1*d14abf15SRobert Mustacchi /*******************************************************************************
2*d14abf15SRobert Mustacchi  * CDDL HEADER START
3*d14abf15SRobert Mustacchi  *
4*d14abf15SRobert Mustacchi  * The contents of this file are subject to the terms of the
5*d14abf15SRobert Mustacchi  * Common Development and Distribution License (the "License").
6*d14abf15SRobert Mustacchi  * You may not use this file except in compliance with the License.
7*d14abf15SRobert Mustacchi  *
8*d14abf15SRobert Mustacchi  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*d14abf15SRobert Mustacchi  * or http://www.opensolaris.org/os/licensing.
10*d14abf15SRobert Mustacchi  * See the License for the specific language governing permissions
11*d14abf15SRobert Mustacchi  * and limitations under the License.
12*d14abf15SRobert Mustacchi  *
13*d14abf15SRobert Mustacchi  * When distributing Covered Code, include this CDDL HEADER in each
14*d14abf15SRobert Mustacchi  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*d14abf15SRobert Mustacchi  * If applicable, add the following below this CDDL HEADER, with the
16*d14abf15SRobert Mustacchi  * fields enclosed by brackets "[]" replaced with your own identifying
17*d14abf15SRobert Mustacchi  * information: Portions Copyright [yyyy] [name of copyright owner]
18*d14abf15SRobert Mustacchi  *
19*d14abf15SRobert Mustacchi  * CDDL HEADER END
20*d14abf15SRobert Mustacchi  *
21*d14abf15SRobert Mustacchi  * Copyright 2014 QLogic Corporation
22*d14abf15SRobert Mustacchi  * The contents of this file are subject to the terms of the
23*d14abf15SRobert Mustacchi  * QLogic End User License (the "License").
24*d14abf15SRobert Mustacchi  * You may not use this file except in compliance with the License.
25*d14abf15SRobert Mustacchi  *
26*d14abf15SRobert Mustacchi  * You can obtain a copy of the License at
27*d14abf15SRobert Mustacchi  * http://www.qlogic.com/Resources/Documents/DriverDownloadHelp/
28*d14abf15SRobert Mustacchi  * QLogic_End_User_Software_License.txt
29*d14abf15SRobert Mustacchi  * See the License for the specific language governing permissions
30*d14abf15SRobert Mustacchi  * and limitations under the License.
31*d14abf15SRobert Mustacchi  *
32*d14abf15SRobert Mustacchi  *
33*d14abf15SRobert Mustacchi  * Module Description:
34*d14abf15SRobert Mustacchi  *
35*d14abf15SRobert Mustacchi  *
36*d14abf15SRobert Mustacchi  * History:
37*d14abf15SRobert Mustacchi  *    01/10/10 Shay Haroush    Inception.
38*d14abf15SRobert Mustacchi  ******************************************************************************/
39*d14abf15SRobert Mustacchi 
40*d14abf15SRobert Mustacchi #include "lm5710.h"
41*d14abf15SRobert Mustacchi #include "license.h"
42*d14abf15SRobert Mustacchi #include "mcp_shmem.h"
43*d14abf15SRobert Mustacchi #include "577xx_int_offsets.h"
44*d14abf15SRobert Mustacchi #include "command.h"
45*d14abf15SRobert Mustacchi 
46*d14abf15SRobert Mustacchi 
47*d14abf15SRobert Mustacchi #define DCBX_ILLEGAL_PG     (0xFF)
48*d14abf15SRobert Mustacchi typedef struct _pg_entry_help_data_t
49*d14abf15SRobert Mustacchi {
50*d14abf15SRobert Mustacchi     u8_t    num_of_dif_pri;
51*d14abf15SRobert Mustacchi     u8_t    pg;
52*d14abf15SRobert Mustacchi     u32_t   pg_priority;
53*d14abf15SRobert Mustacchi }pg_entry_help_data_t;
54*d14abf15SRobert Mustacchi 
55*d14abf15SRobert Mustacchi typedef struct _pg_help_data_t
56*d14abf15SRobert Mustacchi {
57*d14abf15SRobert Mustacchi     pg_entry_help_data_t    pg_entry_data[LLFC_DRIVER_TRAFFIC_TYPE_MAX];
58*d14abf15SRobert Mustacchi     u8_t                    num_of_pg;
59*d14abf15SRobert Mustacchi }pg_help_data_t;
60*d14abf15SRobert Mustacchi 
61*d14abf15SRobert Mustacchi // Used for IE classification debugging
62*d14abf15SRobert Mustacchi typedef struct _lm_dcbx_ie_classif_dbg_t
63*d14abf15SRobert Mustacchi {
64*d14abf15SRobert Mustacchi     u16_t   pri;
65*d14abf15SRobert Mustacchi     u8_t    num_entries;
66*d14abf15SRobert Mustacchi }lm_dcbx_ie_classif_dbg_t;
67*d14abf15SRobert Mustacchi 
68*d14abf15SRobert Mustacchi #define DCBX_INVALID_COS_BW         (0xFFFFFFFF)
69*d14abf15SRobert Mustacchi #define DCBX_MAX_COS_BW             (0xFF)
70*d14abf15SRobert Mustacchi 
71*d14abf15SRobert Mustacchi 
72*d14abf15SRobert Mustacchi #define DCBX_MIB_IS_APP_ENABLED(_app_en,_mib_error_filed)                               \
73*d14abf15SRobert Mustacchi                                 ((TRUE == _app_en) &&                                   \
74*d14abf15SRobert Mustacchi                                  (!GET_FLAGS(_mib_error_filed,(DCBX_LOCAL_APP_ERROR| DCBX_LOCAL_APP_MISMATCH))))
75*d14abf15SRobert Mustacchi 
76*d14abf15SRobert Mustacchi #define DCBX_MIB_IS_ETS_ENABLED(_app_en,_mib_error_filed,_mib_ets_en_filed)             \
77*d14abf15SRobert Mustacchi                                 ((TRUE == _app_en)&&                                    \
78*d14abf15SRobert Mustacchi                                  (!GET_FLAGS(_mib_error_filed,DCBX_LOCAL_ETS_ERROR))&&  \
79*d14abf15SRobert Mustacchi                                  _mib_ets_en_filed)
80*d14abf15SRobert Mustacchi 
81*d14abf15SRobert Mustacchi #define DCBX_MIB_IS_PFC_ENABLED(_app_en,_mib_error_filed,_mib_pfc_en_filed)             \
82*d14abf15SRobert Mustacchi                                 ((TRUE == _app_en)&&                                    \
83*d14abf15SRobert Mustacchi                                  (!GET_FLAGS(_mib_error_filed,(DCBX_LOCAL_PFC_ERROR | DCBX_LOCAL_PFC_MISMATCH)))&&  \
84*d14abf15SRobert Mustacchi                                  _mib_pfc_en_filed)
85*d14abf15SRobert Mustacchi 
86*d14abf15SRobert Mustacchi 
87*d14abf15SRobert Mustacchi typedef struct _cos_entry_help_data_t
88*d14abf15SRobert Mustacchi {
89*d14abf15SRobert Mustacchi     u32_t                   pri_join_mask;
90*d14abf15SRobert Mustacchi     u32_t                   cos_bw;
91*d14abf15SRobert Mustacchi     u8_t    s_pri;
92*d14abf15SRobert Mustacchi     u8_t                    b_pausable;
93*d14abf15SRobert Mustacchi }cos_entry_help_data_t;
94*d14abf15SRobert Mustacchi 
95*d14abf15SRobert Mustacchi typedef struct _cos_help_data_t
96*d14abf15SRobert Mustacchi {
97*d14abf15SRobert Mustacchi     cos_entry_help_data_t   entry_data[DCBX_COS_MAX_NUM];
98*d14abf15SRobert Mustacchi     u8_t                    num_of_cos;
99*d14abf15SRobert Mustacchi }cos_help_data_t;
100*d14abf15SRobert Mustacchi 
101*d14abf15SRobert Mustacchi /**********************foreword declaration************************************/
102*d14abf15SRobert Mustacchi /**
103*d14abf15SRobert Mustacchi  * @description
104*d14abf15SRobert Mustacchi  * Function is needed for PMF migration in order to synchronize
105*d14abf15SRobert Mustacchi  * the new PMF that DCBX results has ended.
106*d14abf15SRobert Mustacchi  * @param pdev
107*d14abf15SRobert Mustacchi  *
108*d14abf15SRobert Mustacchi  * @return u8_t
109*d14abf15SRobert Mustacchi  * This function returns TRUE if DCBX completion received on
110*d14abf15SRobert Mustacchi  * this port
111*d14abf15SRobert Mustacchi  */
112*d14abf15SRobert Mustacchi STATIC u8_t
113*d14abf15SRobert Mustacchi lm_dcbx_check_drv_flags(
114*d14abf15SRobert Mustacchi     IN struct _lm_device_t  *pdev,
115*d14abf15SRobert Mustacchi     IN const  u32_t         flags_bits_to_check);
116*d14abf15SRobert Mustacchi 
117*d14abf15SRobert Mustacchi /*******************************************************************************
118*d14abf15SRobert Mustacchi  * Description: Parse ets_pri_pg data and spread it from nibble to 32 bits.
119*d14abf15SRobert Mustacchi  *
120*d14abf15SRobert Mustacchi  * Return:
121*d14abf15SRobert Mustacchi ******************************************************************************/
122*d14abf15SRobert Mustacchi STATIC void
123*d14abf15SRobert Mustacchi lm_dcbx_get_ets_pri_pg_tbl(struct _lm_device_t      * pdev,
124*d14abf15SRobert Mustacchi                            OUT u32_t                * set_configuration_ets_pg,
125*d14abf15SRobert Mustacchi                            IN const u32_t           * mcp_pri_pg_tbl,
126*d14abf15SRobert Mustacchi                            IN const u8_t            set_priority_app_size,
127*d14abf15SRobert Mustacchi                            IN const u8_t            mcp_pri_pg_tbl_size);
128*d14abf15SRobert Mustacchi 
129*d14abf15SRobert Mustacchi 
130*d14abf15SRobert Mustacchi void lm_dcbx_update_lpme_set_params(struct _lm_device_t *pdev);
131*d14abf15SRobert Mustacchi 
132*d14abf15SRobert Mustacchi STATIC void
133*d14abf15SRobert Mustacchi lm_dcbx_ie_ets_cee_to_ieee_unparse(
134*d14abf15SRobert Mustacchi     INOUT       lm_device_t         *pdev,
135*d14abf15SRobert Mustacchi     IN const    dcbx_ets_feature_t  *cee_ets,
136*d14abf15SRobert Mustacchi     OUT         dcb_ets_tsa_param_t *ieee_ets,
137*d14abf15SRobert Mustacchi     OUT         u32_t               *flags
138*d14abf15SRobert Mustacchi     );
139*d14abf15SRobert Mustacchi 
140*d14abf15SRobert Mustacchi STATIC lm_status_t
141*d14abf15SRobert Mustacchi lm_dcbx_read_admin_mib( IN  lm_device_t         *pdev,
142*d14abf15SRobert Mustacchi                         OUT lldp_admin_mib_t    *p_admin_mib,
143*d14abf15SRobert Mustacchi                         OUT u32_t               *p_admin_mib_offset);
144*d14abf15SRobert Mustacchi 
145*d14abf15SRobert Mustacchi /**********************Start of PFC code**************************************/
146*d14abf15SRobert Mustacchi 
147*d14abf15SRobert Mustacchi /**
148*d14abf15SRobert Mustacchi  * Check if DCB is configured.
149*d14abf15SRobert Mustacchi  * In SF is_dcbx_neg_received is always valid.
150*d14abf15SRobert Mustacchi  * DRV_FLAGS_DCB_CONFIGURED is always valid.
151*d14abf15SRobert Mustacchi  * @param pdev
152*d14abf15SRobert Mustacchi  *
153*d14abf15SRobert Mustacchi  * @return u8_t
154*d14abf15SRobert Mustacchi  */
155*d14abf15SRobert Mustacchi u8_t
lm_dcbx_is_dcb_config(IN lm_device_t * pdev)156*d14abf15SRobert Mustacchi lm_dcbx_is_dcb_config(IN lm_device_t   *pdev)
157*d14abf15SRobert Mustacchi {
158*d14abf15SRobert Mustacchi     // Valid in SF
159*d14abf15SRobert Mustacchi     u8_t const  dcb_config_sf   = pdev->dcbx_info.is_dcbx_neg_received;
160*d14abf15SRobert Mustacchi     // Always valid.
161*d14abf15SRobert Mustacchi     u8_t const  dcb_config      = lm_dcbx_check_drv_flags(pdev, DRV_FLAGS_DCB_CONFIGURED);
162*d14abf15SRobert Mustacchi 
163*d14abf15SRobert Mustacchi     if(FALSE == IS_MULTI_VNIC(pdev))
164*d14abf15SRobert Mustacchi     {
165*d14abf15SRobert Mustacchi         DbgBreakIf(dcb_config != dcb_config_sf);
166*d14abf15SRobert Mustacchi     }
167*d14abf15SRobert Mustacchi 
168*d14abf15SRobert Mustacchi     return dcb_config;
169*d14abf15SRobert Mustacchi }
170*d14abf15SRobert Mustacchi /*******************************************************************************
171*d14abf15SRobert Mustacchi  * Description: Fill Fw struct that will be sent in DCBX start ramrod
172*d14abf15SRobert Mustacchi  *
173*d14abf15SRobert Mustacchi  * Return:
174*d14abf15SRobert Mustacchi  ******************************************************************************/
175*d14abf15SRobert Mustacchi void
lm_dcbx_print_cos_params(IN OUT lm_device_t * pdev,IN struct flow_control_configuration * pfc_fw_cfg)176*d14abf15SRobert Mustacchi lm_dcbx_print_cos_params(
177*d14abf15SRobert Mustacchi     IN OUT   lm_device_t                    *pdev,
178*d14abf15SRobert Mustacchi     IN struct flow_control_configuration    *pfc_fw_cfg)
179*d14abf15SRobert Mustacchi {
180*d14abf15SRobert Mustacchi #if DBG
181*d14abf15SRobert Mustacchi     u8_t   pri                                      = 0;
182*d14abf15SRobert Mustacchi     u8_t   cos                                      = 0;
183*d14abf15SRobert Mustacchi 
184*d14abf15SRobert Mustacchi     DbgMessage(pdev, INFORM, "******************DCBX configuration******************************\n");
185*d14abf15SRobert Mustacchi     DbgMessage(pdev, INFORM, "pfc_fw_cfg->dcb_version %x\n",pfc_fw_cfg->dcb_version);
186*d14abf15SRobert Mustacchi     DbgMessage(pdev, INFORM, "pdev->params.dcbx_port_params.pfc.priority_non_pauseable_mask %x\n",
187*d14abf15SRobert Mustacchi                 pdev->params.dcbx_port_params.pfc.priority_non_pauseable_mask);
188*d14abf15SRobert Mustacchi 
189*d14abf15SRobert Mustacchi     for( cos =0 ; cos < pdev->params.dcbx_port_params.ets.num_of_cos ; cos++)
190*d14abf15SRobert Mustacchi     {
191*d14abf15SRobert Mustacchi         DbgMessage(pdev, INFORM, "pdev->params.dcbx_port_params.ets.cos_params[%d].pri_bitmask %x\n",cos,
192*d14abf15SRobert Mustacchi                 pdev->params.dcbx_port_params.ets.cos_params[cos].pri_bitmask);
193*d14abf15SRobert Mustacchi 
194*d14abf15SRobert Mustacchi         DbgMessage(pdev, INFORM, "pdev->params.dcbx_port_params.ets.cos_params[%d].bw_tbl %x\n",cos,
195*d14abf15SRobert Mustacchi                 pdev->params.dcbx_port_params.ets.cos_params[cos].bw_tbl);
196*d14abf15SRobert Mustacchi 
197*d14abf15SRobert Mustacchi         DbgMessage(pdev, INFORM, "pdev->params.dcbx_port_params.ets.cos_params[%d].strict %x\n",cos,
198*d14abf15SRobert Mustacchi                 pdev->params.dcbx_port_params.ets.cos_params[cos].s_pri);
199*d14abf15SRobert Mustacchi 
200*d14abf15SRobert Mustacchi         DbgMessage(pdev, INFORM, "pdev->params.dcbx_port_params.ets.cos_params[%d].pauseable %x\n",cos,
201*d14abf15SRobert Mustacchi                 pdev->params.dcbx_port_params.ets.cos_params[cos].pauseable);
202*d14abf15SRobert Mustacchi     }
203*d14abf15SRobert Mustacchi 
204*d14abf15SRobert Mustacchi     for (pri = 0; pri < ARRSIZE(pdev->params.dcbx_port_params.app.traffic_type_priority); pri++)
205*d14abf15SRobert Mustacchi     {
206*d14abf15SRobert Mustacchi         DbgMessage(pdev, INFORM, "pfc_fw_cfg->traffic_type_to_priority_cos[%d].priority %x\n",pri,
207*d14abf15SRobert Mustacchi                     pfc_fw_cfg->traffic_type_to_priority_cos[pri].priority);
208*d14abf15SRobert Mustacchi 
209*d14abf15SRobert Mustacchi         DbgMessage(pdev, INFORM, "pfc_fw_cfg->traffic_type_to_priority_cos[%d].cos %x\n",pri,
210*d14abf15SRobert Mustacchi                     pfc_fw_cfg->traffic_type_to_priority_cos[pri].cos);
211*d14abf15SRobert Mustacchi     }
212*d14abf15SRobert Mustacchi 
213*d14abf15SRobert Mustacchi #endif //DBG
214*d14abf15SRobert Mustacchi }
215*d14abf15SRobert Mustacchi /*******************************************************************************
216*d14abf15SRobert Mustacchi  * Description: Fill Fw struct that will be sent in DCBX start ramrod
217*d14abf15SRobert Mustacchi  *
218*d14abf15SRobert Mustacchi  * Return:
219*d14abf15SRobert Mustacchi  ******************************************************************************/
220*d14abf15SRobert Mustacchi void
lm_dcbx_fw_struct(IN OUT lm_device_t * pdev)221*d14abf15SRobert Mustacchi lm_dcbx_fw_struct(
222*d14abf15SRobert Mustacchi     IN OUT   lm_device_t     *pdev)
223*d14abf15SRobert Mustacchi {
224*d14abf15SRobert Mustacchi     struct flow_control_configuration   *pfc_fw_cfg = NULL;
225*d14abf15SRobert Mustacchi     u16_t  pri_bit                                  = 0;
226*d14abf15SRobert Mustacchi     u8_t   cos                                      = 0;
227*d14abf15SRobert Mustacchi     u8_t   pri                                      = 0;
228*d14abf15SRobert Mustacchi 
229*d14abf15SRobert Mustacchi     if(CHK_NULL(pdev->dcbx_info.pfc_fw_cfg_virt))
230*d14abf15SRobert Mustacchi     {
231*d14abf15SRobert Mustacchi         DbgBreakMsg("lm_pfc_fw_struct_e2:pfc_fw_cfg_virt was not allocated DCBX should have been disabled ");
232*d14abf15SRobert Mustacchi         return;
233*d14abf15SRobert Mustacchi     }
234*d14abf15SRobert Mustacchi     pfc_fw_cfg = (struct flow_control_configuration*)pdev->dcbx_info.pfc_fw_cfg_virt;
235*d14abf15SRobert Mustacchi     mm_mem_zero(pfc_fw_cfg, sizeof(struct flow_control_configuration));
236*d14abf15SRobert Mustacchi 
237*d14abf15SRobert Mustacchi     pfc_fw_cfg->dcb_version = 0; // Reserved field
238*d14abf15SRobert Mustacchi 
239*d14abf15SRobert Mustacchi     // If priority tagging (app ID) isn't enabled then DCB should be disabled.
240*d14abf15SRobert Mustacchi     if(FALSE == pdev->params.dcbx_port_params.app.enabled)
241*d14abf15SRobert Mustacchi     {
242*d14abf15SRobert Mustacchi         // Disabled DCB at FW.
243*d14abf15SRobert Mustacchi         pfc_fw_cfg->dcb_enabled = 0;
244*d14abf15SRobert Mustacchi         return;
245*d14abf15SRobert Mustacchi     }
246*d14abf15SRobert Mustacchi 
247*d14abf15SRobert Mustacchi     DbgBreakIf(FALSE == pdev->params.dcbx_port_params.dcbx_enabled);
248*d14abf15SRobert Mustacchi 
249*d14abf15SRobert Mustacchi     // Enable priority tagging and DCB at FW
250*d14abf15SRobert Mustacchi     pfc_fw_cfg->dcb_enabled = 1;
251*d14abf15SRobert Mustacchi     pfc_fw_cfg->dont_add_pri_0 = 1;
252*d14abf15SRobert Mustacchi 
253*d14abf15SRobert Mustacchi     // Default initialization
254*d14abf15SRobert Mustacchi     for (pri = 0; pri < ARRSIZE(pfc_fw_cfg->traffic_type_to_priority_cos) ; pri++)
255*d14abf15SRobert Mustacchi     {
256*d14abf15SRobert Mustacchi         pfc_fw_cfg->traffic_type_to_priority_cos[pri].priority = LLFC_TRAFFIC_TYPE_TO_PRIORITY_UNMAPPED;
257*d14abf15SRobert Mustacchi         pfc_fw_cfg->traffic_type_to_priority_cos[pri].cos      = 0;
258*d14abf15SRobert Mustacchi     }
259*d14abf15SRobert Mustacchi 
260*d14abf15SRobert Mustacchi     // Fill priority parameters
261*d14abf15SRobert Mustacchi     for (pri = 0; pri < ARRSIZE(pdev->params.dcbx_port_params.app.traffic_type_priority); pri++)
262*d14abf15SRobert Mustacchi     {
263*d14abf15SRobert Mustacchi         DbgBreakIf(pdev->params.dcbx_port_params.app.traffic_type_priority[pri] >= MAX_PFC_PRIORITIES);
264*d14abf15SRobert Mustacchi         pfc_fw_cfg->traffic_type_to_priority_cos[pri].priority =
265*d14abf15SRobert Mustacchi             (u8_t)pdev->params.dcbx_port_params.app.traffic_type_priority[pri];
266*d14abf15SRobert Mustacchi 
267*d14abf15SRobert Mustacchi         pri_bit = 1 << pfc_fw_cfg->traffic_type_to_priority_cos[pri].priority;
268*d14abf15SRobert Mustacchi         // Fill COS parameters based on COS calculated to make it more generally for future use
269*d14abf15SRobert Mustacchi         for( cos =0 ; cos < pdev->params.dcbx_port_params.ets.num_of_cos ; cos++)
270*d14abf15SRobert Mustacchi         {
271*d14abf15SRobert Mustacchi             if (pdev->params.dcbx_port_params.ets.cos_params[cos].pri_bitmask & pri_bit)
272*d14abf15SRobert Mustacchi             {
273*d14abf15SRobert Mustacchi                 pfc_fw_cfg->traffic_type_to_priority_cos[pri].cos = cos;
274*d14abf15SRobert Mustacchi             }
275*d14abf15SRobert Mustacchi         }
276*d14abf15SRobert Mustacchi     }
277*d14abf15SRobert Mustacchi     lm_dcbx_print_cos_params(pdev,
278*d14abf15SRobert Mustacchi                              pfc_fw_cfg);
279*d14abf15SRobert Mustacchi 
280*d14abf15SRobert Mustacchi }
281*d14abf15SRobert Mustacchi /*******************************************************************************
282*d14abf15SRobert Mustacchi  * Description:
283*d14abf15SRobert Mustacchi  *
284*d14abf15SRobert Mustacchi  * Return:
285*d14abf15SRobert Mustacchi  ******************************************************************************/
286*d14abf15SRobert Mustacchi static void
lm_pfc_clear(lm_device_t * pdev)287*d14abf15SRobert Mustacchi lm_pfc_clear(lm_device_t *pdev)
288*d14abf15SRobert Mustacchi {
289*d14abf15SRobert Mustacchi     u8_t elink_status = ELINK_STATUS_OK;
290*d14abf15SRobert Mustacchi 
291*d14abf15SRobert Mustacchi     MM_ACQUIRE_PHY_LOCK(pdev);
292*d14abf15SRobert Mustacchi     RESET_FLAGS(pdev->params.link.feature_config_flags, ELINK_FEATURE_CONFIG_PFC_ENABLED);
293*d14abf15SRobert Mustacchi     elink_status = elink_update_pfc(&pdev->params.link, &pdev->vars.link, 0);
294*d14abf15SRobert Mustacchi     DbgBreakIf(ELINK_STATUS_OK != elink_status);
295*d14abf15SRobert Mustacchi     MM_RELEASE_PHY_LOCK(pdev);
296*d14abf15SRobert Mustacchi }
297*d14abf15SRobert Mustacchi /*******************************************************************************
298*d14abf15SRobert Mustacchi  * Description:
299*d14abf15SRobert Mustacchi  *
300*d14abf15SRobert Mustacchi  * Return:
301*d14abf15SRobert Mustacchi  ******************************************************************************/
lm_pfc_set_clc(lm_device_t * pdev)302*d14abf15SRobert Mustacchi static void lm_pfc_set_clc(lm_device_t *pdev)
303*d14abf15SRobert Mustacchi {
304*d14abf15SRobert Mustacchi     struct elink_nig_brb_pfc_port_params    pfc_params = {0};
305*d14abf15SRobert Mustacchi     pg_params_t                             *ets        = &pdev->params.dcbx_port_params.ets;
306*d14abf15SRobert Mustacchi     u32_t                                   val         = 0;
307*d14abf15SRobert Mustacchi     u32_t                                   pri_bit     = 0;
308*d14abf15SRobert Mustacchi     u8_t                                    i           = 0;
309*d14abf15SRobert Mustacchi     u8_t elink_status = ELINK_STATUS_OK;
310*d14abf15SRobert Mustacchi     const u32_t                              class_rx_pause    = 0;
311*d14abf15SRobert Mustacchi     const u32_t                              class_rx_nonpause = 1;
312*d14abf15SRobert Mustacchi 
313*d14abf15SRobert Mustacchi     DbgBreakIf(class_rx_pause == class_rx_nonpause);
314*d14abf15SRobert Mustacchi     DbgBreakIf((0 != class_rx_pause) && (1 != class_rx_pause));
315*d14abf15SRobert Mustacchi     DbgBreakIf((0 != class_rx_nonpause) && (1 != class_rx_nonpause));
316*d14abf15SRobert Mustacchi 
317*d14abf15SRobert Mustacchi     // Tx COS configuration
318*d14abf15SRobert Mustacchi     // Here COS == pri
319*d14abf15SRobert Mustacchi     pfc_params.num_of_rx_cos_priority_mask = ets->num_of_cos;
320*d14abf15SRobert Mustacchi 
321*d14abf15SRobert Mustacchi     for(i = 0 ; i < ets->num_of_cos ; i++)
322*d14abf15SRobert Mustacchi     {
323*d14abf15SRobert Mustacchi         // We configured in this register only the pause-able bits.(non pause-able aren't configure at all)
324*d14abf15SRobert Mustacchi         // it is done to avoid false pauses from network.
325*d14abf15SRobert Mustacchi         pfc_params.rx_cos_priority_mask[i] =
326*d14abf15SRobert Mustacchi             ets->cos_params[i].pri_bitmask & LM_DCBX_PFC_PRI_PAUSE_MASK(pdev);
327*d14abf15SRobert Mustacchi     }
328*d14abf15SRobert Mustacchi 
329*d14abf15SRobert Mustacchi     // Rx COS configuration
330*d14abf15SRobert Mustacchi     // Changing PFC RX configuration . In RX COS0 will always be configured to lossless
331*d14abf15SRobert Mustacchi     // and COS1 to lossy.
332*d14abf15SRobert Mustacchi     // Here i == pri
333*d14abf15SRobert Mustacchi     for(i = 0 ; i < MAX_PFC_PRIORITIES ; i++)
334*d14abf15SRobert Mustacchi     {
335*d14abf15SRobert Mustacchi         pri_bit = 1 << i;
336*d14abf15SRobert Mustacchi 
337*d14abf15SRobert Mustacchi         if(pri_bit & LM_DCBX_PFC_PRI_PAUSE_MASK(pdev))
338*d14abf15SRobert Mustacchi         {
339*d14abf15SRobert Mustacchi             val |= class_rx_pause << (i * 4);
340*d14abf15SRobert Mustacchi         }
341*d14abf15SRobert Mustacchi         else
342*d14abf15SRobert Mustacchi         {
343*d14abf15SRobert Mustacchi             val |= class_rx_nonpause << (i * 4);
344*d14abf15SRobert Mustacchi         }
345*d14abf15SRobert Mustacchi     }
346*d14abf15SRobert Mustacchi 
347*d14abf15SRobert Mustacchi     pfc_params.pkt_priority_to_cos = val;
348*d14abf15SRobert Mustacchi 
349*d14abf15SRobert Mustacchi     if(0 == class_rx_pause)
350*d14abf15SRobert Mustacchi     {
351*d14abf15SRobert Mustacchi         // RX Classs0: On BRB class0 trigger PFC TX. Classes are low-priority for port #. When PFC is triggered on class 0 send PFC with this priorities to stop
352*d14abf15SRobert Mustacchi     pfc_params.llfc_low_priority_classes = LM_DCBX_PFC_PRI_PAUSE_MASK(pdev);
353*d14abf15SRobert Mustacchi         // RX Classs1: On BRB class1 trigger PFC TX. Classes are low-priority for port #. When PFC is triggered on class 1 send PFC with this priorities to stop
354*d14abf15SRobert Mustacchi     pfc_params.llfc_high_priority_classes = 0;
355*d14abf15SRobert Mustacchi     }
356*d14abf15SRobert Mustacchi     else
357*d14abf15SRobert Mustacchi     {
358*d14abf15SRobert Mustacchi         DbgBreakIf(1 != class_rx_pause);
359*d14abf15SRobert Mustacchi         pfc_params.llfc_low_priority_classes    = 0;
360*d14abf15SRobert Mustacchi         pfc_params.llfc_high_priority_classes   = LM_DCBX_PFC_PRI_PAUSE_MASK(pdev);
361*d14abf15SRobert Mustacchi     }
362*d14abf15SRobert Mustacchi 
363*d14abf15SRobert Mustacchi     MM_ACQUIRE_PHY_LOCK(pdev);
364*d14abf15SRobert Mustacchi     SET_FLAGS(pdev->params.link.feature_config_flags, ELINK_FEATURE_CONFIG_PFC_ENABLED);
365*d14abf15SRobert Mustacchi     elink_status = elink_update_pfc(&pdev->params.link, &pdev->vars.link, &pfc_params);
366*d14abf15SRobert Mustacchi     DbgBreakIf(ELINK_STATUS_OK != elink_status);
367*d14abf15SRobert Mustacchi     MM_RELEASE_PHY_LOCK(pdev);
368*d14abf15SRobert Mustacchi }
369*d14abf15SRobert Mustacchi /*******************************************************************************
370*d14abf15SRobert Mustacchi  * Description:
371*d14abf15SRobert Mustacchi  *
372*d14abf15SRobert Mustacchi  * Return:
373*d14abf15SRobert Mustacchi  ******************************************************************************/
374*d14abf15SRobert Mustacchi void
lm_pfc_set_pfc(lm_device_t * pdev)375*d14abf15SRobert Mustacchi lm_pfc_set_pfc(
376*d14abf15SRobert Mustacchi     lm_device_t *pdev)
377*d14abf15SRobert Mustacchi {
378*d14abf15SRobert Mustacchi     DbgBreakIf(CHIP_IS_E1x(pdev));
379*d14abf15SRobert Mustacchi         //1.       Fills up common PFC structures if required.
380*d14abf15SRobert Mustacchi         //2.       Configure BRB
381*d14abf15SRobert Mustacchi         //3.       Configure NIG.
382*d14abf15SRobert Mustacchi         //4.       Configure the MAC via the CLC:
383*d14abf15SRobert Mustacchi         //"        CLC must first check if BMAC is not in reset and only then configures the BMAC
384*d14abf15SRobert Mustacchi         //"        Or, configure EMAC.
385*d14abf15SRobert Mustacchi         lm_pfc_set_clc(pdev);
386*d14abf15SRobert Mustacchi     }
387*d14abf15SRobert Mustacchi 
388*d14abf15SRobert Mustacchi /*******************************************************************************
389*d14abf15SRobert Mustacchi  * Description:
390*d14abf15SRobert Mustacchi  *
391*d14abf15SRobert Mustacchi  * Return:
392*d14abf15SRobert Mustacchi  ******************************************************************************/
393*d14abf15SRobert Mustacchi void
lm_pfc_handle_pfc(lm_device_t * pdev)394*d14abf15SRobert Mustacchi lm_pfc_handle_pfc(
395*d14abf15SRobert Mustacchi     lm_device_t *pdev)
396*d14abf15SRobert Mustacchi {
397*d14abf15SRobert Mustacchi     DbgBreakIf(CHIP_IS_E1x(pdev));
398*d14abf15SRobert Mustacchi     // Only for testing DCBX client the registry key won't be 0 or 1
399*d14abf15SRobert Mustacchi     // Only a call from lm_chip_init can be not 0 or 1
400*d14abf15SRobert Mustacchi     if(TRUE == pdev->params.dcbx_port_params.pfc.enabled)
401*d14abf15SRobert Mustacchi     {// PFC enabled
402*d14abf15SRobert Mustacchi         lm_pfc_set_pfc(pdev);
403*d14abf15SRobert Mustacchi     }
404*d14abf15SRobert Mustacchi     else
405*d14abf15SRobert Mustacchi     {// PFC disabled go back to pause if needed
406*d14abf15SRobert Mustacchi             lm_pfc_clear(pdev);
407*d14abf15SRobert Mustacchi         }
408*d14abf15SRobert Mustacchi     }
409*d14abf15SRobert Mustacchi 
410*d14abf15SRobert Mustacchi void
lm_dcbx_2cos_limit_update_ets_config(lm_device_t * pdev)411*d14abf15SRobert Mustacchi lm_dcbx_2cos_limit_update_ets_config(
412*d14abf15SRobert Mustacchi     lm_device_t *pdev)
413*d14abf15SRobert Mustacchi {
414*d14abf15SRobert Mustacchi 
415*d14abf15SRobert Mustacchi     pg_params_t *ets = &(pdev->params.dcbx_port_params.ets);
416*d14abf15SRobert Mustacchi     u8_t        elink_status = ELINK_STATUS_OK;
417*d14abf15SRobert Mustacchi     u32_t       bw_tbl_0 = 0;
418*d14abf15SRobert Mustacchi     u32_t       bw_tbl_1 = 0;
419*d14abf15SRobert Mustacchi 
420*d14abf15SRobert Mustacchi     if ((0 == ets->num_of_cos ) ||
421*d14abf15SRobert Mustacchi         (DCBX_COS_MAX_NUM_E2E3A0 < ets->num_of_cos))
422*d14abf15SRobert Mustacchi     {
423*d14abf15SRobert Mustacchi         DbgMessage(pdev, FATAL, " illegal num of cos= %x",ets->num_of_cos);
424*d14abf15SRobert Mustacchi         DbgBreakIf(1);
425*d14abf15SRobert Mustacchi         return;
426*d14abf15SRobert Mustacchi     }
427*d14abf15SRobert Mustacchi     //valid COS entries
428*d14abf15SRobert Mustacchi     if( 1 == ets->num_of_cos)
429*d14abf15SRobert Mustacchi     {// No ETS
430*d14abf15SRobert Mustacchi         return;
431*d14abf15SRobert Mustacchi     }
432*d14abf15SRobert Mustacchi     DbgBreakIf(2 != ets->num_of_cos);
433*d14abf15SRobert Mustacchi 
434*d14abf15SRobert Mustacchi     if(((DCBX_S_PRI_INVALID == ets->cos_params[0].s_pri)&&
435*d14abf15SRobert Mustacchi        (DCBX_INVALID_COS_BW == ets->cos_params[0].bw_tbl)) ||
436*d14abf15SRobert Mustacchi        ((DCBX_S_PRI_INVALID == ets->cos_params[1].s_pri)&&
437*d14abf15SRobert Mustacchi        (DCBX_INVALID_COS_BW == ets->cos_params[1].bw_tbl)))
438*d14abf15SRobert Mustacchi     {
439*d14abf15SRobert Mustacchi         DbgMessage(pdev, FATAL, "We expect all the COS to have at least bw_limit or strict"
440*d14abf15SRobert Mustacchi                                "ets->cos_params[0].strict= %x"
441*d14abf15SRobert Mustacchi                                "ets->cos_params[0].bw_tbl= %x"
442*d14abf15SRobert Mustacchi                                "ets->cos_params[1].strict= %x"
443*d14abf15SRobert Mustacchi                                "ets->cos_params[1].bw_tbl= %x"
444*d14abf15SRobert Mustacchi                                 ,ets->cos_params[0].s_pri, ets->cos_params[0].bw_tbl
445*d14abf15SRobert Mustacchi                                 ,ets->cos_params[1].s_pri, ets->cos_params[1].bw_tbl);
446*d14abf15SRobert Mustacchi 
447*d14abf15SRobert Mustacchi         // CQ47518,CQ47504 Assert in the eVBD because of illegal ETS parameters reception. When
448*d14abf15SRobert Mustacchi         //switch changes configuration in runtime it sends several packets that
449*d14abf15SRobert Mustacchi         //contain illegal configuration until the actual configuration is merged.
450*d14abf15SRobert Mustacchi         //DbgBreakIf(1);
451*d14abf15SRobert Mustacchi         return;
452*d14abf15SRobert Mustacchi     }
453*d14abf15SRobert Mustacchi     // If we join a group and there is bw_tbl and strict then bw rules.
454*d14abf15SRobert Mustacchi     if ((DCBX_INVALID_COS_BW != ets->cos_params[0].bw_tbl) &&
455*d14abf15SRobert Mustacchi         (DCBX_INVALID_COS_BW != ets->cos_params[1].bw_tbl))
456*d14abf15SRobert Mustacchi     {
457*d14abf15SRobert Mustacchi         DbgBreakIf(0 == (ets->cos_params[0].bw_tbl + ets->cos_params[1].bw_tbl));
458*d14abf15SRobert Mustacchi         // ETS 0 100 PBF bug.
459*d14abf15SRobert Mustacchi         bw_tbl_0 = ets->cos_params[0].bw_tbl;
460*d14abf15SRobert Mustacchi         bw_tbl_1 = ets->cos_params[1].bw_tbl;
461*d14abf15SRobert Mustacchi 
462*d14abf15SRobert Mustacchi         if((0 == bw_tbl_0)||
463*d14abf15SRobert Mustacchi            (0 == bw_tbl_1))
464*d14abf15SRobert Mustacchi         {
465*d14abf15SRobert Mustacchi             if(0 == bw_tbl_0)
466*d14abf15SRobert Mustacchi             {
467*d14abf15SRobert Mustacchi                 bw_tbl_0 = 1;
468*d14abf15SRobert Mustacchi                 bw_tbl_1 = 99;
469*d14abf15SRobert Mustacchi             }
470*d14abf15SRobert Mustacchi             else
471*d14abf15SRobert Mustacchi     {
472*d14abf15SRobert Mustacchi                 bw_tbl_0 = 99;
473*d14abf15SRobert Mustacchi                 bw_tbl_1 = 1;
474*d14abf15SRobert Mustacchi             }
475*d14abf15SRobert Mustacchi 
476*d14abf15SRobert Mustacchi         }
477*d14abf15SRobert Mustacchi         // The priority is assign as BW
478*d14abf15SRobert Mustacchi         ets->cos_params[0].s_pri = DCBX_S_PRI_INVALID;
479*d14abf15SRobert Mustacchi         ets->cos_params[1].s_pri = DCBX_S_PRI_INVALID;
480*d14abf15SRobert Mustacchi         elink_ets_bw_limit(&pdev->params.link,
481*d14abf15SRobert Mustacchi                            bw_tbl_0,
482*d14abf15SRobert Mustacchi                            bw_tbl_1);
483*d14abf15SRobert Mustacchi     }
484*d14abf15SRobert Mustacchi     else
485*d14abf15SRobert Mustacchi     {
486*d14abf15SRobert Mustacchi         ets->cos_params[0].bw_tbl = DCBX_INVALID_COS_BW;
487*d14abf15SRobert Mustacchi         ets->cos_params[1].bw_tbl = DCBX_INVALID_COS_BW;
488*d14abf15SRobert Mustacchi         // The priority is assign as Strict
489*d14abf15SRobert Mustacchi         DbgBreakIf(ets->cos_params[0].s_pri == ets->cos_params[1].s_pri);
490*d14abf15SRobert Mustacchi         if(DCBX_S_PRI_COS_HIGHEST ==  ets->cos_params[0].s_pri)
491*d14abf15SRobert Mustacchi         {
492*d14abf15SRobert Mustacchi             ets->cos_params[1].s_pri =
493*d14abf15SRobert Mustacchi                 DCBX_S_PRI_COS_NEXT_LOWER_PRI(DCBX_S_PRI_COS_HIGHEST);
494*d14abf15SRobert Mustacchi             elink_status = elink_ets_strict(&pdev->params.link,0);
495*d14abf15SRobert Mustacchi         }
496*d14abf15SRobert Mustacchi         else if(DCBX_S_PRI_COS_HIGHEST ==  ets->cos_params[1].s_pri)
497*d14abf15SRobert Mustacchi         {
498*d14abf15SRobert Mustacchi             ets->cos_params[0].s_pri =
499*d14abf15SRobert Mustacchi                 DCBX_S_PRI_COS_NEXT_LOWER_PRI(DCBX_S_PRI_COS_HIGHEST);
500*d14abf15SRobert Mustacchi             elink_status = elink_ets_strict(&pdev->params.link,1);
501*d14abf15SRobert Mustacchi         }
502*d14abf15SRobert Mustacchi 
503*d14abf15SRobert Mustacchi         if(ELINK_STATUS_OK != elink_status)
504*d14abf15SRobert Mustacchi         {
505*d14abf15SRobert Mustacchi             DbgBreakMsg("lm_dcbx_update_ets_params: elinc_ets_strict failed ");
506*d14abf15SRobert Mustacchi         }
507*d14abf15SRobert Mustacchi     }
508*d14abf15SRobert Mustacchi }
509*d14abf15SRobert Mustacchi /**
510*d14abf15SRobert Mustacchi  * @description
511*d14abf15SRobert Mustacchi  * Set ETS configuration in E3B0.
512*d14abf15SRobert Mustacchi  * In E3B0 the configuration may have more than 2 COS.
513*d14abf15SRobert Mustacchi  * @param pdev
514*d14abf15SRobert Mustacchi  */
515*d14abf15SRobert Mustacchi void
lm_dcbx_update_ets_config(IN lm_device_t * pdev)516*d14abf15SRobert Mustacchi lm_dcbx_update_ets_config(
517*d14abf15SRobert Mustacchi     IN lm_device_t *pdev)
518*d14abf15SRobert Mustacchi {
519*d14abf15SRobert Mustacchi     pg_params_t *ets                        = &(pdev->params.dcbx_port_params.ets);
520*d14abf15SRobert Mustacchi     struct      elink_ets_params ets_params = {0};
521*d14abf15SRobert Mustacchi     u8_t        elink_status                = ELINK_STATUS_OK;
522*d14abf15SRobert Mustacchi     u8_t        i                           = 0;
523*d14abf15SRobert Mustacchi 
524*d14abf15SRobert Mustacchi     ets_params.num_of_cos = ets->num_of_cos;
525*d14abf15SRobert Mustacchi 
526*d14abf15SRobert Mustacchi     for(i = 0 ; i < ets->num_of_cos; i++)
527*d14abf15SRobert Mustacchi     {
528*d14abf15SRobert Mustacchi         if(DCBX_S_PRI_INVALID != ets->cos_params[i].s_pri)
529*d14abf15SRobert Mustacchi         {// COS is SP
530*d14abf15SRobert Mustacchi             if(DCBX_INVALID_COS_BW != ets->cos_params[i].bw_tbl)
531*d14abf15SRobert Mustacchi             {
532*d14abf15SRobert Mustacchi                 DbgBreakMsg("lm_dcbx_update_ets_e3b0_params :COS can't be not BW and not SP");
533*d14abf15SRobert Mustacchi                 return;
534*d14abf15SRobert Mustacchi             }
535*d14abf15SRobert Mustacchi             ets_params.cos[i].state = elink_cos_state_strict;
536*d14abf15SRobert Mustacchi             ets_params.cos[i].params.sp_params.pri = ets->cos_params[i].s_pri;
537*d14abf15SRobert Mustacchi         }
538*d14abf15SRobert Mustacchi         else
539*d14abf15SRobert Mustacchi         {// COS is BW
540*d14abf15SRobert Mustacchi             if(DCBX_INVALID_COS_BW == ets->cos_params[i].bw_tbl)
541*d14abf15SRobert Mustacchi             {
542*d14abf15SRobert Mustacchi                 DbgBreakMsg("lm_dcbx_update_ets_e3b0_params :COS can't be not BW and not SP");
543*d14abf15SRobert Mustacchi                 return;
544*d14abf15SRobert Mustacchi             }
545*d14abf15SRobert Mustacchi             ets_params.cos[i].state                 = elink_cos_state_bw;
546*d14abf15SRobert Mustacchi             ets_params.cos[i].params.bw_params.bw   = (u8_t)ets->cos_params[i].bw_tbl;
547*d14abf15SRobert Mustacchi         }
548*d14abf15SRobert Mustacchi 
549*d14abf15SRobert Mustacchi     }
550*d14abf15SRobert Mustacchi 
551*d14abf15SRobert Mustacchi     // Configure the ETS in HW.
552*d14abf15SRobert Mustacchi     elink_status = elink_ets_e3b0_config(&pdev->params.link,
553*d14abf15SRobert Mustacchi                                          &pdev->vars.link,
554*d14abf15SRobert Mustacchi                                          &ets_params);
555*d14abf15SRobert Mustacchi 
556*d14abf15SRobert Mustacchi     if(ELINK_STATUS_OK != elink_status)
557*d14abf15SRobert Mustacchi     {
558*d14abf15SRobert Mustacchi         DbgBreakMsg("lm_dcbx_update_ets_e3b0_params: ets_e3b0_config failed ");
559*d14abf15SRobert Mustacchi         elink_status = elink_ets_disabled(&pdev->params.link,
560*d14abf15SRobert Mustacchi                                           &pdev->vars.link);
561*d14abf15SRobert Mustacchi     }
562*d14abf15SRobert Mustacchi }
563*d14abf15SRobert Mustacchi /*******************************************************************************
564*d14abf15SRobert Mustacchi  * Description:
565*d14abf15SRobert Mustacchi  *
566*d14abf15SRobert Mustacchi  * Return:
567*d14abf15SRobert Mustacchi  ******************************************************************************/
568*d14abf15SRobert Mustacchi void
lm_dcbx_update_ets_params(IN lm_device_t * pdev)569*d14abf15SRobert Mustacchi lm_dcbx_update_ets_params(
570*d14abf15SRobert Mustacchi     IN lm_device_t *pdev)
571*d14abf15SRobert Mustacchi {
572*d14abf15SRobert Mustacchi     pg_params_t *ets            = &(pdev->params.dcbx_port_params.ets);
573*d14abf15SRobert Mustacchi     u8_t        elink_status    = ELINK_STATUS_OK;
574*d14abf15SRobert Mustacchi 
575*d14abf15SRobert Mustacchi     elink_status = elink_ets_disabled(&pdev->params.link,
576*d14abf15SRobert Mustacchi                                       &pdev->vars.link);
577*d14abf15SRobert Mustacchi 
578*d14abf15SRobert Mustacchi     if(ELINK_STATUS_OK != elink_status)
579*d14abf15SRobert Mustacchi     {
580*d14abf15SRobert Mustacchi         DbgBreakMsg("lm_dcbx_update_ets_params the function elink_ets_disabled failed");
581*d14abf15SRobert Mustacchi         return;
582*d14abf15SRobert Mustacchi     }
583*d14abf15SRobert Mustacchi 
584*d14abf15SRobert Mustacchi     if(FALSE == ets->enabled)
585*d14abf15SRobert Mustacchi     {
586*d14abf15SRobert Mustacchi         return;
587*d14abf15SRobert Mustacchi     }
588*d14abf15SRobert Mustacchi 
589*d14abf15SRobert Mustacchi     if(CHIP_IS_E3B0(pdev))
590*d14abf15SRobert Mustacchi     {
591*d14abf15SRobert Mustacchi         lm_dcbx_update_ets_config(pdev);
592*d14abf15SRobert Mustacchi     }
593*d14abf15SRobert Mustacchi     else
594*d14abf15SRobert Mustacchi     {
595*d14abf15SRobert Mustacchi         DbgBreakIf(FALSE == CHIP_IS_E2E3A0(pdev));
596*d14abf15SRobert Mustacchi         lm_dcbx_2cos_limit_update_ets_config(pdev);
597*d14abf15SRobert Mustacchi     }
598*d14abf15SRobert Mustacchi 
599*d14abf15SRobert Mustacchi }
600*d14abf15SRobert Mustacchi /**********************End of PFC code**************************************/
601*d14abf15SRobert Mustacchi /**********************start DCBX Common FUNCTIONS**************************************/
602*d14abf15SRobert Mustacchi #define ETH_TYPE_FCOE                   (0x8906)
603*d14abf15SRobert Mustacchi #define TCP_PORT_ISCSI                  (0xCBC)
604*d14abf15SRobert Mustacchi 
605*d14abf15SRobert Mustacchi 
606*d14abf15SRobert Mustacchi /*******************************************************************************
607*d14abf15SRobert Mustacchi  * Description:
608*d14abf15SRobert Mustacchi  *              Runtime changes can take more than 1 second and can't be handled
609*d14abf15SRobert Mustacchi  *              from DPC.
610*d14abf15SRobert Mustacchi  *              When the PMF detects a DCBX update it will schedule a WI that
611*d14abf15SRobert Mustacchi  *              will handle the job.
612*d14abf15SRobert Mustacchi  *              Also the function lm_dcbx_stop_HW_TX/lm_dcbx_resume_HW_TX must be
613*d14abf15SRobert Mustacchi  *              called in mutual exclusion.
614*d14abf15SRobert Mustacchi  *              lm_mcp_cmd_send_recieve must be called from default DPC, so when the
615*d14abf15SRobert Mustacchi  *              WI will finish the processing an interrupt that will be called from
616*d14abf15SRobert Mustacchi  *              The WI will cause us to enter this function again and send the Ack.
617*d14abf15SRobert Mustacchi  *
618*d14abf15SRobert Mustacchi  * Return:
619*d14abf15SRobert Mustacchi ******************************************************************************/
620*d14abf15SRobert Mustacchi void
lm_dcbx_event(lm_device_t * pdev,u32_t drv_status)621*d14abf15SRobert Mustacchi lm_dcbx_event(lm_device_t *pdev,
622*d14abf15SRobert Mustacchi               u32_t         drv_status)
623*d14abf15SRobert Mustacchi {
624*d14abf15SRobert Mustacchi 
625*d14abf15SRobert Mustacchi     u32_t fw_resp = 0;
626*d14abf15SRobert Mustacchi     lm_status_t lm_status         = LM_STATUS_SUCCESS ;
627*d14abf15SRobert Mustacchi 
628*d14abf15SRobert Mustacchi     if(IS_PMF(pdev))
629*d14abf15SRobert Mustacchi     {
630*d14abf15SRobert Mustacchi         if( GET_FLAGS( drv_status, DRV_STATUS_DCBX_NEGOTIATION_RESULTS))
631*d14abf15SRobert Mustacchi         {
632*d14abf15SRobert Mustacchi             switch(pdev->dcbx_info.dcbx_update_lpme_task_state)
633*d14abf15SRobert Mustacchi             {
634*d14abf15SRobert Mustacchi             case DCBX_UPDATE_TASK_STATE_FREE:
635*d14abf15SRobert Mustacchi                 // free: this is the first time we saw
636*d14abf15SRobert Mustacchi                 // this DRV_STATUS_DCBX_NEGOTIATION_RES
637*d14abf15SRobert Mustacchi                 if(FALSE == IS_DCB_ENABLED(pdev))
638*d14abf15SRobert Mustacchi                 {
639*d14abf15SRobert Mustacchi                     return;
640*d14abf15SRobert Mustacchi                 }
641*d14abf15SRobert Mustacchi                 pdev->dcbx_info.dcbx_update_lpme_task_state =
642*d14abf15SRobert Mustacchi                     DCBX_UPDATE_TASK_STATE_SCHEDULE;
643*d14abf15SRobert Mustacchi                 lm_status = MM_REGISTER_LPME(pdev,
644*d14abf15SRobert Mustacchi                                              lm_dcbx_update_lpme_set_params,
645*d14abf15SRobert Mustacchi                                              TRUE,
646*d14abf15SRobert Mustacchi                                              FALSE);// DCBX sends ramrods
647*d14abf15SRobert Mustacchi 
648*d14abf15SRobert Mustacchi                 if (LM_STATUS_SUCCESS != lm_status)
649*d14abf15SRobert Mustacchi                 {
650*d14abf15SRobert Mustacchi                     pdev->dcbx_info.dcbx_update_lpme_task_state =
651*d14abf15SRobert Mustacchi                         DCBX_UPDATE_TASK_STATE_FREE;
652*d14abf15SRobert Mustacchi                     if(LM_STATUS_REQUEST_NOT_ACCEPTED == lm_status)
653*d14abf15SRobert Mustacchi                     {// DCBX MM_REGISTER_LPME can fail
654*d14abf15SRobert Mustacchi                         pdev->dcbx_info.lpme_failed_cnt++;
655*d14abf15SRobert Mustacchi                         return;
656*d14abf15SRobert Mustacchi                     }
657*d14abf15SRobert Mustacchi                     pdev->dcbx_info.dcbx_error |= DCBX_ERROR_REGISTER_LPME;
658*d14abf15SRobert Mustacchi                     // No rollback
659*d14abf15SRobert Mustacchi                     // Problem because we won't get to DCBX_UPDATE_TASK_STATE_HANDLED (we won't schedule an interrupt)
660*d14abf15SRobert Mustacchi                     DbgBreakMsg("lm_dcbx_int : The chip QM queues are stuck until an interrupt from MCP");
661*d14abf15SRobert Mustacchi                     //Free the MCP
662*d14abf15SRobert Mustacchi                     lm_status = lm_mcp_cmd_send_recieve( pdev,
663*d14abf15SRobert Mustacchi                                                      lm_mcp_mb_header,
664*d14abf15SRobert Mustacchi                                                      DRV_MSG_CODE_DCBX_PMF_DRV_OK,
665*d14abf15SRobert Mustacchi                                                      0,
666*d14abf15SRobert Mustacchi                                                      MCP_CMD_DEFAULT_TIMEOUT,
667*d14abf15SRobert Mustacchi                                                      &fw_resp ) ;
668*d14abf15SRobert Mustacchi 
669*d14abf15SRobert Mustacchi                    DbgBreakIf( lm_status != LM_STATUS_SUCCESS );
670*d14abf15SRobert Mustacchi 
671*d14abf15SRobert Mustacchi                 }
672*d14abf15SRobert Mustacchi                 break;
673*d14abf15SRobert Mustacchi 
674*d14abf15SRobert Mustacchi             case DCBX_UPDATE_TASK_STATE_SCHEDULE:
675*d14abf15SRobert Mustacchi                 // Schedule: We saw before that DRV_STATUS_DCBX_NEGOTIATION_RES
676*d14abf15SRobert Mustacchi                 // is set before, and didn�t handle it yet
677*d14abf15SRobert Mustacchi                 break;
678*d14abf15SRobert Mustacchi 
679*d14abf15SRobert Mustacchi             case DCBX_UPDATE_TASK_STATE_HANDLED:
680*d14abf15SRobert Mustacchi                 // handled: the WI handled was handled ,The MCP needs to updated
681*d14abf15SRobert Mustacchi                 pdev->dcbx_info.dcbx_update_lpme_task_state =
682*d14abf15SRobert Mustacchi                     DCBX_UPDATE_TASK_STATE_FREE;
683*d14abf15SRobert Mustacchi 
684*d14abf15SRobert Mustacchi                 lm_status = lm_mcp_cmd_send_recieve( pdev,
685*d14abf15SRobert Mustacchi                                                      lm_mcp_mb_header,
686*d14abf15SRobert Mustacchi                                                      DRV_MSG_CODE_DCBX_PMF_DRV_OK,
687*d14abf15SRobert Mustacchi                                                      0,
688*d14abf15SRobert Mustacchi                                                      MCP_CMD_DEFAULT_TIMEOUT,
689*d14abf15SRobert Mustacchi                                                      &fw_resp ) ;
690*d14abf15SRobert Mustacchi 
691*d14abf15SRobert Mustacchi                 DbgBreakIf( lm_status != LM_STATUS_SUCCESS );
692*d14abf15SRobert Mustacchi                 break;
693*d14abf15SRobert Mustacchi             default:
694*d14abf15SRobert Mustacchi                 DbgBreakMsg("illegal value for dcbx_update_lpme_task_state");
695*d14abf15SRobert Mustacchi                 break;
696*d14abf15SRobert Mustacchi             }
697*d14abf15SRobert Mustacchi         }
698*d14abf15SRobert Mustacchi     }
699*d14abf15SRobert Mustacchi }
700*d14abf15SRobert Mustacchi 
701*d14abf15SRobert Mustacchi /*******************************************************************************
702*d14abf15SRobert Mustacchi  * Description: Calculate the number of priority PG.
703*d14abf15SRobert Mustacchi  * The number of priority pg should be derived from the available traffic type
704*d14abf15SRobert Mustacchi  * and pg_pri_orginal_spread configured priorities
705*d14abf15SRobert Mustacchi  *
706*d14abf15SRobert Mustacchi  * Return:
707*d14abf15SRobert Mustacchi  ******************************************************************************/
708*d14abf15SRobert Mustacchi STATIC void
lm_dcbx_cee_get_num_of_pg_traf_type(IN lm_device_t * pdev,IN u32_t pg_pri_orginal_spread[DCBX_MAX_NUM_PRI_PG_ENTRIES],OUT pg_help_data_t * pg_help_data)709*d14abf15SRobert Mustacchi lm_dcbx_cee_get_num_of_pg_traf_type(
710*d14abf15SRobert Mustacchi     IN  lm_device_t     *pdev,
711*d14abf15SRobert Mustacchi     IN  u32_t           pg_pri_orginal_spread[DCBX_MAX_NUM_PRI_PG_ENTRIES],
712*d14abf15SRobert Mustacchi     OUT pg_help_data_t  *pg_help_data)
713*d14abf15SRobert Mustacchi {
714*d14abf15SRobert Mustacchi     u8_t    i                                       = 0;
715*d14abf15SRobert Mustacchi     u8_t    b_pg_found                              = FALSE;
716*d14abf15SRobert Mustacchi     u8_t    search_traf_type                        = 0;
717*d14abf15SRobert Mustacchi     u8_t    add_traf_type                           = 0;
718*d14abf15SRobert Mustacchi     u8_t    add_pg                                  = 0;
719*d14abf15SRobert Mustacchi 
720*d14abf15SRobert Mustacchi     ASSERT_STATIC( DCBX_MAX_NUM_PRI_PG_ENTRIES == 8);
721*d14abf15SRobert Mustacchi 
722*d14abf15SRobert Mustacchi     // Set to invalid
723*d14abf15SRobert Mustacchi     for (i = 0; i < ARRSIZE(pg_help_data->pg_entry_data); i++)
724*d14abf15SRobert Mustacchi     {
725*d14abf15SRobert Mustacchi         pg_help_data->pg_entry_data[i].pg = DCBX_ILLEGAL_PG;
726*d14abf15SRobert Mustacchi     }
727*d14abf15SRobert Mustacchi 
728*d14abf15SRobert Mustacchi     for (add_traf_type = 0; add_traf_type < ARRSIZE(pg_help_data->pg_entry_data); add_traf_type++)
729*d14abf15SRobert Mustacchi     {
730*d14abf15SRobert Mustacchi         ASSERT_STATIC(ARRSIZE(pg_help_data->pg_entry_data) ==
731*d14abf15SRobert Mustacchi                       ARRSIZE(pdev->params.dcbx_port_params.app.traffic_type_priority));
732*d14abf15SRobert Mustacchi 
733*d14abf15SRobert Mustacchi         b_pg_found = FALSE;
734*d14abf15SRobert Mustacchi         if (pdev->params.dcbx_port_params.app.traffic_type_priority[add_traf_type] < MAX_PFC_PRIORITIES)
735*d14abf15SRobert Mustacchi         {
736*d14abf15SRobert Mustacchi             add_pg = (u8_t)pg_pri_orginal_spread[pdev->params.dcbx_port_params.app.traffic_type_priority[add_traf_type]];
737*d14abf15SRobert Mustacchi             for (search_traf_type = 0; search_traf_type < ARRSIZE(pg_help_data->pg_entry_data); search_traf_type++)
738*d14abf15SRobert Mustacchi             {
739*d14abf15SRobert Mustacchi                 if (pg_help_data->pg_entry_data[search_traf_type].pg == add_pg)
740*d14abf15SRobert Mustacchi                 {
741*d14abf15SRobert Mustacchi                     if(0 == (pg_help_data->pg_entry_data[search_traf_type].pg_priority &
742*d14abf15SRobert Mustacchi                              (1 << pdev->params.dcbx_port_params.app.traffic_type_priority[add_traf_type])))
743*d14abf15SRobert Mustacchi                     {
744*d14abf15SRobert Mustacchi                         pg_help_data->pg_entry_data[search_traf_type].num_of_dif_pri++;
745*d14abf15SRobert Mustacchi                     }
746*d14abf15SRobert Mustacchi                     pg_help_data->pg_entry_data[search_traf_type].pg_priority |=
747*d14abf15SRobert Mustacchi                         (1 << pdev->params.dcbx_port_params.app.traffic_type_priority[add_traf_type]);
748*d14abf15SRobert Mustacchi 
749*d14abf15SRobert Mustacchi                     b_pg_found = TRUE;
750*d14abf15SRobert Mustacchi                     break;
751*d14abf15SRobert Mustacchi                 }
752*d14abf15SRobert Mustacchi             }
753*d14abf15SRobert Mustacchi             if(FALSE == b_pg_found)
754*d14abf15SRobert Mustacchi             {
755*d14abf15SRobert Mustacchi                 pg_help_data->pg_entry_data[pg_help_data->num_of_pg].pg             = add_pg;
756*d14abf15SRobert Mustacchi                 pg_help_data->pg_entry_data[pg_help_data->num_of_pg].pg_priority    = (1 << pdev->params.dcbx_port_params.app.traffic_type_priority[add_traf_type]);
757*d14abf15SRobert Mustacchi                 pg_help_data->pg_entry_data[pg_help_data->num_of_pg].num_of_dif_pri = 1;
758*d14abf15SRobert Mustacchi                 pg_help_data->num_of_pg++;
759*d14abf15SRobert Mustacchi             }
760*d14abf15SRobert Mustacchi         }
761*d14abf15SRobert Mustacchi     }
762*d14abf15SRobert Mustacchi     DbgBreakIf(pg_help_data->num_of_pg > LLFC_DRIVER_TRAFFIC_TYPE_MAX);
763*d14abf15SRobert Mustacchi }
764*d14abf15SRobert Mustacchi /*******************************************************************************
765*d14abf15SRobert Mustacchi  * Description: Still
766*d14abf15SRobert Mustacchi  *
767*d14abf15SRobert Mustacchi  * Return:
768*d14abf15SRobert Mustacchi  ******************************************************************************/
769*d14abf15SRobert Mustacchi STATIC void
lm_dcbx_fill_cos_entry(lm_device_t * pdev,dcbx_cos_params_t * cos_params,const u32_t pri_join_mask,const u32_t bw,const u8_t pauseable,const u8_t strict)770*d14abf15SRobert Mustacchi lm_dcbx_fill_cos_entry(
771*d14abf15SRobert Mustacchi     lm_device_t         *pdev,
772*d14abf15SRobert Mustacchi     dcbx_cos_params_t   *cos_params,
773*d14abf15SRobert Mustacchi     const u32_t         pri_join_mask,
774*d14abf15SRobert Mustacchi     const u32_t         bw,
775*d14abf15SRobert Mustacchi     const u8_t          pauseable,
776*d14abf15SRobert Mustacchi     const u8_t          strict)
777*d14abf15SRobert Mustacchi {
778*d14abf15SRobert Mustacchi     cos_params->s_pri       = strict;
779*d14abf15SRobert Mustacchi     cos_params->bw_tbl      = bw;
780*d14abf15SRobert Mustacchi     cos_params->pri_bitmask = pri_join_mask;
781*d14abf15SRobert Mustacchi 
782*d14abf15SRobert Mustacchi 
783*d14abf15SRobert Mustacchi     // This filed is only for debbuging in CHIP_IS_E2E3A0(pdev)
784*d14abf15SRobert Mustacchi     cos_params->pauseable   = pauseable;
785*d14abf15SRobert Mustacchi 
786*d14abf15SRobert Mustacchi     if((DCBX_INVALID_COS_BW != bw)||
787*d14abf15SRobert Mustacchi        (DCBX_S_PRI_INVALID != strict))
788*d14abf15SRobert Mustacchi     {
789*d14abf15SRobert Mustacchi         DbgBreakIf(0 == pri_join_mask);
790*d14abf15SRobert Mustacchi 
791*d14abf15SRobert Mustacchi         if(CHIP_IS_E2E3A0(pdev))
792*d14abf15SRobert Mustacchi         {
793*d14abf15SRobert Mustacchi     if(pauseable)
794*d14abf15SRobert Mustacchi     {
795*d14abf15SRobert Mustacchi                 DbgBreakIf(0 != LM_DCBX_PFC_PRI_GET_NON_PAUSE(pdev,cos_params->pri_bitmask));
796*d14abf15SRobert Mustacchi     }
797*d14abf15SRobert Mustacchi     else
798*d14abf15SRobert Mustacchi     {
799*d14abf15SRobert Mustacchi                 DbgBreakIf(0 != LM_DCBX_PFC_PRI_GET_PAUSE(pdev,cos_params->pri_bitmask));
800*d14abf15SRobert Mustacchi             }
801*d14abf15SRobert Mustacchi         }
802*d14abf15SRobert Mustacchi     }
803*d14abf15SRobert Mustacchi }
804*d14abf15SRobert Mustacchi 
805*d14abf15SRobert Mustacchi /**
806*d14abf15SRobert Mustacchi  * @description
807*d14abf15SRobert Mustacchi  * Disable ETS.
808*d14abf15SRobert Mustacchi  * @param pdev
809*d14abf15SRobert Mustacchi  *
810*d14abf15SRobert Mustacchi  * @return STATIC void
811*d14abf15SRobert Mustacchi  */
812*d14abf15SRobert Mustacchi STATIC void
lm_dcbx_ets_disable(INOUT lm_device_t * pdev)813*d14abf15SRobert Mustacchi lm_dcbx_ets_disable(
814*d14abf15SRobert Mustacchi     INOUT       lm_device_t         *pdev)
815*d14abf15SRobert Mustacchi {
816*d14abf15SRobert Mustacchi     pg_params_t *ets = &pdev->params.dcbx_port_params.ets;
817*d14abf15SRobert Mustacchi 
818*d14abf15SRobert Mustacchi     ets->enabled = FALSE;
819*d14abf15SRobert Mustacchi     ets->num_of_cos = 1;
820*d14abf15SRobert Mustacchi 
821*d14abf15SRobert Mustacchi     ets->cos_params[0].pri_bitmask  = 0xFF;
822*d14abf15SRobert Mustacchi     ets->cos_params[0].bw_tbl       = DCBX_INVALID_COS_BW;
823*d14abf15SRobert Mustacchi     ets->cos_params[0].s_pri        = DCBX_S_PRI_COS_HIGHEST;
824*d14abf15SRobert Mustacchi     ets->cos_params[0].pauseable    =
825*d14abf15SRobert Mustacchi         LM_DCBX_IS_PFC_PRI_SOME_PAUSE(pdev,ets->cos_params[0].pri_bitmask);
826*d14abf15SRobert Mustacchi }
827*d14abf15SRobert Mustacchi /**
828*d14abf15SRobert Mustacchi  * @description
829*d14abf15SRobert Mustacchi  * Clean up old settings of ets and initialize the COS param
830*d14abf15SRobert Mustacchi  * struct.
831*d14abf15SRobert Mustacchi  * @param pdev
832*d14abf15SRobert Mustacchi  * @param ets
833*d14abf15SRobert Mustacchi  *
834*d14abf15SRobert Mustacchi  * @return STATIC void
835*d14abf15SRobert Mustacchi  */
836*d14abf15SRobert Mustacchi STATIC void
lm_dcbx_init_ets_internal_param(lm_device_t * pdev,pg_params_t * ets)837*d14abf15SRobert Mustacchi lm_dcbx_init_ets_internal_param(
838*d14abf15SRobert Mustacchi     lm_device_t         *pdev,
839*d14abf15SRobert Mustacchi     pg_params_t         *ets)
840*d14abf15SRobert Mustacchi {
841*d14abf15SRobert Mustacchi     u8_t i = 0;
842*d14abf15SRobert Mustacchi     ets->enabled = FALSE;
843*d14abf15SRobert Mustacchi     ets->num_of_cos = 0 ;
844*d14abf15SRobert Mustacchi 
845*d14abf15SRobert Mustacchi     for(i=0; i < ARRSIZE(ets->cos_params) ; i++)
846*d14abf15SRobert Mustacchi     {
847*d14abf15SRobert Mustacchi         lm_dcbx_fill_cos_entry(pdev,
848*d14abf15SRobert Mustacchi                                &ets->cos_params[i],
849*d14abf15SRobert Mustacchi                                0,
850*d14abf15SRobert Mustacchi                                DCBX_INVALID_COS_BW,
851*d14abf15SRobert Mustacchi                                FALSE,
852*d14abf15SRobert Mustacchi                                DCBX_S_PRI_INVALID);
853*d14abf15SRobert Mustacchi     }
854*d14abf15SRobert Mustacchi }
855*d14abf15SRobert Mustacchi /*******************************************************************************
856*d14abf15SRobert Mustacchi  * Description: single priority group
857*d14abf15SRobert Mustacchi  *
858*d14abf15SRobert Mustacchi  * Return:
859*d14abf15SRobert Mustacchi  ******************************************************************************/
860*d14abf15SRobert Mustacchi STATIC void
lm_dcbx_ets_disabled_entry_data(IN lm_device_t * pdev,OUT cos_help_data_t * cos_data,IN const u32_t pri_join_mask)861*d14abf15SRobert Mustacchi lm_dcbx_ets_disabled_entry_data(
862*d14abf15SRobert Mustacchi     IN  lm_device_t                 *pdev,
863*d14abf15SRobert Mustacchi     OUT cos_help_data_t             *cos_data,
864*d14abf15SRobert Mustacchi     IN  const   u32_t               pri_join_mask)
865*d14abf15SRobert Mustacchi {
866*d14abf15SRobert Mustacchi       // Only one priority than only one COS
867*d14abf15SRobert Mustacchi     cos_data->entry_data[0].b_pausable      = LM_DCBX_IS_PFC_PRI_ONLY_PAUSE(pdev,pri_join_mask);
868*d14abf15SRobert Mustacchi         cos_data->entry_data[0].pri_join_mask   = pri_join_mask;
869*d14abf15SRobert Mustacchi         cos_data->entry_data[0].cos_bw          = 100;
870*d14abf15SRobert Mustacchi         cos_data->num_of_cos = 1;
871*d14abf15SRobert Mustacchi }
872*d14abf15SRobert Mustacchi 
873*d14abf15SRobert Mustacchi /*******************************************************************************
874*d14abf15SRobert Mustacchi  * Description: Updating the cos bw.
875*d14abf15SRobert Mustacchi  *
876*d14abf15SRobert Mustacchi  * Return:
877*d14abf15SRobert Mustacchi  ******************************************************************************/
878*d14abf15SRobert Mustacchi STATIC void
lm_dcbx_add_to_cos_bw(IN lm_device_t * pdev,OUT cos_entry_help_data_t * entry_data,IN u8_t pg_bw)879*d14abf15SRobert Mustacchi lm_dcbx_add_to_cos_bw(
880*d14abf15SRobert Mustacchi     IN      lm_device_t             *pdev,
881*d14abf15SRobert Mustacchi     OUT     cos_entry_help_data_t   *entry_data,
882*d14abf15SRobert Mustacchi     IN      u8_t                    pg_bw)
883*d14abf15SRobert Mustacchi {
884*d14abf15SRobert Mustacchi 
885*d14abf15SRobert Mustacchi     if(DCBX_INVALID_COS_BW == entry_data->cos_bw )
886*d14abf15SRobert Mustacchi     {
887*d14abf15SRobert Mustacchi 
888*d14abf15SRobert Mustacchi         entry_data->cos_bw =  pg_bw;
889*d14abf15SRobert Mustacchi     }
890*d14abf15SRobert Mustacchi     else
891*d14abf15SRobert Mustacchi     {
892*d14abf15SRobert Mustacchi         entry_data->cos_bw +=  pg_bw;
893*d14abf15SRobert Mustacchi     }
894*d14abf15SRobert Mustacchi     DbgBreakIf(entry_data->cos_bw > DCBX_MAX_COS_BW);
895*d14abf15SRobert Mustacchi }
896*d14abf15SRobert Mustacchi /*******************************************************************************
897*d14abf15SRobert Mustacchi  * Description: single priority group
898*d14abf15SRobert Mustacchi  *
899*d14abf15SRobert Mustacchi  * Return:
900*d14abf15SRobert Mustacchi  ******************************************************************************/
901*d14abf15SRobert Mustacchi STATIC void
lm_dcbx_separate_pauseable_from_non(IN lm_device_t * pdev,OUT cos_help_data_t * cos_data,IN const u32_t * pg_pri_orginal_spread,IN const dcbx_ets_feature_t * ets)902*d14abf15SRobert Mustacchi lm_dcbx_separate_pauseable_from_non(
903*d14abf15SRobert Mustacchi     IN  lm_device_t                 *pdev,
904*d14abf15SRobert Mustacchi     OUT cos_help_data_t             *cos_data,
905*d14abf15SRobert Mustacchi     IN  const u32_t                 *pg_pri_orginal_spread,
906*d14abf15SRobert Mustacchi     IN  const dcbx_ets_feature_t    *ets
907*d14abf15SRobert Mustacchi     )
908*d14abf15SRobert Mustacchi {
909*d14abf15SRobert Mustacchi     u32_t       pri_tested      = 0;
910*d14abf15SRobert Mustacchi     u8_t        i               = 0;
911*d14abf15SRobert Mustacchi     u8_t        entry           = 0;
912*d14abf15SRobert Mustacchi     u8_t        pg_entry        = 0;
913*d14abf15SRobert Mustacchi     const u8_t  num_of_pri      = ARRSIZE(pdev->params.dcbx_port_params.app.traffic_type_priority);
914*d14abf15SRobert Mustacchi 
915*d14abf15SRobert Mustacchi     cos_data->entry_data[0].b_pausable = TRUE;
916*d14abf15SRobert Mustacchi     cos_data->entry_data[1].b_pausable = FALSE;
917*d14abf15SRobert Mustacchi     cos_data->entry_data[0].pri_join_mask = cos_data->entry_data[1].pri_join_mask = 0;
918*d14abf15SRobert Mustacchi 
919*d14abf15SRobert Mustacchi     for(i=0 ; i < num_of_pri ; i++)
920*d14abf15SRobert Mustacchi     {
921*d14abf15SRobert Mustacchi         DbgBreakIf(pdev->params.dcbx_port_params.app.traffic_type_priority[i] >= MAX_PFC_PRIORITIES);
922*d14abf15SRobert Mustacchi         pri_tested = 1 << pdev->params.dcbx_port_params.app.traffic_type_priority[i];
923*d14abf15SRobert Mustacchi 
924*d14abf15SRobert Mustacchi         if(pri_tested & LM_DCBX_PFC_PRI_NON_PAUSE_MASK(pdev))
925*d14abf15SRobert Mustacchi         {
926*d14abf15SRobert Mustacchi             cos_data->entry_data[1].pri_join_mask |= pri_tested;
927*d14abf15SRobert Mustacchi             entry       = 1;
928*d14abf15SRobert Mustacchi         }
929*d14abf15SRobert Mustacchi         else
930*d14abf15SRobert Mustacchi         {
931*d14abf15SRobert Mustacchi             cos_data->entry_data[0].pri_join_mask |= pri_tested;
932*d14abf15SRobert Mustacchi             entry = 0;
933*d14abf15SRobert Mustacchi 
934*d14abf15SRobert Mustacchi         }
935*d14abf15SRobert Mustacchi         pg_entry    = (u8_t)pg_pri_orginal_spread[pdev->params.dcbx_port_params.app.traffic_type_priority[i]];
936*d14abf15SRobert Mustacchi         // There can be only one strict pg
937*d14abf15SRobert Mustacchi         if( pg_entry < DCBX_MAX_NUM_PRI_PG_ENTRIES)
938*d14abf15SRobert Mustacchi         {
939*d14abf15SRobert Mustacchi             lm_dcbx_add_to_cos_bw(pdev,
940*d14abf15SRobert Mustacchi                                   &(cos_data->entry_data[entry]),
941*d14abf15SRobert Mustacchi                                   DCBX_PG_BW_GET(ets->pg_bw_tbl, pg_entry));
942*d14abf15SRobert Mustacchi         }
943*d14abf15SRobert Mustacchi         else
944*d14abf15SRobert Mustacchi         {
945*d14abf15SRobert Mustacchi             // If we join a group and one is strict than the bw rulls
946*d14abf15SRobert Mustacchi             cos_data->entry_data[entry].s_pri = DCBX_S_PRI_COS_HIGHEST;
947*d14abf15SRobert Mustacchi         }
948*d14abf15SRobert Mustacchi     }//end of for
949*d14abf15SRobert Mustacchi     // Both groups must have priorities
950*d14abf15SRobert Mustacchi     DbgBreakIf(( 0 == cos_data->entry_data[0].pri_join_mask) && ( 0 == cos_data->entry_data[1].pri_join_mask));
951*d14abf15SRobert Mustacchi }
952*d14abf15SRobert Mustacchi 
953*d14abf15SRobert Mustacchi /**
954*d14abf15SRobert Mustacchi  * @description
955*d14abf15SRobert Mustacchi  * if the number of requested PG-s in CEE is greater than
956*d14abf15SRobert Mustacchi  *  expected then the results are not determined since this is a
957*d14abf15SRobert Mustacchi  *  violation of the standard.
958*d14abf15SRobert Mustacchi  * @param pdev
959*d14abf15SRobert Mustacchi  * @param pg_help_data
960*d14abf15SRobert Mustacchi  * @param required_num_of_pg
961*d14abf15SRobert Mustacchi  *
962*d14abf15SRobert Mustacchi  * @return STATIC lm_status_t
963*d14abf15SRobert Mustacchi  * If we weren't successful in reducing the number of PGs to
964*d14abf15SRobert Mustacchi  * required_num_of_pg.
965*d14abf15SRobert Mustacchi  */
966*d14abf15SRobert Mustacchi STATIC lm_status_t
lm_dcbx_join_pgs(IN lm_device_t * pdev,IN dcbx_ets_feature_t * ets,INOUT pg_help_data_t * pg_help_data,IN const u8_t required_num_of_pg)967*d14abf15SRobert Mustacchi lm_dcbx_join_pgs(
968*d14abf15SRobert Mustacchi     IN          lm_device_t         *pdev,
969*d14abf15SRobert Mustacchi     IN          dcbx_ets_feature_t  *ets,
970*d14abf15SRobert Mustacchi     INOUT       pg_help_data_t      *pg_help_data,
971*d14abf15SRobert Mustacchi     IN const    u8_t                required_num_of_pg)
972*d14abf15SRobert Mustacchi {
973*d14abf15SRobert Mustacchi     lm_status_t lm_status       = LM_STATUS_SUCCESS;
974*d14abf15SRobert Mustacchi     u8_t        entry_joined    = pg_help_data->num_of_pg -1;
975*d14abf15SRobert Mustacchi     u8_t        entry_removed   = entry_joined + 1;
976*d14abf15SRobert Mustacchi     u8_t        pg_joined       = 0;
977*d14abf15SRobert Mustacchi 
978*d14abf15SRobert Mustacchi     // Algorithm below limitation (-2)
979*d14abf15SRobert Mustacchi     if((required_num_of_pg < 2 )||
980*d14abf15SRobert Mustacchi        (ARRSIZE(pg_help_data->pg_entry_data) <= pg_help_data->num_of_pg)||
981*d14abf15SRobert Mustacchi        ( pg_help_data->num_of_pg <= required_num_of_pg))
982*d14abf15SRobert Mustacchi     {
983*d14abf15SRobert Mustacchi         DbgBreakMsg("lm_dcbx_join_pg_data required_num_of_pg can't be zero");
984*d14abf15SRobert Mustacchi         return LM_STATUS_FAILURE;
985*d14abf15SRobert Mustacchi     }
986*d14abf15SRobert Mustacchi 
987*d14abf15SRobert Mustacchi     while(required_num_of_pg < pg_help_data->num_of_pg)
988*d14abf15SRobert Mustacchi     {
989*d14abf15SRobert Mustacchi         entry_joined = pg_help_data->num_of_pg -2;
990*d14abf15SRobert Mustacchi         entry_removed = entry_joined + 1;
991*d14abf15SRobert Mustacchi 
992*d14abf15SRobert Mustacchi         pg_help_data->pg_entry_data[entry_joined].pg_priority |=
993*d14abf15SRobert Mustacchi             pg_help_data->pg_entry_data[entry_removed].pg_priority;
994*d14abf15SRobert Mustacchi 
995*d14abf15SRobert Mustacchi         pg_help_data->pg_entry_data[entry_joined].num_of_dif_pri +=
996*d14abf15SRobert Mustacchi             pg_help_data->pg_entry_data[entry_removed].num_of_dif_pri;
997*d14abf15SRobert Mustacchi 
998*d14abf15SRobert Mustacchi          if((DCBX_STRICT_PRI_PG == pg_help_data->pg_entry_data[entry_joined].pg ) ||
999*d14abf15SRobert Mustacchi                 (DCBX_STRICT_PRI_PG == pg_help_data->pg_entry_data[entry_removed].pg))
1000*d14abf15SRobert Mustacchi          {
1001*d14abf15SRobert Mustacchi              // Entries joined strict priority rules
1002*d14abf15SRobert Mustacchi              pg_help_data->pg_entry_data[entry_joined].pg = DCBX_STRICT_PRI_PG;
1003*d14abf15SRobert Mustacchi          }
1004*d14abf15SRobert Mustacchi          else
1005*d14abf15SRobert Mustacchi          {
1006*d14abf15SRobert Mustacchi              // Entries can be joined join BW
1007*d14abf15SRobert Mustacchi              pg_joined  = DCBX_PG_BW_GET(ets->pg_bw_tbl, pg_help_data->pg_entry_data[entry_joined].pg) +
1008*d14abf15SRobert Mustacchi                  DCBX_PG_BW_GET(ets->pg_bw_tbl, pg_help_data->pg_entry_data[entry_removed].pg);
1009*d14abf15SRobert Mustacchi 
1010*d14abf15SRobert Mustacchi              DCBX_PG_BW_SET(ets->pg_bw_tbl, pg_help_data->pg_entry_data[entry_joined].pg,pg_joined);
1011*d14abf15SRobert Mustacchi          }
1012*d14abf15SRobert Mustacchi          // Joined the entries
1013*d14abf15SRobert Mustacchi          pg_help_data->num_of_pg--;
1014*d14abf15SRobert Mustacchi     }
1015*d14abf15SRobert Mustacchi     return lm_status;
1016*d14abf15SRobert Mustacchi }
1017*d14abf15SRobert Mustacchi /**
1018*d14abf15SRobert Mustacchi  * @description
1019*d14abf15SRobert Mustacchi  * Fill pause entries in entry_data
1020*d14abf15SRobert Mustacchi  * @param pdev
1021*d14abf15SRobert Mustacchi  * @param entry_data
1022*d14abf15SRobert Mustacchi  *
1023*d14abf15SRobert Mustacchi  * @return STATIC void
1024*d14abf15SRobert Mustacchi  */
1025*d14abf15SRobert Mustacchi STATIC void
lm_dcbx_ets_fill_cos_entry_data_as_pause(IN lm_device_t * pdev,OUT cos_entry_help_data_t * entry_data,IN const u32_t pri_join_mask)1026*d14abf15SRobert Mustacchi lm_dcbx_ets_fill_cos_entry_data_as_pause(
1027*d14abf15SRobert Mustacchi     IN  lm_device_t             *pdev,
1028*d14abf15SRobert Mustacchi     OUT cos_entry_help_data_t   *entry_data,
1029*d14abf15SRobert Mustacchi     IN  const   u32_t           pri_join_mask
1030*d14abf15SRobert Mustacchi     )
1031*d14abf15SRobert Mustacchi {
1032*d14abf15SRobert Mustacchi     entry_data->b_pausable      = TRUE;
1033*d14abf15SRobert Mustacchi     entry_data->pri_join_mask   = LM_DCBX_PFC_PRI_GET_PAUSE(pdev,pri_join_mask);
1034*d14abf15SRobert Mustacchi }
1035*d14abf15SRobert Mustacchi 
1036*d14abf15SRobert Mustacchi /**
1037*d14abf15SRobert Mustacchi  * @description
1038*d14abf15SRobert Mustacchi  * Fill pause entries in entry_data
1039*d14abf15SRobert Mustacchi  * @param pdev
1040*d14abf15SRobert Mustacchi  * @param entry_data
1041*d14abf15SRobert Mustacchi  *
1042*d14abf15SRobert Mustacchi  * @return STATIC void
1043*d14abf15SRobert Mustacchi  */
1044*d14abf15SRobert Mustacchi STATIC void
lm_dcbx_ets_fill_cos_entry_data_as_non_pause(IN lm_device_t * pdev,OUT cos_entry_help_data_t * entry_data,IN const u32_t pri_join_mask)1045*d14abf15SRobert Mustacchi lm_dcbx_ets_fill_cos_entry_data_as_non_pause(
1046*d14abf15SRobert Mustacchi     IN  lm_device_t             *pdev,
1047*d14abf15SRobert Mustacchi     OUT cos_entry_help_data_t   *entry_data,
1048*d14abf15SRobert Mustacchi     IN  const   u32_t           pri_join_mask
1049*d14abf15SRobert Mustacchi     )
1050*d14abf15SRobert Mustacchi {
1051*d14abf15SRobert Mustacchi     entry_data->b_pausable      = FALSE;
1052*d14abf15SRobert Mustacchi     entry_data->pri_join_mask   = LM_DCBX_PFC_PRI_GET_NON_PAUSE(pdev,pri_join_mask);
1053*d14abf15SRobert Mustacchi }
1054*d14abf15SRobert Mustacchi /*******************************************************************************
1055*d14abf15SRobert Mustacchi  * Description: single priority group
1056*d14abf15SRobert Mustacchi  *
1057*d14abf15SRobert Mustacchi  * Return:
1058*d14abf15SRobert Mustacchi  ******************************************************************************/
1059*d14abf15SRobert Mustacchi STATIC void
lm_dcbx_2cos_limit_cee_single_pg_to_cos_params(IN lm_device_t * pdev,IN pg_help_data_t * pg_help_data,OUT cos_help_data_t * cos_data,IN const u32_t pri_join_mask,IN const u8_t num_of_dif_pri)1060*d14abf15SRobert Mustacchi lm_dcbx_2cos_limit_cee_single_pg_to_cos_params(
1061*d14abf15SRobert Mustacchi     IN  lm_device_t                 *pdev,
1062*d14abf15SRobert Mustacchi     IN  pg_help_data_t              *pg_help_data,
1063*d14abf15SRobert Mustacchi     OUT cos_help_data_t             *cos_data,
1064*d14abf15SRobert Mustacchi     IN  const   u32_t               pri_join_mask,
1065*d14abf15SRobert Mustacchi     IN  const   u8_t                num_of_dif_pri
1066*d14abf15SRobert Mustacchi     )
1067*d14abf15SRobert Mustacchi {
1068*d14abf15SRobert Mustacchi     u8_t                    i                           = 0;
1069*d14abf15SRobert Mustacchi     u32_t                   pri_tested                  = 0;
1070*d14abf15SRobert Mustacchi     u32_t                   pri_mask_without_pri        = 0;
1071*d14abf15SRobert Mustacchi 
1072*d14abf15SRobert Mustacchi     if(1 == num_of_dif_pri)
1073*d14abf15SRobert Mustacchi     {
1074*d14abf15SRobert Mustacchi       // Only one priority than only one COS
1075*d14abf15SRobert Mustacchi         lm_dcbx_ets_disabled_entry_data(pdev,cos_data,pri_join_mask);
1076*d14abf15SRobert Mustacchi         return;
1077*d14abf15SRobert Mustacchi     }
1078*d14abf15SRobert Mustacchi 
1079*d14abf15SRobert Mustacchi     if( pg_help_data->pg_entry_data[0].pg < DCBX_MAX_NUM_PG_BW_ENTRIES)
1080*d14abf15SRobert Mustacchi     {// BW limited
1081*d14abf15SRobert Mustacchi         // If there are both pauseable and non-pauseable priorities, the pauseable priorities go to the first queue and the non-pauseable
1082*d14abf15SRobert Mustacchi         // priorities go to the second queue.
1083*d14abf15SRobert Mustacchi         if(LM_DCBX_IS_PFC_PRI_MIX_PAUSE(pdev,pri_join_mask))
1084*d14abf15SRobert Mustacchi         {
1085*d14abf15SRobert Mustacchi             DbgBreakIf( 1 == num_of_dif_pri );
1086*d14abf15SRobert Mustacchi             // Pause able
1087*d14abf15SRobert Mustacchi             lm_dcbx_ets_fill_cos_entry_data_as_pause(
1088*d14abf15SRobert Mustacchi                 pdev,
1089*d14abf15SRobert Mustacchi                 &cos_data->entry_data[0],
1090*d14abf15SRobert Mustacchi                 pri_join_mask);
1091*d14abf15SRobert Mustacchi             // Non pause able.
1092*d14abf15SRobert Mustacchi             lm_dcbx_ets_fill_cos_entry_data_as_non_pause(
1093*d14abf15SRobert Mustacchi                 pdev,
1094*d14abf15SRobert Mustacchi                 &cos_data->entry_data[1],
1095*d14abf15SRobert Mustacchi                 pri_join_mask);
1096*d14abf15SRobert Mustacchi 
1097*d14abf15SRobert Mustacchi             if(2 == num_of_dif_pri)
1098*d14abf15SRobert Mustacchi             {
1099*d14abf15SRobert Mustacchi                 cos_data->entry_data[0].cos_bw = 50;
1100*d14abf15SRobert Mustacchi                 cos_data->entry_data[1].cos_bw = 50;
1101*d14abf15SRobert Mustacchi             }
1102*d14abf15SRobert Mustacchi             if (3 == num_of_dif_pri)
1103*d14abf15SRobert Mustacchi             {
1104*d14abf15SRobert Mustacchi                 // We need to find out how has only one priority and how has two priorities.
1105*d14abf15SRobert Mustacchi                 // If the pri_bitmask is a power of 2 than there is only one priority.
1106*d14abf15SRobert Mustacchi                 if(POWER_OF_2(LM_DCBX_PFC_PRI_GET_PAUSE(pdev,pri_join_mask)))
1107*d14abf15SRobert Mustacchi                 {
1108*d14abf15SRobert Mustacchi                     DbgBreakIf(POWER_OF_2(LM_DCBX_PFC_PRI_GET_NON_PAUSE(pdev,pri_join_mask)));
1109*d14abf15SRobert Mustacchi                     cos_data->entry_data[0].cos_bw = 33;
1110*d14abf15SRobert Mustacchi                     cos_data->entry_data[1].cos_bw = 67;
1111*d14abf15SRobert Mustacchi                 }
1112*d14abf15SRobert Mustacchi                 else
1113*d14abf15SRobert Mustacchi                 {
1114*d14abf15SRobert Mustacchi                     DbgBreakIf(FALSE == POWER_OF_2(LM_DCBX_PFC_PRI_GET_NON_PAUSE(pdev,pri_join_mask)));
1115*d14abf15SRobert Mustacchi                     cos_data->entry_data[0].cos_bw = 67;
1116*d14abf15SRobert Mustacchi                     cos_data->entry_data[1].cos_bw = 33;
1117*d14abf15SRobert Mustacchi                 }
1118*d14abf15SRobert Mustacchi             }
1119*d14abf15SRobert Mustacchi         }
1120*d14abf15SRobert Mustacchi         else if(LM_DCBX_IS_PFC_PRI_ONLY_PAUSE(pdev,pri_join_mask))
1121*d14abf15SRobert Mustacchi         {// If there are only pauseable priorities, then one/two priorities go
1122*d14abf15SRobert Mustacchi          // to the first queue and one priority goes to the second queue.
1123*d14abf15SRobert Mustacchi             if(2 == num_of_dif_pri)
1124*d14abf15SRobert Mustacchi             {
1125*d14abf15SRobert Mustacchi                 cos_data->entry_data[0].cos_bw = 50;
1126*d14abf15SRobert Mustacchi                 cos_data->entry_data[1].cos_bw = 50;
1127*d14abf15SRobert Mustacchi             }
1128*d14abf15SRobert Mustacchi             else
1129*d14abf15SRobert Mustacchi             {
1130*d14abf15SRobert Mustacchi                 DbgBreakIf(3 != num_of_dif_pri);
1131*d14abf15SRobert Mustacchi                 cos_data->entry_data[0].cos_bw = 67;
1132*d14abf15SRobert Mustacchi                 cos_data->entry_data[1].cos_bw = 33;
1133*d14abf15SRobert Mustacchi             }
1134*d14abf15SRobert Mustacchi             cos_data->entry_data[0].b_pausable       = cos_data->entry_data[1].b_pausable = TRUE;
1135*d14abf15SRobert Mustacchi             // All priorities except FCOE
1136*d14abf15SRobert Mustacchi             cos_data->entry_data[0].pri_join_mask    = (pri_join_mask & ((u8_t)~(1 << pdev->params.dcbx_port_params.app.traffic_type_priority[LLFC_TRAFFIC_TYPE_FCOE])));
1137*d14abf15SRobert Mustacchi             // Only FCOE priority.
1138*d14abf15SRobert Mustacchi             cos_data->entry_data[1].pri_join_mask    = (1 << pdev->params.dcbx_port_params.app.traffic_type_priority[LLFC_TRAFFIC_TYPE_FCOE]);
1139*d14abf15SRobert Mustacchi         }
1140*d14abf15SRobert Mustacchi         else
1141*d14abf15SRobert Mustacchi         {//If there are only non-pauseable priorities, they will all go to the same queue.
1142*d14abf15SRobert Mustacchi             DbgBreakIf(FALSE == LM_DCBX_IS_PFC_PRI_ONLY_NON_PAUSE(pdev,pri_join_mask));
1143*d14abf15SRobert Mustacchi             lm_dcbx_ets_disabled_entry_data(pdev,cos_data,pri_join_mask);
1144*d14abf15SRobert Mustacchi         }
1145*d14abf15SRobert Mustacchi     }
1146*d14abf15SRobert Mustacchi     else
1147*d14abf15SRobert Mustacchi     {
1148*d14abf15SRobert Mustacchi         // priority group which is not BW limited (PG#15):
1149*d14abf15SRobert Mustacchi         DbgBreakIf(DCBX_STRICT_PRI_PG != pg_help_data->pg_entry_data[0].pg);
1150*d14abf15SRobert Mustacchi         if(LM_DCBX_IS_PFC_PRI_MIX_PAUSE(pdev,pri_join_mask))
1151*d14abf15SRobert Mustacchi         {
1152*d14abf15SRobert Mustacchi             // If there are both pauseable and non-pauseable priorities, the pauseable priorities go
1153*d14abf15SRobert Mustacchi             // to the first queue and the non-pauseable priorities go to the second queue.
1154*d14abf15SRobert Mustacchi             if(LM_DCBX_PFC_PRI_GET_PAUSE(pdev,pri_join_mask) > LM_DCBX_PFC_PRI_GET_NON_PAUSE(pdev,pri_join_mask))
1155*d14abf15SRobert Mustacchi             {
1156*d14abf15SRobert Mustacchi                 cos_data->entry_data[0].s_pri        = DCBX_S_PRI_COS_HIGHEST;
1157*d14abf15SRobert Mustacchi                 cos_data->entry_data[1].s_pri        = DCBX_S_PRI_COS_NEXT_LOWER_PRI(DCBX_S_PRI_COS_HIGHEST);
1158*d14abf15SRobert Mustacchi             }
1159*d14abf15SRobert Mustacchi             else
1160*d14abf15SRobert Mustacchi             {
1161*d14abf15SRobert Mustacchi                 cos_data->entry_data[1].s_pri        = DCBX_S_PRI_COS_HIGHEST;
1162*d14abf15SRobert Mustacchi                 cos_data->entry_data[0].s_pri        = DCBX_S_PRI_COS_NEXT_LOWER_PRI(DCBX_S_PRI_COS_HIGHEST);
1163*d14abf15SRobert Mustacchi             }
1164*d14abf15SRobert Mustacchi             // Pause able
1165*d14abf15SRobert Mustacchi             lm_dcbx_ets_fill_cos_entry_data_as_pause(
1166*d14abf15SRobert Mustacchi                 pdev,
1167*d14abf15SRobert Mustacchi                 &cos_data->entry_data[0],
1168*d14abf15SRobert Mustacchi                 pri_join_mask);
1169*d14abf15SRobert Mustacchi             // Non pause-able.
1170*d14abf15SRobert Mustacchi             lm_dcbx_ets_fill_cos_entry_data_as_non_pause(
1171*d14abf15SRobert Mustacchi                 pdev,
1172*d14abf15SRobert Mustacchi                 &cos_data->entry_data[1],
1173*d14abf15SRobert Mustacchi                 pri_join_mask);
1174*d14abf15SRobert Mustacchi         }
1175*d14abf15SRobert Mustacchi         else
1176*d14abf15SRobert Mustacchi         {
1177*d14abf15SRobert Mustacchi             // If there are only pauseable priorities or only non-pauseable, the lower priorities
1178*d14abf15SRobert Mustacchi             // go to the first queue and the higher priorities go to the second queue.
1179*d14abf15SRobert Mustacchi             cos_data->entry_data[0].b_pausable = cos_data->entry_data[1].b_pausable = LM_DCBX_IS_PFC_PRI_ONLY_PAUSE(pdev,pri_join_mask);
1180*d14abf15SRobert Mustacchi 
1181*d14abf15SRobert Mustacchi             for(i=0 ; i < ARRSIZE(pdev->params.dcbx_port_params.app.traffic_type_priority) ; i++)
1182*d14abf15SRobert Mustacchi             {
1183*d14abf15SRobert Mustacchi                 DbgBreakIf(pdev->params.dcbx_port_params.app.traffic_type_priority[i] >= MAX_PFC_PRIORITIES);
1184*d14abf15SRobert Mustacchi                 pri_tested = 1 << pdev->params.dcbx_port_params.app.traffic_type_priority[i];
1185*d14abf15SRobert Mustacchi                 // Remove priority tested
1186*d14abf15SRobert Mustacchi                 pri_mask_without_pri = (pri_join_mask & ((u8_t)(~pri_tested)));
1187*d14abf15SRobert Mustacchi                 if( pri_mask_without_pri < pri_tested )
1188*d14abf15SRobert Mustacchi                 {
1189*d14abf15SRobert Mustacchi                     break;
1190*d14abf15SRobert Mustacchi                 }
1191*d14abf15SRobert Mustacchi             }
1192*d14abf15SRobert Mustacchi 
1193*d14abf15SRobert Mustacchi             if(i == ARRSIZE(pdev->params.dcbx_port_params.app.traffic_type_priority))
1194*d14abf15SRobert Mustacchi             {
1195*d14abf15SRobert Mustacchi                 DbgBreakMsg("lm_dcbx_fill_cos_params : Invalid value for pri_join_mask could not find a priority \n");
1196*d14abf15SRobert Mustacchi             }
1197*d14abf15SRobert Mustacchi             cos_data->entry_data[0].pri_join_mask = pri_mask_without_pri;
1198*d14abf15SRobert Mustacchi             cos_data->entry_data[1].pri_join_mask = pri_tested;
1199*d14abf15SRobert Mustacchi             // Both queues are strict priority, and that with the highest priority
1200*d14abf15SRobert Mustacchi             // gets the highest strict priority in the arbiter.
1201*d14abf15SRobert Mustacchi             cos_data->entry_data[1].s_pri      = DCBX_S_PRI_COS_HIGHEST;
1202*d14abf15SRobert Mustacchi             cos_data->entry_data[0].s_pri      = DCBX_S_PRI_COS_NEXT_LOWER_PRI(DCBX_S_PRI_COS_HIGHEST);
1203*d14abf15SRobert Mustacchi         }
1204*d14abf15SRobert Mustacchi     }
1205*d14abf15SRobert Mustacchi 
1206*d14abf15SRobert Mustacchi }
1207*d14abf15SRobert Mustacchi /*******************************************************************************
1208*d14abf15SRobert Mustacchi  * Description: Still
1209*d14abf15SRobert Mustacchi  *
1210*d14abf15SRobert Mustacchi  * Return:
1211*d14abf15SRobert Mustacchi  ******************************************************************************/
1212*d14abf15SRobert Mustacchi STATIC void
lm_dcbx_2cos_limit_cee_two_pg_to_cos_params(IN lm_device_t * pdev,IN pg_help_data_t * pg_help_data,IN const dcbx_ets_feature_t * ets,OUT cos_help_data_t * cos_data,IN const u32_t * pg_pri_orginal_spread,IN u32_t pri_join_mask,IN u8_t num_of_dif_pri)1213*d14abf15SRobert Mustacchi lm_dcbx_2cos_limit_cee_two_pg_to_cos_params(
1214*d14abf15SRobert Mustacchi     IN  lm_device_t                 *pdev,
1215*d14abf15SRobert Mustacchi     IN  pg_help_data_t              *pg_help_data,
1216*d14abf15SRobert Mustacchi     IN  const dcbx_ets_feature_t    *ets,
1217*d14abf15SRobert Mustacchi     OUT cos_help_data_t             *cos_data,
1218*d14abf15SRobert Mustacchi     IN  const u32_t                 *pg_pri_orginal_spread,
1219*d14abf15SRobert Mustacchi     IN  u32_t                       pri_join_mask,
1220*d14abf15SRobert Mustacchi     IN  u8_t                        num_of_dif_pri)
1221*d14abf15SRobert Mustacchi {
1222*d14abf15SRobert Mustacchi     u8_t                    i                           = 0;
1223*d14abf15SRobert Mustacchi     u8_t                    pg[DCBX_COS_MAX_NUM_E2E3A0]           = {0};
1224*d14abf15SRobert Mustacchi 
1225*d14abf15SRobert Mustacchi     // If there are both pauseable and non-pauseable priorities, the pauseable priorities
1226*d14abf15SRobert Mustacchi     // go to the first queue and the non-pauseable priorities go to the second queue.
1227*d14abf15SRobert Mustacchi     if(LM_DCBX_IS_PFC_PRI_MIX_PAUSE(pdev,pri_join_mask))
1228*d14abf15SRobert Mustacchi     {
1229*d14abf15SRobert Mustacchi         if(LM_DCBX_IS_PFC_PRI_MIX_PAUSE(pdev, pg_help_data->pg_entry_data[0].pg_priority) ||
1230*d14abf15SRobert Mustacchi                 LM_DCBX_IS_PFC_PRI_MIX_PAUSE(pdev, pg_help_data->pg_entry_data[1].pg_priority))
1231*d14abf15SRobert Mustacchi         {
1232*d14abf15SRobert Mustacchi             // If one PG contains both pauseable and non-pauseable priorities then ETS is disabled.
1233*d14abf15SRobert Mustacchi             DbgMessage(pdev, WARN, "lm_dcbx_fill_cos_params : PG contains both pauseable and non-pauseable "
1234*d14abf15SRobert Mustacchi                         "priorities -> ETS is disabled. \n");
1235*d14abf15SRobert Mustacchi             lm_dcbx_separate_pauseable_from_non(pdev,cos_data,pg_pri_orginal_spread,ets);
1236*d14abf15SRobert Mustacchi             // ETS disabled wrong configuration
1237*d14abf15SRobert Mustacchi             pdev->params.dcbx_port_params.ets.enabled = FALSE;
1238*d14abf15SRobert Mustacchi             return;
1239*d14abf15SRobert Mustacchi         }
1240*d14abf15SRobert Mustacchi 
1241*d14abf15SRobert Mustacchi         // Pause-able
1242*d14abf15SRobert Mustacchi         cos_data->entry_data[0].b_pausable = TRUE;
1243*d14abf15SRobert Mustacchi         // Non pause-able.
1244*d14abf15SRobert Mustacchi         cos_data->entry_data[1].b_pausable = FALSE;
1245*d14abf15SRobert Mustacchi         if(LM_DCBX_IS_PFC_PRI_ONLY_PAUSE(pdev, pg_help_data->pg_entry_data[0].pg_priority))
1246*d14abf15SRobert Mustacchi         {// 0 is pause-able
1247*d14abf15SRobert Mustacchi             cos_data->entry_data[0].pri_join_mask    = pg_help_data->pg_entry_data[0].pg_priority;
1248*d14abf15SRobert Mustacchi             pg[0]                                   = pg_help_data->pg_entry_data[0].pg;
1249*d14abf15SRobert Mustacchi             cos_data->entry_data[1].pri_join_mask    = pg_help_data->pg_entry_data[1].pg_priority;
1250*d14abf15SRobert Mustacchi             pg[1]                                   = pg_help_data->pg_entry_data[1].pg;
1251*d14abf15SRobert Mustacchi         }
1252*d14abf15SRobert Mustacchi         else
1253*d14abf15SRobert Mustacchi         {// 1 is pause-able
1254*d14abf15SRobert Mustacchi             cos_data->entry_data[0].pri_join_mask    = pg_help_data->pg_entry_data[1].pg_priority;
1255*d14abf15SRobert Mustacchi             pg[0]                                   = pg_help_data->pg_entry_data[1].pg;
1256*d14abf15SRobert Mustacchi             cos_data->entry_data[1].pri_join_mask    = pg_help_data->pg_entry_data[0].pg_priority;
1257*d14abf15SRobert Mustacchi             pg[1]                                   = pg_help_data->pg_entry_data[0].pg;
1258*d14abf15SRobert Mustacchi         }
1259*d14abf15SRobert Mustacchi     }
1260*d14abf15SRobert Mustacchi     else
1261*d14abf15SRobert Mustacchi     {
1262*d14abf15SRobert Mustacchi         //If there are only pauseable priorities or only non-pauseable, each PG goes to a queue.
1263*d14abf15SRobert Mustacchi         cos_data->entry_data[0].b_pausable       = cos_data->entry_data[1].b_pausable = LM_DCBX_IS_PFC_PRI_ONLY_PAUSE(pdev,pri_join_mask);
1264*d14abf15SRobert Mustacchi         cos_data->entry_data[0].pri_join_mask    = pg_help_data->pg_entry_data[0].pg_priority;
1265*d14abf15SRobert Mustacchi         pg[0]                                   = pg_help_data->pg_entry_data[0].pg;
1266*d14abf15SRobert Mustacchi         cos_data->entry_data[1].pri_join_mask    = pg_help_data->pg_entry_data[1].pg_priority;
1267*d14abf15SRobert Mustacchi         pg[1]                                   = pg_help_data->pg_entry_data[1].pg;
1268*d14abf15SRobert Mustacchi     }
1269*d14abf15SRobert Mustacchi 
1270*d14abf15SRobert Mustacchi     // There can be only one strict pg
1271*d14abf15SRobert Mustacchi     for(i=0 ; i < ARRSIZE(pg) ; i++)
1272*d14abf15SRobert Mustacchi     {
1273*d14abf15SRobert Mustacchi         if( pg[i] < DCBX_MAX_NUM_PG_BW_ENTRIES)
1274*d14abf15SRobert Mustacchi         {
1275*d14abf15SRobert Mustacchi             cos_data->entry_data[i].cos_bw =  DCBX_PG_BW_GET( ets->pg_bw_tbl,pg[i]);
1276*d14abf15SRobert Mustacchi         }
1277*d14abf15SRobert Mustacchi         else
1278*d14abf15SRobert Mustacchi         {
1279*d14abf15SRobert Mustacchi             cos_data->entry_data[i].s_pri = DCBX_S_PRI_COS_HIGHEST;
1280*d14abf15SRobert Mustacchi         }
1281*d14abf15SRobert Mustacchi     }
1282*d14abf15SRobert Mustacchi }
1283*d14abf15SRobert Mustacchi 
1284*d14abf15SRobert Mustacchi /*******************************************************************************
1285*d14abf15SRobert Mustacchi  * Description: Still
1286*d14abf15SRobert Mustacchi  *
1287*d14abf15SRobert Mustacchi  * Return:
1288*d14abf15SRobert Mustacchi  ******************************************************************************/
1289*d14abf15SRobert Mustacchi STATIC void
lm_dcbx_2cos_limit_cee_three_pg_to_cos_params(IN lm_device_t * pdev,IN pg_help_data_t * pg_help_data,IN const dcbx_ets_feature_t * ets,OUT cos_help_data_t * cos_data,IN const u32_t * pg_pri_orginal_spread,IN u32_t pri_join_mask,IN u8_t num_of_dif_pri)1290*d14abf15SRobert Mustacchi lm_dcbx_2cos_limit_cee_three_pg_to_cos_params(
1291*d14abf15SRobert Mustacchi     IN  lm_device_t                 *pdev,
1292*d14abf15SRobert Mustacchi     IN  pg_help_data_t              *pg_help_data,
1293*d14abf15SRobert Mustacchi     IN  const dcbx_ets_feature_t    *ets,
1294*d14abf15SRobert Mustacchi     OUT cos_help_data_t             *cos_data,
1295*d14abf15SRobert Mustacchi     IN  const u32_t                 *pg_pri_orginal_spread,
1296*d14abf15SRobert Mustacchi     IN  u32_t                       pri_join_mask,
1297*d14abf15SRobert Mustacchi     IN  u8_t                        num_of_dif_pri)
1298*d14abf15SRobert Mustacchi {
1299*d14abf15SRobert Mustacchi     u8_t        i               = 0;
1300*d14abf15SRobert Mustacchi     u32_t       pri_tested      = 0;
1301*d14abf15SRobert Mustacchi     u8_t        entry           = 0;
1302*d14abf15SRobert Mustacchi     u8_t        pg_entry        = 0;
1303*d14abf15SRobert Mustacchi     u8_t        b_found_strict  = FALSE;
1304*d14abf15SRobert Mustacchi     u8_t        num_of_pri      = ARRSIZE(pdev->params.dcbx_port_params.app.traffic_type_priority);
1305*d14abf15SRobert Mustacchi     DbgBreakIf(3 != num_of_pri);
1306*d14abf15SRobert Mustacchi     cos_data->entry_data[0].pri_join_mask = cos_data->entry_data[1].pri_join_mask = 0;
1307*d14abf15SRobert Mustacchi     //- If there are both pauseable and non-pauseable priorities, the pauseable priorities go to the first
1308*d14abf15SRobert Mustacchi     // queue and the non-pauseable priorities go to the second queue.
1309*d14abf15SRobert Mustacchi     if(LM_DCBX_IS_PFC_PRI_MIX_PAUSE(pdev,pri_join_mask))
1310*d14abf15SRobert Mustacchi     {
1311*d14abf15SRobert Mustacchi         lm_dcbx_separate_pauseable_from_non(pdev,cos_data,pg_pri_orginal_spread,ets);
1312*d14abf15SRobert Mustacchi     }
1313*d14abf15SRobert Mustacchi     else
1314*d14abf15SRobert Mustacchi     {
1315*d14abf15SRobert Mustacchi         DbgBreakIf(!(LM_DCBX_IS_PFC_PRI_ONLY_NON_PAUSE(pdev,pri_join_mask) ||
1316*d14abf15SRobert Mustacchi             LM_DCBX_IS_PFC_PRI_ONLY_PAUSE(pdev,pri_join_mask)));
1317*d14abf15SRobert Mustacchi 
1318*d14abf15SRobert Mustacchi         //- If two BW-limited PG-s were combined to one queue, the BW is their sum.
1319*d14abf15SRobert Mustacchi         //- If there are only pauseable priorities or only non-pauseable, and there are both BW-limited and
1320*d14abf15SRobert Mustacchi         // non-BW-limited PG-s, the BW-limited PG/s go to one queue and the non-BW-limited PG/s go to the
1321*d14abf15SRobert Mustacchi         // second queue.
1322*d14abf15SRobert Mustacchi         //- If there are only pauseable priorities or only non-pauseable and all are BW limited, then
1323*d14abf15SRobert Mustacchi         // two priorities go to the first queue and one priority goes to the second queue.
1324*d14abf15SRobert Mustacchi 
1325*d14abf15SRobert Mustacchi         //  We will join this two cases:
1326*d14abf15SRobert Mustacchi         // if one is BW limited he will go to the secoend queue otherwise the last priority will get it
1327*d14abf15SRobert Mustacchi 
1328*d14abf15SRobert Mustacchi         cos_data->entry_data[0].b_pausable = cos_data->entry_data[1].b_pausable = LM_DCBX_IS_PFC_PRI_ONLY_PAUSE(pdev,pri_join_mask);
1329*d14abf15SRobert Mustacchi 
1330*d14abf15SRobert Mustacchi         for(i=0 ; i < num_of_pri; i++)
1331*d14abf15SRobert Mustacchi         {
1332*d14abf15SRobert Mustacchi             DbgBreakIf(pdev->params.dcbx_port_params.app.traffic_type_priority[i] >= MAX_PFC_PRIORITIES);
1333*d14abf15SRobert Mustacchi             pri_tested = 1 << pdev->params.dcbx_port_params.app.traffic_type_priority[i];
1334*d14abf15SRobert Mustacchi             pg_entry    = (u8_t)pg_pri_orginal_spread[pdev->params.dcbx_port_params.app.traffic_type_priority[i]];
1335*d14abf15SRobert Mustacchi 
1336*d14abf15SRobert Mustacchi             if(pg_entry < DCBX_MAX_NUM_PG_BW_ENTRIES)
1337*d14abf15SRobert Mustacchi             {
1338*d14abf15SRobert Mustacchi                 entry = 0;
1339*d14abf15SRobert Mustacchi 
1340*d14abf15SRobert Mustacchi                 if((i == (num_of_pri-1))&&
1341*d14abf15SRobert Mustacchi                    (FALSE == b_found_strict) )
1342*d14abf15SRobert Mustacchi                 {/* last entry will be handled separately */
1343*d14abf15SRobert Mustacchi                     // If no priority is strict than last enty goes to last queue.
1344*d14abf15SRobert Mustacchi                     entry = 1;
1345*d14abf15SRobert Mustacchi                 }
1346*d14abf15SRobert Mustacchi                 cos_data->entry_data[entry].pri_join_mask |= pri_tested;
1347*d14abf15SRobert Mustacchi                 lm_dcbx_add_to_cos_bw(pdev, &(cos_data->entry_data[entry]), DCBX_PG_BW_GET(ets->pg_bw_tbl, pg_entry));
1348*d14abf15SRobert Mustacchi             }
1349*d14abf15SRobert Mustacchi             else
1350*d14abf15SRobert Mustacchi             {
1351*d14abf15SRobert Mustacchi                 DbgBreakIf(TRUE == b_found_strict );
1352*d14abf15SRobert Mustacchi                 b_found_strict = TRUE;
1353*d14abf15SRobert Mustacchi                 cos_data->entry_data[1].pri_join_mask |= pri_tested;
1354*d14abf15SRobert Mustacchi                 // If we join a group and one is strict than the bw rulls
1355*d14abf15SRobert Mustacchi                 cos_data->entry_data[1].s_pri = DCBX_S_PRI_COS_HIGHEST;
1356*d14abf15SRobert Mustacchi             }
1357*d14abf15SRobert Mustacchi 
1358*d14abf15SRobert Mustacchi         }//end of for
1359*d14abf15SRobert Mustacchi     }
1360*d14abf15SRobert Mustacchi }
1361*d14abf15SRobert Mustacchi /**
1362*d14abf15SRobert Mustacchi  * @description
1363*d14abf15SRobert Mustacchi  * Also for e3 and e2.
1364*d14abf15SRobert Mustacchi  * @param pdev
1365*d14abf15SRobert Mustacchi  * @param pg_help_data
1366*d14abf15SRobert Mustacchi  * @param ets
1367*d14abf15SRobert Mustacchi  * @param cos_data
1368*d14abf15SRobert Mustacchi  * @param pg_pri_orginal_spread
1369*d14abf15SRobert Mustacchi  * @param pri_join_mask
1370*d14abf15SRobert Mustacchi  * @param num_of_dif_pri
1371*d14abf15SRobert Mustacchi  *
1372*d14abf15SRobert Mustacchi  * @return STATIC void
1373*d14abf15SRobert Mustacchi  */
1374*d14abf15SRobert Mustacchi STATIC void
lm_dcbx_2cos_limit_cee_fill_cos_params(IN lm_device_t * pdev,IN pg_help_data_t * pg_help_data,IN dcbx_ets_feature_t * ets,OUT cos_help_data_t * cos_data,IN const u32_t * pg_pri_orginal_spread,IN u32_t pri_join_mask,IN u8_t num_of_dif_pri)1375*d14abf15SRobert Mustacchi lm_dcbx_2cos_limit_cee_fill_cos_params(
1376*d14abf15SRobert Mustacchi     IN          lm_device_t         *pdev,
1377*d14abf15SRobert Mustacchi     IN          pg_help_data_t      *pg_help_data,
1378*d14abf15SRobert Mustacchi     IN          dcbx_ets_feature_t  *ets,
1379*d14abf15SRobert Mustacchi     OUT         cos_help_data_t     *cos_data,
1380*d14abf15SRobert Mustacchi     IN  const   u32_t               *pg_pri_orginal_spread,
1381*d14abf15SRobert Mustacchi     IN          u32_t               pri_join_mask,
1382*d14abf15SRobert Mustacchi     IN          u8_t                num_of_dif_pri)
1383*d14abf15SRobert Mustacchi {
1384*d14abf15SRobert Mustacchi     DbgBreakIf(FALSE == CHIP_IS_E2E3A0(pdev));
1385*d14abf15SRobert Mustacchi 
1386*d14abf15SRobert Mustacchi     // Default settings
1387*d14abf15SRobert Mustacchi     cos_data->num_of_cos = DCBX_COS_MAX_NUM_E2E3A0;
1388*d14abf15SRobert Mustacchi 
1389*d14abf15SRobert Mustacchi     switch(pg_help_data->num_of_pg)
1390*d14abf15SRobert Mustacchi     {
1391*d14abf15SRobert Mustacchi     case 1:
1392*d14abf15SRobert Mustacchi         //single priority group
1393*d14abf15SRobert Mustacchi         lm_dcbx_2cos_limit_cee_single_pg_to_cos_params(
1394*d14abf15SRobert Mustacchi             pdev,
1395*d14abf15SRobert Mustacchi             pg_help_data,
1396*d14abf15SRobert Mustacchi             cos_data,
1397*d14abf15SRobert Mustacchi             pri_join_mask,
1398*d14abf15SRobert Mustacchi             num_of_dif_pri);
1399*d14abf15SRobert Mustacchi     break;
1400*d14abf15SRobert Mustacchi     case 2:
1401*d14abf15SRobert Mustacchi         lm_dcbx_2cos_limit_cee_two_pg_to_cos_params(
1402*d14abf15SRobert Mustacchi             pdev,
1403*d14abf15SRobert Mustacchi             pg_help_data,
1404*d14abf15SRobert Mustacchi             ets,
1405*d14abf15SRobert Mustacchi             cos_data,
1406*d14abf15SRobert Mustacchi             pg_pri_orginal_spread,
1407*d14abf15SRobert Mustacchi             pri_join_mask,
1408*d14abf15SRobert Mustacchi             num_of_dif_pri);
1409*d14abf15SRobert Mustacchi     break;
1410*d14abf15SRobert Mustacchi 
1411*d14abf15SRobert Mustacchi     case 3:
1412*d14abf15SRobert Mustacchi         // Three pg must mean three priorities.
1413*d14abf15SRobert Mustacchi         lm_dcbx_2cos_limit_cee_three_pg_to_cos_params(
1414*d14abf15SRobert Mustacchi             pdev,
1415*d14abf15SRobert Mustacchi             pg_help_data,
1416*d14abf15SRobert Mustacchi             ets,
1417*d14abf15SRobert Mustacchi             cos_data,
1418*d14abf15SRobert Mustacchi             pg_pri_orginal_spread,
1419*d14abf15SRobert Mustacchi             pri_join_mask,
1420*d14abf15SRobert Mustacchi             num_of_dif_pri);
1421*d14abf15SRobert Mustacchi 
1422*d14abf15SRobert Mustacchi     break;
1423*d14abf15SRobert Mustacchi     default:
1424*d14abf15SRobert Mustacchi         DbgBreakMsg("lm_dcbx_fill_cos_params :Wrong pg_help_data->num_of_pg \n");
1425*d14abf15SRobert Mustacchi         lm_dcbx_ets_disabled_entry_data(pdev,cos_data,pri_join_mask);
1426*d14abf15SRobert Mustacchi     }
1427*d14abf15SRobert Mustacchi }
1428*d14abf15SRobert Mustacchi /**
1429*d14abf15SRobert Mustacchi  * @description
1430*d14abf15SRobert Mustacchi  * Fill cos params in E3B0 A VOQ is PFC enabled if there is one
1431*d14abf15SRobert Mustacchi  * or more priorities mapped to it which is PFC enabled.
1432*d14abf15SRobert Mustacchi  * @param pdev
1433*d14abf15SRobert Mustacchi  * @param entry_data
1434*d14abf15SRobert Mustacchi  * @param pri_join_mask
1435*d14abf15SRobert Mustacchi  * @param bw
1436*d14abf15SRobert Mustacchi  * @param sp
1437*d14abf15SRobert Mustacchi  *
1438*d14abf15SRobert Mustacchi  * @return STATIC void
1439*d14abf15SRobert Mustacchi  */
1440*d14abf15SRobert Mustacchi STATIC void
lm_dcbx_fill_cos(IN lm_device_t * pdev,OUT cos_entry_help_data_t * entry_data,IN const u32_t pri_join_mask,IN const u32_t bw,IN const u8_t s_pri)1441*d14abf15SRobert Mustacchi lm_dcbx_fill_cos(
1442*d14abf15SRobert Mustacchi     IN          lm_device_t             *pdev,
1443*d14abf15SRobert Mustacchi     OUT         cos_entry_help_data_t   *entry_data,
1444*d14abf15SRobert Mustacchi     IN  const   u32_t                   pri_join_mask,
1445*d14abf15SRobert Mustacchi     IN  const   u32_t                   bw,
1446*d14abf15SRobert Mustacchi     IN  const   u8_t                    s_pri)
1447*d14abf15SRobert Mustacchi {
1448*d14abf15SRobert Mustacchi 
1449*d14abf15SRobert Mustacchi     DbgBreakIf(FALSE == CHIP_IS_E3B0(pdev));
1450*d14abf15SRobert Mustacchi 
1451*d14abf15SRobert Mustacchi     entry_data->cos_bw  = bw;
1452*d14abf15SRobert Mustacchi     entry_data->s_pri   = s_pri;
1453*d14abf15SRobert Mustacchi     //Set the entry it wasn't set before
1454*d14abf15SRobert Mustacchi     entry_data->pri_join_mask = pri_join_mask;
1455*d14abf15SRobert Mustacchi 
1456*d14abf15SRobert Mustacchi     // A VOQ is PFC enabled if there is one or more priorities
1457*d14abf15SRobert Mustacchi     // mapped to it which is PFC enabled.
1458*d14abf15SRobert Mustacchi     entry_data->b_pausable =
1459*d14abf15SRobert Mustacchi         LM_DCBX_IS_PFC_PRI_SOME_PAUSE(pdev, entry_data->pri_join_mask);
1460*d14abf15SRobert Mustacchi 
1461*d14abf15SRobert Mustacchi }
1462*d14abf15SRobert Mustacchi 
1463*d14abf15SRobert Mustacchi /**
1464*d14abf15SRobert Mustacchi  * @description
1465*d14abf15SRobert Mustacchi  * Spread the strict priority according to
1466*d14abf15SRobert Mustacchi  * num_spread_of_entries.
1467*d14abf15SRobert Mustacchi  *
1468*d14abf15SRobert Mustacchi  * 2.Arbitration between the VOQ-s will be the same as the
1469*d14abf15SRobert Mustacchi  * arbitration requirements between the PG-s except that if
1470*d14abf15SRobert Mustacchi  * multiple VOQ-s are used for priorities in PG15 then there
1471*d14abf15SRobert Mustacchi  * will be strict priority ordering between them according to
1472*d14abf15SRobert Mustacchi  * the order of priorities.
1473*d14abf15SRobert Mustacchi  * @param pdev
1474*d14abf15SRobert Mustacchi  * @param cos_data
1475*d14abf15SRobert Mustacchi  * @param inout_entry
1476*d14abf15SRobert Mustacchi  * @param strict_need_num_of_entries
1477*d14abf15SRobert Mustacchi  * @param strict_app_pris
1478*d14abf15SRobert Mustacchi  *
1479*d14abf15SRobert Mustacchi  * @return STATIC lm_status_t
1480*d14abf15SRobert Mustacchi  */
1481*d14abf15SRobert Mustacchi STATIC lm_status_t
lm_dcbx_spread_strict_pri(IN lm_device_t * pdev,OUT cos_help_data_t * cos_data,IN u8_t entry,IN u8_t num_spread_of_entries,IN u8_t strict_app_pris)1482*d14abf15SRobert Mustacchi lm_dcbx_spread_strict_pri(
1483*d14abf15SRobert Mustacchi     IN      lm_device_t         *pdev,
1484*d14abf15SRobert Mustacchi     OUT     cos_help_data_t     *cos_data,
1485*d14abf15SRobert Mustacchi     IN      u8_t                entry,
1486*d14abf15SRobert Mustacchi     IN      u8_t                num_spread_of_entries,
1487*d14abf15SRobert Mustacchi     IN      u8_t                strict_app_pris)
1488*d14abf15SRobert Mustacchi {
1489*d14abf15SRobert Mustacchi     u8_t        stict_pri       = DCBX_S_PRI_COS_HIGHEST;
1490*d14abf15SRobert Mustacchi     u8_t        num_of_app_pri  = MAX_PFC_PRIORITIES;
1491*d14abf15SRobert Mustacchi     u8_t        app_pri_bit     = 0;
1492*d14abf15SRobert Mustacchi     lm_status_t lm_status       = LM_STATUS_SUCCESS;
1493*d14abf15SRobert Mustacchi 
1494*d14abf15SRobert Mustacchi     DbgBreakIf(FALSE == CHIP_IS_E3B0(pdev));
1495*d14abf15SRobert Mustacchi 
1496*d14abf15SRobert Mustacchi     while((num_spread_of_entries)&&
1497*d14abf15SRobert Mustacchi           (0 < num_of_app_pri))
1498*d14abf15SRobert Mustacchi     {
1499*d14abf15SRobert Mustacchi         app_pri_bit = 1 << (num_of_app_pri -1 );
1500*d14abf15SRobert Mustacchi         if(app_pri_bit & strict_app_pris)
1501*d14abf15SRobert Mustacchi         {
1502*d14abf15SRobert Mustacchi             num_spread_of_entries--;
1503*d14abf15SRobert Mustacchi             if(0 == num_spread_of_entries)
1504*d14abf15SRobert Mustacchi             {
1505*d14abf15SRobert Mustacchi                 // last entry needed put all the entries left
1506*d14abf15SRobert Mustacchi                 lm_dcbx_fill_cos(pdev,
1507*d14abf15SRobert Mustacchi                                  &(cos_data->entry_data[entry]),
1508*d14abf15SRobert Mustacchi                                  strict_app_pris,
1509*d14abf15SRobert Mustacchi                                  DCBX_INVALID_COS_BW,
1510*d14abf15SRobert Mustacchi                                  stict_pri);
1511*d14abf15SRobert Mustacchi             }
1512*d14abf15SRobert Mustacchi             else
1513*d14abf15SRobert Mustacchi             {
1514*d14abf15SRobert Mustacchi                 strict_app_pris &= ~app_pri_bit;
1515*d14abf15SRobert Mustacchi                 lm_dcbx_fill_cos(pdev,
1516*d14abf15SRobert Mustacchi                                  &(cos_data->entry_data[entry]),
1517*d14abf15SRobert Mustacchi                                  app_pri_bit,
1518*d14abf15SRobert Mustacchi                                  DCBX_INVALID_COS_BW,
1519*d14abf15SRobert Mustacchi                                  stict_pri);
1520*d14abf15SRobert Mustacchi             }
1521*d14abf15SRobert Mustacchi 
1522*d14abf15SRobert Mustacchi             stict_pri = DCBX_S_PRI_COS_NEXT_LOWER_PRI(stict_pri);
1523*d14abf15SRobert Mustacchi             entry++;
1524*d14abf15SRobert Mustacchi         }
1525*d14abf15SRobert Mustacchi         num_of_app_pri--;
1526*d14abf15SRobert Mustacchi     }
1527*d14abf15SRobert Mustacchi 
1528*d14abf15SRobert Mustacchi     if(0 != num_spread_of_entries)
1529*d14abf15SRobert Mustacchi     {
1530*d14abf15SRobert Mustacchi         DbgBreakMsg("lm_dcbx_spread_strict_pri- This is a bug ");
1531*d14abf15SRobert Mustacchi         lm_status = LM_STATUS_FAILURE;
1532*d14abf15SRobert Mustacchi     }
1533*d14abf15SRobert Mustacchi 
1534*d14abf15SRobert Mustacchi     return lm_status;
1535*d14abf15SRobert Mustacchi }
1536*d14abf15SRobert Mustacchi /**
1537*d14abf15SRobert Mustacchi  * @description
1538*d14abf15SRobert Mustacchi  * Try to split the strict priority to num_spread_of_entries.
1539*d14abf15SRobert Mustacchi  * If not possible all of the priorities will be in one entry.
1540*d14abf15SRobert Mustacchi  * @param pdev
1541*d14abf15SRobert Mustacchi  * @param cos_data
1542*d14abf15SRobert Mustacchi  * @param entry
1543*d14abf15SRobert Mustacchi  * @param num_spread_of_entries
1544*d14abf15SRobert Mustacchi  * @param strict_app_pris
1545*d14abf15SRobert Mustacchi  *
1546*d14abf15SRobert Mustacchi  * @return STATIC u8_t
1547*d14abf15SRobert Mustacchi  * Num of entries cos_data used.
1548*d14abf15SRobert Mustacchi  */
1549*d14abf15SRobert Mustacchi STATIC u8_t
lm_dcbx_cee_fill_strict_pri(IN lm_device_t * pdev,OUT cos_help_data_t * cos_data,INOUT u8_t entry,IN u8_t num_spread_of_entries,IN u8_t strict_app_pris)1550*d14abf15SRobert Mustacchi lm_dcbx_cee_fill_strict_pri(
1551*d14abf15SRobert Mustacchi     IN      lm_device_t         *pdev,
1552*d14abf15SRobert Mustacchi     OUT     cos_help_data_t     *cos_data,
1553*d14abf15SRobert Mustacchi     INOUT   u8_t                entry,
1554*d14abf15SRobert Mustacchi     IN      u8_t                num_spread_of_entries,
1555*d14abf15SRobert Mustacchi     IN      u8_t                strict_app_pris)
1556*d14abf15SRobert Mustacchi {
1557*d14abf15SRobert Mustacchi 
1558*d14abf15SRobert Mustacchi     lm_status_t lm_status = LM_STATUS_SUCCESS;
1559*d14abf15SRobert Mustacchi 
1560*d14abf15SRobert Mustacchi     DbgBreakIf(FALSE == CHIP_IS_E3B0(pdev));
1561*d14abf15SRobert Mustacchi 
1562*d14abf15SRobert Mustacchi     lm_status = lm_dcbx_spread_strict_pri(pdev,
1563*d14abf15SRobert Mustacchi                                           cos_data,
1564*d14abf15SRobert Mustacchi                                           entry,
1565*d14abf15SRobert Mustacchi                                           num_spread_of_entries,
1566*d14abf15SRobert Mustacchi                                           strict_app_pris);
1567*d14abf15SRobert Mustacchi     if(LM_STATUS_SUCCESS != lm_status)
1568*d14abf15SRobert Mustacchi     {
1569*d14abf15SRobert Mustacchi         lm_dcbx_fill_cos(pdev,
1570*d14abf15SRobert Mustacchi                          &(cos_data->entry_data[entry]),
1571*d14abf15SRobert Mustacchi                          strict_app_pris,
1572*d14abf15SRobert Mustacchi                          DCBX_INVALID_COS_BW,
1573*d14abf15SRobert Mustacchi                          DCBX_S_PRI_COS_HIGHEST);
1574*d14abf15SRobert Mustacchi         return 1;
1575*d14abf15SRobert Mustacchi 
1576*d14abf15SRobert Mustacchi     }
1577*d14abf15SRobert Mustacchi 
1578*d14abf15SRobert Mustacchi     return num_spread_of_entries;
1579*d14abf15SRobert Mustacchi }
1580*d14abf15SRobert Mustacchi /**
1581*d14abf15SRobert Mustacchi  * @description
1582*d14abf15SRobert Mustacchi  * In E3 the allocation is based only on the PG configuration.
1583*d14abf15SRobert Mustacchi  * PFC will not have an effect on the mapping. The mapping is
1584*d14abf15SRobert Mustacchi  * done according to the following priorities:
1585*d14abf15SRobert Mustacchi  * 1. Allocate a single VOQ to PG15 if there is at least one
1586*d14abf15SRobert Mustacchi  * priority mapped to PG15.
1587*d14abf15SRobert Mustacchi  * 2. Allocate the rest of the VOQ-s to the other PG-s.
1588*d14abf15SRobert Mustacchi  * 3. If there are still VOQ-s which have no associated PG, then
1589*d14abf15SRobert Mustacchi  * associate these VOQ-s to PG15. These PG-s will be used for SP
1590*d14abf15SRobert Mustacchi  * between priorities on PG15.
1591*d14abf15SRobert Mustacchi  *
1592*d14abf15SRobert Mustacchi  * @param pdev
1593*d14abf15SRobert Mustacchi  * @param pg_help_data
1594*d14abf15SRobert Mustacchi  * @param ets
1595*d14abf15SRobert Mustacchi  * @param cos_data
1596*d14abf15SRobert Mustacchi  * @param pg_pri_orginal_spread
1597*d14abf15SRobert Mustacchi  * @param pri_join_mask
1598*d14abf15SRobert Mustacchi  * @param num_of_dif_pri
1599*d14abf15SRobert Mustacchi  *
1600*d14abf15SRobert Mustacchi  * @return STATIC void
1601*d14abf15SRobert Mustacchi  */
1602*d14abf15SRobert Mustacchi STATIC void
lm_dcbx_cee_fill_cos_params(IN lm_device_t * pdev,IN pg_help_data_t * pg_help_data,IN dcbx_ets_feature_t * ets,OUT cos_help_data_t * cos_data,IN const u32_t pri_join_mask)1603*d14abf15SRobert Mustacchi lm_dcbx_cee_fill_cos_params(
1604*d14abf15SRobert Mustacchi     IN          lm_device_t         *pdev,
1605*d14abf15SRobert Mustacchi     IN          pg_help_data_t      *pg_help_data,
1606*d14abf15SRobert Mustacchi     IN          dcbx_ets_feature_t  *ets,
1607*d14abf15SRobert Mustacchi     OUT         cos_help_data_t     *cos_data,
1608*d14abf15SRobert Mustacchi     IN  const   u32_t               pri_join_mask)
1609*d14abf15SRobert Mustacchi {
1610*d14abf15SRobert Mustacchi     lm_status_t lm_status           = LM_STATUS_SUCCESS;
1611*d14abf15SRobert Mustacchi     u8_t        need_num_of_entries = 0;
1612*d14abf15SRobert Mustacchi     u8_t        i                   = 0;
1613*d14abf15SRobert Mustacchi     u8_t        entry               = 0;
1614*d14abf15SRobert Mustacchi 
1615*d14abf15SRobert Mustacchi     DbgBreakIf(FALSE == CHIP_IS_E3B0(pdev));
1616*d14abf15SRobert Mustacchi 
1617*d14abf15SRobert Mustacchi     // if the number of requested PG-s in CEE is greater than 3
1618*d14abf15SRobert Mustacchi     // then the results are not determined since this is a violation
1619*d14abf15SRobert Mustacchi     // of the standard.
1620*d14abf15SRobert Mustacchi     if(DCBX_COS_MAX_NUM_E3B0 < pg_help_data->num_of_pg)
1621*d14abf15SRobert Mustacchi     {
1622*d14abf15SRobert Mustacchi         DbgBreakMsg("lm_dcbx_cee_e3b0_fill_cos_params :Wrong pg_help_data->num_of_pg \n");
1623*d14abf15SRobert Mustacchi         lm_status = lm_dcbx_join_pgs(pdev,
1624*d14abf15SRobert Mustacchi                                      ets,
1625*d14abf15SRobert Mustacchi                                      pg_help_data,
1626*d14abf15SRobert Mustacchi                                      DCBX_COS_MAX_NUM_E3B0);
1627*d14abf15SRobert Mustacchi 
1628*d14abf15SRobert Mustacchi         if(LM_STATUS_SUCCESS != lm_status)
1629*d14abf15SRobert Mustacchi         {
1630*d14abf15SRobert Mustacchi             // If we weren't successful in reducing the number of PGs we will disables ETS.
1631*d14abf15SRobert Mustacchi             lm_dcbx_ets_disabled_entry_data(pdev,cos_data,pri_join_mask);
1632*d14abf15SRobert Mustacchi             return;
1633*d14abf15SRobert Mustacchi         }
1634*d14abf15SRobert Mustacchi     }
1635*d14abf15SRobert Mustacchi 
1636*d14abf15SRobert Mustacchi     for(i = 0 ; i < pg_help_data->num_of_pg; i++)
1637*d14abf15SRobert Mustacchi     {
1638*d14abf15SRobert Mustacchi 
1639*d14abf15SRobert Mustacchi         if(pg_help_data->pg_entry_data[i].pg < DCBX_MAX_NUM_PG_BW_ENTRIES)
1640*d14abf15SRobert Mustacchi         {
1641*d14abf15SRobert Mustacchi             // Fill BW entry.
1642*d14abf15SRobert Mustacchi             lm_dcbx_fill_cos(pdev,
1643*d14abf15SRobert Mustacchi                              &(cos_data->entry_data[entry]),
1644*d14abf15SRobert Mustacchi                              pg_help_data->pg_entry_data[i].pg_priority,
1645*d14abf15SRobert Mustacchi                              DCBX_PG_BW_GET(ets->pg_bw_tbl, pg_help_data->pg_entry_data[i].pg),
1646*d14abf15SRobert Mustacchi                              DCBX_S_PRI_INVALID);
1647*d14abf15SRobert Mustacchi             entry++;
1648*d14abf15SRobert Mustacchi         }
1649*d14abf15SRobert Mustacchi         else
1650*d14abf15SRobert Mustacchi         {
1651*d14abf15SRobert Mustacchi             DbgBreakIf(DCBX_STRICT_PRI_PG != pg_help_data->pg_entry_data[i].pg );
1652*d14abf15SRobert Mustacchi 
1653*d14abf15SRobert Mustacchi             need_num_of_entries = min((u8_t)pg_help_data->pg_entry_data[i].num_of_dif_pri,
1654*d14abf15SRobert Mustacchi                                       (u8_t)(((u8_t)DCBX_COS_MAX_NUM_E3B0 - pg_help_data->num_of_pg) + 1/*current entry*/));
1655*d14abf15SRobert Mustacchi 
1656*d14abf15SRobert Mustacchi             // 3. If there are still VOQ-s which have no associated PG, then
1657*d14abf15SRobert Mustacchi             // associate these VOQ-s to PG15. These PG-s will be used for SP
1658*d14abf15SRobert Mustacchi             // between priorities on PG15.
1659*d14abf15SRobert Mustacchi             entry += lm_dcbx_cee_fill_strict_pri(pdev,
1660*d14abf15SRobert Mustacchi                                                  cos_data,
1661*d14abf15SRobert Mustacchi                                                  entry,
1662*d14abf15SRobert Mustacchi                                                  need_num_of_entries,
1663*d14abf15SRobert Mustacchi                                                  (u8_t)pg_help_data->pg_entry_data[i].pg_priority);
1664*d14abf15SRobert Mustacchi 
1665*d14abf15SRobert Mustacchi         }
1666*d14abf15SRobert Mustacchi 
1667*d14abf15SRobert Mustacchi     }//end of for
1668*d14abf15SRobert Mustacchi 
1669*d14abf15SRobert Mustacchi     // the entry will represent the number of COS used
1670*d14abf15SRobert Mustacchi     cos_data->num_of_cos = entry;
1671*d14abf15SRobert Mustacchi 
1672*d14abf15SRobert Mustacchi     DbgBreakIf(DCBX_COS_MAX_NUM_E3B0 < cos_data->num_of_cos );
1673*d14abf15SRobert Mustacchi }
1674*d14abf15SRobert Mustacchi /**
1675*d14abf15SRobert Mustacchi  * @description
1676*d14abf15SRobert Mustacchi  * Get the COS parameters according to ETS and PFC receive
1677*d14abf15SRobert Mustacchi  * configuration
1678*d14abf15SRobert Mustacchi  * @param pdev
1679*d14abf15SRobert Mustacchi  * @param pg_help_data
1680*d14abf15SRobert Mustacchi  * @param ets
1681*d14abf15SRobert Mustacchi  * @param pg_pri_orginal_spread
1682*d14abf15SRobert Mustacchi  *
1683*d14abf15SRobert Mustacchi  * @return STATIC void
1684*d14abf15SRobert Mustacchi  */
1685*d14abf15SRobert Mustacchi STATIC void
lm_dcbx_fill_cos_params(IN lm_device_t * pdev,IN pg_help_data_t * pg_help_data,IN dcbx_ets_feature_t * ets,IN const u32_t * pg_pri_orginal_spread)1686*d14abf15SRobert Mustacchi lm_dcbx_fill_cos_params(
1687*d14abf15SRobert Mustacchi     IN  lm_device_t                 *pdev,
1688*d14abf15SRobert Mustacchi     IN  pg_help_data_t              *pg_help_data,
1689*d14abf15SRobert Mustacchi     IN          dcbx_ets_feature_t  *ets,
1690*d14abf15SRobert Mustacchi     IN  const u32_t                 *pg_pri_orginal_spread)
1691*d14abf15SRobert Mustacchi {
1692*d14abf15SRobert Mustacchi     cos_help_data_t         cos_data                    = {{{0}}};
1693*d14abf15SRobert Mustacchi     u8_t                    i                           = 0;
1694*d14abf15SRobert Mustacchi     u8_t                    j                           = 0;
1695*d14abf15SRobert Mustacchi     u32_t                   pri_join_mask               = 0;
1696*d14abf15SRobert Mustacchi     u8_t                    num_of_dif_pri              = 0;
1697*d14abf15SRobert Mustacchi 
1698*d14abf15SRobert Mustacchi     // Validate the pg value
1699*d14abf15SRobert Mustacchi     for(i=0; i < pg_help_data->num_of_pg ; i++)
1700*d14abf15SRobert Mustacchi     {
1701*d14abf15SRobert Mustacchi         DbgBreakIf((DCBX_STRICT_PRI_PG != pg_help_data->pg_entry_data[i].pg) &&
1702*d14abf15SRobert Mustacchi                    (DCBX_MAX_NUM_PG_BW_ENTRIES <= pg_help_data->pg_entry_data[i].pg));
1703*d14abf15SRobert Mustacchi         pri_join_mask   |=  pg_help_data->pg_entry_data[i].pg_priority;
1704*d14abf15SRobert Mustacchi         num_of_dif_pri  += pg_help_data->pg_entry_data[i].num_of_dif_pri;
1705*d14abf15SRobert Mustacchi     }
1706*d14abf15SRobert Mustacchi 
1707*d14abf15SRobert Mustacchi     //default settings
1708*d14abf15SRobert Mustacchi     cos_data.num_of_cos = 1;
1709*d14abf15SRobert Mustacchi     for(i=0; i < ARRSIZE(cos_data.entry_data) ; i++)
1710*d14abf15SRobert Mustacchi     {
1711*d14abf15SRobert Mustacchi         cos_data.entry_data[i].pri_join_mask    = 0;
1712*d14abf15SRobert Mustacchi         cos_data.entry_data[i].b_pausable       = FALSE;
1713*d14abf15SRobert Mustacchi         cos_data.entry_data[i].s_pri               = DCBX_S_PRI_INVALID;
1714*d14abf15SRobert Mustacchi         cos_data.entry_data[i].cos_bw           = DCBX_INVALID_COS_BW;
1715*d14abf15SRobert Mustacchi     }
1716*d14abf15SRobert Mustacchi 
1717*d14abf15SRobert Mustacchi     DbgBreakIf((0 == num_of_dif_pri) && (3 < num_of_dif_pri));
1718*d14abf15SRobert Mustacchi     if(CHIP_IS_E3B0(pdev))
1719*d14abf15SRobert Mustacchi     {
1720*d14abf15SRobert Mustacchi         lm_dcbx_cee_fill_cos_params(
1721*d14abf15SRobert Mustacchi             pdev,
1722*d14abf15SRobert Mustacchi             pg_help_data,
1723*d14abf15SRobert Mustacchi             ets,
1724*d14abf15SRobert Mustacchi             &cos_data,
1725*d14abf15SRobert Mustacchi             pri_join_mask);
1726*d14abf15SRobert Mustacchi     }
1727*d14abf15SRobert Mustacchi     else
1728*d14abf15SRobert Mustacchi     {
1729*d14abf15SRobert Mustacchi         DbgBreakIf(FALSE == CHIP_IS_E2E3A0(pdev));
1730*d14abf15SRobert Mustacchi         lm_dcbx_2cos_limit_cee_fill_cos_params(
1731*d14abf15SRobert Mustacchi             pdev,
1732*d14abf15SRobert Mustacchi             pg_help_data,
1733*d14abf15SRobert Mustacchi             ets,
1734*d14abf15SRobert Mustacchi             &cos_data,
1735*d14abf15SRobert Mustacchi             pg_pri_orginal_spread,
1736*d14abf15SRobert Mustacchi             pri_join_mask,
1737*d14abf15SRobert Mustacchi             num_of_dif_pri);
1738*d14abf15SRobert Mustacchi     }
1739*d14abf15SRobert Mustacchi 
1740*d14abf15SRobert Mustacchi     for(i=0; i < cos_data.num_of_cos ; i++)
1741*d14abf15SRobert Mustacchi     {
1742*d14abf15SRobert Mustacchi         lm_dcbx_fill_cos_entry(pdev,
1743*d14abf15SRobert Mustacchi                                &pdev->params.dcbx_port_params.ets.cos_params[i],
1744*d14abf15SRobert Mustacchi                                cos_data.entry_data[i].pri_join_mask,
1745*d14abf15SRobert Mustacchi                                cos_data.entry_data[i].cos_bw,
1746*d14abf15SRobert Mustacchi                                cos_data.entry_data[i].b_pausable,
1747*d14abf15SRobert Mustacchi                                cos_data.entry_data[i].s_pri);
1748*d14abf15SRobert Mustacchi     }
1749*d14abf15SRobert Mustacchi 
1750*d14abf15SRobert Mustacchi     DbgBreakIf(0 == cos_data.num_of_cos);
1751*d14abf15SRobert Mustacchi 
1752*d14abf15SRobert Mustacchi     DbgBreakIf(pri_join_mask != (pdev->params.dcbx_port_params.ets.cos_params[0].pri_bitmask |
1753*d14abf15SRobert Mustacchi                                  pdev->params.dcbx_port_params.ets.cos_params[1].pri_bitmask |
1754*d14abf15SRobert Mustacchi                                  pdev->params.dcbx_port_params.ets.cos_params[2].pri_bitmask));
1755*d14abf15SRobert Mustacchi 
1756*d14abf15SRobert Mustacchi     // debugging make sure the same priority isn't mapped to to COS
1757*d14abf15SRobert Mustacchi     for(i = 0 ; i < cos_data.num_of_cos; i++)
1758*d14abf15SRobert Mustacchi     {
1759*d14abf15SRobert Mustacchi         for(j = i+1 ; j < cos_data.num_of_cos; j++)
1760*d14abf15SRobert Mustacchi         {
1761*d14abf15SRobert Mustacchi             DbgBreakIf(0 != (pdev->params.dcbx_port_params.ets.cos_params[i].pri_bitmask &
1762*d14abf15SRobert Mustacchi                                          pdev->params.dcbx_port_params.ets.cos_params[j].pri_bitmask));
1763*d14abf15SRobert Mustacchi         }
1764*d14abf15SRobert Mustacchi     }
1765*d14abf15SRobert Mustacchi 
1766*d14abf15SRobert Mustacchi     pdev->params.dcbx_port_params.ets.num_of_cos = cos_data.num_of_cos ;
1767*d14abf15SRobert Mustacchi }
1768*d14abf15SRobert Mustacchi /**
1769*d14abf15SRobert Mustacchi  * CQ60417 : If remote feature is not found, we disable the
1770*d14abf15SRobert Mustacchi  * feature unless user explicitly configured feature (copycat
1771*d14abf15SRobert Mustacchi  * switch behavior)
1772*d14abf15SRobert Mustacchi  * @param pdev
1773*d14abf15SRobert Mustacchi  * @param error - error flag sent from DCBX.
1774*d14abf15SRobert Mustacchi  * @param remote_tlv_feature_flag - Must be one of the
1775*d14abf15SRobert Mustacchi  *                                DCBX_REMOTE_XXX_TLV_NOT_FOUND
1776*d14abf15SRobert Mustacchi  *
1777*d14abf15SRobert Mustacchi  * @return STATIC u8_t -
1778*d14abf15SRobert Mustacchi  */
1779*d14abf15SRobert Mustacchi STATIC u8_t
lm_dcbx_is_feature_dis_remote_tlv(INOUT lm_device_t * pdev,IN const u32_t error,IN const u32_t remote_tlv_feature_flag)1780*d14abf15SRobert Mustacchi lm_dcbx_is_feature_dis_remote_tlv(
1781*d14abf15SRobert Mustacchi     INOUT lm_device_t   *pdev,
1782*d14abf15SRobert Mustacchi     IN const u32_t      error,
1783*d14abf15SRobert Mustacchi     IN const u32_t      remote_tlv_feature_flag
1784*d14abf15SRobert Mustacchi     )
1785*d14abf15SRobert Mustacchi {
1786*d14abf15SRobert Mustacchi     u8_t const mfw_config       = lm_dcbx_check_drv_flags(pdev, DRV_FLAGS_DCB_MFW_CONFIGURED);
1787*d14abf15SRobert Mustacchi     u8_t const ret_feature_dis  = (remote_tlv_feature_flag == GET_FLAGS(error ,remote_tlv_feature_flag)) &&
1788*d14abf15SRobert Mustacchi                                     (FALSE == mfw_config);
1789*d14abf15SRobert Mustacchi 
1790*d14abf15SRobert Mustacchi     DbgBreakIf(0 == GET_FLAGS(remote_tlv_feature_flag ,
1791*d14abf15SRobert Mustacchi                               (DCBX_REMOTE_ETS_TLV_NOT_FOUND |
1792*d14abf15SRobert Mustacchi                                DCBX_REMOTE_PFC_TLV_NOT_FOUND |
1793*d14abf15SRobert Mustacchi                                DCBX_REMOTE_APP_TLV_NOT_FOUND)));
1794*d14abf15SRobert Mustacchi 
1795*d14abf15SRobert Mustacchi     return ret_feature_dis;
1796*d14abf15SRobert Mustacchi }
1797*d14abf15SRobert Mustacchi 
1798*d14abf15SRobert Mustacchi /*******************************************************************************
1799*d14abf15SRobert Mustacchi  * Description: Translate from ETS parameter to COS paramters
1800*d14abf15SRobert Mustacchi  *
1801*d14abf15SRobert Mustacchi  * Return:
1802*d14abf15SRobert Mustacchi  ******************************************************************************/
1803*d14abf15SRobert Mustacchi STATIC void
lm_dcbx_get_ets_cee_feature(INOUT lm_device_t * pdev,INOUT dcbx_ets_feature_t * ets,IN const u32_t error)1804*d14abf15SRobert Mustacchi lm_dcbx_get_ets_cee_feature(
1805*d14abf15SRobert Mustacchi     INOUT       lm_device_t         *pdev,
1806*d14abf15SRobert Mustacchi     INOUT       dcbx_ets_feature_t  *ets,
1807*d14abf15SRobert Mustacchi     IN const    u32_t               error)
1808*d14abf15SRobert Mustacchi {
1809*d14abf15SRobert Mustacchi     u32_t           pg_pri_orginal_spread[DCBX_MAX_NUM_PRI_PG_ENTRIES]  = {0};
1810*d14abf15SRobert Mustacchi     pg_help_data_t  pg_help_data                                        = {{{0}}};
1811*d14abf15SRobert Mustacchi     const u8_t      is_ets_dis_remote_tlv                               = lm_dcbx_is_feature_dis_remote_tlv(
1812*d14abf15SRobert Mustacchi                                                                                 pdev,
1813*d14abf15SRobert Mustacchi                                                                                 error,
1814*d14abf15SRobert Mustacchi                                                                                 DCBX_REMOTE_ETS_TLV_NOT_FOUND);
1815*d14abf15SRobert Mustacchi     // Clean up old settings of ets on COS
1816*d14abf15SRobert Mustacchi     lm_dcbx_init_ets_internal_param(pdev,
1817*d14abf15SRobert Mustacchi                                     &(pdev->params.dcbx_port_params.ets));
1818*d14abf15SRobert Mustacchi 
1819*d14abf15SRobert Mustacchi     if(DCBX_MIB_IS_ETS_ENABLED(pdev->params.dcbx_port_params.app.enabled,
1820*d14abf15SRobert Mustacchi        error,ets->enabled) &&
1821*d14abf15SRobert Mustacchi        (!is_ets_dis_remote_tlv))
1822*d14abf15SRobert Mustacchi     {
1823*d14abf15SRobert Mustacchi         DbgBreakIf(FALSE == pdev->params.dcbx_port_params.dcbx_enabled);
1824*d14abf15SRobert Mustacchi         pdev->params.dcbx_port_params.ets.enabled = TRUE;
1825*d14abf15SRobert Mustacchi     }
1826*d14abf15SRobert Mustacchi     else
1827*d14abf15SRobert Mustacchi     {
1828*d14abf15SRobert Mustacchi 
1829*d14abf15SRobert Mustacchi         lm_dcbx_ets_disable(pdev);
1830*d14abf15SRobert Mustacchi         return;
1831*d14abf15SRobert Mustacchi     }
1832*d14abf15SRobert Mustacchi 
1833*d14abf15SRobert Mustacchi     //Parse pg_pri_orginal_spread data and spread it from nibble to 32 bits
1834*d14abf15SRobert Mustacchi     lm_dcbx_get_ets_pri_pg_tbl(pdev,
1835*d14abf15SRobert Mustacchi                                pg_pri_orginal_spread,
1836*d14abf15SRobert Mustacchi                                ets->pri_pg_tbl,
1837*d14abf15SRobert Mustacchi                                ARRSIZE(pg_pri_orginal_spread),
1838*d14abf15SRobert Mustacchi                                DCBX_MAX_NUM_PRI_PG_ENTRIES);
1839*d14abf15SRobert Mustacchi 
1840*d14abf15SRobert Mustacchi     lm_dcbx_cee_get_num_of_pg_traf_type(pdev,
1841*d14abf15SRobert Mustacchi                                     pg_pri_orginal_spread,
1842*d14abf15SRobert Mustacchi                                     &pg_help_data);
1843*d14abf15SRobert Mustacchi 
1844*d14abf15SRobert Mustacchi     lm_dcbx_fill_cos_params(pdev,
1845*d14abf15SRobert Mustacchi                             &pg_help_data,
1846*d14abf15SRobert Mustacchi                             ets,
1847*d14abf15SRobert Mustacchi                             pg_pri_orginal_spread);
1848*d14abf15SRobert Mustacchi 
1849*d14abf15SRobert Mustacchi }
1850*d14abf15SRobert Mustacchi 
1851*d14abf15SRobert Mustacchi /**
1852*d14abf15SRobert Mustacchi  * @description
1853*d14abf15SRobert Mustacchi  * Mapping between TC( acording to the given parameters from
1854*d14abf15SRobert Mustacchi  * upper layer) which isn't zero based to COS which is zero
1855*d14abf15SRobert Mustacchi  * based.
1856*d14abf15SRobert Mustacchi  * COS configuration is used to the chip configuration.
1857*d14abf15SRobert Mustacchi  * @param pdev
1858*d14abf15SRobert Mustacchi  *
1859*d14abf15SRobert Mustacchi  * @return STATIC void
1860*d14abf15SRobert Mustacchi  */
1861*d14abf15SRobert Mustacchi STATIC void
lm_dcbx_ie_get_ets_ieee_feature(INOUT lm_device_t * pdev)1862*d14abf15SRobert Mustacchi lm_dcbx_ie_get_ets_ieee_feature(
1863*d14abf15SRobert Mustacchi     INOUT       lm_device_t         *pdev)
1864*d14abf15SRobert Mustacchi {
1865*d14abf15SRobert Mustacchi     lm_dcbx_indicate_event_t    *indicate_event     = &pdev->dcbx_info.indicate_event;
1866*d14abf15SRobert Mustacchi     pg_params_t                 *ets_drv_param      = &pdev->params.dcbx_port_params.ets;
1867*d14abf15SRobert Mustacchi     dcb_ets_tsa_param_t         *ieee_ets           = &indicate_event->ets_ieee_params_config;
1868*d14abf15SRobert Mustacchi     // COS should be continues and zero based
1869*d14abf15SRobert Mustacchi     u8_t                        cee_tc_to_continues_cos[DCBX_MAX_NUM_PRI_PG_ENTRIES] = {0};
1870*d14abf15SRobert Mustacchi     u8_t                        i                   = 0;
1871*d14abf15SRobert Mustacchi     s16_t                       pri                 = 0;
1872*d14abf15SRobert Mustacchi     u8_t                        strict_pri          = DCBX_S_PRI_COS_HIGHEST;
1873*d14abf15SRobert Mustacchi     u8_t                        tc_entry            = 0;
1874*d14abf15SRobert Mustacchi     u8_t                        cos_entry           = 0;
1875*d14abf15SRobert Mustacchi     const u8_t                  max_tc_sup          = lm_dcbx_cos_max_num(pdev) ;
1876*d14abf15SRobert Mustacchi     u8_t                        next_free_cos_entry = 0;
1877*d14abf15SRobert Mustacchi     u8_t                        tc_used_bitmap      = 0;
1878*d14abf15SRobert Mustacchi #if (DBG)
1879*d14abf15SRobert Mustacchi     u8_t                        j                   = 0;
1880*d14abf15SRobert Mustacchi     u8_t                        pri_used_bitmap     = 0;
1881*d14abf15SRobert Mustacchi #endif //DBG
1882*d14abf15SRobert Mustacchi     /************************************ Validate Check ***************************/
1883*d14abf15SRobert Mustacchi     ASSERT_STATIC(DCBX_MAX_NUM_PRI_PG_ENTRIES == DCBX_MAX_NUM_PG_BW_ENTRIES);
1884*d14abf15SRobert Mustacchi     ASSERT_STATIC(DCBX_MAX_NUM_PRI_PG_ENTRIES == ARRSIZE(ieee_ets->priority_assignment_table));
1885*d14abf15SRobert Mustacchi     ASSERT_STATIC(DCBX_MAX_NUM_PG_BW_ENTRIES == ARRSIZE(ieee_ets->tc_bw_assignment_table));
1886*d14abf15SRobert Mustacchi     ASSERT_STATIC(DCBX_MAX_NUM_PG_BW_ENTRIES == ARRSIZE(ieee_ets->tsa_assignment_table));
1887*d14abf15SRobert Mustacchi 
1888*d14abf15SRobert Mustacchi     DbgBreakIf(lm_dcbx_ets_ieee_config_not_valid == indicate_event->ets_ieee_config_state);
1889*d14abf15SRobert Mustacchi     /********************************** Init variables  ***************************/
1890*d14abf15SRobert Mustacchi     // Clean up old settings of ets on COS
1891*d14abf15SRobert Mustacchi     lm_dcbx_init_ets_internal_param(pdev, ets_drv_param);
1892*d14abf15SRobert Mustacchi 
1893*d14abf15SRobert Mustacchi     // If application priority isn't enabled then all DCB features must be disabled.
1894*d14abf15SRobert Mustacchi     if((FALSE == pdev->params.dcbx_port_params.app.enabled)||
1895*d14abf15SRobert Mustacchi         (LM_DCBX_IE_IS_ETS_DISABLE(ieee_ets->num_traffic_classes))||
1896*d14abf15SRobert Mustacchi         (lm_dcbx_ets_ieee_config_en != indicate_event->ets_ieee_config_state))
1897*d14abf15SRobert Mustacchi     {
1898*d14abf15SRobert Mustacchi         lm_dcbx_ets_disable(pdev);
1899*d14abf15SRobert Mustacchi         return;
1900*d14abf15SRobert Mustacchi     }
1901*d14abf15SRobert Mustacchi 
1902*d14abf15SRobert Mustacchi     /*** Mapping between TC which isn't zero based to COS which is zero based*****/
1903*d14abf15SRobert Mustacchi 
1904*d14abf15SRobert Mustacchi     // Count the number of TC entries given and fill the appropriate COS entry.
1905*d14abf15SRobert Mustacchi     // The for is from the higher priority down, because higher priorities should
1906*d14abf15SRobert Mustacchi     // receive higher strict priority.
1907*d14abf15SRobert Mustacchi     for (pri = (ARRSIZE(ieee_ets->priority_assignment_table) -1);
1908*d14abf15SRobert Mustacchi           0 <= pri;
1909*d14abf15SRobert Mustacchi           pri--)
1910*d14abf15SRobert Mustacchi     {
1911*d14abf15SRobert Mustacchi         tc_entry = ieee_ets->priority_assignment_table[pri];
1912*d14abf15SRobert Mustacchi 
1913*d14abf15SRobert Mustacchi         if(0 == (tc_used_bitmap & (1 << tc_entry)))
1914*d14abf15SRobert Mustacchi         {
1915*d14abf15SRobert Mustacchi             // We should not reenter, this will cause a bug in strict priority.
1916*d14abf15SRobert Mustacchi             // Validate COS entry is legal
1917*d14abf15SRobert Mustacchi             if(max_tc_sup <= next_free_cos_entry )
1918*d14abf15SRobert Mustacchi             {
1919*d14abf15SRobert Mustacchi                 DbgBreakMsg(" Wrong ETS settings ");
1920*d14abf15SRobert Mustacchi                 lm_dcbx_ets_disable(pdev);
1921*d14abf15SRobert Mustacchi                 return;
1922*d14abf15SRobert Mustacchi             }
1923*d14abf15SRobert Mustacchi 
1924*d14abf15SRobert Mustacchi             tc_used_bitmap |= (1 << tc_entry);
1925*d14abf15SRobert Mustacchi             cee_tc_to_continues_cos[tc_entry] = next_free_cos_entry;
1926*d14abf15SRobert Mustacchi 
1927*d14abf15SRobert Mustacchi             if(TSA_ASSIGNMENT_DCB_TSA_STRICT == ieee_ets->tsa_assignment_table[tc_entry])
1928*d14abf15SRobert Mustacchi             {
1929*d14abf15SRobert Mustacchi                 ets_drv_param->cos_params[next_free_cos_entry].bw_tbl = DCBX_INVALID_COS_BW;
1930*d14abf15SRobert Mustacchi                 ets_drv_param->cos_params[next_free_cos_entry].s_pri = strict_pri;
1931*d14abf15SRobert Mustacchi                 // Prepare for next strict priority
1932*d14abf15SRobert Mustacchi                 strict_pri = DCBX_S_PRI_COS_NEXT_LOWER_PRI(strict_pri);
1933*d14abf15SRobert Mustacchi             }
1934*d14abf15SRobert Mustacchi             else if(TSA_ASSIGNMENT_DCB_TSA_ETS == ieee_ets->tsa_assignment_table[tc_entry])
1935*d14abf15SRobert Mustacchi             {
1936*d14abf15SRobert Mustacchi                 ets_drv_param->cos_params[next_free_cos_entry].bw_tbl = ieee_ets->tc_bw_assignment_table[tc_entry];
1937*d14abf15SRobert Mustacchi                 ets_drv_param->cos_params[next_free_cos_entry].s_pri = DCBX_S_PRI_INVALID;
1938*d14abf15SRobert Mustacchi             }
1939*d14abf15SRobert Mustacchi             else
1940*d14abf15SRobert Mustacchi             {
1941*d14abf15SRobert Mustacchi                 DbgBreakMsg("lm_dcbx_get_ets_ieee_feature parameters are check before "
1942*d14abf15SRobert Mustacchi                             "this should not happen");
1943*d14abf15SRobert Mustacchi 
1944*d14abf15SRobert Mustacchi                 lm_dcbx_ets_disable(pdev);
1945*d14abf15SRobert Mustacchi                 return;
1946*d14abf15SRobert Mustacchi             }
1947*d14abf15SRobert Mustacchi 
1948*d14abf15SRobert Mustacchi             // Prepare for next entry and also represents after this while the number
1949*d14abf15SRobert Mustacchi             // of used COS entries.
1950*d14abf15SRobert Mustacchi             next_free_cos_entry++;
1951*d14abf15SRobert Mustacchi         }
1952*d14abf15SRobert Mustacchi     }
1953*d14abf15SRobert Mustacchi 
1954*d14abf15SRobert Mustacchi     // Fill priority to COS mapping
1955*d14abf15SRobert Mustacchi     for (pri = 0; pri < ARRSIZE(ieee_ets->priority_assignment_table); pri++)
1956*d14abf15SRobert Mustacchi     {
1957*d14abf15SRobert Mustacchi         tc_entry = ieee_ets->priority_assignment_table[pri];
1958*d14abf15SRobert Mustacchi         cos_entry = cee_tc_to_continues_cos[tc_entry];
1959*d14abf15SRobert Mustacchi 
1960*d14abf15SRobert Mustacchi         DbgBreakIf(ARRSIZE(ets_drv_param->cos_params) <= cos_entry);
1961*d14abf15SRobert Mustacchi 
1962*d14abf15SRobert Mustacchi         ets_drv_param->cos_params[cos_entry].pri_bitmask |= 1<< pri;
1963*d14abf15SRobert Mustacchi 
1964*d14abf15SRobert Mustacchi         ets_drv_param->cos_params[cos_entry].pauseable = LM_DCBX_IS_PFC_PRI_SOME_PAUSE(pdev,ets_drv_param->cos_params[cos_entry].pri_bitmask);
1965*d14abf15SRobert Mustacchi     }
1966*d14abf15SRobert Mustacchi 
1967*d14abf15SRobert Mustacchi     DbgBreakIf( ieee_ets->num_traffic_classes < next_free_cos_entry);
1968*d14abf15SRobert Mustacchi 
1969*d14abf15SRobert Mustacchi     ets_drv_param->num_of_cos = (u8_t)next_free_cos_entry;
1970*d14abf15SRobert Mustacchi     ets_drv_param->enabled = TRUE;
1971*d14abf15SRobert Mustacchi 
1972*d14abf15SRobert Mustacchi #if (DBG)
1973*d14abf15SRobert Mustacchi     pri_used_bitmap = 0;
1974*d14abf15SRobert Mustacchi     for(i = 0 ; i < ets_drv_param->num_of_cos; i++)
1975*d14abf15SRobert Mustacchi     {
1976*d14abf15SRobert Mustacchi         // All priorities must be present
1977*d14abf15SRobert Mustacchi         pri_used_bitmap |= ets_drv_param->cos_params[i].pri_bitmask;
1978*d14abf15SRobert Mustacchi         for(j = i+1 ; j < ets_drv_param->num_of_cos; j++)
1979*d14abf15SRobert Mustacchi         {
1980*d14abf15SRobert Mustacchi             // Make sure there are no intersection
1981*d14abf15SRobert Mustacchi             DbgBreakIf(0 != (ets_drv_param->cos_params[i].pri_bitmask &
1982*d14abf15SRobert Mustacchi                              ets_drv_param->cos_params[j].pri_bitmask));
1983*d14abf15SRobert Mustacchi         }
1984*d14abf15SRobert Mustacchi }
1985*d14abf15SRobert Mustacchi     DbgBreakIf(((1 << MAX_PFC_PRIORITIES) -1) != pri_used_bitmap);
1986*d14abf15SRobert Mustacchi #endif //DBG
1987*d14abf15SRobert Mustacchi }
1988*d14abf15SRobert Mustacchi /**
1989*d14abf15SRobert Mustacchi  * @description
1990*d14abf15SRobert Mustacchi  * Fill priority to COS mapping.
1991*d14abf15SRobert Mustacchi  * @param pdev
1992*d14abf15SRobert Mustacchi  */
1993*d14abf15SRobert Mustacchi void
lm_dcbx_fill_pri_to_cos_mapping(lm_device_t * pdev)1994*d14abf15SRobert Mustacchi lm_dcbx_fill_pri_to_cos_mapping(lm_device_t  *pdev)
1995*d14abf15SRobert Mustacchi {
1996*d14abf15SRobert Mustacchi     pg_params_t *ets_drv_param = &pdev->params.dcbx_port_params.ets;
1997*d14abf15SRobert Mustacchi     u8_t pri = 0;
1998*d14abf15SRobert Mustacchi     u8_t cos = 0;
1999*d14abf15SRobert Mustacchi     u8_t pri_bit = 0;
2000*d14abf15SRobert Mustacchi 
2001*d14abf15SRobert Mustacchi     ASSERT_STATIC( MAX_PFC_PRIORITIES == ARRSIZE(pdev->dcbx_info.pri_to_cos));
2002*d14abf15SRobert Mustacchi 
2003*d14abf15SRobert Mustacchi     // Map all priorities to COS 0 by default
2004*d14abf15SRobert Mustacchi     mm_mem_zero(pdev->dcbx_info.pri_to_cos, sizeof(pdev->dcbx_info.pri_to_cos));
2005*d14abf15SRobert Mustacchi 
2006*d14abf15SRobert Mustacchi     if(FALSE == ets_drv_param->enabled)
2007*d14abf15SRobert Mustacchi     {
2008*d14abf15SRobert Mustacchi         return;
2009*d14abf15SRobert Mustacchi     }
2010*d14abf15SRobert Mustacchi 
2011*d14abf15SRobert Mustacchi     // Fill the priority to COS
2012*d14abf15SRobert Mustacchi     for (cos = 0; cos < ets_drv_param->num_of_cos; cos++)
2013*d14abf15SRobert Mustacchi     {
2014*d14abf15SRobert Mustacchi         for( pri = 0; pri < ARRSIZE(pdev->dcbx_info.pri_to_cos) ; pri++)
2015*d14abf15SRobert Mustacchi         {
2016*d14abf15SRobert Mustacchi             pri_bit = 1 << pri;
2017*d14abf15SRobert Mustacchi 
2018*d14abf15SRobert Mustacchi             if (ets_drv_param->cos_params[cos].pri_bitmask & pri_bit)
2019*d14abf15SRobert Mustacchi             {
2020*d14abf15SRobert Mustacchi                 pdev->dcbx_info.pri_to_cos[pri] = cos;
2021*d14abf15SRobert Mustacchi             }
2022*d14abf15SRobert Mustacchi         }
2023*d14abf15SRobert Mustacchi     }
2024*d14abf15SRobert Mustacchi }
2025*d14abf15SRobert Mustacchi 
lm_dcbx_map_nw(INOUT lm_device_t * pdev)2026*d14abf15SRobert Mustacchi static void lm_dcbx_map_nw(INOUT lm_device_t  *pdev)
2027*d14abf15SRobert Mustacchi {
2028*d14abf15SRobert Mustacchi    u8_t i;
2029*d14abf15SRobert Mustacchi    u32_t unmapped = (1 << MAX_PFC_PRIORITIES) - 1; // all ones
2030*d14abf15SRobert Mustacchi    u32_t *ttp = pdev->params.dcbx_port_params.app.traffic_type_priority;
2031*d14abf15SRobert Mustacchi    u32_t nw_prio = 1 << ttp[LLFC_TRAFFIC_TYPE_NW];
2032*d14abf15SRobert Mustacchi    dcbx_cos_params_t *cos_params =
2033*d14abf15SRobert Mustacchi                    pdev->params.dcbx_port_params.ets.cos_params;
2034*d14abf15SRobert Mustacchi 
2035*d14abf15SRobert Mustacchi    // get unmapped priorities by clearing mapped bits
2036*d14abf15SRobert Mustacchi    for (i = 0; i < LLFC_DRIVER_TRAFFIC_TYPE_MAX; i++)
2037*d14abf15SRobert Mustacchi            unmapped &= ~(1 << ttp[i]);
2038*d14abf15SRobert Mustacchi 
2039*d14abf15SRobert Mustacchi    // find cos for nw prio and extend it with unmapped
2040*d14abf15SRobert Mustacchi    for (i = 0; i < ARRSIZE(pdev->params.dcbx_port_params.ets.cos_params); i++) {
2041*d14abf15SRobert Mustacchi            if (cos_params[i].pri_bitmask & nw_prio) {
2042*d14abf15SRobert Mustacchi                    // extend the bitmask with unmapped
2043*d14abf15SRobert Mustacchi                    DbgMessage(pdev, INFORM,
2044*d14abf15SRobert Mustacchi                       "cos %d extended with 0x%08x", i, unmapped);
2045*d14abf15SRobert Mustacchi 
2046*d14abf15SRobert Mustacchi                    cos_params[i].pri_bitmask |= unmapped;
2047*d14abf15SRobert Mustacchi                    break;
2048*d14abf15SRobert Mustacchi            }
2049*d14abf15SRobert Mustacchi    }
2050*d14abf15SRobert Mustacchi }
2051*d14abf15SRobert Mustacchi /**
2052*d14abf15SRobert Mustacchi  * Pass on all priority_assignment_table cells and merge them to
2053*d14abf15SRobert Mustacchi  * the first cell of the BW until the amount of cells will be
2054*d14abf15SRobert Mustacchi  * less than max_tc_sup
2055*d14abf15SRobert Mustacchi  *
2056*d14abf15SRobert Mustacchi  * @param pdev
2057*d14abf15SRobert Mustacchi  * @param ieee_ets
2058*d14abf15SRobert Mustacchi  */
2059*d14abf15SRobert Mustacchi void
lm_dcbx_ie_merge_bw_cells(INOUT lm_device_t * pdev,INOUT dcb_ets_tsa_param_t * ieee_ets)2060*d14abf15SRobert Mustacchi lm_dcbx_ie_merge_bw_cells(
2061*d14abf15SRobert Mustacchi     INOUT   lm_device_t         *pdev,
2062*d14abf15SRobert Mustacchi     INOUT   dcb_ets_tsa_param_t *ieee_ets
2063*d14abf15SRobert Mustacchi     )
2064*d14abf15SRobert Mustacchi {
2065*d14abf15SRobert Mustacchi     const u8_t  max_tc_sup      = lm_dcbx_cos_max_num(pdev);
2066*d14abf15SRobert Mustacchi     const u8_t  invalid_tc      = ARRSIZE(ieee_ets->priority_assignment_table);
2067*d14abf15SRobert Mustacchi     u8_t        tc_entry        = 0;
2068*d14abf15SRobert Mustacchi     u8_t        tc_entry_bit    = 0;
2069*d14abf15SRobert Mustacchi     u8_t        merge_tc        = invalid_tc;
2070*d14abf15SRobert Mustacchi     u8_t        pri             = 0;
2071*d14abf15SRobert Mustacchi     u8_t        pri_remap       = 0;
2072*d14abf15SRobert Mustacchi     u8_t        tc_used_bitmap  = 0;
2073*d14abf15SRobert Mustacchi 
2074*d14abf15SRobert Mustacchi     if(ieee_ets->num_traffic_classes <= max_tc_sup)
2075*d14abf15SRobert Mustacchi     {
2076*d14abf15SRobert Mustacchi         // nothing to do.
2077*d14abf15SRobert Mustacchi         return;
2078*d14abf15SRobert Mustacchi     }
2079*d14abf15SRobert Mustacchi 
2080*d14abf15SRobert Mustacchi     for (pri = 0;
2081*d14abf15SRobert Mustacchi           pri < ARRSIZE(ieee_ets->priority_assignment_table);
2082*d14abf15SRobert Mustacchi           pri++)
2083*d14abf15SRobert Mustacchi     {
2084*d14abf15SRobert Mustacchi         tc_entry = ieee_ets->priority_assignment_table[pri];
2085*d14abf15SRobert Mustacchi         tc_entry_bit = (1 << tc_entry);
2086*d14abf15SRobert Mustacchi 
2087*d14abf15SRobert Mustacchi         if((0 == (tc_used_bitmap & tc_entry_bit)) &&
2088*d14abf15SRobert Mustacchi            (TSA_ASSIGNMENT_DCB_TSA_ETS == ieee_ets->tsa_assignment_table[tc_entry]))
2089*d14abf15SRobert Mustacchi         {
2090*d14abf15SRobert Mustacchi             if(invalid_tc != merge_tc)
2091*d14abf15SRobert Mustacchi             {
2092*d14abf15SRobert Mustacchi                 // We found already a cell to merge to
2093*d14abf15SRobert Mustacchi                 DbgBreakIf(tc_entry == merge_tc);
2094*d14abf15SRobert Mustacchi 
2095*d14abf15SRobert Mustacchi                 // point the pri to merge_tc.
2096*d14abf15SRobert Mustacchi                 ieee_ets->priority_assignment_table[pri] = merge_tc;
2097*d14abf15SRobert Mustacchi 
2098*d14abf15SRobert Mustacchi                 // merge the cells
2099*d14abf15SRobert Mustacchi                 ieee_ets->tc_bw_assignment_table[merge_tc] += ieee_ets->tc_bw_assignment_table[tc_entry];
2100*d14abf15SRobert Mustacchi                 ieee_ets->tc_bw_assignment_table[tc_entry] = 0;
2101*d14abf15SRobert Mustacchi                 ieee_ets->tsa_assignment_table[tc_entry] = TSA_ASSIGNMENT_DCB_TSA_STRICT;// Don't care
2102*d14abf15SRobert Mustacchi 
2103*d14abf15SRobert Mustacchi                 // remapping all tc_entry => merge_tc
2104*d14abf15SRobert Mustacchi                 for (pri_remap = 0;
2105*d14abf15SRobert Mustacchi                       pri_remap < ARRSIZE(ieee_ets->priority_assignment_table);
2106*d14abf15SRobert Mustacchi                       pri_remap++)
2107*d14abf15SRobert Mustacchi                 {
2108*d14abf15SRobert Mustacchi                     if(tc_entry == ieee_ets->priority_assignment_table[pri_remap])
2109*d14abf15SRobert Mustacchi                     {
2110*d14abf15SRobert Mustacchi                         ieee_ets->priority_assignment_table[pri_remap] = merge_tc;
2111*d14abf15SRobert Mustacchi                     }
2112*d14abf15SRobert Mustacchi                 }
2113*d14abf15SRobert Mustacchi 
2114*d14abf15SRobert Mustacchi                 ieee_ets->num_traffic_classes--;
2115*d14abf15SRobert Mustacchi             }
2116*d14abf15SRobert Mustacchi             else
2117*d14abf15SRobert Mustacchi             {
2118*d14abf15SRobert Mustacchi                 // Find first BW cell
2119*d14abf15SRobert Mustacchi                 merge_tc = tc_entry;
2120*d14abf15SRobert Mustacchi             }
2121*d14abf15SRobert Mustacchi         }
2122*d14abf15SRobert Mustacchi 
2123*d14abf15SRobert Mustacchi         tc_used_bitmap |= tc_entry_bit;
2124*d14abf15SRobert Mustacchi 
2125*d14abf15SRobert Mustacchi         if(ieee_ets->num_traffic_classes <= max_tc_sup )
2126*d14abf15SRobert Mustacchi         {
2127*d14abf15SRobert Mustacchi             break;
2128*d14abf15SRobert Mustacchi         }
2129*d14abf15SRobert Mustacchi 
2130*d14abf15SRobert Mustacchi     }
2131*d14abf15SRobert Mustacchi 
2132*d14abf15SRobert Mustacchi     DbgBreakIf(max_tc_sup < ieee_ets->num_traffic_classes);
2133*d14abf15SRobert Mustacchi 
2134*d14abf15SRobert Mustacchi }
2135*d14abf15SRobert Mustacchi /**
2136*d14abf15SRobert Mustacchi  *  if (admin.ETS == local.ETS)
2137*d14abf15SRobert Mustacchi  *              Use OS configuration.
2138*d14abf15SRobert Mustacchi  *  Else
2139*d14abf15SRobert Mustacchi  *              Parse the data from CEE to IEEE .
2140*d14abf15SRobert Mustacchi  * @param pdev
2141*d14abf15SRobert Mustacchi  * @param cee_ets
2142*d14abf15SRobert Mustacchi  *
2143*d14abf15SRobert Mustacchi  * @return u8_t
2144*d14abf15SRobert Mustacchi  */
2145*d14abf15SRobert Mustacchi u8_t
lm_dcbx_ie_is_ets_admin_eq_local(INOUT lm_device_t * pdev,IN dcbx_ets_feature_t * cee_ets)2146*d14abf15SRobert Mustacchi lm_dcbx_ie_is_ets_admin_eq_local(
2147*d14abf15SRobert Mustacchi     INOUT   lm_device_t         *pdev,
2148*d14abf15SRobert Mustacchi     IN      dcbx_ets_feature_t  *cee_ets
2149*d14abf15SRobert Mustacchi     )
2150*d14abf15SRobert Mustacchi {
2151*d14abf15SRobert Mustacchi     lldp_admin_mib_t    admin_mib           = {0};
2152*d14abf15SRobert Mustacchi     u32_t               admin_mib_offset    = 0;
2153*d14abf15SRobert Mustacchi     lm_status_t         lm_status           = LM_STATUS_SUCCESS;
2154*d14abf15SRobert Mustacchi 
2155*d14abf15SRobert Mustacchi     lm_status = lm_dcbx_read_admin_mib( pdev,
2156*d14abf15SRobert Mustacchi                                         &admin_mib,
2157*d14abf15SRobert Mustacchi                                         &admin_mib_offset);
2158*d14abf15SRobert Mustacchi 
2159*d14abf15SRobert Mustacchi     if(LM_STATUS_SUCCESS != lm_status)
2160*d14abf15SRobert Mustacchi     {
2161*d14abf15SRobert Mustacchi         DbgBreakMsg(" lm_dcbx_ie_admin_mib_updated_runtime lm_dcbx_read_admin_mib failed ");
2162*d14abf15SRobert Mustacchi         return FALSE;
2163*d14abf15SRobert Mustacchi     }
2164*d14abf15SRobert Mustacchi 
2165*d14abf15SRobert Mustacchi     return mm_memcmp(cee_ets,
2166*d14abf15SRobert Mustacchi                      &admin_mib.features.ets,
2167*d14abf15SRobert Mustacchi                      sizeof(admin_mib.features.ets));
2168*d14abf15SRobert Mustacchi 
2169*d14abf15SRobert Mustacchi }
2170*d14abf15SRobert Mustacchi /**
2171*d14abf15SRobert Mustacchi    In CEE all strict TC-s are map to PGID=15. This is how it
2172*d14abf15SRobert Mustacchi    will appear in the TLV on the wire and in local settings.
2173*d14abf15SRobert Mustacchi     As a result there is a problem in showing the correct
2174*d14abf15SRobert Mustacchi     strict TC settings of the local and remote peer side (remote
2175*d14abf15SRobert Mustacchi     configuration): a.     If more than one TC (e.g. TC_0 and TC_1)
2176*d14abf15SRobert Mustacchi     will be assigned to TSA strict, on the local or remote peer
2177*d14abf15SRobert Mustacchi     side they will be merged to one TC. b. The strict TC number
2178*d14abf15SRobert Mustacchi     will not be correct on the local and remote peer side.
2179*d14abf15SRobert Mustacchi 
2180*d14abf15SRobert Mustacchi     Assumption:In ETS there is no merging done by MCP we either
2181*d14abf15SRobert Mustacchi     take our configuration or the other side
2182*d14abf15SRobert Mustacchi 
2183*d14abf15SRobert Mustacchi     Suggested solution: Driver will save ETS       OS
2184*d14abf15SRobert Mustacchi     configuration.
2185*d14abf15SRobert Mustacchi 
2186*d14abf15SRobert Mustacchi     In case of an interrupt driver will :
2187*d14abf15SRobert Mustacchi     if (admin.ETS == local.ETS)
2188*d14abf15SRobert Mustacchi                 Use OS configuration.
2189*d14abf15SRobert Mustacchi     Else
2190*d14abf15SRobert Mustacchi                 Parse the data from CEE to IEEE .
2191*d14abf15SRobert Mustacchi  * @param pdev
2192*d14abf15SRobert Mustacchi  * @param cee_ets
2193*d14abf15SRobert Mustacchi  */
2194*d14abf15SRobert Mustacchi void
lm_dcbx_ie_get_ieee_config_param(INOUT lm_device_t * pdev,IN dcbx_ets_feature_t * cee_ets,IN const u32_t error)2195*d14abf15SRobert Mustacchi lm_dcbx_ie_get_ieee_config_param(
2196*d14abf15SRobert Mustacchi     INOUT   lm_device_t         *pdev,
2197*d14abf15SRobert Mustacchi     IN      dcbx_ets_feature_t  *cee_ets,
2198*d14abf15SRobert Mustacchi     IN const u32_t              error
2199*d14abf15SRobert Mustacchi     )
2200*d14abf15SRobert Mustacchi {
2201*d14abf15SRobert Mustacchi     lm_dcbx_indicate_event_t    *indicate_event = &pdev->dcbx_info.indicate_event;
2202*d14abf15SRobert Mustacchi     u32_t                       flags           = 0;
2203*d14abf15SRobert Mustacchi 
2204*d14abf15SRobert Mustacchi     if(FALSE == DCBX_MIB_IS_ETS_ENABLED(pdev->params.dcbx_port_params.app.enabled,
2205*d14abf15SRobert Mustacchi        error,cee_ets->enabled))
2206*d14abf15SRobert Mustacchi     {
2207*d14abf15SRobert Mustacchi         indicate_event->ets_ieee_config_state = lm_dcbx_ets_ieee_config_di;
2208*d14abf15SRobert Mustacchi         mm_mem_zero(&indicate_event->ets_ieee_params_config,
2209*d14abf15SRobert Mustacchi                    sizeof(indicate_event->ets_ieee_params_os));
2210*d14abf15SRobert Mustacchi         return;
2211*d14abf15SRobert Mustacchi     }
2212*d14abf15SRobert Mustacchi 
2213*d14abf15SRobert Mustacchi     if(lm_dcbx_ie_is_ets_admin_eq_local(pdev,cee_ets) &&
2214*d14abf15SRobert Mustacchi        indicate_event->is_ets_ieee_params_os_valid)
2215*d14abf15SRobert Mustacchi     {
2216*d14abf15SRobert Mustacchi         indicate_event->ets_ieee_config_state = lm_dcbx_ets_ieee_config_en;
2217*d14abf15SRobert Mustacchi 
2218*d14abf15SRobert Mustacchi         mm_memcpy(&indicate_event->ets_ieee_params_config,
2219*d14abf15SRobert Mustacchi                   &indicate_event->ets_ieee_params_os,
2220*d14abf15SRobert Mustacchi                   sizeof(indicate_event->ets_ieee_params_os));
2221*d14abf15SRobert Mustacchi     }
2222*d14abf15SRobert Mustacchi     else
2223*d14abf15SRobert Mustacchi     {
2224*d14abf15SRobert Mustacchi         lm_dcbx_ie_ets_cee_to_ieee_unparse(pdev,
2225*d14abf15SRobert Mustacchi                                            cee_ets,
2226*d14abf15SRobert Mustacchi                                            &indicate_event->ets_ieee_params_config,
2227*d14abf15SRobert Mustacchi                                            &flags);
2228*d14abf15SRobert Mustacchi 
2229*d14abf15SRobert Mustacchi         if(GET_FLAGS(flags,DCB_PARAMS_ETS_ENABLED))
2230*d14abf15SRobert Mustacchi         {
2231*d14abf15SRobert Mustacchi             indicate_event->ets_ieee_config_state = lm_dcbx_ets_ieee_config_en;
2232*d14abf15SRobert Mustacchi         }
2233*d14abf15SRobert Mustacchi         else
2234*d14abf15SRobert Mustacchi         {
2235*d14abf15SRobert Mustacchi             indicate_event->ets_ieee_config_state = lm_dcbx_ets_ieee_config_di;
2236*d14abf15SRobert Mustacchi         }
2237*d14abf15SRobert Mustacchi 
2238*d14abf15SRobert Mustacchi         lm_dcbx_ie_merge_bw_cells(pdev,
2239*d14abf15SRobert Mustacchi                                   &indicate_event->ets_ieee_params_config);
2240*d14abf15SRobert Mustacchi     }
2241*d14abf15SRobert Mustacchi }
2242*d14abf15SRobert Mustacchi 
2243*d14abf15SRobert Mustacchi /**
2244*d14abf15SRobert Mustacchi  * @description
2245*d14abf15SRobert Mustacchi  *
2246*d14abf15SRobert Mustacchi  * @param pdev
2247*d14abf15SRobert Mustacchi  * @param pfc
2248*d14abf15SRobert Mustacchi  * @param error
2249*d14abf15SRobert Mustacchi  *
2250*d14abf15SRobert Mustacchi  * @return STATIC void
2251*d14abf15SRobert Mustacchi  */
2252*d14abf15SRobert Mustacchi STATIC void
lm_dcbx_get_ets_feature(INOUT lm_device_t * pdev,IN dcbx_ets_feature_t * ets,IN const u32_t error)2253*d14abf15SRobert Mustacchi lm_dcbx_get_ets_feature(
2254*d14abf15SRobert Mustacchi     INOUT lm_device_t       *pdev,
2255*d14abf15SRobert Mustacchi     IN dcbx_ets_feature_t   *ets,
2256*d14abf15SRobert Mustacchi     IN const u32_t          error
2257*d14abf15SRobert Mustacchi     )
2258*d14abf15SRobert Mustacchi {
2259*d14abf15SRobert Mustacchi     lm_dcbx_indicate_event_t    *indicate_event     = &pdev->dcbx_info.indicate_event;
2260*d14abf15SRobert Mustacchi 
2261*d14abf15SRobert Mustacchi     if(lm_dcbx_ets_config_state_cee == indicate_event->ets_config_state)
2262*d14abf15SRobert Mustacchi     {
2263*d14abf15SRobert Mustacchi         indicate_event->ets_ieee_config_state = lm_dcbx_ets_ieee_config_not_valid;
2264*d14abf15SRobert Mustacchi 
2265*d14abf15SRobert Mustacchi         lm_dcbx_get_ets_cee_feature(
2266*d14abf15SRobert Mustacchi             pdev,
2267*d14abf15SRobert Mustacchi             ets,
2268*d14abf15SRobert Mustacchi             error);
2269*d14abf15SRobert Mustacchi 
2270*d14abf15SRobert Mustacchi         lm_dcbx_map_nw(pdev);
2271*d14abf15SRobert Mustacchi 
2272*d14abf15SRobert Mustacchi         DbgBreakIf(lm_dcbx_ets_ieee_config_not_valid != indicate_event->ets_ieee_config_state);
2273*d14abf15SRobert Mustacchi     }
2274*d14abf15SRobert Mustacchi     else
2275*d14abf15SRobert Mustacchi     {
2276*d14abf15SRobert Mustacchi         lm_dcbx_ie_get_ieee_config_param(pdev,
2277*d14abf15SRobert Mustacchi                                          ets,
2278*d14abf15SRobert Mustacchi                                          error);
2279*d14abf15SRobert Mustacchi 
2280*d14abf15SRobert Mustacchi         //If ets is given from upper layer we don't use chip ETS configuration
2281*d14abf15SRobert Mustacchi         lm_dcbx_ie_get_ets_ieee_feature( pdev);
2282*d14abf15SRobert Mustacchi 
2283*d14abf15SRobert Mustacchi         DbgBreakIf(lm_dcbx_ets_ieee_config_not_valid == indicate_event->ets_ieee_config_state);
2284*d14abf15SRobert Mustacchi     }
2285*d14abf15SRobert Mustacchi 
2286*d14abf15SRobert Mustacchi     lm_dcbx_fill_pri_to_cos_mapping( pdev);
2287*d14abf15SRobert Mustacchi }
2288*d14abf15SRobert Mustacchi /*******************************************************************************
2289*d14abf15SRobert Mustacchi  * Description:
2290*d14abf15SRobert Mustacchi  *
2291*d14abf15SRobert Mustacchi  * Return:
2292*d14abf15SRobert Mustacchi  ******************************************************************************/
2293*d14abf15SRobert Mustacchi STATIC void
lm_dcbx_get_pfc_feature(INOUT lm_device_t * pdev,IN const dcbx_pfc_feature_t * pfc,IN const u32_t error)2294*d14abf15SRobert Mustacchi lm_dcbx_get_pfc_feature(
2295*d14abf15SRobert Mustacchi     INOUT lm_device_t              *pdev,
2296*d14abf15SRobert Mustacchi     IN const dcbx_pfc_feature_t    *pfc,
2297*d14abf15SRobert Mustacchi     IN const u32_t                 error
2298*d14abf15SRobert Mustacchi     )
2299*d14abf15SRobert Mustacchi {
2300*d14abf15SRobert Mustacchi     const u8_t  is_pfc_dis_remote_tlv = lm_dcbx_is_feature_dis_remote_tlv(
2301*d14abf15SRobert Mustacchi                                             pdev,
2302*d14abf15SRobert Mustacchi                                             error,
2303*d14abf15SRobert Mustacchi                                             DCBX_REMOTE_PFC_TLV_NOT_FOUND);
2304*d14abf15SRobert Mustacchi 
2305*d14abf15SRobert Mustacchi     if(DCBX_MIB_IS_PFC_ENABLED(pdev->params.dcbx_port_params.app.enabled,
2306*d14abf15SRobert Mustacchi                                error, pfc->enabled) && (!is_pfc_dis_remote_tlv))
2307*d14abf15SRobert Mustacchi     {
2308*d14abf15SRobert Mustacchi         DbgBreakIf(FALSE == pdev->params.dcbx_port_params.dcbx_enabled);
2309*d14abf15SRobert Mustacchi         pdev->params.dcbx_port_params.pfc.enabled = TRUE;
2310*d14abf15SRobert Mustacchi         pdev->params.dcbx_port_params.pfc.priority_non_pauseable_mask = (u8_t)(~(pfc->pri_en_bitmap));
2311*d14abf15SRobert Mustacchi     }
2312*d14abf15SRobert Mustacchi     else
2313*d14abf15SRobert Mustacchi     {
2314*d14abf15SRobert Mustacchi         pdev->params.dcbx_port_params.pfc.enabled = FALSE;
2315*d14abf15SRobert Mustacchi         pdev->params.dcbx_port_params.pfc.priority_non_pauseable_mask = 0;
2316*d14abf15SRobert Mustacchi     }
2317*d14abf15SRobert Mustacchi 
2318*d14abf15SRobert Mustacchi }
2319*d14abf15SRobert Mustacchi 
2320*d14abf15SRobert Mustacchi /*******************************************************************************
2321*d14abf15SRobert Mustacchi  * Description: Take the highest priority available.(This function don't do the
2322*d14abf15SRobert Mustacchi  *              initialization of priority.)
2323*d14abf15SRobert Mustacchi  *
2324*d14abf15SRobert Mustacchi  * Return:
2325*d14abf15SRobert Mustacchi ******************************************************************************/
2326*d14abf15SRobert Mustacchi STATIC void
lm_dcbx_get_ap_priority(IN lm_device_t * pdev,INOUT u32_t * entry_pri,IN const u8_t pri_bitmap,INOUT u8_t * is_default_off_tt_set)2327*d14abf15SRobert Mustacchi lm_dcbx_get_ap_priority(
2328*d14abf15SRobert Mustacchi     IN          lm_device_t     *pdev,
2329*d14abf15SRobert Mustacchi     INOUT       u32_t           *entry_pri,
2330*d14abf15SRobert Mustacchi     IN const    u8_t            pri_bitmap,
2331*d14abf15SRobert Mustacchi     INOUT       u8_t            *is_default_off_tt_set
2332*d14abf15SRobert Mustacchi     )
2333*d14abf15SRobert Mustacchi {
2334*d14abf15SRobert Mustacchi     u8_t pri      = MAX_PFC_PRIORITIES;
2335*d14abf15SRobert Mustacchi     u8_t index    = 0 ;
2336*d14abf15SRobert Mustacchi     u8_t pri_mask = 0;
2337*d14abf15SRobert Mustacchi 
2338*d14abf15SRobert Mustacchi     //Chose the highest priority the lower pri will get run over
2339*d14abf15SRobert Mustacchi     for(index = 0; index < MAX_PFC_PRIORITIES ; index++)
2340*d14abf15SRobert Mustacchi     {
2341*d14abf15SRobert Mustacchi         pri_mask = 1 <<(index);
2342*d14abf15SRobert Mustacchi         if(GET_FLAGS(pri_bitmap , pri_mask))
2343*d14abf15SRobert Mustacchi         {
2344*d14abf15SRobert Mustacchi             pri = index ;
2345*d14abf15SRobert Mustacchi         }
2346*d14abf15SRobert Mustacchi     }
2347*d14abf15SRobert Mustacchi 
2348*d14abf15SRobert Mustacchi     if(pri < MAX_PFC_PRIORITIES)
2349*d14abf15SRobert Mustacchi     {
2350*d14abf15SRobert Mustacchi         if((*entry_pri < MAX_PFC_PRIORITIES) &&
2351*d14abf15SRobert Mustacchi            (FALSE == *is_default_off_tt_set))
2352*d14abf15SRobert Mustacchi         {
2353*d14abf15SRobert Mustacchi             *entry_pri = max(*entry_pri, pri);
2354*d14abf15SRobert Mustacchi         }
2355*d14abf15SRobert Mustacchi         else
2356*d14abf15SRobert Mustacchi         {
2357*d14abf15SRobert Mustacchi             *entry_pri =  pri;
2358*d14abf15SRobert Mustacchi             *is_default_off_tt_set = FALSE;
2359*d14abf15SRobert Mustacchi         }
2360*d14abf15SRobert Mustacchi 
2361*d14abf15SRobert Mustacchi     }
2362*d14abf15SRobert Mustacchi }
2363*d14abf15SRobert Mustacchi /**
2364*d14abf15SRobert Mustacchi  * Check if the entry is an ISCSI classification entry.
2365*d14abf15SRobert Mustacchi  * @param app_id
2366*d14abf15SRobert Mustacchi  * @param appBitfield
2367*d14abf15SRobert Mustacchi  *
2368*d14abf15SRobert Mustacchi  * @return STATIC u8_t
2369*d14abf15SRobert Mustacchi  */
2370*d14abf15SRobert Mustacchi STATIC u8_t
lm_dcbx_cee_is_entry_iscsi_classif(IN const u8_t appBitfield,IN const u16_t app_id)2371*d14abf15SRobert Mustacchi lm_dcbx_cee_is_entry_iscsi_classif(IN const u8_t    appBitfield,
2372*d14abf15SRobert Mustacchi                                    IN const u16_t   app_id)
2373*d14abf15SRobert Mustacchi {
2374*d14abf15SRobert Mustacchi     if(GET_FLAGS(appBitfield,DCBX_APP_SF_PORT) &&
2375*d14abf15SRobert Mustacchi        (TCP_PORT_ISCSI == app_id))
2376*d14abf15SRobert Mustacchi     {
2377*d14abf15SRobert Mustacchi         return TRUE;
2378*d14abf15SRobert Mustacchi     }
2379*d14abf15SRobert Mustacchi 
2380*d14abf15SRobert Mustacchi     return FALSE;
2381*d14abf15SRobert Mustacchi }
2382*d14abf15SRobert Mustacchi /**
2383*d14abf15SRobert Mustacchi  * Check if the entry is an FCOE classification entry.
2384*d14abf15SRobert Mustacchi  * @param app_id
2385*d14abf15SRobert Mustacchi  * @param appBitfield
2386*d14abf15SRobert Mustacchi  *
2387*d14abf15SRobert Mustacchi  * @return STATIC u8_t
2388*d14abf15SRobert Mustacchi  */
2389*d14abf15SRobert Mustacchi STATIC u8_t
lm_dcbx_cee_is_entry_fcoe_classif(IN const u8_t appBitfield,IN const u16_t app_id)2390*d14abf15SRobert Mustacchi lm_dcbx_cee_is_entry_fcoe_classif(IN const  u8_t    appBitfield,
2391*d14abf15SRobert Mustacchi                                   IN const  u16_t   app_id)
2392*d14abf15SRobert Mustacchi {
2393*d14abf15SRobert Mustacchi     if(GET_FLAGS(appBitfield,DCBX_APP_SF_ETH_TYPE) &&
2394*d14abf15SRobert Mustacchi        (ETH_TYPE_FCOE == app_id))
2395*d14abf15SRobert Mustacchi     {
2396*d14abf15SRobert Mustacchi         return TRUE;
2397*d14abf15SRobert Mustacchi     }
2398*d14abf15SRobert Mustacchi 
2399*d14abf15SRobert Mustacchi     return FALSE;
2400*d14abf15SRobert Mustacchi }
2401*d14abf15SRobert Mustacchi 
2402*d14abf15SRobert Mustacchi /**
2403*d14abf15SRobert Mustacchi  * Look for offload app priorities for offload traffic
2404*d14abf15SRobert Mustacchi  * types:ISCSI and FCOE.
2405*d14abf15SRobert Mustacchi  * @param pdev
2406*d14abf15SRobert Mustacchi  * @param app_tbl
2407*d14abf15SRobert Mustacchi  * @param app_tbl_size
2408*d14abf15SRobert Mustacchi  *
2409*d14abf15SRobert Mustacchi  * @return STATIC void
2410*d14abf15SRobert Mustacchi  */
2411*d14abf15SRobert Mustacchi STATIC void
lm_dcbx_get_app_pri_off_tt(lm_device_t * pdev,IN const dcbx_app_priority_entry_t * app_tbl,IN const u8_t app_tbl_size,INOUT u8_t * is_default_off_tt_used)2412*d14abf15SRobert Mustacchi lm_dcbx_get_app_pri_off_tt(
2413*d14abf15SRobert Mustacchi     lm_device_t                         *pdev,
2414*d14abf15SRobert Mustacchi     IN const dcbx_app_priority_entry_t  *app_tbl,
2415*d14abf15SRobert Mustacchi     IN const u8_t                       app_tbl_size,
2416*d14abf15SRobert Mustacchi     INOUT   u8_t                        *is_default_off_tt_used
2417*d14abf15SRobert Mustacchi     )
2418*d14abf15SRobert Mustacchi {
2419*d14abf15SRobert Mustacchi     u8_t        index   = 0;
2420*d14abf15SRobert Mustacchi 
2421*d14abf15SRobert Mustacchi     for(index = 0 ;(index < app_tbl_size); index++)
2422*d14abf15SRobert Mustacchi     {
2423*d14abf15SRobert Mustacchi         if(DCBX_APP_ENTRY_VALID != GET_FLAGS(app_tbl[index].appBitfield,DCBX_APP_ENTRY_VALID))
2424*d14abf15SRobert Mustacchi         {
2425*d14abf15SRobert Mustacchi             continue;
2426*d14abf15SRobert Mustacchi         }
2427*d14abf15SRobert Mustacchi 
2428*d14abf15SRobert Mustacchi         if(lm_dcbx_cee_is_entry_fcoe_classif(app_tbl[index].appBitfield, app_tbl[index].app_id))
2429*d14abf15SRobert Mustacchi         {
2430*d14abf15SRobert Mustacchi             lm_dcbx_get_ap_priority(pdev,
2431*d14abf15SRobert Mustacchi                                     &(pdev->params.dcbx_port_params.app.traffic_type_priority[LLFC_TRAFFIC_TYPE_FCOE]),
2432*d14abf15SRobert Mustacchi                                     app_tbl[index].pri_bitmap,
2433*d14abf15SRobert Mustacchi                                     &is_default_off_tt_used[LLFC_TRAFFIC_TYPE_FCOE]);
2434*d14abf15SRobert Mustacchi         }
2435*d14abf15SRobert Mustacchi 
2436*d14abf15SRobert Mustacchi         if(lm_dcbx_cee_is_entry_iscsi_classif(app_tbl[index].appBitfield, app_tbl[index].app_id))
2437*d14abf15SRobert Mustacchi         {
2438*d14abf15SRobert Mustacchi             lm_dcbx_get_ap_priority(pdev,
2439*d14abf15SRobert Mustacchi                                     &(pdev->params.dcbx_port_params.app.traffic_type_priority[LLFC_TRAFFIC_TYPE_ISCSI]),
2440*d14abf15SRobert Mustacchi                                     app_tbl[index].pri_bitmap,
2441*d14abf15SRobert Mustacchi                                     &is_default_off_tt_used[LLFC_TRAFFIC_TYPE_ISCSI]);
2442*d14abf15SRobert Mustacchi         }
2443*d14abf15SRobert Mustacchi     }
2444*d14abf15SRobert Mustacchi }
2445*d14abf15SRobert Mustacchi /**
2446*d14abf15SRobert Mustacchi  * Update non negotiation application IDs entries.
2447*d14abf15SRobert Mustacchi  * @param pdev
2448*d14abf15SRobert Mustacchi  *
2449*d14abf15SRobert Mustacchi  * @return STATIC void
2450*d14abf15SRobert Mustacchi  */
2451*d14abf15SRobert Mustacchi STATIC void
lm_dcbx_get_app_pri_off_tt_non_neg(INOUT lm_device_t * pdev,INOUT u8_t * is_default_off_tt_set)2452*d14abf15SRobert Mustacchi lm_dcbx_get_app_pri_off_tt_non_neg(
2453*d14abf15SRobert Mustacchi     INOUT   lm_device_t *pdev,
2454*d14abf15SRobert Mustacchi     INOUT   u8_t        *is_default_off_tt_set)
2455*d14abf15SRobert Mustacchi {
2456*d14abf15SRobert Mustacchi     lm_dcbx_indicate_event_t *indicate_event    = &pdev->dcbx_info.indicate_event;
2457*d14abf15SRobert Mustacchi     // If indicate event is enabled and there is a OS configuration contained an entry
2458*d14abf15SRobert Mustacchi     // with �TCP port� = 3260 use that entry.
2459*d14abf15SRobert Mustacchi     if((TRUE == pdev->dcbx_info.is_indicate_event_en) &&
2460*d14abf15SRobert Mustacchi         (LM_DCBX_ILLEGAL_PRI != indicate_event->iscsi_tcp_pri))
2461*d14abf15SRobert Mustacchi     {
2462*d14abf15SRobert Mustacchi         pdev->params.dcbx_port_params.app.traffic_type_priority[LLFC_TRAFFIC_TYPE_ISCSI] =
2463*d14abf15SRobert Mustacchi             indicate_event->iscsi_tcp_pri;
2464*d14abf15SRobert Mustacchi 
2465*d14abf15SRobert Mustacchi         is_default_off_tt_set[LLFC_TRAFFIC_TYPE_ISCSI] = FALSE;
2466*d14abf15SRobert Mustacchi     }
2467*d14abf15SRobert Mustacchi }
2468*d14abf15SRobert Mustacchi /*******************************************************************************
2469*d14abf15SRobert Mustacchi  *  Description:
2470*d14abf15SRobert Mustacchi  *  Traffic type (protocol) identification:
2471*d14abf15SRobert Mustacchi  * Networking is identified by Ether-Type = IPv4 or Ether-Type =IPv6.
2472*d14abf15SRobert Mustacchi  * iSCSI is  by TCP-port = iSCSI well know port (3260)
2473*d14abf15SRobert Mustacchi  * FCoE is identified by Ether-type = FCoE
2474*d14abf15SRobert Mustacchi  * Theoretically each protocol can be associated with multiple priorities (a priority bit map). In this case we choose the highest one.
2475*d14abf15SRobert Mustacchi  * Priority assignment for networking:
2476*d14abf15SRobert Mustacchi  * 1.      If IPv4 is identified, the networking priority is the IPv4 priority (highest one as mentioned above).
2477*d14abf15SRobert Mustacchi  * 2.      Otherwise if IPv6 is identified, the networking priority is the IPv6 priority.
2478*d14abf15SRobert Mustacchi  * 3.      Otherwise the networking priority is set 0. (All other protocol TLVs which are not iSCSI or FCoE are ignored).
2479*d14abf15SRobert Mustacchi  *
2480*d14abf15SRobert Mustacchi  * Priority assignment for iSCSI:
2481*d14abf15SRobert Mustacchi  * 1. If the operational configuration from MCP contains an entry with 'TCP or UDP port' = 3260 use that entry,
2482*d14abf15SRobert Mustacchi  * 2. Else if OS configuration contained an entry with 'TCP port' = 3260 use that entry,
2483*d14abf15SRobert Mustacchi  * 3. Else use the default configuration.
2484*d14abf15SRobert Mustacchi  *
2485*d14abf15SRobert Mustacchi  * Priority assignment for FCoE:
2486*d14abf15SRobert Mustacchi  * 1.      If FCoE is identified, then obviously this is the FCoE priority (again the highest one).
2487*d14abf15SRobert Mustacchi  * 2.      Otherwise FCoE priority is set to default configuration.
2488*d14abf15SRobert Mustacchi  * Return:
2489*d14abf15SRobert Mustacchi  ******************************************************************************/
2490*d14abf15SRobert Mustacchi STATIC void
lm_dcbx_get_ap_feature(INOUT lm_device_t * pdev,IN const dcbx_app_priority_feature_t * app,IN const dcbx_app_priority_entry_t * app_tbl_ext,IN const u8_t app_tbl_ext_size,IN const u32_t error)2491*d14abf15SRobert Mustacchi lm_dcbx_get_ap_feature(
2492*d14abf15SRobert Mustacchi     INOUT lm_device_t                       *pdev,
2493*d14abf15SRobert Mustacchi     IN const dcbx_app_priority_feature_t    *app,
2494*d14abf15SRobert Mustacchi     IN const dcbx_app_priority_entry_t      *app_tbl_ext,
2495*d14abf15SRobert Mustacchi     IN const u8_t                           app_tbl_ext_size,
2496*d14abf15SRobert Mustacchi     IN const u32_t                          error)
2497*d14abf15SRobert Mustacchi {
2498*d14abf15SRobert Mustacchi     u8_t    index = 0;
2499*d14abf15SRobert Mustacchi     u8_t const  default_pri                                 = (app->default_pri < MAX_PFC_PRIORITIES)? app->default_pri: 0;
2500*d14abf15SRobert Mustacchi     u8_t        is_default_off_tt_used[MAX_TRAFFIC_TYPE]    = {0};
2501*d14abf15SRobert Mustacchi     const u8_t  is_app_dis_remote_tlv                       = lm_dcbx_is_feature_dis_remote_tlv(
2502*d14abf15SRobert Mustacchi                                                                     pdev,
2503*d14abf15SRobert Mustacchi                                                                     error,
2504*d14abf15SRobert Mustacchi                                                                     DCBX_REMOTE_APP_TLV_NOT_FOUND);
2505*d14abf15SRobert Mustacchi 
2506*d14abf15SRobert Mustacchi     if((TRUE == pdev->params.dcbx_port_params.dcbx_enabled) &&
2507*d14abf15SRobert Mustacchi         DCBX_MIB_IS_APP_ENABLED(app->enabled, error) && (!is_app_dis_remote_tlv))
2508*d14abf15SRobert Mustacchi     {
2509*d14abf15SRobert Mustacchi         pdev->params.dcbx_port_params.app.enabled = TRUE;
2510*d14abf15SRobert Mustacchi 
2511*d14abf15SRobert Mustacchi         // First initialize all the entries to default priority
2512*d14abf15SRobert Mustacchi         for( index=0 ; index < ARRSIZE(pdev->params.dcbx_port_params.app.traffic_type_priority) ;index++)
2513*d14abf15SRobert Mustacchi         {
2514*d14abf15SRobert Mustacchi             is_default_off_tt_used[index] = TRUE;
2515*d14abf15SRobert Mustacchi             pdev->params.dcbx_port_params.app.traffic_type_priority[index] = default_pri;
2516*d14abf15SRobert Mustacchi         }
2517*d14abf15SRobert Mustacchi         // The value of this entries is used only if there isn't a corresponding negotiated entry.
2518*d14abf15SRobert Mustacchi         lm_dcbx_get_app_pri_off_tt_non_neg(pdev, is_default_off_tt_used);
2519*d14abf15SRobert Mustacchi 
2520*d14abf15SRobert Mustacchi         lm_dcbx_get_app_pri_off_tt(pdev,
2521*d14abf15SRobert Mustacchi                                    app->app_pri_tbl,
2522*d14abf15SRobert Mustacchi                                    ARRSIZE(app->app_pri_tbl),
2523*d14abf15SRobert Mustacchi                                    is_default_off_tt_used);
2524*d14abf15SRobert Mustacchi 
2525*d14abf15SRobert Mustacchi         lm_dcbx_get_app_pri_off_tt(pdev,
2526*d14abf15SRobert Mustacchi                                    app_tbl_ext,
2527*d14abf15SRobert Mustacchi                                    app_tbl_ext_size,
2528*d14abf15SRobert Mustacchi                                    is_default_off_tt_used);
2529*d14abf15SRobert Mustacchi             }
2530*d14abf15SRobert Mustacchi     else
2531*d14abf15SRobert Mustacchi     {
2532*d14abf15SRobert Mustacchi         pdev->params.dcbx_port_params.app.enabled = FALSE;
2533*d14abf15SRobert Mustacchi         for( index=0 ;
2534*d14abf15SRobert Mustacchi              index < ARRSIZE(pdev->params.dcbx_port_params.app.traffic_type_priority) ;
2535*d14abf15SRobert Mustacchi              index++)
2536*d14abf15SRobert Mustacchi         {
2537*d14abf15SRobert Mustacchi             pdev->params.dcbx_port_params.app.traffic_type_priority[index] =
2538*d14abf15SRobert Mustacchi                 INVALID_TRAFFIC_TYPE_PRIORITY;
2539*d14abf15SRobert Mustacchi         }
2540*d14abf15SRobert Mustacchi     }
2541*d14abf15SRobert Mustacchi }
2542*d14abf15SRobert Mustacchi void
lm_dcbx_get_dcbx_enabled(INOUT lm_device_t * pdev,IN const u32_t error)2543*d14abf15SRobert Mustacchi lm_dcbx_get_dcbx_enabled(
2544*d14abf15SRobert Mustacchi     INOUT   lm_device_t         *pdev,
2545*d14abf15SRobert Mustacchi     IN const u32_t              error)
2546*d14abf15SRobert Mustacchi {
2547*d14abf15SRobert Mustacchi     dcbx_port_params_t  *dcbx_port_params = &(pdev->params.dcbx_port_params);
2548*d14abf15SRobert Mustacchi     u8_t const mfw_config = lm_dcbx_check_drv_flags(pdev, DRV_FLAGS_DCB_MFW_CONFIGURED);
2549*d14abf15SRobert Mustacchi 
2550*d14abf15SRobert Mustacchi     if((0 == GET_FLAGS(error, DCBX_REMOTE_MIB_ERROR)) ||
2551*d14abf15SRobert Mustacchi         (TRUE == mfw_config))
2552*d14abf15SRobert Mustacchi     {
2553*d14abf15SRobert Mustacchi         dcbx_port_params->dcbx_enabled = TRUE;
2554*d14abf15SRobert Mustacchi     }
2555*d14abf15SRobert Mustacchi     else
2556*d14abf15SRobert Mustacchi     {
2557*d14abf15SRobert Mustacchi         //If no configuration from OS / BACS and no DCBX received from the peer then disable DCB.
2558*d14abf15SRobert Mustacchi         dcbx_port_params->dcbx_enabled = FALSE;
2559*d14abf15SRobert Mustacchi     }
2560*d14abf15SRobert Mustacchi }
2561*d14abf15SRobert Mustacchi /*******************************************************************************
2562*d14abf15SRobert Mustacchi  * Description: Translate PFC/PG parameters to VBD parameters and call relevent
2563*d14abf15SRobert Mustacchi  * Function to set the parameters.
2564*d14abf15SRobert Mustacchi  *
2565*d14abf15SRobert Mustacchi  * Return:
2566*d14abf15SRobert Mustacchi ******************************************************************************/
2567*d14abf15SRobert Mustacchi STATIC void
lm_print_dcbx_drv_param(IN struct _lm_device_t * pdev,IN const lldp_local_mib_t * local_mib)2568*d14abf15SRobert Mustacchi lm_print_dcbx_drv_param(IN struct _lm_device_t     *pdev,
2569*d14abf15SRobert Mustacchi                         IN const lldp_local_mib_t  *local_mib)
2570*d14abf15SRobert Mustacchi {
2571*d14abf15SRobert Mustacchi #if DBG
2572*d14abf15SRobert Mustacchi     u8_t i =0;
2573*d14abf15SRobert Mustacchi     DbgMessage(pdev, INFORM, "local_mib.error %x\n",local_mib->error);
2574*d14abf15SRobert Mustacchi 
2575*d14abf15SRobert Mustacchi     //Pg
2576*d14abf15SRobert Mustacchi     DbgMessage(pdev, INFORM, "local_mib.features.ets.enabled %x\n",local_mib->features.ets.enabled);
2577*d14abf15SRobert Mustacchi     for(i=0;i<DCBX_MAX_NUM_PG_BW_ENTRIES;i++)
2578*d14abf15SRobert Mustacchi     {
2579*d14abf15SRobert Mustacchi         DbgMessage(pdev, INFORM, "local_mib.features.ets.pg_bw_tbl[%x] %x\n",i,DCBX_PG_BW_GET(local_mib->features.ets.pg_bw_tbl,i));
2580*d14abf15SRobert Mustacchi     }
2581*d14abf15SRobert Mustacchi     for(i=0;i<DCBX_MAX_NUM_PRI_PG_ENTRIES;i++)
2582*d14abf15SRobert Mustacchi     {
2583*d14abf15SRobert Mustacchi         DbgMessage(pdev, INFORM,"local_mib.features.ets.pri_pg_tbl[%x] %x\n",i,DCBX_PRI_PG_GET(local_mib->features.ets.pri_pg_tbl,i));
2584*d14abf15SRobert Mustacchi     }
2585*d14abf15SRobert Mustacchi 
2586*d14abf15SRobert Mustacchi     //pfc
2587*d14abf15SRobert Mustacchi     DbgMessage(pdev, INFORM, "local_mib.features.pfc.pri_en_bitmap %x\n",local_mib->features.pfc.pri_en_bitmap);
2588*d14abf15SRobert Mustacchi     DbgMessage(pdev, INFORM, "local_mib.features.pfc.pfc_caps %x\n",local_mib->features.pfc.pfc_caps);
2589*d14abf15SRobert Mustacchi     DbgMessage(pdev, INFORM, "local_mib.features.pfc.enabled %x\n",local_mib->features.pfc.enabled);
2590*d14abf15SRobert Mustacchi 
2591*d14abf15SRobert Mustacchi     DbgMessage(pdev, INFORM, "local_mib.features.app.default_pri %x\n",local_mib->features.app.default_pri);
2592*d14abf15SRobert Mustacchi     DbgMessage(pdev, INFORM, "local_mib.features.app.tc_supported %x\n",local_mib->features.app.tc_supported);
2593*d14abf15SRobert Mustacchi     DbgMessage(pdev, INFORM, "local_mib.features.app.enabled %x\n",local_mib->features.app.enabled);
2594*d14abf15SRobert Mustacchi     for(i=0;i<DCBX_MAX_APP_PROTOCOL;i++)
2595*d14abf15SRobert Mustacchi     {
2596*d14abf15SRobert Mustacchi 
2597*d14abf15SRobert Mustacchi         // This has no logic this is only done for supporting old bootcodes.
2598*d14abf15SRobert Mustacchi         // The boot code still expexts u8 [2] instead of u16
2599*d14abf15SRobert Mustacchi         DbgMessage(pdev, INFORM,"local_mib.features.app.app_pri_tbl[%x].app_id %x\n",
2600*d14abf15SRobert Mustacchi                     i,local_mib->features.app.app_pri_tbl[i].app_id);
2601*d14abf15SRobert Mustacchi 
2602*d14abf15SRobert Mustacchi         DbgMessage(pdev, INFORM, "local_mib.features.app.app_pri_tbl[%x].pri_bitmap %x\n",
2603*d14abf15SRobert Mustacchi                     i,local_mib->features.app.app_pri_tbl[i].pri_bitmap);
2604*d14abf15SRobert Mustacchi         DbgMessage(pdev, INFORM, "local_mib.features.app.app_pri_tbl[%x].appBitfield %x\n",
2605*d14abf15SRobert Mustacchi                     i,local_mib->features.app.app_pri_tbl[i].appBitfield);
2606*d14abf15SRobert Mustacchi     }
2607*d14abf15SRobert Mustacchi #endif
2608*d14abf15SRobert Mustacchi }
2609*d14abf15SRobert Mustacchi /*******************************************************************************
2610*d14abf15SRobert Mustacchi  * Description: Translate PFC/PG parameters to VBD parameters and call relevent
2611*d14abf15SRobert Mustacchi  * Function to set the parameters.
2612*d14abf15SRobert Mustacchi  *
2613*d14abf15SRobert Mustacchi  * Return:
2614*d14abf15SRobert Mustacchi  ******************************************************************************/
2615*d14abf15SRobert Mustacchi STATIC void
lm_get_dcbx_drv_param(INOUT lm_device_t * pdev,IN lldp_local_mib_t * local_mib,IN const lldp_local_mib_ext_t * local_mib_ext)2616*d14abf15SRobert Mustacchi lm_get_dcbx_drv_param(INOUT     lm_device_t         *pdev,
2617*d14abf15SRobert Mustacchi                       IN        lldp_local_mib_t        *local_mib,
2618*d14abf15SRobert Mustacchi                       IN const  lldp_local_mib_ext_t    *local_mib_ext)
2619*d14abf15SRobert Mustacchi {
2620*d14abf15SRobert Mustacchi     if(CHK_NULL(local_mib) || CHK_NULL(local_mib_ext))
2621*d14abf15SRobert Mustacchi     {
2622*d14abf15SRobert Mustacchi         DbgBreakMsg("lm_get_dcbx_drv_param wrong in parameters ");
2623*d14abf15SRobert Mustacchi         return;
2624*d14abf15SRobert Mustacchi     }
2625*d14abf15SRobert Mustacchi 
2626*d14abf15SRobert Mustacchi     lm_dcbx_get_dcbx_enabled(
2627*d14abf15SRobert Mustacchi         pdev,
2628*d14abf15SRobert Mustacchi         local_mib->error);
2629*d14abf15SRobert Mustacchi 
2630*d14abf15SRobert Mustacchi     lm_dcbx_get_ap_feature(
2631*d14abf15SRobert Mustacchi         pdev,
2632*d14abf15SRobert Mustacchi         &(local_mib->features.app),
2633*d14abf15SRobert Mustacchi         local_mib_ext->app_pri_tbl_ext,
2634*d14abf15SRobert Mustacchi         ARRSIZE(local_mib_ext->app_pri_tbl_ext),
2635*d14abf15SRobert Mustacchi         local_mib->error);
2636*d14abf15SRobert Mustacchi 
2637*d14abf15SRobert Mustacchi     lm_dcbx_get_pfc_feature(
2638*d14abf15SRobert Mustacchi         pdev,
2639*d14abf15SRobert Mustacchi         &(local_mib->features.pfc),
2640*d14abf15SRobert Mustacchi         local_mib->error);
2641*d14abf15SRobert Mustacchi 
2642*d14abf15SRobert Mustacchi     lm_dcbx_get_ets_feature(
2643*d14abf15SRobert Mustacchi         pdev,
2644*d14abf15SRobert Mustacchi         &(local_mib->features.ets),
2645*d14abf15SRobert Mustacchi         local_mib->error);
2646*d14abf15SRobert Mustacchi }
2647*d14abf15SRobert Mustacchi /*******************************************************************************
2648*d14abf15SRobert Mustacchi  * Description: Should be integrate with write and moved to common code
2649*d14abf15SRobert Mustacchi  *
2650*d14abf15SRobert Mustacchi  * Return:
2651*d14abf15SRobert Mustacchi ******************************************************************************/
2652*d14abf15SRobert Mustacchi STATIC void
lm_dcbx_read_shmem2_mcp_fields(struct _lm_device_t * pdev,u32_t offset,u32_t * val)2653*d14abf15SRobert Mustacchi lm_dcbx_read_shmem2_mcp_fields(struct _lm_device_t * pdev,
2654*d14abf15SRobert Mustacchi                         u32_t                 offset,
2655*d14abf15SRobert Mustacchi                         u32_t               * val)
2656*d14abf15SRobert Mustacchi {
2657*d14abf15SRobert Mustacchi     u32_t shmem2_size;
2658*d14abf15SRobert Mustacchi 
2659*d14abf15SRobert Mustacchi     if (pdev->hw_info.shmem_base2 != 0)
2660*d14abf15SRobert Mustacchi     {
2661*d14abf15SRobert Mustacchi         LM_SHMEM2_READ(pdev, OFFSETOF(shmem2_region_t,size), &shmem2_size);
2662*d14abf15SRobert Mustacchi         if (shmem2_size > offset)
2663*d14abf15SRobert Mustacchi         {
2664*d14abf15SRobert Mustacchi             LM_SHMEM2_READ(pdev, offset, val);
2665*d14abf15SRobert Mustacchi         }
2666*d14abf15SRobert Mustacchi     }
2667*d14abf15SRobert Mustacchi }
2668*d14abf15SRobert Mustacchi 
2669*d14abf15SRobert Mustacchi /*******************************************************************************
2670*d14abf15SRobert Mustacchi  * Description:Should be integrate with read and moved to common code
2671*d14abf15SRobert Mustacchi  *
2672*d14abf15SRobert Mustacchi  * Return:
2673*d14abf15SRobert Mustacchi ******************************************************************************/
2674*d14abf15SRobert Mustacchi STATIC void
lm_dcbx_write_shmem2_mcp_fields(struct _lm_device_t * pdev,u32_t offset,u32_t val)2675*d14abf15SRobert Mustacchi lm_dcbx_write_shmem2_mcp_fields(struct _lm_device_t *pdev,
2676*d14abf15SRobert Mustacchi                                 u32_t               offset,
2677*d14abf15SRobert Mustacchi                                 u32_t               val)
2678*d14abf15SRobert Mustacchi {
2679*d14abf15SRobert Mustacchi     u32_t shmem2_size;
2680*d14abf15SRobert Mustacchi 
2681*d14abf15SRobert Mustacchi     if (pdev->hw_info.shmem_base2 != 0)
2682*d14abf15SRobert Mustacchi     {
2683*d14abf15SRobert Mustacchi         LM_SHMEM2_READ(pdev, OFFSETOF(shmem2_region_t,size), &shmem2_size);
2684*d14abf15SRobert Mustacchi         if (shmem2_size > offset)
2685*d14abf15SRobert Mustacchi         {
2686*d14abf15SRobert Mustacchi             LM_SHMEM2_WRITE(pdev, offset, val);
2687*d14abf15SRobert Mustacchi         }
2688*d14abf15SRobert Mustacchi     }
2689*d14abf15SRobert Mustacchi }
2690*d14abf15SRobert Mustacchi /*******************************************************************************
2691*d14abf15SRobert Mustacchi  * Description:
2692*d14abf15SRobert Mustacchi  *
2693*d14abf15SRobert Mustacchi  * Return:
2694*d14abf15SRobert Mustacchi ******************************************************************************/
2695*d14abf15SRobert Mustacchi STATIC void
lm_dcbx_stop_hw_tx(struct _lm_device_t * pdev)2696*d14abf15SRobert Mustacchi lm_dcbx_stop_hw_tx(struct _lm_device_t * pdev)
2697*d14abf15SRobert Mustacchi {
2698*d14abf15SRobert Mustacchi 
2699*d14abf15SRobert Mustacchi     // TODO DCBX change to cmd_id
2700*d14abf15SRobert Mustacchi     lm_eq_ramrod_post_sync(pdev,
2701*d14abf15SRobert Mustacchi                            RAMROD_CMD_ID_COMMON_STOP_TRAFFIC,
2702*d14abf15SRobert Mustacchi                            0,
2703*d14abf15SRobert Mustacchi                            CMD_PRIORITY_MEDIUM,/* Called from WI must be done ASAP*/
2704*d14abf15SRobert Mustacchi                            &(pdev->dcbx_info.dcbx_ramrod_state),
2705*d14abf15SRobert Mustacchi                            FUNCTION_DCBX_STOP_POSTED,
2706*d14abf15SRobert Mustacchi                            FUNCTION_DCBX_STOP_COMPLETED);
2707*d14abf15SRobert Mustacchi 
2708*d14abf15SRobert Mustacchi }
2709*d14abf15SRobert Mustacchi /*******************************************************************************
2710*d14abf15SRobert Mustacchi  * Description:
2711*d14abf15SRobert Mustacchi  *
2712*d14abf15SRobert Mustacchi  * Return:
2713*d14abf15SRobert Mustacchi ******************************************************************************/
2714*d14abf15SRobert Mustacchi STATIC void
lm_dcbx_resume_hw_tx(struct _lm_device_t * pdev)2715*d14abf15SRobert Mustacchi lm_dcbx_resume_hw_tx(struct _lm_device_t * pdev)
2716*d14abf15SRobert Mustacchi {
2717*d14abf15SRobert Mustacchi     lm_dcbx_fw_struct(pdev);
2718*d14abf15SRobert Mustacchi 
2719*d14abf15SRobert Mustacchi     lm_eq_ramrod_post_sync(pdev,
2720*d14abf15SRobert Mustacchi                            RAMROD_CMD_ID_COMMON_START_TRAFFIC,
2721*d14abf15SRobert Mustacchi                            pdev->dcbx_info.pfc_fw_cfg_phys.as_u64,
2722*d14abf15SRobert Mustacchi                            CMD_PRIORITY_HIGH,/* Called from WI must be done ASAP*/
2723*d14abf15SRobert Mustacchi                            &(pdev->dcbx_info.dcbx_ramrod_state),
2724*d14abf15SRobert Mustacchi                            FUNCTION_DCBX_START_POSTED,
2725*d14abf15SRobert Mustacchi                            FUNCTION_DCBX_START_COMPLETED);
2726*d14abf15SRobert Mustacchi 
2727*d14abf15SRobert Mustacchi }
2728*d14abf15SRobert Mustacchi /*******************************************************************************
2729*d14abf15SRobert Mustacchi  * Description:
2730*d14abf15SRobert Mustacchi  *
2731*d14abf15SRobert Mustacchi  * Return:
2732*d14abf15SRobert Mustacchi ******************************************************************************/
2733*d14abf15SRobert Mustacchi #define DCBX_LOCAL_MIB_MAX_TRY_READ             (100)
2734*d14abf15SRobert Mustacchi STATIC lm_status_t
lm_dcbx_read_remote_local_mib(IN struct _lm_device_t * pdev,OUT u32_t * base_mib_addr,IN const dcbx_read_mib_type read_mib_type)2735*d14abf15SRobert Mustacchi lm_dcbx_read_remote_local_mib(IN        struct _lm_device_t  *pdev,
2736*d14abf15SRobert Mustacchi                               OUT       u32_t                *base_mib_addr,
2737*d14abf15SRobert Mustacchi                               IN const  dcbx_read_mib_type   read_mib_type)
2738*d14abf15SRobert Mustacchi {
2739*d14abf15SRobert Mustacchi     static const u8_t dcbx_local_mib_max_try_read = DCBX_LOCAL_MIB_MAX_TRY_READ;
2740*d14abf15SRobert Mustacchi     u8_t    max_try_read            = 0 ,i =0;
2741*d14abf15SRobert Mustacchi     u32_t * buff                    = NULL;
2742*d14abf15SRobert Mustacchi     u32_t   mib_size                = 0,prefix_seq_num = 0 ,suffix_seq_num = 0;
2743*d14abf15SRobert Mustacchi     lldp_remote_mib_t *remote_mib   = NULL;
2744*d14abf15SRobert Mustacchi     lldp_local_mib_t  *local_mib    = NULL;
2745*d14abf15SRobert Mustacchi     const u32_t         mcp_dcbx_neg_res_offset     = OFFSETOF(shmem2_region_t,dcbx_neg_res_offset);
2746*d14abf15SRobert Mustacchi     const u32_t         mcp_dcbx_remote_mib_offset  = OFFSETOF(shmem2_region_t,dcbx_remote_mib_offset);
2747*d14abf15SRobert Mustacchi     u32_t               offset                      = 0;
2748*d14abf15SRobert Mustacchi     // verify no wraparound on while loop
2749*d14abf15SRobert Mustacchi     ASSERT_STATIC( sizeof( max_try_read ) == sizeof(u8_t) );
2750*d14abf15SRobert Mustacchi     ASSERT_STATIC(DCBX_LOCAL_MIB_MAX_TRY_READ < ((u8_t)-1));
2751*d14abf15SRobert Mustacchi 
2752*d14abf15SRobert Mustacchi     switch (read_mib_type)
2753*d14abf15SRobert Mustacchi     {
2754*d14abf15SRobert Mustacchi     case DCBX_READ_LOCAL_MIB:
2755*d14abf15SRobert Mustacchi 
2756*d14abf15SRobert Mustacchi         // Get negotiation results MIB data
2757*d14abf15SRobert Mustacchi         offset  = SHMEM_DCBX_NEG_RES_NONE;
2758*d14abf15SRobert Mustacchi 
2759*d14abf15SRobert Mustacchi         lm_dcbx_read_shmem2_mcp_fields(pdev,
2760*d14abf15SRobert Mustacchi                                        mcp_dcbx_neg_res_offset,
2761*d14abf15SRobert Mustacchi                                        &offset);
2762*d14abf15SRobert Mustacchi 
2763*d14abf15SRobert Mustacchi         if (SHMEM_DCBX_NEG_RES_NONE == offset)
2764*d14abf15SRobert Mustacchi         {
2765*d14abf15SRobert Mustacchi             DbgBreakMsg("lm_dcbx_read_remote_local_mib DCBX Negotiation result not supported");
2766*d14abf15SRobert Mustacchi             return LM_STATUS_FAILURE;
2767*d14abf15SRobert Mustacchi         }
2768*d14abf15SRobert Mustacchi         mib_size = sizeof(lldp_local_mib_t);
2769*d14abf15SRobert Mustacchi         break;
2770*d14abf15SRobert Mustacchi     case DCBX_READ_REMOTE_MIB:
2771*d14abf15SRobert Mustacchi         // Get remote MIB data
2772*d14abf15SRobert Mustacchi         offset  = SHMEM_DCBX_REMOTE_MIB_NONE;
2773*d14abf15SRobert Mustacchi 
2774*d14abf15SRobert Mustacchi         lm_dcbx_read_shmem2_mcp_fields(pdev,
2775*d14abf15SRobert Mustacchi                                 mcp_dcbx_remote_mib_offset,
2776*d14abf15SRobert Mustacchi                                 &offset);
2777*d14abf15SRobert Mustacchi 
2778*d14abf15SRobert Mustacchi         if (SHMEM_DCBX_REMOTE_MIB_NONE == offset)
2779*d14abf15SRobert Mustacchi         {
2780*d14abf15SRobert Mustacchi             DbgBreakMsg("lm_dcbx_read_remote_local_mib DCBX Negotiation result not supported");
2781*d14abf15SRobert Mustacchi             return LM_STATUS_FAILURE;
2782*d14abf15SRobert Mustacchi         }
2783*d14abf15SRobert Mustacchi 
2784*d14abf15SRobert Mustacchi         mib_size = sizeof(lldp_remote_mib_t);
2785*d14abf15SRobert Mustacchi         break;
2786*d14abf15SRobert Mustacchi     default:
2787*d14abf15SRobert Mustacchi         DbgBreakIf(1);
2788*d14abf15SRobert Mustacchi         return LM_STATUS_FAILURE;
2789*d14abf15SRobert Mustacchi     }
2790*d14abf15SRobert Mustacchi 
2791*d14abf15SRobert Mustacchi     offset += PORT_ID(pdev) * mib_size;
2792*d14abf15SRobert Mustacchi 
2793*d14abf15SRobert Mustacchi     do
2794*d14abf15SRobert Mustacchi     {
2795*d14abf15SRobert Mustacchi         buff = base_mib_addr;
2796*d14abf15SRobert Mustacchi 
2797*d14abf15SRobert Mustacchi         for(i=0 ;i<mib_size; i+=4,buff++)
2798*d14abf15SRobert Mustacchi         {
2799*d14abf15SRobert Mustacchi             *buff = REG_RD(pdev,
2800*d14abf15SRobert Mustacchi                           offset + i);
2801*d14abf15SRobert Mustacchi         }
2802*d14abf15SRobert Mustacchi         max_try_read++;
2803*d14abf15SRobert Mustacchi 
2804*d14abf15SRobert Mustacchi         switch (read_mib_type)
2805*d14abf15SRobert Mustacchi         {
2806*d14abf15SRobert Mustacchi         case DCBX_READ_LOCAL_MIB:
2807*d14abf15SRobert Mustacchi             local_mib   = (lldp_local_mib_t *) base_mib_addr;
2808*d14abf15SRobert Mustacchi             prefix_seq_num = local_mib->prefix_seq_num;
2809*d14abf15SRobert Mustacchi             suffix_seq_num = local_mib->suffix_seq_num;
2810*d14abf15SRobert Mustacchi             break;
2811*d14abf15SRobert Mustacchi         case DCBX_READ_REMOTE_MIB:
2812*d14abf15SRobert Mustacchi             remote_mib   = (lldp_remote_mib_t *) base_mib_addr;
2813*d14abf15SRobert Mustacchi             prefix_seq_num = remote_mib->prefix_seq_num;
2814*d14abf15SRobert Mustacchi             suffix_seq_num = remote_mib->suffix_seq_num;
2815*d14abf15SRobert Mustacchi             break;
2816*d14abf15SRobert Mustacchi         default:
2817*d14abf15SRobert Mustacchi             DbgBreakIf(1);
2818*d14abf15SRobert Mustacchi             return LM_STATUS_FAILURE;
2819*d14abf15SRobert Mustacchi         }
2820*d14abf15SRobert Mustacchi     }while((prefix_seq_num != suffix_seq_num)&&
2821*d14abf15SRobert Mustacchi            (max_try_read <dcbx_local_mib_max_try_read));
2822*d14abf15SRobert Mustacchi 
2823*d14abf15SRobert Mustacchi 
2824*d14abf15SRobert Mustacchi     if(max_try_read >= dcbx_local_mib_max_try_read)
2825*d14abf15SRobert Mustacchi     {
2826*d14abf15SRobert Mustacchi         DbgBreakMsg("prefix_seq_num doesnt equal suffix_seq_num for to much time");
2827*d14abf15SRobert Mustacchi         return LM_STATUS_FAILURE;
2828*d14abf15SRobert Mustacchi     }
2829*d14abf15SRobert Mustacchi     return LM_STATUS_SUCCESS;
2830*d14abf15SRobert Mustacchi }
2831*d14abf15SRobert Mustacchi /**
2832*d14abf15SRobert Mustacchi  *
2833*d14abf15SRobert Mustacchi  * @param pdev
2834*d14abf15SRobert Mustacchi  * @param local_mib
2835*d14abf15SRobert Mustacchi  * @param local_mib_ext
2836*d14abf15SRobert Mustacchi  *
2837*d14abf15SRobert Mustacchi  * @return lm_status_t
2838*d14abf15SRobert Mustacchi  */
2839*d14abf15SRobert Mustacchi lm_status_t
lm_dcbx_read_local_mib_fields(IN struct _lm_device_t * pdev,OUT lldp_local_mib_t * local_mib,OUT lldp_local_mib_ext_t * local_mib_ext)2840*d14abf15SRobert Mustacchi lm_dcbx_read_local_mib_fields(
2841*d14abf15SRobert Mustacchi     IN struct _lm_device_t  *pdev,
2842*d14abf15SRobert Mustacchi     OUT lldp_local_mib_t     *local_mib,
2843*d14abf15SRobert Mustacchi     OUT lldp_local_mib_ext_t *local_mib_ext)
2844*d14abf15SRobert Mustacchi {
2845*d14abf15SRobert Mustacchi     const u32_t field_res_ext_offset    = OFFSETOF(shmem2_region_t,dcbx_neg_res_ext_offset);
2846*d14abf15SRobert Mustacchi     u32_t       res_ext_offset          = SHMEM_DCBX_NEG_RES_EXT_NONE;
2847*d14abf15SRobert Mustacchi     u8_t        is_ext_sup              = FALSE;
2848*d14abf15SRobert Mustacchi     u8_t        max_try_read            = 0;
2849*d14abf15SRobert Mustacchi     lm_status_t      lm_status          = LM_STATUS_SUCCESS;
2850*d14abf15SRobert Mustacchi 
2851*d14abf15SRobert Mustacchi     mm_mem_zero(local_mib, sizeof(lldp_local_mib_t));
2852*d14abf15SRobert Mustacchi     mm_mem_zero(local_mib_ext, sizeof(lldp_local_mib_ext_t));
2853*d14abf15SRobert Mustacchi 
2854*d14abf15SRobert Mustacchi     if(LM_SHMEM2_HAS(pdev, dcbx_neg_res_ext_offset))
2855*d14abf15SRobert Mustacchi     {
2856*d14abf15SRobert Mustacchi     lm_dcbx_read_shmem2_mcp_fields(pdev,
2857*d14abf15SRobert Mustacchi                                        field_res_ext_offset,
2858*d14abf15SRobert Mustacchi                                        &res_ext_offset);
2859*d14abf15SRobert Mustacchi         //CQ62832 - T7.0  bootcode contains the field dcbx_neg_res_ext_offset
2860*d14abf15SRobert Mustacchi         // in shmem2 but dcbx_neg_res_ext_offse isn't implemented.
2861*d14abf15SRobert Mustacchi         if (SHMEM_DCBX_NEG_RES_EXT_NONE != res_ext_offset)
2862*d14abf15SRobert Mustacchi         {
2863*d14abf15SRobert Mustacchi         res_ext_offset += PORT_ID(pdev) * sizeof(lldp_local_mib_ext_t);
2864*d14abf15SRobert Mustacchi         is_ext_sup = TRUE;
2865*d14abf15SRobert Mustacchi     }
2866*d14abf15SRobert Mustacchi     }
2867*d14abf15SRobert Mustacchi 
2868*d14abf15SRobert Mustacchi     do
2869*d14abf15SRobert Mustacchi     {
2870*d14abf15SRobert Mustacchi     lm_status = lm_dcbx_read_remote_local_mib(pdev,
2871*d14abf15SRobert Mustacchi                                                   (u32_t *)local_mib,
2872*d14abf15SRobert Mustacchi                                               DCBX_READ_LOCAL_MIB);
2873*d14abf15SRobert Mustacchi         if (LM_STATUS_SUCCESS != lm_status)
2874*d14abf15SRobert Mustacchi         {
2875*d14abf15SRobert Mustacchi             DbgBreakMsg("lm_dcbx_read_remote_local_mib DCBX Negotiation result not supported");
2876*d14abf15SRobert Mustacchi             return lm_status;
2877*d14abf15SRobert Mustacchi         }
2878*d14abf15SRobert Mustacchi 
2879*d14abf15SRobert Mustacchi         if(FALSE == is_ext_sup)
2880*d14abf15SRobert Mustacchi         {
2881*d14abf15SRobert Mustacchi             break;
2882*d14abf15SRobert Mustacchi         }
2883*d14abf15SRobert Mustacchi 
2884*d14abf15SRobert Mustacchi         lm_reg_rd_blk(pdev,
2885*d14abf15SRobert Mustacchi                       res_ext_offset,
2886*d14abf15SRobert Mustacchi                       (u32_t *)local_mib_ext,
2887*d14abf15SRobert Mustacchi                       (sizeof(lldp_local_mib_ext_t)/sizeof(u32_t)));
2888*d14abf15SRobert Mustacchi 
2889*d14abf15SRobert Mustacchi         if((local_mib->prefix_seq_num == local_mib->suffix_seq_num ) &&
2890*d14abf15SRobert Mustacchi            (local_mib_ext->prefix_seq_num == local_mib_ext->suffix_seq_num ) &&
2891*d14abf15SRobert Mustacchi            (local_mib_ext->suffix_seq_num == local_mib->suffix_seq_num ))
2892*d14abf15SRobert Mustacchi         {
2893*d14abf15SRobert Mustacchi             break;
2894*d14abf15SRobert Mustacchi         }
2895*d14abf15SRobert Mustacchi 
2896*d14abf15SRobert Mustacchi         max_try_read++;
2897*d14abf15SRobert Mustacchi 
2898*d14abf15SRobert Mustacchi     }while(max_try_read < DCBX_LOCAL_MIB_MAX_TRY_READ);
2899*d14abf15SRobert Mustacchi 
2900*d14abf15SRobert Mustacchi 
2901*d14abf15SRobert Mustacchi     if(max_try_read >= DCBX_LOCAL_MIB_MAX_TRY_READ)
2902*d14abf15SRobert Mustacchi     {
2903*d14abf15SRobert Mustacchi         DbgBreakMsg("lm_dcbx_read_local_mib_fields : prefix_seq_num doesnt equal suffix_seq_num for to much time");
2904*d14abf15SRobert Mustacchi         return LM_STATUS_FAILURE;
2905*d14abf15SRobert Mustacchi     }
2906*d14abf15SRobert Mustacchi 
2907*d14abf15SRobert Mustacchi     return lm_status;
2908*d14abf15SRobert Mustacchi }
2909*d14abf15SRobert Mustacchi /**
2910*d14abf15SRobert Mustacchi  * Use parameters given for first calculate VBD settings for
2911*d14abf15SRobert Mustacchi  * each feature.
2912*d14abf15SRobert Mustacchi  * Use VBD settings to configure HW.
2913*d14abf15SRobert Mustacchi  * @param pdev
2914*d14abf15SRobert Mustacchi  * @param local_mib Not const because ETS parameters can be
2915*d14abf15SRobert Mustacchi  *                  changed (merge)
2916*d14abf15SRobert Mustacchi  * @param local_mib_ext
2917*d14abf15SRobert Mustacchi  * @param is_local_ets_change
2918*d14abf15SRobert Mustacchi  * @param b_can_update_ie - Update indiacate enent if indicate
2919*d14abf15SRobert Mustacchi  *                          event is valid and b_can_update_ie.
2920*d14abf15SRobert Mustacchi  *
2921*d14abf15SRobert Mustacchi  * @return lm_status_t
2922*d14abf15SRobert Mustacchi  */
2923*d14abf15SRobert Mustacchi lm_status_t
lm_dcbx_set_params(IN lm_device_t * pdev,IN lldp_local_mib_t * local_mib,IN lldp_local_mib_ext_t * local_mib_ext,IN const u8_t is_local_ets_change,IN const u8_t b_can_update_ie)2924*d14abf15SRobert Mustacchi lm_dcbx_set_params(
2925*d14abf15SRobert Mustacchi     IN          lm_device_t              *pdev,
2926*d14abf15SRobert Mustacchi     IN  /*const*/ lldp_local_mib_t       *local_mib,
2927*d14abf15SRobert Mustacchi     IN  /*const*/   lldp_local_mib_ext_t *local_mib_ext,
2928*d14abf15SRobert Mustacchi     IN  const   u8_t                     is_local_ets_change,
2929*d14abf15SRobert Mustacchi     IN  const   u8_t                     b_can_update_ie
2930*d14abf15SRobert Mustacchi     )
2931*d14abf15SRobert Mustacchi {
2932*d14abf15SRobert Mustacchi     lm_status_t      lm_status          = LM_STATUS_SUCCESS;
2933*d14abf15SRobert Mustacchi 
2934*d14abf15SRobert Mustacchi     if(!IS_PMF(pdev))
2935*d14abf15SRobert Mustacchi     {
2936*d14abf15SRobert Mustacchi         DbgBreakMsg("lm_dcbx_update_lpme_set_params error");
2937*d14abf15SRobert Mustacchi         return LM_STATUS_FAILURE;
2938*d14abf15SRobert Mustacchi     }
2939*d14abf15SRobert Mustacchi 
2940*d14abf15SRobert Mustacchi 
2941*d14abf15SRobert Mustacchi     if(FALSE == pdev->dcbx_info.is_dcbx_neg_received)
2942*d14abf15SRobert Mustacchi     {
2943*d14abf15SRobert Mustacchi     pdev->dcbx_info.is_dcbx_neg_received = TRUE;
2944*d14abf15SRobert Mustacchi         // Setting the completion bit to TRUE can be
2945*d14abf15SRobert Mustacchi         // done only once but will done on each PMF
2946*d14abf15SRobert Mustacchi         // migration because is_dcbx_neg_received is
2947*d14abf15SRobert Mustacchi         // per function.
2948*d14abf15SRobert Mustacchi         lm_dcbx_config_drv_flags(pdev, lm_dcbx_drv_flags_set_bit, DRV_FLAGS_DCB_CONFIGURED);
2949*d14abf15SRobert Mustacchi     }
2950*d14abf15SRobert Mustacchi 
2951*d14abf15SRobert Mustacchi     lm_print_dcbx_drv_param(pdev,
2952*d14abf15SRobert Mustacchi                             local_mib);
2953*d14abf15SRobert Mustacchi 
2954*d14abf15SRobert Mustacchi     lm_get_dcbx_drv_param(pdev,
2955*d14abf15SRobert Mustacchi                           local_mib,
2956*d14abf15SRobert Mustacchi                           local_mib_ext);
2957*d14abf15SRobert Mustacchi 
2958*d14abf15SRobert Mustacchi     MM_ACQUIRE_PHY_LOCK(pdev);
2959*d14abf15SRobert Mustacchi     lm_cmng_update(pdev);
2960*d14abf15SRobert Mustacchi     MM_RELEASE_PHY_LOCK(pdev);
2961*d14abf15SRobert Mustacchi 
2962*d14abf15SRobert Mustacchi     lm_dcbx_stop_hw_tx(pdev);
2963*d14abf15SRobert Mustacchi 
2964*d14abf15SRobert Mustacchi     lm_pfc_handle_pfc(pdev);
2965*d14abf15SRobert Mustacchi 
2966*d14abf15SRobert Mustacchi     lm_dcbx_update_ets_params(pdev);
2967*d14abf15SRobert Mustacchi 
2968*d14abf15SRobert Mustacchi     lm_dcbx_resume_hw_tx(pdev);
2969*d14abf15SRobert Mustacchi 
2970*d14abf15SRobert Mustacchi     if((TRUE == pdev->dcbx_info.is_indicate_event_en) &&
2971*d14abf15SRobert Mustacchi        (TRUE == b_can_update_ie))
2972*d14abf15SRobert Mustacchi     {
2973*d14abf15SRobert Mustacchi         lm_status = lm_dcbx_ie_check_if_param_change(pdev,
2974*d14abf15SRobert Mustacchi                                                      local_mib,
2975*d14abf15SRobert Mustacchi                                                      local_mib_ext,
2976*d14abf15SRobert Mustacchi                                                      is_local_ets_change);
2977*d14abf15SRobert Mustacchi     }
2978*d14abf15SRobert Mustacchi 
2979*d14abf15SRobert Mustacchi     return lm_status;
2980*d14abf15SRobert Mustacchi }
2981*d14abf15SRobert Mustacchi /**
2982*d14abf15SRobert Mustacchi  * Read data from MCP and configure DCBX in HW and FW.
2983*d14abf15SRobert Mustacchi  * @param pdev
2984*d14abf15SRobert Mustacchi  * @param is_local_ets_change
2985*d14abf15SRobert Mustacchi  * @param b_can_update_ie Update indiacate enent if indicate
2986*d14abf15SRobert Mustacchi  *                          event is valid and b_can_update_ie.
2987*d14abf15SRobert Mustacchi  *
2988*d14abf15SRobert Mustacchi  * @return lm_status_t
2989*d14abf15SRobert Mustacchi  */
2990*d14abf15SRobert Mustacchi lm_status_t
lm_dcbx_set_params_and_read_mib(IN lm_device_t * pdev,IN const u8_t is_local_ets_change,IN const u8_t b_can_update_ie)2991*d14abf15SRobert Mustacchi lm_dcbx_set_params_and_read_mib(
2992*d14abf15SRobert Mustacchi     IN          lm_device_t *pdev,
2993*d14abf15SRobert Mustacchi     IN  const   u8_t        is_local_ets_change,
2994*d14abf15SRobert Mustacchi     IN  const   u8_t        b_can_update_ie
2995*d14abf15SRobert Mustacchi     )
2996*d14abf15SRobert Mustacchi {
2997*d14abf15SRobert Mustacchi     lldp_local_mib_t local_mib          = {0};
2998*d14abf15SRobert Mustacchi     lldp_local_mib_ext_t local_mib_ext  = {0};
2999*d14abf15SRobert Mustacchi     lm_status_t      lm_status          = LM_STATUS_SUCCESS;
3000*d14abf15SRobert Mustacchi 
3001*d14abf15SRobert Mustacchi     // No current flow should support this.
3002*d14abf15SRobert Mustacchi     DbgBreakIf(FALSE == b_can_update_ie);
3003*d14abf15SRobert Mustacchi 
3004*d14abf15SRobert Mustacchi     if(!IS_PMF(pdev))
3005*d14abf15SRobert Mustacchi     {
3006*d14abf15SRobert Mustacchi         DbgBreakMsg("lm_dcbx_update_lpme_set_params error");
3007*d14abf15SRobert Mustacchi         return LM_STATUS_FAILURE;
3008*d14abf15SRobert Mustacchi     }
3009*d14abf15SRobert Mustacchi 
3010*d14abf15SRobert Mustacchi     lm_status = lm_dcbx_read_local_mib_fields(pdev,
3011*d14abf15SRobert Mustacchi                                               &local_mib,
3012*d14abf15SRobert Mustacchi                                               &local_mib_ext);
3013*d14abf15SRobert Mustacchi 
3014*d14abf15SRobert Mustacchi     if(lm_status != LM_STATUS_SUCCESS)
3015*d14abf15SRobert Mustacchi     {
3016*d14abf15SRobert Mustacchi 
3017*d14abf15SRobert Mustacchi         DbgBreakMsg("lm_dcbx_set_params: couldn't read local_mib");
3018*d14abf15SRobert Mustacchi         return lm_status;
3019*d14abf15SRobert Mustacchi     }
3020*d14abf15SRobert Mustacchi     /******************************start Debbuging code not to submit**************************************/
3021*d14abf15SRobert Mustacchi     mm_memcpy(&pdev->dcbx_info.local_mib_last, &local_mib, sizeof(local_mib));
3022*d14abf15SRobert Mustacchi     /******************************end Debbuging code not to submit****************************************/
3023*d14abf15SRobert Mustacchi 
3024*d14abf15SRobert Mustacchi     lm_status =  lm_dcbx_set_params(pdev,
3025*d14abf15SRobert Mustacchi                                     &local_mib,
3026*d14abf15SRobert Mustacchi                                     &local_mib_ext,
3027*d14abf15SRobert Mustacchi                                     is_local_ets_change,
3028*d14abf15SRobert Mustacchi                                     b_can_update_ie);
3029*d14abf15SRobert Mustacchi 
3030*d14abf15SRobert Mustacchi     return lm_status;
3031*d14abf15SRobert Mustacchi }
3032*d14abf15SRobert Mustacchi /**
3033*d14abf15SRobert Mustacchi  * Disable DCBX in HW and FW.
3034*d14abf15SRobert Mustacchi  * @param pdev
3035*d14abf15SRobert Mustacchi  * @param b_can_update_ie - Update indiacate enent if indicate
3036*d14abf15SRobert Mustacchi  *                          event is valid and b_can_update_ie.
3037*d14abf15SRobert Mustacchi  *
3038*d14abf15SRobert Mustacchi  * @return lm_status_t
3039*d14abf15SRobert Mustacchi  */
3040*d14abf15SRobert Mustacchi lm_status_t
lm_dcbx_disable_dcb_at_fw_and_hw(IN lm_device_t * pdev,IN const u8_t b_can_update_ie)3041*d14abf15SRobert Mustacchi lm_dcbx_disable_dcb_at_fw_and_hw(
3042*d14abf15SRobert Mustacchi     IN          lm_device_t *pdev,
3043*d14abf15SRobert Mustacchi     IN  const   u8_t        b_can_update_ie
3044*d14abf15SRobert Mustacchi     )
3045*d14abf15SRobert Mustacchi {
3046*d14abf15SRobert Mustacchi     lldp_local_mib_t local_mib          = {0};
3047*d14abf15SRobert Mustacchi     lldp_local_mib_ext_t local_mib_ext  = {0};
3048*d14abf15SRobert Mustacchi     lm_status_t      lm_status          = LM_STATUS_SUCCESS;
3049*d14abf15SRobert Mustacchi 
3050*d14abf15SRobert Mustacchi     // No current flow should support this.
3051*d14abf15SRobert Mustacchi     DbgBreakIf(TRUE == b_can_update_ie);
3052*d14abf15SRobert Mustacchi 
3053*d14abf15SRobert Mustacchi     if(!IS_PMF(pdev))
3054*d14abf15SRobert Mustacchi     {
3055*d14abf15SRobert Mustacchi         DbgBreakMsg("lm_dcbx_update_lpme_set_params error");
3056*d14abf15SRobert Mustacchi         return LM_STATUS_FAILURE;
3057*d14abf15SRobert Mustacchi     }
3058*d14abf15SRobert Mustacchi 
3059*d14abf15SRobert Mustacchi     lm_status =  lm_dcbx_set_params(pdev,
3060*d14abf15SRobert Mustacchi                                     &local_mib,
3061*d14abf15SRobert Mustacchi                                     &local_mib_ext,
3062*d14abf15SRobert Mustacchi                                     FALSE,
3063*d14abf15SRobert Mustacchi                                     b_can_update_ie);
3064*d14abf15SRobert Mustacchi 
3065*d14abf15SRobert Mustacchi     return lm_status;
3066*d14abf15SRobert Mustacchi }
3067*d14abf15SRobert Mustacchi /**********************start DCBX INIT FUNCTIONS**************************************/
3068*d14abf15SRobert Mustacchi 
3069*d14abf15SRobert Mustacchi /*******************************************************************************
3070*d14abf15SRobert Mustacchi  * Description:
3071*d14abf15SRobert Mustacchi  *
3072*d14abf15SRobert Mustacchi  * Return:
3073*d14abf15SRobert Mustacchi ******************************************************************************/
3074*d14abf15SRobert Mustacchi STATIC lm_status_t
lm_dcbx_init_check_params_valid(INOUT lm_device_t * pdev,OUT u32_t * buff_check,IN const u32_t buff_size)3075*d14abf15SRobert Mustacchi lm_dcbx_init_check_params_valid(INOUT       lm_device_t     *pdev,
3076*d14abf15SRobert Mustacchi                                 OUT         u32_t           *buff_check,
3077*d14abf15SRobert Mustacchi                                 IN const    u32_t           buff_size)
3078*d14abf15SRobert Mustacchi {
3079*d14abf15SRobert Mustacchi     u32_t i=0;
3080*d14abf15SRobert Mustacchi     lm_status_t ret_val = LM_STATUS_SUCCESS;
3081*d14abf15SRobert Mustacchi 
3082*d14abf15SRobert Mustacchi     for (i=0 ; i < buff_size ; i++,buff_check++)
3083*d14abf15SRobert Mustacchi     {
3084*d14abf15SRobert Mustacchi         if( DCBX_CONFIG_INV_VALUE == *buff_check)
3085*d14abf15SRobert Mustacchi         {
3086*d14abf15SRobert Mustacchi             ret_val = LM_STATUS_INVALID_PARAMETER;
3087*d14abf15SRobert Mustacchi         }
3088*d14abf15SRobert Mustacchi     }
3089*d14abf15SRobert Mustacchi     return ret_val;
3090*d14abf15SRobert Mustacchi }
3091*d14abf15SRobert Mustacchi /*******************************************************************************
3092*d14abf15SRobert Mustacchi  * Description: Read lldp parameters.
3093*d14abf15SRobert Mustacchi  * Return:
3094*d14abf15SRobert Mustacchi ******************************************************************************/
3095*d14abf15SRobert Mustacchi lm_status_t
lm_dcbx_lldp_read_params(struct _lm_device_t * pdev,b10_lldp_params_get_t * lldp_params)3096*d14abf15SRobert Mustacchi lm_dcbx_lldp_read_params(struct _lm_device_t            * pdev,
3097*d14abf15SRobert Mustacchi                          b10_lldp_params_get_t          * lldp_params)
3098*d14abf15SRobert Mustacchi {
3099*d14abf15SRobert Mustacchi     lldp_params_t       mcp_lldp_params                 = {0};
3100*d14abf15SRobert Mustacchi     lldp_dcbx_stat_t    mcp_dcbx_stat                   = {{0}};
3101*d14abf15SRobert Mustacchi     u32_t               i                               = 0;
3102*d14abf15SRobert Mustacchi     u32_t               *buff                           = NULL ;
3103*d14abf15SRobert Mustacchi     u32_t               offset                          = 0;
3104*d14abf15SRobert Mustacchi     lm_status_t         lm_status                       = LM_STATUS_SUCCESS;
3105*d14abf15SRobert Mustacchi     const u32_t         mcp_dcbx_lldp_params_offset     = OFFSETOF(shmem2_region_t,dcbx_lldp_params_offset);
3106*d14abf15SRobert Mustacchi     const u32_t         mcp_dcbx_lldp_dcbx_stat_offset  = OFFSETOF(shmem2_region_t,dcbx_lldp_dcbx_stat_offset);
3107*d14abf15SRobert Mustacchi 
3108*d14abf15SRobert Mustacchi     mm_mem_zero(lldp_params, sizeof(b10_lldp_params_get_t));
3109*d14abf15SRobert Mustacchi 
3110*d14abf15SRobert Mustacchi 
3111*d14abf15SRobert Mustacchi     offset     = SHMEM_LLDP_DCBX_PARAMS_NONE;
3112*d14abf15SRobert Mustacchi 
3113*d14abf15SRobert Mustacchi     lm_dcbx_read_shmem2_mcp_fields(pdev,
3114*d14abf15SRobert Mustacchi                             mcp_dcbx_lldp_params_offset,
3115*d14abf15SRobert Mustacchi                             &offset);
3116*d14abf15SRobert Mustacchi 
3117*d14abf15SRobert Mustacchi     if((!IS_DCB_ENABLED(pdev)) ||
3118*d14abf15SRobert Mustacchi        (SHMEM_LLDP_DCBX_PARAMS_NONE == offset))
3119*d14abf15SRobert Mustacchi     {//DCBX isn't supported on E1
3120*d14abf15SRobert Mustacchi         return LM_STATUS_FAILURE;
3121*d14abf15SRobert Mustacchi     }
3122*d14abf15SRobert Mustacchi 
3123*d14abf15SRobert Mustacchi     lldp_params->config_lldp_params.overwrite_settings =
3124*d14abf15SRobert Mustacchi         pdev->params.lldp_config_params.overwrite_settings;
3125*d14abf15SRobert Mustacchi 
3126*d14abf15SRobert Mustacchi     if (SHMEM_LLDP_DCBX_PARAMS_NONE != offset)
3127*d14abf15SRobert Mustacchi     {
3128*d14abf15SRobert Mustacchi         offset += PORT_ID(pdev) * sizeof(lldp_params_t);
3129*d14abf15SRobert Mustacchi 
3130*d14abf15SRobert Mustacchi         //Read the data first
3131*d14abf15SRobert Mustacchi         buff = (u32_t *)&mcp_lldp_params;
3132*d14abf15SRobert Mustacchi         for(i=0 ;i<sizeof(lldp_params_t); i+=4,buff++)
3133*d14abf15SRobert Mustacchi         {
3134*d14abf15SRobert Mustacchi             *buff = REG_RD(pdev,
3135*d14abf15SRobert Mustacchi                           (offset + i));
3136*d14abf15SRobert Mustacchi         }
3137*d14abf15SRobert Mustacchi         lldp_params->ver_num                                     = LLDP_PARAMS_VER_NUM;
3138*d14abf15SRobert Mustacchi         lldp_params->config_lldp_params.msg_tx_hold              = mcp_lldp_params.msg_tx_hold;
3139*d14abf15SRobert Mustacchi         lldp_params->config_lldp_params.msg_fast_tx              = mcp_lldp_params.msg_fast_tx_interval;
3140*d14abf15SRobert Mustacchi         lldp_params->config_lldp_params.tx_credit_max            = mcp_lldp_params.tx_crd_max;
3141*d14abf15SRobert Mustacchi         lldp_params->config_lldp_params.msg_tx_interval          = mcp_lldp_params.msg_tx_interval;
3142*d14abf15SRobert Mustacchi         lldp_params->config_lldp_params.tx_fast                  = mcp_lldp_params.tx_fast;
3143*d14abf15SRobert Mustacchi 
3144*d14abf15SRobert Mustacchi 
3145*d14abf15SRobert Mustacchi         // Preparation for new shmem
3146*d14abf15SRobert Mustacchi         ASSERT_STATIC(ARRSIZE(lldp_params->remote_chassis_id) >= ARRSIZE(mcp_lldp_params.peer_chassis_id));
3147*d14abf15SRobert Mustacchi         ASSERT_STATIC(sizeof(lldp_params->remote_chassis_id[0]) == sizeof(mcp_lldp_params.peer_chassis_id[0]));
3148*d14abf15SRobert Mustacchi         for(i=0 ; i< ARRSIZE(mcp_lldp_params.peer_chassis_id) ; i++)
3149*d14abf15SRobert Mustacchi         {
3150*d14abf15SRobert Mustacchi             lldp_params->remote_chassis_id[i]    = mcp_lldp_params.peer_chassis_id[i];
3151*d14abf15SRobert Mustacchi         }
3152*d14abf15SRobert Mustacchi 
3153*d14abf15SRobert Mustacchi         ASSERT_STATIC(sizeof(lldp_params->remote_port_id[0]) == sizeof(mcp_lldp_params.peer_port_id[0]));
3154*d14abf15SRobert Mustacchi         ASSERT_STATIC(ARRSIZE(lldp_params->remote_port_id) > ARRSIZE(mcp_lldp_params.peer_port_id));
3155*d14abf15SRobert Mustacchi         for(i=0 ; i<ARRSIZE(mcp_lldp_params.peer_port_id) ; i++)
3156*d14abf15SRobert Mustacchi         {
3157*d14abf15SRobert Mustacchi             lldp_params->remote_port_id[i]    = mcp_lldp_params.peer_port_id[i];
3158*d14abf15SRobert Mustacchi         }
3159*d14abf15SRobert Mustacchi 
3160*d14abf15SRobert Mustacchi         lldp_params->admin_status                                = mcp_lldp_params.admin_status;
3161*d14abf15SRobert Mustacchi     }
3162*d14abf15SRobert Mustacchi     else
3163*d14abf15SRobert Mustacchi     {// DCBX not supported in MCP
3164*d14abf15SRobert Mustacchi         DbgBreakMsg("DCBX DCBX params supported");
3165*d14abf15SRobert Mustacchi         lm_status= LM_STATUS_FAILURE;
3166*d14abf15SRobert Mustacchi     }
3167*d14abf15SRobert Mustacchi 
3168*d14abf15SRobert Mustacchi     offset     = SHMEM_LLDP_DCBX_STAT_NONE;
3169*d14abf15SRobert Mustacchi 
3170*d14abf15SRobert Mustacchi     lm_dcbx_read_shmem2_mcp_fields(pdev,
3171*d14abf15SRobert Mustacchi                             mcp_dcbx_lldp_dcbx_stat_offset,
3172*d14abf15SRobert Mustacchi                             &offset);
3173*d14abf15SRobert Mustacchi 
3174*d14abf15SRobert Mustacchi     if (SHMEM_LLDP_DCBX_STAT_NONE != offset)
3175*d14abf15SRobert Mustacchi     {
3176*d14abf15SRobert Mustacchi         offset += PORT_ID(pdev) * sizeof(mcp_dcbx_stat);
3177*d14abf15SRobert Mustacchi 
3178*d14abf15SRobert Mustacchi         //Read the data first
3179*d14abf15SRobert Mustacchi         buff = (u32_t *)&mcp_dcbx_stat;
3180*d14abf15SRobert Mustacchi         for(i=0 ;i<sizeof(mcp_dcbx_stat); i+=4,buff++)
3181*d14abf15SRobert Mustacchi         {
3182*d14abf15SRobert Mustacchi             *buff = REG_RD(pdev,
3183*d14abf15SRobert Mustacchi                           (offset + i));
3184*d14abf15SRobert Mustacchi         }
3185*d14abf15SRobert Mustacchi         // Preparation for new shmem
3186*d14abf15SRobert Mustacchi 
3187*d14abf15SRobert Mustacchi         ASSERT_STATIC(ARRSIZE(lldp_params->local_chassis_id) >= ARRSIZE(mcp_dcbx_stat.local_chassis_id));
3188*d14abf15SRobert Mustacchi         ASSERT_STATIC(sizeof(lldp_params->local_chassis_id[0]) >= sizeof(mcp_dcbx_stat.local_chassis_id[0]));
3189*d14abf15SRobert Mustacchi         for(i=0 ; i< ARRSIZE(mcp_dcbx_stat.local_chassis_id) ; i++)
3190*d14abf15SRobert Mustacchi         {
3191*d14abf15SRobert Mustacchi             lldp_params->local_chassis_id[i]    = mcp_dcbx_stat.local_chassis_id[i];
3192*d14abf15SRobert Mustacchi         }
3193*d14abf15SRobert Mustacchi 
3194*d14abf15SRobert Mustacchi         ASSERT_STATIC(ARRSIZE(lldp_params->local_port_id) >= ARRSIZE(mcp_dcbx_stat.local_port_id));
3195*d14abf15SRobert Mustacchi         ASSERT_STATIC(sizeof(lldp_params->local_port_id[0]) >= sizeof(mcp_dcbx_stat.local_port_id[0]));
3196*d14abf15SRobert Mustacchi         for(i=0 ; i< ARRSIZE(mcp_dcbx_stat.local_port_id) ; i++)
3197*d14abf15SRobert Mustacchi         {
3198*d14abf15SRobert Mustacchi             lldp_params->local_port_id[i]    = mcp_dcbx_stat.local_port_id[i];
3199*d14abf15SRobert Mustacchi         }
3200*d14abf15SRobert Mustacchi     }
3201*d14abf15SRobert Mustacchi     else
3202*d14abf15SRobert Mustacchi     {// DCBX not supported in MCP
3203*d14abf15SRobert Mustacchi         DbgBreakMsg("DCBX DCBX stats supported");
3204*d14abf15SRobert Mustacchi         lm_status= LM_STATUS_FAILURE;
3205*d14abf15SRobert Mustacchi     }
3206*d14abf15SRobert Mustacchi 
3207*d14abf15SRobert Mustacchi     return lm_status;
3208*d14abf15SRobert Mustacchi }
3209*d14abf15SRobert Mustacchi /*******************************************************************************
3210*d14abf15SRobert Mustacchi  * Description:
3211*d14abf15SRobert Mustacchi  *              mcp_pg_bw_tbl_size: In elements.
3212*d14abf15SRobert Mustacchi  *              set_configuration_bw_size: In elements.
3213*d14abf15SRobert Mustacchi  * Return:
3214*d14abf15SRobert Mustacchi ******************************************************************************/
3215*d14abf15SRobert Mustacchi STATIC void
lm_dcbx_get_bw_percentage_tbl(struct _lm_device_t * pdev,OUT u32_t * set_configuration_bw,IN u32_t * mcp_pg_bw_tbl,IN const u8_t set_configuration_bw_size,IN const u8_t mcp_pg_bw_tbl_size)3216*d14abf15SRobert Mustacchi lm_dcbx_get_bw_percentage_tbl(struct _lm_device_t   * pdev,
3217*d14abf15SRobert Mustacchi                               OUT u32_t             * set_configuration_bw,
3218*d14abf15SRobert Mustacchi                               IN u32_t              * mcp_pg_bw_tbl,
3219*d14abf15SRobert Mustacchi                               IN const u8_t         set_configuration_bw_size,
3220*d14abf15SRobert Mustacchi                               IN const u8_t         mcp_pg_bw_tbl_size)
3221*d14abf15SRobert Mustacchi {
3222*d14abf15SRobert Mustacchi 
3223*d14abf15SRobert Mustacchi     u8_t        i       = 0;
3224*d14abf15SRobert Mustacchi     const u8_t  mcp_pg_bw_tbl_size_in_bytes = (sizeof(*mcp_pg_bw_tbl)*(mcp_pg_bw_tbl_size));
3225*d14abf15SRobert Mustacchi 
3226*d14abf15SRobert Mustacchi     DbgBreakIf(set_configuration_bw_size != mcp_pg_bw_tbl_size);
3227*d14abf15SRobert Mustacchi 
3228*d14abf15SRobert Mustacchi     DbgBreakIf(0 != (mcp_pg_bw_tbl_size_in_bytes % sizeof(u32_t)));
3229*d14abf15SRobert Mustacchi     for(i=0 ;i<set_configuration_bw_size ;i++)
3230*d14abf15SRobert Mustacchi     {
3231*d14abf15SRobert Mustacchi         set_configuration_bw[i] = DCBX_PG_BW_GET(mcp_pg_bw_tbl,i);
3232*d14abf15SRobert Mustacchi     }
3233*d14abf15SRobert Mustacchi }
3234*d14abf15SRobert Mustacchi /*******************************************************************************
3235*d14abf15SRobert Mustacchi  * Description: Parse ets_pri_pg data and spread it from nibble to 32 bits.
3236*d14abf15SRobert Mustacchi  *
3237*d14abf15SRobert Mustacchi  * Return:
3238*d14abf15SRobert Mustacchi ******************************************************************************/
3239*d14abf15SRobert Mustacchi STATIC void
lm_dcbx_get_ets_pri_pg_tbl(struct _lm_device_t * pdev,OUT u32_t * set_configuration_ets_pg,IN const u32_t * mcp_pri_pg_tbl,IN const u8_t set_priority_app_size,IN const u8_t mcp_pri_pg_tbl_size)3240*d14abf15SRobert Mustacchi lm_dcbx_get_ets_pri_pg_tbl(struct _lm_device_t      * pdev,
3241*d14abf15SRobert Mustacchi                            OUT      u32_t           * set_configuration_ets_pg,
3242*d14abf15SRobert Mustacchi                            IN const u32_t           * mcp_pri_pg_tbl,
3243*d14abf15SRobert Mustacchi                            IN const u8_t            set_priority_app_size,
3244*d14abf15SRobert Mustacchi                            IN const u8_t            mcp_pri_pg_tbl_size)
3245*d14abf15SRobert Mustacchi {
3246*d14abf15SRobert Mustacchi     u8_t        i       = 0;
3247*d14abf15SRobert Mustacchi     const u8_t  mcp_pri_pg_tbl_size_in_bytes = (sizeof(*mcp_pri_pg_tbl)*(mcp_pri_pg_tbl_size));
3248*d14abf15SRobert Mustacchi 
3249*d14abf15SRobert Mustacchi     DbgBreakIf(set_priority_app_size != (mcp_pri_pg_tbl_size));
3250*d14abf15SRobert Mustacchi 
3251*d14abf15SRobert Mustacchi     // Arrays that there cell are less than 32 bit are still
3252*d14abf15SRobert Mustacchi     // in big endian mode.
3253*d14abf15SRobert Mustacchi     DbgBreakIf(0 != (mcp_pri_pg_tbl_size_in_bytes % sizeof(u32_t)));
3254*d14abf15SRobert Mustacchi 
3255*d14abf15SRobert Mustacchi     // Nibble handling
3256*d14abf15SRobert Mustacchi     for(i=0 ; i < set_priority_app_size ; i++)
3257*d14abf15SRobert Mustacchi     {
3258*d14abf15SRobert Mustacchi             set_configuration_ets_pg[i] = DCBX_PRI_PG_GET(mcp_pri_pg_tbl,i);
3259*d14abf15SRobert Mustacchi     }
3260*d14abf15SRobert Mustacchi }
3261*d14abf15SRobert Mustacchi /*******************************************************************************
3262*d14abf15SRobert Mustacchi  * Description: Parse priority app data.
3263*d14abf15SRobert Mustacchi  *
3264*d14abf15SRobert Mustacchi  * Return:
3265*d14abf15SRobert Mustacchi ******************************************************************************/
3266*d14abf15SRobert Mustacchi STATIC void
lm_dcbx_get_priority_app_table(struct _lm_device_t * pdev,OUT struct _admin_priority_app_table_t * set_priority_app,IN dcbx_app_priority_entry_t * mcp_array,IN const u8_t set_priority_app_size,IN const u8_t mcp_array_size)3267*d14abf15SRobert Mustacchi lm_dcbx_get_priority_app_table(struct _lm_device_t                      * pdev,
3268*d14abf15SRobert Mustacchi                               OUT struct _admin_priority_app_table_t    * set_priority_app,
3269*d14abf15SRobert Mustacchi                               IN dcbx_app_priority_entry_t              * mcp_array,
3270*d14abf15SRobert Mustacchi                               IN const u8_t                              set_priority_app_size,
3271*d14abf15SRobert Mustacchi                               IN const u8_t                              mcp_array_size)
3272*d14abf15SRobert Mustacchi {
3273*d14abf15SRobert Mustacchi     u8_t    i           = 0;
3274*d14abf15SRobert Mustacchi 
3275*d14abf15SRobert Mustacchi     if(set_priority_app_size > mcp_array_size)
3276*d14abf15SRobert Mustacchi     {
3277*d14abf15SRobert Mustacchi         DbgBreakIf(1);
3278*d14abf15SRobert Mustacchi         return;
3279*d14abf15SRobert Mustacchi     }
3280*d14abf15SRobert Mustacchi 
3281*d14abf15SRobert Mustacchi     for(i=0 ;i<set_priority_app_size ;i++)
3282*d14abf15SRobert Mustacchi     {
3283*d14abf15SRobert Mustacchi         if(GET_FLAGS(mcp_array[i].appBitfield,DCBX_APP_ENTRY_VALID))
3284*d14abf15SRobert Mustacchi         {
3285*d14abf15SRobert Mustacchi             set_priority_app[i].valid = TRUE;
3286*d14abf15SRobert Mustacchi         }
3287*d14abf15SRobert Mustacchi 
3288*d14abf15SRobert Mustacchi         if(GET_FLAGS(mcp_array[i].appBitfield,DCBX_APP_SF_ETH_TYPE))
3289*d14abf15SRobert Mustacchi         {
3290*d14abf15SRobert Mustacchi             set_priority_app[i].traffic_type = TRAFFIC_TYPE_ETH;
3291*d14abf15SRobert Mustacchi         }
3292*d14abf15SRobert Mustacchi         else
3293*d14abf15SRobert Mustacchi         {
3294*d14abf15SRobert Mustacchi             set_priority_app[i].traffic_type = TRAFFIC_TYPE_PORT;
3295*d14abf15SRobert Mustacchi         }
3296*d14abf15SRobert Mustacchi         set_priority_app[i].priority = mcp_array[i].pri_bitmap;
3297*d14abf15SRobert Mustacchi 
3298*d14abf15SRobert Mustacchi 
3299*d14abf15SRobert Mustacchi         // This has no logic this is only done for supporting old bootcodes.
3300*d14abf15SRobert Mustacchi         // The boot code still expexts u8 [2] instead of u16
3301*d14abf15SRobert Mustacchi         set_priority_app[i].app_id = mcp_array[i].app_id;
3302*d14abf15SRobert Mustacchi     }
3303*d14abf15SRobert Mustacchi 
3304*d14abf15SRobert Mustacchi }
3305*d14abf15SRobert Mustacchi /**
3306*d14abf15SRobert Mustacchi  * @description
3307*d14abf15SRobert Mustacchi  * Fill the operational parameters.
3308*d14abf15SRobert Mustacchi  * @param pdev
3309*d14abf15SRobert Mustacchi  * @param dcbx_params
3310*d14abf15SRobert Mustacchi  *
3311*d14abf15SRobert Mustacchi  * @return STATIC void
3312*d14abf15SRobert Mustacchi  */
3313*d14abf15SRobert Mustacchi STATIC void
lm_dcbx_read_params_fill_oper_state(struct _lm_device_t * pdev,b10_dcbx_params_get_t * dcbx_params)3314*d14abf15SRobert Mustacchi lm_dcbx_read_params_fill_oper_state(struct _lm_device_t            * pdev,
3315*d14abf15SRobert Mustacchi                                     b10_dcbx_params_get_t          * dcbx_params)
3316*d14abf15SRobert Mustacchi {
3317*d14abf15SRobert Mustacchi     lm_dcbx_indicate_event_t *indicate_event = &pdev->dcbx_info.indicate_event;
3318*d14abf15SRobert Mustacchi 
3319*d14abf15SRobert Mustacchi     if(TRUE == pdev->params.dcbx_port_params.app.enabled)
3320*d14abf15SRobert Mustacchi     {
3321*d14abf15SRobert Mustacchi         SET_FLAGS(dcbx_params->dcb_current_oper_state_bitmap,PRIORITY_TAGGING_IS_CURRENTLY_OPERATIONAL);
3322*d14abf15SRobert Mustacchi     }
3323*d14abf15SRobert Mustacchi 
3324*d14abf15SRobert Mustacchi     if(TRUE == pdev->params.dcbx_port_params.pfc.enabled)
3325*d14abf15SRobert Mustacchi     {
3326*d14abf15SRobert Mustacchi         SET_FLAGS(dcbx_params->dcb_current_oper_state_bitmap,PFC_IS_CURRENTLY_OPERATIONAL);
3327*d14abf15SRobert Mustacchi     }
3328*d14abf15SRobert Mustacchi 
3329*d14abf15SRobert Mustacchi     if(TRUE == pdev->params.dcbx_port_params.ets.enabled)
3330*d14abf15SRobert Mustacchi     {
3331*d14abf15SRobert Mustacchi         SET_FLAGS(dcbx_params->dcb_current_oper_state_bitmap,ETS_IS_CURRENTLY_OPERATIONAL);
3332*d14abf15SRobert Mustacchi     }
3333*d14abf15SRobert Mustacchi 
3334*d14abf15SRobert Mustacchi     if(GET_FLAGS(indicate_event->dcb_current_oper_state_bitmap,
3335*d14abf15SRobert Mustacchi                  DCB_STATE_CONFIGURED_BY_OS_QOS))
3336*d14abf15SRobert Mustacchi     {
3337*d14abf15SRobert Mustacchi         SET_FLAGS(dcbx_params->dcb_current_oper_state_bitmap,
3338*d14abf15SRobert Mustacchi                   DRIVER_CONFIGURED_BY_OS_QOS);
3339*d14abf15SRobert Mustacchi     }
3340*d14abf15SRobert Mustacchi 
3341*d14abf15SRobert Mustacchi     if(GET_FLAGS(indicate_event->dcb_current_oper_state_bitmap,
3342*d14abf15SRobert Mustacchi                  DCB_STATE_CONFIGURED_BY_OS_QOS_TO_WILLING))
3343*d14abf15SRobert Mustacchi     {
3344*d14abf15SRobert Mustacchi         SET_FLAGS(dcbx_params->dcb_current_oper_state_bitmap,
3345*d14abf15SRobert Mustacchi                   DRIVER_CONFIGURED_BY_OS_QOS_TO_WILLING);
3346*d14abf15SRobert Mustacchi     }
3347*d14abf15SRobert Mustacchi }
3348*d14abf15SRobert Mustacchi /*******************************************************************************
3349*d14abf15SRobert Mustacchi  * Description: Read DCBX parameters from admin/local and remote MIBs.
3350*d14abf15SRobert Mustacchi  *
3351*d14abf15SRobert Mustacchi  * Return:
3352*d14abf15SRobert Mustacchi  *              LM_STATUS_FAILURE - All/Some of the parameters could not be read.
3353*d14abf15SRobert Mustacchi  *              LM_STATUS_SUCCESS - All the MIBs where read successfully.
3354*d14abf15SRobert Mustacchi ******************************************************************************/
3355*d14abf15SRobert Mustacchi lm_status_t
lm_dcbx_read_params(struct _lm_device_t * pdev,b10_dcbx_params_get_t * dcbx_params)3356*d14abf15SRobert Mustacchi lm_dcbx_read_params(struct _lm_device_t            * pdev,
3357*d14abf15SRobert Mustacchi                     b10_dcbx_params_get_t          * dcbx_params)
3358*d14abf15SRobert Mustacchi {
3359*d14abf15SRobert Mustacchi     lldp_admin_mib_t    admin_mib                       = {0};
3360*d14abf15SRobert Mustacchi     lldp_local_mib_t    local_mib                       = {0};
3361*d14abf15SRobert Mustacchi     lldp_remote_mib_t   remote_mib                      = {0};
3362*d14abf15SRobert Mustacchi     lldp_dcbx_stat_t    mcp_dcbx_stat                   = {{0}};
3363*d14abf15SRobert Mustacchi     lm_dcbx_stat        dcbx_stat                       = {0};
3364*d14abf15SRobert Mustacchi     u32_t               pfc_frames_sent[2]              = {0};
3365*d14abf15SRobert Mustacchi     u32_t               pfc_frames_received[2]          = {0};
3366*d14abf15SRobert Mustacchi     u32_t               i                               = 0;
3367*d14abf15SRobert Mustacchi     u32_t               *buff                           = NULL;
3368*d14abf15SRobert Mustacchi     u32_t               offset                          = SHMEM_LLDP_DCBX_PARAMS_NONE;
3369*d14abf15SRobert Mustacchi     lm_status_t         lm_status                       = LM_STATUS_SUCCESS;
3370*d14abf15SRobert Mustacchi     const u32_t         mcp_dcbx_lldp_params_offset     = OFFSETOF(shmem2_region_t,dcbx_lldp_params_offset);
3371*d14abf15SRobert Mustacchi     const u32_t         mcp_dcbx_lldp_dcbx_stat_offset  = OFFSETOF(shmem2_region_t,dcbx_lldp_dcbx_stat_offset);
3372*d14abf15SRobert Mustacchi 
3373*d14abf15SRobert Mustacchi     mm_mem_zero(dcbx_params, sizeof(b10_dcbx_params_get_t));
3374*d14abf15SRobert Mustacchi 
3375*d14abf15SRobert Mustacchi     lm_dcbx_read_params_fill_oper_state(pdev,dcbx_params);
3376*d14abf15SRobert Mustacchi 
3377*d14abf15SRobert Mustacchi     lm_dcbx_read_shmem2_mcp_fields(pdev,
3378*d14abf15SRobert Mustacchi                             mcp_dcbx_lldp_params_offset,
3379*d14abf15SRobert Mustacchi                             &offset);
3380*d14abf15SRobert Mustacchi 
3381*d14abf15SRobert Mustacchi     if((!IS_DCB_ENABLED(pdev)) ||
3382*d14abf15SRobert Mustacchi        (SHMEM_LLDP_DCBX_PARAMS_NONE == offset))
3383*d14abf15SRobert Mustacchi     {//DCBX isn't supported on E1
3384*d14abf15SRobert Mustacchi         return LM_STATUS_FAILURE;
3385*d14abf15SRobert Mustacchi     }
3386*d14abf15SRobert Mustacchi 
3387*d14abf15SRobert Mustacchi     dcbx_params->config_dcbx_params.overwrite_settings =
3388*d14abf15SRobert Mustacchi         pdev->params.dcbx_config_params.overwrite_settings;
3389*d14abf15SRobert Mustacchi 
3390*d14abf15SRobert Mustacchi     // E3.0 might be 4...not supported in current shmem
3391*d14abf15SRobert Mustacchi     ASSERT_STATIC( 2 == PORT_MAX );
3392*d14abf15SRobert Mustacchi 
3393*d14abf15SRobert Mustacchi     if (SHMEM_LLDP_DCBX_PARAMS_NONE != offset)
3394*d14abf15SRobert Mustacchi     {
3395*d14abf15SRobert Mustacchi         offset = LM_DCBX_ADMIN_MIB_OFFSET(pdev ,offset);
3396*d14abf15SRobert Mustacchi 
3397*d14abf15SRobert Mustacchi         //Read the data first
3398*d14abf15SRobert Mustacchi         buff = (u32_t *)&admin_mib;
3399*d14abf15SRobert Mustacchi         for(i=0 ;i<sizeof(lldp_admin_mib_t); i+=4,buff++)
3400*d14abf15SRobert Mustacchi         {
3401*d14abf15SRobert Mustacchi             *buff = REG_RD(pdev,
3402*d14abf15SRobert Mustacchi                           (offset + i));
3403*d14abf15SRobert Mustacchi         }
3404*d14abf15SRobert Mustacchi 
3405*d14abf15SRobert Mustacchi         dcbx_params->config_dcbx_params.dcb_enable          = IS_DCB_ENABLED(pdev) ;
3406*d14abf15SRobert Mustacchi 
3407*d14abf15SRobert Mustacchi         if(GET_FLAGS(admin_mib.ver_cfg_flags,DCBX_DCBX_ENABLED))
3408*d14abf15SRobert Mustacchi         {
3409*d14abf15SRobert Mustacchi             dcbx_params->config_dcbx_params.admin_dcbx_enable   = 1 ;
3410*d14abf15SRobert Mustacchi         }
3411*d14abf15SRobert Mustacchi 
3412*d14abf15SRobert Mustacchi         if(GET_FLAGS(admin_mib.ver_cfg_flags,DCBX_VERSION_CEE))
3413*d14abf15SRobert Mustacchi         {
3414*d14abf15SRobert Mustacchi             dcbx_params->config_dcbx_params.admin_dcbx_version  = ADMIN_DCBX_VERSION_CEE;
3415*d14abf15SRobert Mustacchi         }
3416*d14abf15SRobert Mustacchi         else if(GET_FLAGS(admin_mib.ver_cfg_flags,DCBX_VERSION_IEEE))
3417*d14abf15SRobert Mustacchi         {
3418*d14abf15SRobert Mustacchi             dcbx_params->config_dcbx_params.admin_dcbx_version  = ADMIN_DCBX_VERSION_IEEE;
3419*d14abf15SRobert Mustacchi         }
3420*d14abf15SRobert Mustacchi         else
3421*d14abf15SRobert Mustacchi         {
3422*d14abf15SRobert Mustacchi             dcbx_params->config_dcbx_params.admin_dcbx_version  = OVERWRITE_SETTINGS_INVALID;
3423*d14abf15SRobert Mustacchi             DbgMessage(pdev, WARN, " unknown DCBX version ");
3424*d14abf15SRobert Mustacchi         }
3425*d14abf15SRobert Mustacchi 
3426*d14abf15SRobert Mustacchi         dcbx_params->config_dcbx_params.admin_ets_enable    = admin_mib.features.ets.enabled;
3427*d14abf15SRobert Mustacchi 
3428*d14abf15SRobert Mustacchi         dcbx_params->config_dcbx_params.admin_pfc_enable    = admin_mib.features.pfc.enabled;
3429*d14abf15SRobert Mustacchi 
3430*d14abf15SRobert Mustacchi         //FOR IEEE pdev->params.dcbx_config_params.admin_tc_supported_tx_enable
3431*d14abf15SRobert Mustacchi         if(GET_FLAGS(admin_mib.ver_cfg_flags,DCBX_ETS_CONFIG_TX_ENABLED))
3432*d14abf15SRobert Mustacchi         {
3433*d14abf15SRobert Mustacchi             dcbx_params->config_dcbx_params.admin_ets_configuration_tx_enable = TRUE;
3434*d14abf15SRobert Mustacchi         }
3435*d14abf15SRobert Mustacchi         //For IEEE admin_ets_recommendation_tx_enable
3436*d14abf15SRobert Mustacchi 
3437*d14abf15SRobert Mustacchi         if(GET_FLAGS(admin_mib.ver_cfg_flags,DCBX_PFC_CONFIG_TX_ENABLED))
3438*d14abf15SRobert Mustacchi         {
3439*d14abf15SRobert Mustacchi             dcbx_params->config_dcbx_params.admin_pfc_tx_enable = TRUE;
3440*d14abf15SRobert Mustacchi         }
3441*d14abf15SRobert Mustacchi 
3442*d14abf15SRobert Mustacchi         if(GET_FLAGS(admin_mib.ver_cfg_flags,DCBX_APP_CONFIG_TX_ENABLED))
3443*d14abf15SRobert Mustacchi         {
3444*d14abf15SRobert Mustacchi             dcbx_params->config_dcbx_params.admin_application_priority_tx_enable = TRUE;
3445*d14abf15SRobert Mustacchi         }
3446*d14abf15SRobert Mustacchi 
3447*d14abf15SRobert Mustacchi 
3448*d14abf15SRobert Mustacchi         if(GET_FLAGS(admin_mib.ver_cfg_flags,DCBX_ETS_WILLING))
3449*d14abf15SRobert Mustacchi         {
3450*d14abf15SRobert Mustacchi             dcbx_params->config_dcbx_params.admin_ets_willing = TRUE;
3451*d14abf15SRobert Mustacchi         }
3452*d14abf15SRobert Mustacchi 
3453*d14abf15SRobert Mustacchi         //For IEEE admin_ets_reco_valid
3454*d14abf15SRobert Mustacchi 
3455*d14abf15SRobert Mustacchi         if(GET_FLAGS(admin_mib.ver_cfg_flags,DCBX_PFC_WILLING))
3456*d14abf15SRobert Mustacchi         {
3457*d14abf15SRobert Mustacchi             dcbx_params->config_dcbx_params.admin_pfc_willing = TRUE;
3458*d14abf15SRobert Mustacchi         }
3459*d14abf15SRobert Mustacchi 
3460*d14abf15SRobert Mustacchi 
3461*d14abf15SRobert Mustacchi         if(GET_FLAGS(admin_mib.ver_cfg_flags,DCBX_APP_WILLING))
3462*d14abf15SRobert Mustacchi         {
3463*d14abf15SRobert Mustacchi             dcbx_params->config_dcbx_params.admin_app_priority_willing = TRUE;
3464*d14abf15SRobert Mustacchi         }
3465*d14abf15SRobert Mustacchi 
3466*d14abf15SRobert Mustacchi 
3467*d14abf15SRobert Mustacchi         lm_dcbx_get_bw_percentage_tbl(pdev,
3468*d14abf15SRobert Mustacchi                               dcbx_params->config_dcbx_params.admin_configuration_bw_percentage,
3469*d14abf15SRobert Mustacchi                               admin_mib.features.ets.pg_bw_tbl,
3470*d14abf15SRobert Mustacchi                               ARRSIZE(dcbx_params->config_dcbx_params.admin_configuration_bw_percentage),
3471*d14abf15SRobert Mustacchi                               DCBX_MAX_NUM_PG_BW_ENTRIES);
3472*d14abf15SRobert Mustacchi 
3473*d14abf15SRobert Mustacchi         lm_dcbx_get_ets_pri_pg_tbl(pdev,
3474*d14abf15SRobert Mustacchi                                    dcbx_params->config_dcbx_params.admin_configuration_ets_pg,
3475*d14abf15SRobert Mustacchi                                    admin_mib.features.ets.pri_pg_tbl,
3476*d14abf15SRobert Mustacchi                                    ARRSIZE(dcbx_params->config_dcbx_params.admin_configuration_ets_pg),
3477*d14abf15SRobert Mustacchi                                    DCBX_MAX_NUM_PRI_PG_ENTRIES);
3478*d14abf15SRobert Mustacchi 
3479*d14abf15SRobert Mustacchi 
3480*d14abf15SRobert Mustacchi         //For IEEE admin_recommendation_bw_percentage
3481*d14abf15SRobert Mustacchi         //For IEEE admin_recommendation_ets_pg
3482*d14abf15SRobert Mustacchi         dcbx_params->config_dcbx_params.admin_pfc_bitmap = admin_mib.features.pfc.pri_en_bitmap;
3483*d14abf15SRobert Mustacchi 
3484*d14abf15SRobert Mustacchi         lm_dcbx_get_priority_app_table(pdev,
3485*d14abf15SRobert Mustacchi                                   dcbx_params->config_dcbx_params.admin_priority_app_table,
3486*d14abf15SRobert Mustacchi                                   admin_mib.features.app.app_pri_tbl,
3487*d14abf15SRobert Mustacchi                                   ARRSIZE(dcbx_params->config_dcbx_params.admin_priority_app_table),
3488*d14abf15SRobert Mustacchi                                   ARRSIZE(admin_mib.features.app.app_pri_tbl));
3489*d14abf15SRobert Mustacchi 
3490*d14abf15SRobert Mustacchi         dcbx_params->config_dcbx_params.admin_default_priority = admin_mib.features.app.default_pri;
3491*d14abf15SRobert Mustacchi     }
3492*d14abf15SRobert Mustacchi     else
3493*d14abf15SRobert Mustacchi     {// DCBX not supported in MCP
3494*d14abf15SRobert Mustacchi         DbgBreakMsg("DCBX DCBX params not supported");
3495*d14abf15SRobert Mustacchi         lm_status= LM_STATUS_FAILURE;
3496*d14abf15SRobert Mustacchi     }
3497*d14abf15SRobert Mustacchi 
3498*d14abf15SRobert Mustacchi         lm_status = lm_dcbx_read_remote_local_mib(pdev,
3499*d14abf15SRobert Mustacchi                                            (u32_t *)&local_mib,
3500*d14abf15SRobert Mustacchi                                            DCBX_READ_LOCAL_MIB);
3501*d14abf15SRobert Mustacchi 
3502*d14abf15SRobert Mustacchi     if (LM_STATUS_SUCCESS == lm_status)
3503*d14abf15SRobert Mustacchi     {
3504*d14abf15SRobert Mustacchi 
3505*d14abf15SRobert Mustacchi         if(0 == GET_FLAGS(local_mib.error,DCBX_REMOTE_MIB_ERROR))
3506*d14abf15SRobert Mustacchi         {
3507*d14abf15SRobert Mustacchi             SET_FLAGS(dcbx_params->dcb_current_oper_state_bitmap,DCBX_CURRENT_STATE_IS_SYNC);
3508*d14abf15SRobert Mustacchi         }
3509*d14abf15SRobert Mustacchi 
3510*d14abf15SRobert Mustacchi         dcbx_params->ver_num            = DCBX_PARAMS_VER_NUM;
3511*d14abf15SRobert Mustacchi         dcbx_params->local_tc_supported = local_mib.features.app.tc_supported;
3512*d14abf15SRobert Mustacchi         dcbx_params->local_pfc_caps     = local_mib.features.pfc.pfc_caps;
3513*d14abf15SRobert Mustacchi         dcbx_params->local_ets_enable   = local_mib.features.ets.enabled;
3514*d14abf15SRobert Mustacchi         dcbx_params->local_pfc_enable   = local_mib.features.pfc.enabled;
3515*d14abf15SRobert Mustacchi 
3516*d14abf15SRobert Mustacchi         lm_dcbx_get_bw_percentage_tbl(pdev,
3517*d14abf15SRobert Mustacchi                               dcbx_params->local_configuration_bw_percentage,
3518*d14abf15SRobert Mustacchi                               local_mib.features.ets.pg_bw_tbl,
3519*d14abf15SRobert Mustacchi                               ARRSIZE(dcbx_params->local_configuration_bw_percentage),
3520*d14abf15SRobert Mustacchi                               DCBX_MAX_NUM_PG_BW_ENTRIES);
3521*d14abf15SRobert Mustacchi 
3522*d14abf15SRobert Mustacchi         lm_dcbx_get_ets_pri_pg_tbl(pdev,
3523*d14abf15SRobert Mustacchi                                    dcbx_params->local_configuration_ets_pg,
3524*d14abf15SRobert Mustacchi                                    local_mib.features.ets.pri_pg_tbl,
3525*d14abf15SRobert Mustacchi                                    ARRSIZE(dcbx_params->local_configuration_ets_pg),
3526*d14abf15SRobert Mustacchi                                    DCBX_MAX_NUM_PRI_PG_ENTRIES);
3527*d14abf15SRobert Mustacchi 
3528*d14abf15SRobert Mustacchi         dcbx_params->local_pfc_bitmap = local_mib.features.pfc.pri_en_bitmap;
3529*d14abf15SRobert Mustacchi 
3530*d14abf15SRobert Mustacchi         lm_dcbx_get_priority_app_table(pdev,
3531*d14abf15SRobert Mustacchi                                   dcbx_params->local_priority_app_table,
3532*d14abf15SRobert Mustacchi                                   local_mib.features.app.app_pri_tbl,
3533*d14abf15SRobert Mustacchi                                   ARRSIZE(dcbx_params->local_priority_app_table),
3534*d14abf15SRobert Mustacchi                                   ARRSIZE(local_mib.features.app.app_pri_tbl));
3535*d14abf15SRobert Mustacchi 
3536*d14abf15SRobert Mustacchi         if(GET_FLAGS(local_mib.error,DCBX_LOCAL_PFC_MISMATCH))
3537*d14abf15SRobert Mustacchi         {
3538*d14abf15SRobert Mustacchi             dcbx_params->pfc_mismatch = TRUE;
3539*d14abf15SRobert Mustacchi         }
3540*d14abf15SRobert Mustacchi 
3541*d14abf15SRobert Mustacchi         if(GET_FLAGS(local_mib.error,DCBX_LOCAL_APP_MISMATCH))
3542*d14abf15SRobert Mustacchi         {
3543*d14abf15SRobert Mustacchi             dcbx_params->priority_app_mismatch = TRUE;
3544*d14abf15SRobert Mustacchi         }
3545*d14abf15SRobert Mustacchi     }
3546*d14abf15SRobert Mustacchi     else
3547*d14abf15SRobert Mustacchi     {// DCBX not supported in MCP
3548*d14abf15SRobert Mustacchi         DbgBreakMsg("DCBX Negotiation result not supported");
3549*d14abf15SRobert Mustacchi         lm_status= LM_STATUS_FAILURE;
3550*d14abf15SRobert Mustacchi     }
3551*d14abf15SRobert Mustacchi     // Get remote MIB data
3552*d14abf15SRobert Mustacchi 
3553*d14abf15SRobert Mustacchi         lm_status = lm_dcbx_read_remote_local_mib(pdev,
3554*d14abf15SRobert Mustacchi                                                   (u32_t *)&remote_mib,
3555*d14abf15SRobert Mustacchi                                                   DCBX_READ_REMOTE_MIB);
3556*d14abf15SRobert Mustacchi     if (LM_STATUS_SUCCESS == lm_status)
3557*d14abf15SRobert Mustacchi     {
3558*d14abf15SRobert Mustacchi 
3559*d14abf15SRobert Mustacchi         dcbx_params->remote_tc_supported = remote_mib.features.app.tc_supported;
3560*d14abf15SRobert Mustacchi         dcbx_params->remote_pfc_cap = remote_mib.features.pfc.pfc_caps;
3561*d14abf15SRobert Mustacchi         if(GET_FLAGS(remote_mib.flags,DCBX_REMOTE_ETS_RECO_VALID))
3562*d14abf15SRobert Mustacchi         {
3563*d14abf15SRobert Mustacchi             dcbx_params->remote_ets_reco_valid = TRUE;
3564*d14abf15SRobert Mustacchi         }
3565*d14abf15SRobert Mustacchi 
3566*d14abf15SRobert Mustacchi         if(GET_FLAGS(remote_mib.flags,DCBX_ETS_REM_WILLING))
3567*d14abf15SRobert Mustacchi         {
3568*d14abf15SRobert Mustacchi             dcbx_params->remote_ets_willing = TRUE;
3569*d14abf15SRobert Mustacchi         }
3570*d14abf15SRobert Mustacchi 
3571*d14abf15SRobert Mustacchi         if(GET_FLAGS(remote_mib.flags,DCBX_PFC_REM_WILLING))
3572*d14abf15SRobert Mustacchi         {
3573*d14abf15SRobert Mustacchi             dcbx_params->remote_pfc_willing = TRUE;
3574*d14abf15SRobert Mustacchi         }
3575*d14abf15SRobert Mustacchi 
3576*d14abf15SRobert Mustacchi         if(GET_FLAGS(remote_mib.flags,DCBX_APP_REM_WILLING))
3577*d14abf15SRobert Mustacchi         {
3578*d14abf15SRobert Mustacchi             dcbx_params->remote_app_priority_willing = TRUE;
3579*d14abf15SRobert Mustacchi         }
3580*d14abf15SRobert Mustacchi 
3581*d14abf15SRobert Mustacchi         lm_dcbx_get_bw_percentage_tbl(pdev,
3582*d14abf15SRobert Mustacchi                               dcbx_params->remote_configuration_bw_percentage,
3583*d14abf15SRobert Mustacchi                               remote_mib.features.ets.pg_bw_tbl,
3584*d14abf15SRobert Mustacchi                               ARRSIZE(dcbx_params->remote_configuration_bw_percentage),
3585*d14abf15SRobert Mustacchi                               DCBX_MAX_NUM_PG_BW_ENTRIES);
3586*d14abf15SRobert Mustacchi 
3587*d14abf15SRobert Mustacchi         lm_dcbx_get_ets_pri_pg_tbl(pdev,
3588*d14abf15SRobert Mustacchi                                    dcbx_params->remote_configuration_ets_pg,
3589*d14abf15SRobert Mustacchi                                    remote_mib.features.ets.pri_pg_tbl,
3590*d14abf15SRobert Mustacchi                                    ARRSIZE(dcbx_params->remote_configuration_ets_pg),
3591*d14abf15SRobert Mustacchi                                    DCBX_MAX_NUM_PRI_PG_ENTRIES);
3592*d14abf15SRobert Mustacchi         // For IEEE remote_recommendation_bw_percentage
3593*d14abf15SRobert Mustacchi         // For IEEE remote_recommendation_ets_pg
3594*d14abf15SRobert Mustacchi 
3595*d14abf15SRobert Mustacchi         dcbx_params->remote_pfc_bitmap = remote_mib.features.pfc.pri_en_bitmap;
3596*d14abf15SRobert Mustacchi 
3597*d14abf15SRobert Mustacchi         lm_dcbx_get_priority_app_table(pdev,
3598*d14abf15SRobert Mustacchi                                   dcbx_params->remote_priority_app_table,
3599*d14abf15SRobert Mustacchi                                   remote_mib.features.app.app_pri_tbl,
3600*d14abf15SRobert Mustacchi                                   ARRSIZE(dcbx_params->remote_priority_app_table),
3601*d14abf15SRobert Mustacchi                                   ARRSIZE(remote_mib.features.app.app_pri_tbl));
3602*d14abf15SRobert Mustacchi     }
3603*d14abf15SRobert Mustacchi     else
3604*d14abf15SRobert Mustacchi     {// DCBX not supported in MCP
3605*d14abf15SRobert Mustacchi         DbgBreakMsg("DCBX remote MIB not supported");
3606*d14abf15SRobert Mustacchi         lm_status= LM_STATUS_FAILURE;
3607*d14abf15SRobert Mustacchi     }
3608*d14abf15SRobert Mustacchi 
3609*d14abf15SRobert Mustacchi     // Get negotiation results MIB data
3610*d14abf15SRobert Mustacchi     offset  = SHMEM_LLDP_DCBX_STAT_NONE;
3611*d14abf15SRobert Mustacchi 
3612*d14abf15SRobert Mustacchi     lm_dcbx_read_shmem2_mcp_fields(pdev,
3613*d14abf15SRobert Mustacchi                             mcp_dcbx_lldp_dcbx_stat_offset,
3614*d14abf15SRobert Mustacchi                             &offset);
3615*d14abf15SRobert Mustacchi 
3616*d14abf15SRobert Mustacchi     // E3.0 might be 4...not supported in current shmem
3617*d14abf15SRobert Mustacchi     ASSERT_STATIC( 2 == PORT_MAX );
3618*d14abf15SRobert Mustacchi 
3619*d14abf15SRobert Mustacchi     if (SHMEM_LLDP_DCBX_STAT_NONE != offset)
3620*d14abf15SRobert Mustacchi     {
3621*d14abf15SRobert Mustacchi         offset += PORT_ID(pdev) * sizeof(mcp_dcbx_stat);
3622*d14abf15SRobert Mustacchi 
3623*d14abf15SRobert Mustacchi         //Read the data first
3624*d14abf15SRobert Mustacchi         buff = (u32_t *)&mcp_dcbx_stat;
3625*d14abf15SRobert Mustacchi         for(i=0 ;i<sizeof(mcp_dcbx_stat); i+=4,buff++)
3626*d14abf15SRobert Mustacchi         {
3627*d14abf15SRobert Mustacchi             *buff = REG_RD(pdev,
3628*d14abf15SRobert Mustacchi                           (offset + i));
3629*d14abf15SRobert Mustacchi         }
3630*d14abf15SRobert Mustacchi 
3631*d14abf15SRobert Mustacchi         dcbx_params->dcbx_frames_sent       = mcp_dcbx_stat.num_tx_dcbx_pkts;
3632*d14abf15SRobert Mustacchi         dcbx_params->dcbx_frames_received   = mcp_dcbx_stat.num_rx_dcbx_pkts;
3633*d14abf15SRobert Mustacchi     }
3634*d14abf15SRobert Mustacchi     else
3635*d14abf15SRobert Mustacchi     {// DCBX not supported in MCP
3636*d14abf15SRobert Mustacchi         DbgBreakMsg("DCBX statistic not supported");
3637*d14abf15SRobert Mustacchi         lm_status= LM_STATUS_FAILURE;
3638*d14abf15SRobert Mustacchi     }
3639*d14abf15SRobert Mustacchi     // TODO - Move to lm_stat
3640*d14abf15SRobert Mustacchi 
3641*d14abf15SRobert Mustacchi 
3642*d14abf15SRobert Mustacchi     if(pdev->vars.mac_type == MAC_TYPE_EMAC)
3643*d14abf15SRobert Mustacchi     {
3644*d14abf15SRobert Mustacchi     MM_ACQUIRE_PHY_LOCK(pdev);
3645*d14abf15SRobert Mustacchi         // EMAC stats are not collected through statitic code.
3646*d14abf15SRobert Mustacchi     elink_pfc_statistic(&pdev->params.link, &pdev->vars.link,
3647*d14abf15SRobert Mustacchi                         pfc_frames_sent, pfc_frames_received);
3648*d14abf15SRobert Mustacchi 
3649*d14abf15SRobert Mustacchi     MM_RELEASE_PHY_LOCK(pdev);
3650*d14abf15SRobert Mustacchi 
3651*d14abf15SRobert Mustacchi         dcbx_stat.pfc_frames_sent = ((u64_t)(pfc_frames_sent[1]) << 32) + pfc_frames_sent[0];
3652*d14abf15SRobert Mustacchi 
3653*d14abf15SRobert Mustacchi         dcbx_stat.pfc_frames_received = ((u64_t)(pfc_frames_received[1]) << 32) + pfc_frames_received[0];
3654*d14abf15SRobert Mustacchi     }
3655*d14abf15SRobert Mustacchi     else
3656*d14abf15SRobert Mustacchi     {
3657*d14abf15SRobert Mustacchi         lm_stats_get_dcb_stats( pdev, &dcbx_stat );
3658*d14abf15SRobert Mustacchi 
3659*d14abf15SRobert Mustacchi     }
3660*d14abf15SRobert Mustacchi 
3661*d14abf15SRobert Mustacchi     dcbx_params->pfc_frames_sent = dcbx_stat.pfc_frames_sent;
3662*d14abf15SRobert Mustacchi 
3663*d14abf15SRobert Mustacchi     dcbx_params->pfc_frames_received = dcbx_stat.pfc_frames_received;
3664*d14abf15SRobert Mustacchi 
3665*d14abf15SRobert Mustacchi     return lm_status;
3666*d14abf15SRobert Mustacchi }
3667*d14abf15SRobert Mustacchi /*******************************************************************************
3668*d14abf15SRobert Mustacchi  * Description:
3669*d14abf15SRobert Mustacchi  *
3670*d14abf15SRobert Mustacchi  * Return:
3671*d14abf15SRobert Mustacchi ******************************************************************************/
3672*d14abf15SRobert Mustacchi void
lm_dcbx_init_lpme_set_params(struct _lm_device_t * pdev)3673*d14abf15SRobert Mustacchi lm_dcbx_init_lpme_set_params(struct _lm_device_t *pdev)
3674*d14abf15SRobert Mustacchi {
3675*d14abf15SRobert Mustacchi     lm_status_t lm_status = LM_STATUS_SUCCESS;
3676*d14abf15SRobert Mustacchi 
3677*d14abf15SRobert Mustacchi     if( TRUE == pdev->dcbx_info.is_dcbx_neg_received)
3678*d14abf15SRobert Mustacchi     {
3679*d14abf15SRobert Mustacchi         // DCBX negotiation ended normaly.
3680*d14abf15SRobert Mustacchi         return;
3681*d14abf15SRobert Mustacchi     }
3682*d14abf15SRobert Mustacchi     //DbgBreakMsg(" lm_dcbx_init_lpme_set_params : DCBX timer configuration \n");
3683*d14abf15SRobert Mustacchi     //DbgMessage(pdev, FATAL, "lm_dcbx_init_lpme_set_params : DCBX timer configuration \n");
3684*d14abf15SRobert Mustacchi     // DCBX negotiation didn�t ended normaly yet.
3685*d14abf15SRobert Mustacchi     // No lock is needed to be taken because lm_dcbx_set_params is only called from a WI
3686*d14abf15SRobert Mustacchi     lm_status = lm_dcbx_set_params_and_read_mib(pdev,
3687*d14abf15SRobert Mustacchi                                                 FALSE,
3688*d14abf15SRobert Mustacchi                                                 TRUE);
3689*d14abf15SRobert Mustacchi 
3690*d14abf15SRobert Mustacchi     DbgBreakIf(LM_STATUS_SUCCESS != lm_status);
3691*d14abf15SRobert Mustacchi }
3692*d14abf15SRobert Mustacchi /**
3693*d14abf15SRobert Mustacchi  * look for an entry that isn't iSCSI or FCoE and return it's
3694*d14abf15SRobert Mustacchi  * position.
3695*d14abf15SRobert Mustacchi  * @param pdev
3696*d14abf15SRobert Mustacchi  * @param app
3697*d14abf15SRobert Mustacchi  *
3698*d14abf15SRobert Mustacchi  * @return STATIC u8_t
3699*d14abf15SRobert Mustacchi  */
3700*d14abf15SRobert Mustacchi STATIC u8_t
lm_dcbx_app_find_non_off_tt_entry(IN lm_device_t * pdev,INOUT dcbx_app_priority_feature_t * app)3701*d14abf15SRobert Mustacchi lm_dcbx_app_find_non_off_tt_entry(
3702*d14abf15SRobert Mustacchi     IN          lm_device_t                 *pdev,
3703*d14abf15SRobert Mustacchi     INOUT       dcbx_app_priority_feature_t *app
3704*d14abf15SRobert Mustacchi     )
3705*d14abf15SRobert Mustacchi {
3706*d14abf15SRobert Mustacchi     dcbx_app_priority_entry_t *app_priority_entry = NULL;
3707*d14abf15SRobert Mustacchi     u8_t entry = 0;
3708*d14abf15SRobert Mustacchi 
3709*d14abf15SRobert Mustacchi     for(entry = 0; entry < ARRSIZE(app->app_pri_tbl); entry++)
3710*d14abf15SRobert Mustacchi     {
3711*d14abf15SRobert Mustacchi         app_priority_entry = &(app->app_pri_tbl[entry]);
3712*d14abf15SRobert Mustacchi 
3713*d14abf15SRobert Mustacchi         if(lm_dcbx_cee_is_entry_fcoe_classif(app_priority_entry->appBitfield,
3714*d14abf15SRobert Mustacchi                                              app_priority_entry->app_id))
3715*d14abf15SRobert Mustacchi         {
3716*d14abf15SRobert Mustacchi             DbgMessage(pdev, INFORM, "lm_dcbx_app_find_non_off_tt_entry :FCOE entry");
3717*d14abf15SRobert Mustacchi         }
3718*d14abf15SRobert Mustacchi         else if(lm_dcbx_cee_is_entry_iscsi_classif(app_priority_entry->appBitfield,
3719*d14abf15SRobert Mustacchi                                                    app_priority_entry->app_id))
3720*d14abf15SRobert Mustacchi         {
3721*d14abf15SRobert Mustacchi             DbgMessage(pdev, INFORM, "lm_dcbx_app_find_non_off_tt_entry :ISCSI entry");
3722*d14abf15SRobert Mustacchi         }
3723*d14abf15SRobert Mustacchi         else
3724*d14abf15SRobert Mustacchi         {
3725*d14abf15SRobert Mustacchi             // Found an entry that isn't ISCSI or FCOE
3726*d14abf15SRobert Mustacchi             break;
3727*d14abf15SRobert Mustacchi         }
3728*d14abf15SRobert Mustacchi     }
3729*d14abf15SRobert Mustacchi 
3730*d14abf15SRobert Mustacchi     return entry;
3731*d14abf15SRobert Mustacchi }
3732*d14abf15SRobert Mustacchi /**
3733*d14abf15SRobert Mustacchi  * @description
3734*d14abf15SRobert Mustacchi  *
3735*d14abf15SRobert Mustacchi  * @param pdev
3736*d14abf15SRobert Mustacchi  * @param app
3737*d14abf15SRobert Mustacchi  * @param other_traf_type_entry - For entries that are not
3738*d14abf15SRobert Mustacchi  *                              predefined
3739*d14abf15SRobert Mustacchi  * @param app_id
3740*d14abf15SRobert Mustacchi  * @param traffic_type
3741*d14abf15SRobert Mustacchi  * @param priority
3742*d14abf15SRobert Mustacchi  *
3743*d14abf15SRobert Mustacchi  * @return STATIC lm_status_t
3744*d14abf15SRobert Mustacchi  */
3745*d14abf15SRobert Mustacchi STATIC lm_status_t
lm_dcbx_admin_mib_update_app_pri(IN lm_device_t * pdev,INOUT dcbx_app_priority_feature_t * app,INOUT u8_t * next_free_app_id_entry,IN const u16_t app_id,IN const u8_t traffic_type,IN const u8_t priority)3746*d14abf15SRobert Mustacchi lm_dcbx_admin_mib_update_app_pri(
3747*d14abf15SRobert Mustacchi     IN          lm_device_t                 *pdev,
3748*d14abf15SRobert Mustacchi     INOUT       dcbx_app_priority_feature_t *app,
3749*d14abf15SRobert Mustacchi     INOUT       u8_t                        *next_free_app_id_entry,
3750*d14abf15SRobert Mustacchi     IN const    u16_t                       app_id,
3751*d14abf15SRobert Mustacchi     IN const    u8_t                        traffic_type,
3752*d14abf15SRobert Mustacchi     IN const    u8_t                        priority)
3753*d14abf15SRobert Mustacchi {
3754*d14abf15SRobert Mustacchi     lm_status_t lm_status = LM_STATUS_SUCCESS;
3755*d14abf15SRobert Mustacchi     u8_t traf_type_entry = 0;
3756*d14abf15SRobert Mustacchi     u8_t app_bit_field = DCBX_APP_ENTRY_VALID;
3757*d14abf15SRobert Mustacchi 
3758*d14abf15SRobert Mustacchi     switch(traffic_type)
3759*d14abf15SRobert Mustacchi     {
3760*d14abf15SRobert Mustacchi     case TRAFFIC_TYPE_ETH:
3761*d14abf15SRobert Mustacchi         app_bit_field |= DCBX_APP_SF_ETH_TYPE;
3762*d14abf15SRobert Mustacchi         break;
3763*d14abf15SRobert Mustacchi     case TRAFFIC_TYPE_PORT:
3764*d14abf15SRobert Mustacchi         app_bit_field |= DCBX_APP_SF_PORT;
3765*d14abf15SRobert Mustacchi         break;
3766*d14abf15SRobert Mustacchi     default:
3767*d14abf15SRobert Mustacchi         DbgBreakMsg("lm_dcbx_admin_mib_update_app_pri illegal traffic_type entry ");
3768*d14abf15SRobert Mustacchi         return LM_STATUS_INVALID_PARAMETER;
3769*d14abf15SRobert Mustacchi     }
3770*d14abf15SRobert Mustacchi 
3771*d14abf15SRobert Mustacchi     if(ARRSIZE(app->app_pri_tbl) <= (*next_free_app_id_entry) )
3772*d14abf15SRobert Mustacchi     {
3773*d14abf15SRobert Mustacchi         // Reserve two entries to iSCSI and FCoE (in case they will
3774*d14abf15SRobert Mustacchi         // be received after the 16th application priority entry).
3775*d14abf15SRobert Mustacchi         if(lm_dcbx_cee_is_entry_iscsi_classif(
3776*d14abf15SRobert Mustacchi             app_bit_field,
3777*d14abf15SRobert Mustacchi             app_id ) ||
3778*d14abf15SRobert Mustacchi            lm_dcbx_cee_is_entry_fcoe_classif(
3779*d14abf15SRobert Mustacchi             app_bit_field,
3780*d14abf15SRobert Mustacchi             app_id))
3781*d14abf15SRobert Mustacchi         {
3782*d14abf15SRobert Mustacchi             traf_type_entry = lm_dcbx_app_find_non_off_tt_entry(pdev, app);
3783*d14abf15SRobert Mustacchi 
3784*d14abf15SRobert Mustacchi             if (ARRSIZE(app->app_pri_tbl) <= traf_type_entry)
3785*d14abf15SRobert Mustacchi             {
3786*d14abf15SRobert Mustacchi                 DbgBreakMsg("lm_dcbx_admin_mib_update_app_pri : traf_type_entry contains an invalid value ");
3787*d14abf15SRobert Mustacchi                 return lm_status;
3788*d14abf15SRobert Mustacchi             }
3789*d14abf15SRobert Mustacchi         }
3790*d14abf15SRobert Mustacchi         else
3791*d14abf15SRobert Mustacchi         {
3792*d14abf15SRobert Mustacchi             return lm_status;
3793*d14abf15SRobert Mustacchi         }
3794*d14abf15SRobert Mustacchi     }
3795*d14abf15SRobert Mustacchi     else
3796*d14abf15SRobert Mustacchi     {
3797*d14abf15SRobert Mustacchi         DbgBreakIf(ARRSIZE(app->app_pri_tbl) <= (*next_free_app_id_entry));
3798*d14abf15SRobert Mustacchi         traf_type_entry = (*next_free_app_id_entry)++;
3799*d14abf15SRobert Mustacchi     }
3800*d14abf15SRobert Mustacchi 
3801*d14abf15SRobert Mustacchi     DbgBreakIf(ARRSIZE(app->app_pri_tbl) <= traf_type_entry );
3802*d14abf15SRobert Mustacchi 
3803*d14abf15SRobert Mustacchi     app->app_pri_tbl[traf_type_entry].app_id = app_id;
3804*d14abf15SRobert Mustacchi 
3805*d14abf15SRobert Mustacchi     app->app_pri_tbl[traf_type_entry].pri_bitmap =(u8_t)(1 << priority);
3806*d14abf15SRobert Mustacchi 
3807*d14abf15SRobert Mustacchi     app->app_pri_tbl[traf_type_entry].appBitfield = app_bit_field;
3808*d14abf15SRobert Mustacchi 
3809*d14abf15SRobert Mustacchi     return lm_status;
3810*d14abf15SRobert Mustacchi }
3811*d14abf15SRobert Mustacchi /**
3812*d14abf15SRobert Mustacchi  * @description
3813*d14abf15SRobert Mustacchi  * Update admin MIB classification entries with OS DCBX
3814*d14abf15SRobert Mustacchi  * classification configuration.
3815*d14abf15SRobert Mustacchi  * @param pdev
3816*d14abf15SRobert Mustacchi  * @param admin_mib
3817*d14abf15SRobert Mustacchi  * @param dcb_params
3818*d14abf15SRobert Mustacchi  * @param classif_local_vars
3819*d14abf15SRobert Mustacchi  *
3820*d14abf15SRobert Mustacchi  * @return STATIC lm_status_t
3821*d14abf15SRobert Mustacchi  */
3822*d14abf15SRobert Mustacchi STATIC lm_status_t
lm_dcbx_ie_admin_mib_classif(IN lm_device_t * pdev,INOUT dcbx_app_priority_feature_t * app,IN const dcb_classif_params_t * classif_params,IN const u32_t flags)3823*d14abf15SRobert Mustacchi lm_dcbx_ie_admin_mib_classif(IN         lm_device_t                 *pdev,
3824*d14abf15SRobert Mustacchi                              INOUT      dcbx_app_priority_feature_t *app,
3825*d14abf15SRobert Mustacchi                              IN const   dcb_classif_params_t        *classif_params,
3826*d14abf15SRobert Mustacchi                              IN const   u32_t                       flags
3827*d14abf15SRobert Mustacchi                              )
3828*d14abf15SRobert Mustacchi {
3829*d14abf15SRobert Mustacchi     lm_dcbx_indicate_event_t *indicate_event    = &pdev->dcbx_info.indicate_event;
3830*d14abf15SRobert Mustacchi     dcb_classif_elem_t  *p_classif_elem         = (dcb_classif_elem_t *)classif_params->classif_table;
3831*d14abf15SRobert Mustacchi     u32_t               i                       = 0;
3832*d14abf15SRobert Mustacchi     u8_t                traffic_type            = 0;
3833*d14abf15SRobert Mustacchi     u8_t                b_update_admin          = FALSE;
3834*d14abf15SRobert Mustacchi     // Other traffic type is defined as not ISCSI or FCOE
3835*d14abf15SRobert Mustacchi     u8_t                next_free_app_id_entry  = 0;
3836*d14abf15SRobert Mustacchi 
3837*d14abf15SRobert Mustacchi     mm_mem_zero(&(app->app_pri_tbl), sizeof(app->app_pri_tbl));
3838*d14abf15SRobert Mustacchi     app->default_pri = 0;
3839*d14abf15SRobert Mustacchi     app->tc_supported = 0;
3840*d14abf15SRobert Mustacchi     indicate_event->iscsi_tcp_pri = LM_DCBX_ILLEGAL_PRI;
3841*d14abf15SRobert Mustacchi 
3842*d14abf15SRobert Mustacchi     if(0 == GET_FLAGS(flags, DCB_PARAMS_CLASSIF_ENABLED))
3843*d14abf15SRobert Mustacchi     {
3844*d14abf15SRobert Mustacchi         return LM_STATUS_SUCCESS;
3845*d14abf15SRobert Mustacchi     }
3846*d14abf15SRobert Mustacchi 
3847*d14abf15SRobert Mustacchi     for(i = 0; i < classif_params->num_classif_elements; i++ , p_classif_elem++)
3848*d14abf15SRobert Mustacchi     {
3849*d14abf15SRobert Mustacchi         b_update_admin = FALSE;
3850*d14abf15SRobert Mustacchi 
3851*d14abf15SRobert Mustacchi         if(DCB_ACTION_PRIORITY != p_classif_elem->action_selector)
3852*d14abf15SRobert Mustacchi         {
3853*d14abf15SRobert Mustacchi             // VBD only supports condition_selector that is based on priority
3854*d14abf15SRobert Mustacchi             continue;
3855*d14abf15SRobert Mustacchi         }
3856*d14abf15SRobert Mustacchi         switch(p_classif_elem->condition_selector)
3857*d14abf15SRobert Mustacchi         {
3858*d14abf15SRobert Mustacchi         case DCB_CONDITION_DEFAULT:
3859*d14abf15SRobert Mustacchi             // If default entry exist it must be the first entry ISCSI and FCOE priority
3860*d14abf15SRobert Mustacchi             // will be update accordingly. If OS gave us an ISCSI or FCOE entry it will
3861*d14abf15SRobert Mustacchi             // overwrite this value.
3862*d14abf15SRobert Mustacchi             DbgBreakIf(0 != i);
3863*d14abf15SRobert Mustacchi             app->default_pri = (u8_t)p_classif_elem->action_field;
3864*d14abf15SRobert Mustacchi             break;
3865*d14abf15SRobert Mustacchi 
3866*d14abf15SRobert Mustacchi         case DCB_CONDITION_TCP_OR_UDP_PORT:
3867*d14abf15SRobert Mustacchi             traffic_type = TRAFFIC_TYPE_PORT;
3868*d14abf15SRobert Mustacchi             b_update_admin = TRUE;
3869*d14abf15SRobert Mustacchi             break;
3870*d14abf15SRobert Mustacchi 
3871*d14abf15SRobert Mustacchi         case DCB_CONDITION_ETHERTYPE:
3872*d14abf15SRobert Mustacchi             traffic_type = TRAFFIC_TYPE_ETH;
3873*d14abf15SRobert Mustacchi             b_update_admin = TRUE;
3874*d14abf15SRobert Mustacchi             break;
3875*d14abf15SRobert Mustacchi         case DCB_CONDITION_TCP_PORT:
3876*d14abf15SRobert Mustacchi             if(TCP_PORT_ISCSI == p_classif_elem->condition_field)
3877*d14abf15SRobert Mustacchi             {
3878*d14abf15SRobert Mustacchi                 // Check if ISCSI prioriy changed from last time.
3879*d14abf15SRobert Mustacchi                 if(LM_DCBX_ILLEGAL_PRI <= p_classif_elem->action_field )
3880*d14abf15SRobert Mustacchi                 {
3881*d14abf15SRobert Mustacchi                     DbgBreakMsg("lm_dcbx_ie_admin_mib_update_runtime_classif illegal action field");
3882*d14abf15SRobert Mustacchi                     return LM_STATUS_FAILURE;
3883*d14abf15SRobert Mustacchi                 }
3884*d14abf15SRobert Mustacchi                 if(p_classif_elem->action_field !=
3885*d14abf15SRobert Mustacchi                    indicate_event->iscsi_tcp_pri)
3886*d14abf15SRobert Mustacchi                 {
3887*d14abf15SRobert Mustacchi                     indicate_event->iscsi_tcp_pri = p_classif_elem->action_field;
3888*d14abf15SRobert Mustacchi                 }
3889*d14abf15SRobert Mustacchi             }
3890*d14abf15SRobert Mustacchi             break;
3891*d14abf15SRobert Mustacchi         case DCB_CONDITION_RESERVED:
3892*d14abf15SRobert Mustacchi         case DCB_CONDITION_UDP_PORT://Fall through
3893*d14abf15SRobert Mustacchi         case DCB_CONDITION_NETDIRECT_PORT://Fall through
3894*d14abf15SRobert Mustacchi             //Not supported by VBD
3895*d14abf15SRobert Mustacchi             break;
3896*d14abf15SRobert Mustacchi         default:
3897*d14abf15SRobert Mustacchi             DbgBreakMsg("lm_dcbx_runtime_params_updated_en_classif_entries: illegal entry ");
3898*d14abf15SRobert Mustacchi             break;
3899*d14abf15SRobert Mustacchi         }
3900*d14abf15SRobert Mustacchi         if(TRUE == b_update_admin)
3901*d14abf15SRobert Mustacchi         {
3902*d14abf15SRobert Mustacchi             lm_dcbx_admin_mib_update_app_pri(pdev,
3903*d14abf15SRobert Mustacchi                                              app,
3904*d14abf15SRobert Mustacchi                                              &next_free_app_id_entry,
3905*d14abf15SRobert Mustacchi                                              p_classif_elem->condition_field,
3906*d14abf15SRobert Mustacchi                                              traffic_type,
3907*d14abf15SRobert Mustacchi                                              (u8_t)p_classif_elem->action_field);
3908*d14abf15SRobert Mustacchi         }
3909*d14abf15SRobert Mustacchi     }
3910*d14abf15SRobert Mustacchi 
3911*d14abf15SRobert Mustacchi     app->tc_supported = next_free_app_id_entry;
3912*d14abf15SRobert Mustacchi 
3913*d14abf15SRobert Mustacchi     return LM_STATUS_SUCCESS;
3914*d14abf15SRobert Mustacchi }
3915*d14abf15SRobert Mustacchi /**
3916*d14abf15SRobert Mustacchi  * This function is for wrapper for the function
3917*d14abf15SRobert Mustacchi  * lm_dcbx_ie_admin_mib_classif and it purpose is for telling if
3918*d14abf15SRobert Mustacchi  * DCBX configuration needs to change but MCP was not update.
3919*d14abf15SRobert Mustacchi  * @param pdev
3920*d14abf15SRobert Mustacchi  * @param app
3921*d14abf15SRobert Mustacchi  * @param classif_params
3922*d14abf15SRobert Mustacchi  * @param classif_change_mcp_not_aware
3923*d14abf15SRobert Mustacchi  * @param flags
3924*d14abf15SRobert Mustacchi  *
3925*d14abf15SRobert Mustacchi  * @return STATIC lm_device_t
3926*d14abf15SRobert Mustacchi  */
3927*d14abf15SRobert Mustacchi STATIC lm_status_t
lm_dcbx_ie_admin_mib_classif_wrapper(IN lm_device_t * pdev,INOUT dcbx_app_priority_feature_t * app,IN const dcb_classif_params_t * classif_params,OUT u8_t * classif_change_mcp_not_aware,IN const u32_t flags)3928*d14abf15SRobert Mustacchi lm_dcbx_ie_admin_mib_classif_wrapper(IN         lm_device_t                 *pdev,
3929*d14abf15SRobert Mustacchi                                      INOUT      dcbx_app_priority_feature_t *app,
3930*d14abf15SRobert Mustacchi                                      IN const   dcb_classif_params_t        *classif_params,
3931*d14abf15SRobert Mustacchi                                      OUT        u8_t                        *classif_change_mcp_not_aware,
3932*d14abf15SRobert Mustacchi                                      IN const   u32_t                       flags
3933*d14abf15SRobert Mustacchi                                      )
3934*d14abf15SRobert Mustacchi {
3935*d14abf15SRobert Mustacchi     lm_dcbx_indicate_event_t    *indicate_event     = &pdev->dcbx_info.indicate_event;
3936*d14abf15SRobert Mustacchi     lm_status_t                 lm_status           = LM_STATUS_SUCCESS;
3937*d14abf15SRobert Mustacchi     const u16_t                 iscsi_tcp_pri_prev  = indicate_event->iscsi_tcp_pri;
3938*d14abf15SRobert Mustacchi 
3939*d14abf15SRobert Mustacchi     lm_status = lm_dcbx_ie_admin_mib_classif(pdev,app,classif_params,flags);
3940*d14abf15SRobert Mustacchi 
3941*d14abf15SRobert Mustacchi     if(iscsi_tcp_pri_prev != indicate_event->iscsi_tcp_pri)
3942*d14abf15SRobert Mustacchi     {
3943*d14abf15SRobert Mustacchi         (*classif_change_mcp_not_aware) = TRUE;
3944*d14abf15SRobert Mustacchi     }
3945*d14abf15SRobert Mustacchi 
3946*d14abf15SRobert Mustacchi     return lm_status;
3947*d14abf15SRobert Mustacchi }
3948*d14abf15SRobert Mustacchi 
3949*d14abf15SRobert Mustacchi /**
3950*d14abf15SRobert Mustacchi  * @description
3951*d14abf15SRobert Mustacchi  * Update admin MIB ETS parameters.
3952*d14abf15SRobert Mustacchi  * @param pdev
3953*d14abf15SRobert Mustacchi  * @param admin_ets
3954*d14abf15SRobert Mustacchi  * @param bw_tbl
3955*d14abf15SRobert Mustacchi  * @param pri_pg
3956*d14abf15SRobert Mustacchi  * @param bw_tbl_size
3957*d14abf15SRobert Mustacchi  * @param pri_pg_size
3958*d14abf15SRobert Mustacchi  */
3959*d14abf15SRobert Mustacchi void
lm_dcbx_admin_mib_update_ets_param(IN lm_device_t * pdev,IN dcbx_ets_feature_t * admin_ets,IN const u32_t * pg_bw_tbl,IN const u32_t * pri_pg,IN const u8_t bw_tbl_size,IN const u8_t pri_pg_size)3960*d14abf15SRobert Mustacchi lm_dcbx_admin_mib_update_ets_param(
3961*d14abf15SRobert Mustacchi     IN lm_device_t         *pdev,
3962*d14abf15SRobert Mustacchi     IN dcbx_ets_feature_t  *admin_ets,
3963*d14abf15SRobert Mustacchi     IN const u32_t         *pg_bw_tbl,
3964*d14abf15SRobert Mustacchi     IN const u32_t         *pri_pg,
3965*d14abf15SRobert Mustacchi     IN const u8_t          bw_tbl_size,
3966*d14abf15SRobert Mustacchi     IN const u8_t          pri_pg_size  )
3967*d14abf15SRobert Mustacchi {
3968*d14abf15SRobert Mustacchi     u8_t    i = 0;
3969*d14abf15SRobert Mustacchi 
3970*d14abf15SRobert Mustacchi     DbgBreakIf(DCBX_MAX_NUM_PG_BW_ENTRIES != bw_tbl_size);
3971*d14abf15SRobert Mustacchi 
3972*d14abf15SRobert Mustacchi     for(i=0; i < DCBX_MAX_NUM_PG_BW_ENTRIES ;i++)
3973*d14abf15SRobert Mustacchi     {
3974*d14abf15SRobert Mustacchi         DCBX_PG_BW_SET(admin_ets->pg_bw_tbl,
3975*d14abf15SRobert Mustacchi                        i,
3976*d14abf15SRobert Mustacchi                        pg_bw_tbl[i]);
3977*d14abf15SRobert Mustacchi     }
3978*d14abf15SRobert Mustacchi 
3979*d14abf15SRobert Mustacchi     DbgBreakIf(DCBX_MAX_NUM_PRI_PG_ENTRIES != pri_pg_size);
3980*d14abf15SRobert Mustacchi 
3981*d14abf15SRobert Mustacchi     for(i=0; i < DCBX_MAX_NUM_PRI_PG_ENTRIES; i++)
3982*d14abf15SRobert Mustacchi     {
3983*d14abf15SRobert Mustacchi         DCBX_PRI_PG_SET(admin_ets->pri_pg_tbl,
3984*d14abf15SRobert Mustacchi                         i,
3985*d14abf15SRobert Mustacchi                         pri_pg[i]);
3986*d14abf15SRobert Mustacchi     }
3987*d14abf15SRobert Mustacchi }
3988*d14abf15SRobert Mustacchi /**
3989*d14abf15SRobert Mustacchi  * @description
3990*d14abf15SRobert Mustacchi  *
3991*d14abf15SRobert Mustacchi  * @param pdev
3992*d14abf15SRobert Mustacchi  * @param ets
3993*d14abf15SRobert Mustacchi  * @param ets_params
3994*d14abf15SRobert Mustacchi  *
3995*d14abf15SRobert Mustacchi  * @return lm_status_t
3996*d14abf15SRobert Mustacchi  */
3997*d14abf15SRobert Mustacchi lm_status_t
lm_dcbx_ie_admin_mib_update_runtime_ets(IN lm_device_t * pdev,OUT dcbx_ets_feature_t * admin_ets,IN const dcb_ets_tsa_param_t * os_ets_params,IN const u32_t flags)3998*d14abf15SRobert Mustacchi lm_dcbx_ie_admin_mib_update_runtime_ets(IN          lm_device_t         *pdev,
3999*d14abf15SRobert Mustacchi                                         OUT         dcbx_ets_feature_t  *admin_ets,
4000*d14abf15SRobert Mustacchi                                         IN const    dcb_ets_tsa_param_t *os_ets_params,
4001*d14abf15SRobert Mustacchi                                         IN const    u32_t               flags
4002*d14abf15SRobert Mustacchi                                         )
4003*d14abf15SRobert Mustacchi {
4004*d14abf15SRobert Mustacchi     u32_t pg_bw_tbl[DCBX_MAX_NUM_PG_BW_ENTRIES] = {0};
4005*d14abf15SRobert Mustacchi     u32_t pri_pg[DCBX_MAX_NUM_PRI_PG_ENTRIES] = {0};
4006*d14abf15SRobert Mustacchi     u8_t pri = 0;
4007*d14abf15SRobert Mustacchi     u8_t tc_entry = 0;
4008*d14abf15SRobert Mustacchi 
4009*d14abf15SRobert Mustacchi     ASSERT_STATIC(DCBX_MAX_NUM_PRI_PG_ENTRIES == DCBX_MAX_NUM_PG_BW_ENTRIES);
4010*d14abf15SRobert Mustacchi 
4011*d14abf15SRobert Mustacchi     ASSERT_STATIC(ARRSIZE(os_ets_params->priority_assignment_table) ==
4012*d14abf15SRobert Mustacchi                   DCBX_MAX_NUM_PG_BW_ENTRIES);
4013*d14abf15SRobert Mustacchi 
4014*d14abf15SRobert Mustacchi     ASSERT_STATIC(ARRSIZE(os_ets_params->tc_bw_assignment_table) ==
4015*d14abf15SRobert Mustacchi                   DCBX_MAX_NUM_PRI_PG_ENTRIES);
4016*d14abf15SRobert Mustacchi 
4017*d14abf15SRobert Mustacchi     ASSERT_STATIC(ARRSIZE(os_ets_params->tsa_assignment_table) ==
4018*d14abf15SRobert Mustacchi                   DCBX_MAX_NUM_PRI_PG_ENTRIES);
4019*d14abf15SRobert Mustacchi 
4020*d14abf15SRobert Mustacchi     if(0 == GET_FLAGS(flags, DCB_PARAMS_ETS_ENABLED))
4021*d14abf15SRobert Mustacchi     {
4022*d14abf15SRobert Mustacchi         // All pri_pg point to entry 0
4023*d14abf15SRobert Mustacchi         pg_bw_tbl[0] = 100;
4024*d14abf15SRobert Mustacchi     }
4025*d14abf15SRobert Mustacchi     else
4026*d14abf15SRobert Mustacchi     {
4027*d14abf15SRobert Mustacchi         // Prepare parameters from OS to standard config.
4028*d14abf15SRobert Mustacchi         for(pri = 0 ;
4029*d14abf15SRobert Mustacchi             pri < ARRSIZE(os_ets_params->priority_assignment_table);
4030*d14abf15SRobert Mustacchi             pri++)
4031*d14abf15SRobert Mustacchi         {
4032*d14abf15SRobert Mustacchi             tc_entry = os_ets_params->priority_assignment_table[pri];
4033*d14abf15SRobert Mustacchi 
4034*d14abf15SRobert Mustacchi             if(TSA_ASSIGNMENT_DCB_TSA_STRICT == os_ets_params->tsa_assignment_table[tc_entry])
4035*d14abf15SRobert Mustacchi             {
4036*d14abf15SRobert Mustacchi                 // pg_bw_tbl isn't relevant for strict priority
4037*d14abf15SRobert Mustacchi                 pri_pg[pri] = DCBX_STRICT_PRI_PG;
4038*d14abf15SRobert Mustacchi             }
4039*d14abf15SRobert Mustacchi             else if(TSA_ASSIGNMENT_DCB_TSA_ETS == os_ets_params->tsa_assignment_table[tc_entry])
4040*d14abf15SRobert Mustacchi             {
4041*d14abf15SRobert Mustacchi                 pri_pg[pri]         = tc_entry;
4042*d14abf15SRobert Mustacchi                 pg_bw_tbl[tc_entry] = os_ets_params->tc_bw_assignment_table[tc_entry];
4043*d14abf15SRobert Mustacchi             }
4044*d14abf15SRobert Mustacchi             else
4045*d14abf15SRobert Mustacchi             {
4046*d14abf15SRobert Mustacchi                 DbgBreakMsg("lm_dcbx_get_ets_ieee_feature parameters are check before "
4047*d14abf15SRobert Mustacchi                             "this should not happen");
4048*d14abf15SRobert Mustacchi                 // For retail
4049*d14abf15SRobert Mustacchi                 return LM_STATUS_FAILURE;
4050*d14abf15SRobert Mustacchi             }
4051*d14abf15SRobert Mustacchi         }
4052*d14abf15SRobert Mustacchi     }
4053*d14abf15SRobert Mustacchi 
4054*d14abf15SRobert Mustacchi     // Update MCP.
4055*d14abf15SRobert Mustacchi     lm_dcbx_admin_mib_update_ets_param(
4056*d14abf15SRobert Mustacchi         pdev,
4057*d14abf15SRobert Mustacchi         admin_ets,
4058*d14abf15SRobert Mustacchi         pg_bw_tbl,
4059*d14abf15SRobert Mustacchi         pri_pg,
4060*d14abf15SRobert Mustacchi         ARRSIZE(pg_bw_tbl) ,
4061*d14abf15SRobert Mustacchi         ARRSIZE(pri_pg));
4062*d14abf15SRobert Mustacchi 
4063*d14abf15SRobert Mustacchi     return LM_STATUS_SUCCESS;
4064*d14abf15SRobert Mustacchi }
4065*d14abf15SRobert Mustacchi /**
4066*d14abf15SRobert Mustacchi  * Update PFC admin MIB
4067*d14abf15SRobert Mustacchi  * @param pdev
4068*d14abf15SRobert Mustacchi  * @param pfc
4069*d14abf15SRobert Mustacchi  * @param pfc_params
4070*d14abf15SRobert Mustacchi  * @param flags
4071*d14abf15SRobert Mustacchi  *
4072*d14abf15SRobert Mustacchi  * @return STATIC lm_status_t
4073*d14abf15SRobert Mustacchi  */
4074*d14abf15SRobert Mustacchi STATIC lm_status_t
lm_dcbx_ie_admin_mib_pfc(IN lm_device_t * pdev,INOUT dcbx_pfc_feature_t * pfc,IN const dcb_pfc_param_t * pfc_params,IN const u32_t flags)4075*d14abf15SRobert Mustacchi lm_dcbx_ie_admin_mib_pfc(IN         lm_device_t         *pdev,
4076*d14abf15SRobert Mustacchi                          INOUT      dcbx_pfc_feature_t  *pfc,
4077*d14abf15SRobert Mustacchi                          IN const   dcb_pfc_param_t     *pfc_params,
4078*d14abf15SRobert Mustacchi                          IN const   u32_t               flags
4079*d14abf15SRobert Mustacchi                          )
4080*d14abf15SRobert Mustacchi {
4081*d14abf15SRobert Mustacchi     if(GET_FLAGS(flags, DCB_PARAMS_PFC_ENABLED))
4082*d14abf15SRobert Mustacchi     {
4083*d14abf15SRobert Mustacchi         pfc->pri_en_bitmap =(u8_t)pfc_params->pfc_enable;
4084*d14abf15SRobert Mustacchi     }
4085*d14abf15SRobert Mustacchi     else
4086*d14abf15SRobert Mustacchi     {
4087*d14abf15SRobert Mustacchi         pfc->pri_en_bitmap = 0;
4088*d14abf15SRobert Mustacchi     }
4089*d14abf15SRobert Mustacchi 
4090*d14abf15SRobert Mustacchi     return LM_STATUS_SUCCESS;
4091*d14abf15SRobert Mustacchi }
4092*d14abf15SRobert Mustacchi /**
4093*d14abf15SRobert Mustacchi  *
4094*d14abf15SRobert Mustacchi  * @param pdev
4095*d14abf15SRobert Mustacchi  * @param p_admin_mib_offset
4096*d14abf15SRobert Mustacchi  *
4097*d14abf15SRobert Mustacchi  * @return STATIC lm_status_t
4098*d14abf15SRobert Mustacchi  */
4099*d14abf15SRobert Mustacchi STATIC lm_status_t
lm_dcbx_get_admin_mib_offset(IN lm_device_t * pdev,OUT u32_t * p_admin_mib_offset)4100*d14abf15SRobert Mustacchi lm_dcbx_get_admin_mib_offset( IN  lm_device_t         *pdev,
4101*d14abf15SRobert Mustacchi                               OUT u32_t               *p_admin_mib_offset)
4102*d14abf15SRobert Mustacchi {
4103*d14abf15SRobert Mustacchi     u32_t               dcbx_lldp_params_offset         = SHMEM_LLDP_DCBX_PARAMS_NONE;
4104*d14abf15SRobert Mustacchi     const u32_t         dcbx_lldp_params_field_offset   = OFFSETOF(shmem2_region_t,dcbx_lldp_params_offset);
4105*d14abf15SRobert Mustacchi     lm_status_t         lm_status                       = LM_STATUS_SUCCESS;
4106*d14abf15SRobert Mustacchi 
4107*d14abf15SRobert Mustacchi     lm_dcbx_read_shmem2_mcp_fields( pdev,
4108*d14abf15SRobert Mustacchi                                     dcbx_lldp_params_field_offset,
4109*d14abf15SRobert Mustacchi                                     &dcbx_lldp_params_offset);
4110*d14abf15SRobert Mustacchi 
4111*d14abf15SRobert Mustacchi     if (SHMEM_LLDP_DCBX_PARAMS_NONE == dcbx_lldp_params_offset)
4112*d14abf15SRobert Mustacchi     {
4113*d14abf15SRobert Mustacchi         DbgBreakMsg("lm_dcbx_read_admin_mib couldn't read mcp offset ");
4114*d14abf15SRobert Mustacchi         return LM_STATUS_FAILURE;
4115*d14abf15SRobert Mustacchi     }
4116*d14abf15SRobert Mustacchi 
4117*d14abf15SRobert Mustacchi     *p_admin_mib_offset = LM_DCBX_ADMIN_MIB_OFFSET(pdev ,dcbx_lldp_params_offset);
4118*d14abf15SRobert Mustacchi 
4119*d14abf15SRobert Mustacchi     return lm_status;
4120*d14abf15SRobert Mustacchi }
4121*d14abf15SRobert Mustacchi /**
4122*d14abf15SRobert Mustacchi  *
4123*d14abf15SRobert Mustacchi  * @param pdev
4124*d14abf15SRobert Mustacchi  * @param p_admin_mib
4125*d14abf15SRobert Mustacchi  * @param p_admin_mib_offset
4126*d14abf15SRobert Mustacchi  *
4127*d14abf15SRobert Mustacchi  * @return STATIC lm_status_t
4128*d14abf15SRobert Mustacchi  */
4129*d14abf15SRobert Mustacchi STATIC lm_status_t
lm_dcbx_read_admin_mib(IN lm_device_t * pdev,OUT lldp_admin_mib_t * p_admin_mib,OUT u32_t * p_admin_mib_offset)4130*d14abf15SRobert Mustacchi lm_dcbx_read_admin_mib( IN  lm_device_t         *pdev,
4131*d14abf15SRobert Mustacchi                         OUT lldp_admin_mib_t    *p_admin_mib,
4132*d14abf15SRobert Mustacchi                         OUT u32_t               *p_admin_mib_offset)
4133*d14abf15SRobert Mustacchi {
4134*d14abf15SRobert Mustacchi     u32_t               i                               = 0;
4135*d14abf15SRobert Mustacchi     u32_t               *buff                           = NULL ;
4136*d14abf15SRobert Mustacchi     lm_status_t         lm_status                       = LM_STATUS_SUCCESS;
4137*d14abf15SRobert Mustacchi 
4138*d14abf15SRobert Mustacchi     lm_status = lm_dcbx_get_admin_mib_offset( pdev,
4139*d14abf15SRobert Mustacchi                                               p_admin_mib_offset);
4140*d14abf15SRobert Mustacchi 
4141*d14abf15SRobert Mustacchi     if(LM_STATUS_SUCCESS != lm_status)
4142*d14abf15SRobert Mustacchi     {
4143*d14abf15SRobert Mustacchi         DbgBreakMsg("lm_dcbx_read_admin_mib: lm_dcbx_get_admin_mib_offset failed ");
4144*d14abf15SRobert Mustacchi         return lm_status;
4145*d14abf15SRobert Mustacchi     }
4146*d14abf15SRobert Mustacchi 
4147*d14abf15SRobert Mustacchi     buff = (u32_t *)p_admin_mib;
4148*d14abf15SRobert Mustacchi     //Read the data first
4149*d14abf15SRobert Mustacchi     for(i=0 ;i < sizeof(lldp_admin_mib_t); i+=4, buff++)
4150*d14abf15SRobert Mustacchi     {
4151*d14abf15SRobert Mustacchi         *buff = REG_RD(pdev,
4152*d14abf15SRobert Mustacchi                       ((*p_admin_mib_offset) + i));
4153*d14abf15SRobert Mustacchi     }
4154*d14abf15SRobert Mustacchi 
4155*d14abf15SRobert Mustacchi     return lm_status;
4156*d14abf15SRobert Mustacchi }
4157*d14abf15SRobert Mustacchi 
4158*d14abf15SRobert Mustacchi /**
4159*d14abf15SRobert Mustacchi  * @description
4160*d14abf15SRobert Mustacchi  * Update admin MIN and notify MCP on the changes.
4161*d14abf15SRobert Mustacchi  * @param pdev
4162*d14abf15SRobert Mustacchi  * @param dcb_params
4163*d14abf15SRobert Mustacchi  * @param mf_cfg_offset_value
4164*d14abf15SRobert Mustacchi  *
4165*d14abf15SRobert Mustacchi  * @return STATIC lm_status_t
4166*d14abf15SRobert Mustacchi  */
4167*d14abf15SRobert Mustacchi STATIC lm_status_t
lm_dcbx_ie_admin_mib_updated_runtime(IN lm_device_t * pdev,IN const dcb_indicate_event_params_t * dcb_params,OUT u8_t * classif_change_mcp_not_aware,OUT u8_t * is_ets_admin_updated)4168*d14abf15SRobert Mustacchi lm_dcbx_ie_admin_mib_updated_runtime(IN         lm_device_t                     *pdev,
4169*d14abf15SRobert Mustacchi                                      IN const   dcb_indicate_event_params_t     *dcb_params,
4170*d14abf15SRobert Mustacchi                                      OUT        u8_t                            *classif_change_mcp_not_aware,
4171*d14abf15SRobert Mustacchi                                      OUT        u8_t                            *is_ets_admin_updated
4172*d14abf15SRobert Mustacchi                                      )
4173*d14abf15SRobert Mustacchi {
4174*d14abf15SRobert Mustacchi     lldp_admin_mib_t    admin_mib           = {0};
4175*d14abf15SRobert Mustacchi     u32_t               i                   = 0;
4176*d14abf15SRobert Mustacchi     u32_t               *buff               = NULL ;
4177*d14abf15SRobert Mustacchi     lm_status_t         lm_status           = LM_STATUS_SUCCESS;
4178*d14abf15SRobert Mustacchi     u32_t               fw_resp             = 0;
4179*d14abf15SRobert Mustacchi     u32_t               admin_mib_offset    = 0;
4180*d14abf15SRobert Mustacchi     u8_t                is_mfw_cfg          = FALSE;
4181*d14abf15SRobert Mustacchi     const u32_t         willing_flags       = DCBX_ETS_WILLING | DCBX_PFC_WILLING | DCBX_APP_WILLING;
4182*d14abf15SRobert Mustacchi 
4183*d14abf15SRobert Mustacchi     // Use original admin MIB not updated by BACS
4184*d14abf15SRobert Mustacchi     mm_memcpy(&admin_mib, &pdev->dcbx_info.admin_mib_org, sizeof(admin_mib));
4185*d14abf15SRobert Mustacchi 
4186*d14abf15SRobert Mustacchi     if(GET_FLAGS(dcb_params->flags, DCB_PARAMS_WILLING))
4187*d14abf15SRobert Mustacchi     {
4188*d14abf15SRobert Mustacchi         SET_FLAGS(admin_mib.ver_cfg_flags,willing_flags);
4189*d14abf15SRobert Mustacchi     }
4190*d14abf15SRobert Mustacchi     else
4191*d14abf15SRobert Mustacchi     {
4192*d14abf15SRobert Mustacchi         RESET_FLAGS(admin_mib.ver_cfg_flags,willing_flags);
4193*d14abf15SRobert Mustacchi     }
4194*d14abf15SRobert Mustacchi 
4195*d14abf15SRobert Mustacchi     lm_status = lm_dcbx_ie_admin_mib_update_runtime_ets(pdev,
4196*d14abf15SRobert Mustacchi                                                         &admin_mib.features.ets,
4197*d14abf15SRobert Mustacchi                                                         &dcb_params->ets_params,
4198*d14abf15SRobert Mustacchi                                                         dcb_params->flags);
4199*d14abf15SRobert Mustacchi 
4200*d14abf15SRobert Mustacchi     if(LM_STATUS_SUCCESS != lm_status)
4201*d14abf15SRobert Mustacchi     {
4202*d14abf15SRobert Mustacchi         DbgBreakMsg("lm_dcbx_ie_admin_mib_update_runtime_ets function failed ");
4203*d14abf15SRobert Mustacchi     }
4204*d14abf15SRobert Mustacchi     else
4205*d14abf15SRobert Mustacchi     {
4206*d14abf15SRobert Mustacchi         *is_ets_admin_updated = TRUE;
4207*d14abf15SRobert Mustacchi         is_mfw_cfg = TRUE;
4208*d14abf15SRobert Mustacchi     }
4209*d14abf15SRobert Mustacchi 
4210*d14abf15SRobert Mustacchi     lm_status = lm_dcbx_ie_admin_mib_pfc(pdev,
4211*d14abf15SRobert Mustacchi                                          &admin_mib.features.pfc,
4212*d14abf15SRobert Mustacchi                                          &dcb_params->pfc_params,
4213*d14abf15SRobert Mustacchi                                          dcb_params->flags);
4214*d14abf15SRobert Mustacchi 
4215*d14abf15SRobert Mustacchi     if(LM_STATUS_SUCCESS != lm_status)
4216*d14abf15SRobert Mustacchi     {
4217*d14abf15SRobert Mustacchi         DbgBreakMsg("lm_dcbx_ie_admin_mib_update_runtime_ets function failed ");
4218*d14abf15SRobert Mustacchi     }
4219*d14abf15SRobert Mustacchi     else
4220*d14abf15SRobert Mustacchi     {
4221*d14abf15SRobert Mustacchi         is_mfw_cfg = TRUE;
4222*d14abf15SRobert Mustacchi     }
4223*d14abf15SRobert Mustacchi 
4224*d14abf15SRobert Mustacchi     lm_status = lm_dcbx_ie_admin_mib_classif_wrapper(pdev,
4225*d14abf15SRobert Mustacchi                                                      &admin_mib.features.app,
4226*d14abf15SRobert Mustacchi                                                      &dcb_params->classif_params,
4227*d14abf15SRobert Mustacchi                                                      classif_change_mcp_not_aware,
4228*d14abf15SRobert Mustacchi                                                      dcb_params->flags);
4229*d14abf15SRobert Mustacchi 
4230*d14abf15SRobert Mustacchi     if(LM_STATUS_SUCCESS != lm_status)
4231*d14abf15SRobert Mustacchi     {
4232*d14abf15SRobert Mustacchi         DbgBreakMsg("lm_dcbx_ie_admin_mib_update_runtime_classif function failed ");
4233*d14abf15SRobert Mustacchi     }
4234*d14abf15SRobert Mustacchi     else
4235*d14abf15SRobert Mustacchi     {
4236*d14abf15SRobert Mustacchi         is_mfw_cfg = TRUE;
4237*d14abf15SRobert Mustacchi     }
4238*d14abf15SRobert Mustacchi 
4239*d14abf15SRobert Mustacchi     if(TRUE == is_mfw_cfg)
4240*d14abf15SRobert Mustacchi     {
4241*d14abf15SRobert Mustacchi         // There is a configuration done to MCP that was done by OS.
4242*d14abf15SRobert Mustacchi         lm_dcbx_config_drv_flags(
4243*d14abf15SRobert Mustacchi             pdev,
4244*d14abf15SRobert Mustacchi             lm_dcbx_drv_flags_set_bit,
4245*d14abf15SRobert Mustacchi             DRV_FLAGS_DCB_MFW_CONFIGURED);
4246*d14abf15SRobert Mustacchi 
4247*d14abf15SRobert Mustacchi         lm_status = lm_dcbx_get_admin_mib_offset( pdev,
4248*d14abf15SRobert Mustacchi                                                   &admin_mib_offset);
4249*d14abf15SRobert Mustacchi 
4250*d14abf15SRobert Mustacchi         // Write the data back.
4251*d14abf15SRobert Mustacchi         buff = (u32_t *)&admin_mib;
4252*d14abf15SRobert Mustacchi         for(i=0 ; i< sizeof(lldp_admin_mib_t); i+=4,buff++)
4253*d14abf15SRobert Mustacchi         {
4254*d14abf15SRobert Mustacchi             REG_WR(pdev, (admin_mib_offset + i) , *buff);
4255*d14abf15SRobert Mustacchi         }
4256*d14abf15SRobert Mustacchi 
4257*d14abf15SRobert Mustacchi         // update MCP
4258*d14abf15SRobert Mustacchi         lm_status = lm_mcp_cmd_send_recieve( pdev,
4259*d14abf15SRobert Mustacchi                                                 lm_mcp_mb_header,
4260*d14abf15SRobert Mustacchi                                                 DRV_MSG_CODE_DCBX_ADMIN_PMF_MSG,
4261*d14abf15SRobert Mustacchi                                                 0,
4262*d14abf15SRobert Mustacchi                                                 MCP_CMD_DEFAULT_TIMEOUT,
4263*d14abf15SRobert Mustacchi                                                 &fw_resp ) ;
4264*d14abf15SRobert Mustacchi 
4265*d14abf15SRobert Mustacchi         DbgBreakIf( lm_status != LM_STATUS_SUCCESS );
4266*d14abf15SRobert Mustacchi     }
4267*d14abf15SRobert Mustacchi 
4268*d14abf15SRobert Mustacchi     return lm_status;
4269*d14abf15SRobert Mustacchi }
4270*d14abf15SRobert Mustacchi 
4271*d14abf15SRobert Mustacchi /*******************************************************************************
4272*d14abf15SRobert Mustacchi  * Description: Update admin MIB that changes deafault DCBX configuration
4273*d14abf15SRobert Mustacchi  *              "admin_dcbx_enable" and "dcb_enable" are stand alone registry keys
4274*d14abf15SRobert Mustacchi  *              (if present will always be valid and not ignored), for all other
4275*d14abf15SRobert Mustacchi  *              DCBX registry set only if the entire DCBX registry set is present
4276*d14abf15SRobert Mustacchi  *              and differ from 0xFFFFFFFF (invalid value) the DCBX registry
4277*d14abf15SRobert Mustacchi  *              parameters are taken, otherwise the registry key set is ignored.)
4278*d14abf15SRobert Mustacchi  *              (Expect "admin_dcbx_enable" and "dcb_enable")
4279*d14abf15SRobert Mustacchi  * Return:
4280*d14abf15SRobert Mustacchi ******************************************************************************/
4281*d14abf15SRobert Mustacchi STATIC void
lm_dcbx_admin_mib_updated_init(lm_device_t * pdev,u32_t mf_cfg_offset_value)4282*d14abf15SRobert Mustacchi lm_dcbx_admin_mib_updated_init(lm_device_t * pdev,
4283*d14abf15SRobert Mustacchi                                  u32_t                 mf_cfg_offset_value)
4284*d14abf15SRobert Mustacchi {
4285*d14abf15SRobert Mustacchi     lldp_admin_mib_t admin_mib          = {0};
4286*d14abf15SRobert Mustacchi     u32_t           i                   = 0;
4287*d14abf15SRobert Mustacchi     u8_t            next_free_app_id_entry  = 0; /*used for not predifined entries*/
4288*d14abf15SRobert Mustacchi     u32_t           *buff               = NULL ;
4289*d14abf15SRobert Mustacchi     lm_status_t     lm_status           = LM_STATUS_SUCCESS;
4290*d14abf15SRobert Mustacchi     u32_t           offset                  = 0;
4291*d14abf15SRobert Mustacchi 
4292*d14abf15SRobert Mustacchi     lm_status = lm_dcbx_read_admin_mib( pdev,
4293*d14abf15SRobert Mustacchi                                         &admin_mib,
4294*d14abf15SRobert Mustacchi                                         &offset);
4295*d14abf15SRobert Mustacchi 
4296*d14abf15SRobert Mustacchi     if(LM_STATUS_SUCCESS != lm_status)
4297*d14abf15SRobert Mustacchi     {
4298*d14abf15SRobert Mustacchi         DbgBreakMsg(" lm_dcbx_admin_mib_updated_init lm_dcbx_read_admin_mib failed ");
4299*d14abf15SRobert Mustacchi     }
4300*d14abf15SRobert Mustacchi     DbgBreakIf(offset != LM_DCBX_ADMIN_MIB_OFFSET(pdev, mf_cfg_offset_value));
4301*d14abf15SRobert Mustacchi 
4302*d14abf15SRobert Mustacchi     if(DCBX_CONFIG_INV_VALUE !=
4303*d14abf15SRobert Mustacchi        pdev->params.dcbx_config_params.admin_dcbx_enable)
4304*d14abf15SRobert Mustacchi     {
4305*d14abf15SRobert Mustacchi         if(pdev->params.dcbx_config_params.admin_dcbx_enable)
4306*d14abf15SRobert Mustacchi         {
4307*d14abf15SRobert Mustacchi             SET_FLAGS(admin_mib.ver_cfg_flags,DCBX_DCBX_ENABLED);
4308*d14abf15SRobert Mustacchi         }
4309*d14abf15SRobert Mustacchi         else
4310*d14abf15SRobert Mustacchi         {
4311*d14abf15SRobert Mustacchi             RESET_FLAGS(admin_mib.ver_cfg_flags,DCBX_DCBX_ENABLED);
4312*d14abf15SRobert Mustacchi         }
4313*d14abf15SRobert Mustacchi     }
4314*d14abf15SRobert Mustacchi     lm_status = lm_dcbx_init_check_params_valid(pdev,
4315*d14abf15SRobert Mustacchi                                     (u32_t *)(&(pdev->params.dcbx_config_params.overwrite_settings)),
4316*d14abf15SRobert Mustacchi                                     ((sizeof(pdev->params.dcbx_config_params)-
4317*d14abf15SRobert Mustacchi                                      OFFSETOF(config_dcbx_params_t , overwrite_settings))/sizeof(u32_t)));
4318*d14abf15SRobert Mustacchi 
4319*d14abf15SRobert Mustacchi     if((LM_STATUS_SUCCESS == lm_status)&&
4320*d14abf15SRobert Mustacchi        (OVERWRITE_SETTINGS_ENABLE == pdev->params.dcbx_config_params.overwrite_settings))
4321*d14abf15SRobert Mustacchi     {
4322*d14abf15SRobert Mustacchi         RESET_FLAGS(admin_mib.ver_cfg_flags,DCBX_CEE_VERSION_MASK);
4323*d14abf15SRobert Mustacchi         admin_mib.ver_cfg_flags |=
4324*d14abf15SRobert Mustacchi             (pdev->params.dcbx_config_params.admin_dcbx_version << DCBX_CEE_VERSION_SHIFT) & DCBX_CEE_VERSION_MASK;
4325*d14abf15SRobert Mustacchi 
4326*d14abf15SRobert Mustacchi         admin_mib.features.ets.enabled = (u8_t)
4327*d14abf15SRobert Mustacchi             pdev->params.dcbx_config_params.admin_ets_enable;
4328*d14abf15SRobert Mustacchi 
4329*d14abf15SRobert Mustacchi 
4330*d14abf15SRobert Mustacchi         admin_mib.features.pfc.enabled =(u8_t)
4331*d14abf15SRobert Mustacchi             pdev->params.dcbx_config_params.admin_pfc_enable;
4332*d14abf15SRobert Mustacchi 
4333*d14abf15SRobert Mustacchi 
4334*d14abf15SRobert Mustacchi         //FOR IEEE pdev->params.dcbx_config_params.admin_tc_supported_tx_enable
4335*d14abf15SRobert Mustacchi         if(pdev->params.dcbx_config_params.admin_ets_configuration_tx_enable)
4336*d14abf15SRobert Mustacchi         {
4337*d14abf15SRobert Mustacchi             SET_FLAGS(admin_mib.ver_cfg_flags,DCBX_ETS_CONFIG_TX_ENABLED);
4338*d14abf15SRobert Mustacchi         }
4339*d14abf15SRobert Mustacchi         else
4340*d14abf15SRobert Mustacchi         {
4341*d14abf15SRobert Mustacchi             RESET_FLAGS(admin_mib.ver_cfg_flags,DCBX_ETS_CONFIG_TX_ENABLED);
4342*d14abf15SRobert Mustacchi         }
4343*d14abf15SRobert Mustacchi         //For IEEE admin_ets_recommendation_tx_enable
4344*d14abf15SRobert Mustacchi 
4345*d14abf15SRobert Mustacchi         if(pdev->params.dcbx_config_params.admin_pfc_tx_enable)
4346*d14abf15SRobert Mustacchi         {
4347*d14abf15SRobert Mustacchi             SET_FLAGS(admin_mib.ver_cfg_flags,DCBX_PFC_CONFIG_TX_ENABLED);
4348*d14abf15SRobert Mustacchi         }
4349*d14abf15SRobert Mustacchi         else
4350*d14abf15SRobert Mustacchi         {
4351*d14abf15SRobert Mustacchi             RESET_FLAGS(admin_mib.ver_cfg_flags,DCBX_PFC_CONFIG_TX_ENABLED);
4352*d14abf15SRobert Mustacchi         }
4353*d14abf15SRobert Mustacchi 
4354*d14abf15SRobert Mustacchi         if(pdev->params.dcbx_config_params.admin_application_priority_tx_enable)
4355*d14abf15SRobert Mustacchi         {
4356*d14abf15SRobert Mustacchi             SET_FLAGS(admin_mib.ver_cfg_flags,DCBX_APP_CONFIG_TX_ENABLED);
4357*d14abf15SRobert Mustacchi         }
4358*d14abf15SRobert Mustacchi         else
4359*d14abf15SRobert Mustacchi         {
4360*d14abf15SRobert Mustacchi             RESET_FLAGS(admin_mib.ver_cfg_flags,DCBX_APP_CONFIG_TX_ENABLED);
4361*d14abf15SRobert Mustacchi         }
4362*d14abf15SRobert Mustacchi 
4363*d14abf15SRobert Mustacchi 
4364*d14abf15SRobert Mustacchi         if(pdev->params.dcbx_config_params.admin_ets_willing)
4365*d14abf15SRobert Mustacchi         {
4366*d14abf15SRobert Mustacchi             SET_FLAGS(admin_mib.ver_cfg_flags,DCBX_ETS_WILLING);
4367*d14abf15SRobert Mustacchi         }
4368*d14abf15SRobert Mustacchi         else
4369*d14abf15SRobert Mustacchi         {
4370*d14abf15SRobert Mustacchi             RESET_FLAGS(admin_mib.ver_cfg_flags,DCBX_ETS_WILLING);
4371*d14abf15SRobert Mustacchi         }
4372*d14abf15SRobert Mustacchi         //For IEEE admin_ets_reco_valid
4373*d14abf15SRobert Mustacchi         if(pdev->params.dcbx_config_params.admin_pfc_willing)
4374*d14abf15SRobert Mustacchi         {
4375*d14abf15SRobert Mustacchi             SET_FLAGS(admin_mib.ver_cfg_flags,DCBX_PFC_WILLING);
4376*d14abf15SRobert Mustacchi         }
4377*d14abf15SRobert Mustacchi         else
4378*d14abf15SRobert Mustacchi         {
4379*d14abf15SRobert Mustacchi             RESET_FLAGS(admin_mib.ver_cfg_flags,DCBX_PFC_WILLING);
4380*d14abf15SRobert Mustacchi         }
4381*d14abf15SRobert Mustacchi 
4382*d14abf15SRobert Mustacchi         if(pdev->params.dcbx_config_params.admin_app_priority_willing)
4383*d14abf15SRobert Mustacchi         {
4384*d14abf15SRobert Mustacchi             SET_FLAGS(admin_mib.ver_cfg_flags,DCBX_APP_WILLING);
4385*d14abf15SRobert Mustacchi         }
4386*d14abf15SRobert Mustacchi         else
4387*d14abf15SRobert Mustacchi         {
4388*d14abf15SRobert Mustacchi             RESET_FLAGS(admin_mib.ver_cfg_flags,DCBX_APP_WILLING);
4389*d14abf15SRobert Mustacchi         }
4390*d14abf15SRobert Mustacchi 
4391*d14abf15SRobert Mustacchi         lm_dcbx_admin_mib_update_ets_param(
4392*d14abf15SRobert Mustacchi             pdev,
4393*d14abf15SRobert Mustacchi             &admin_mib.features.ets,
4394*d14abf15SRobert Mustacchi             pdev->params.dcbx_config_params.admin_configuration_bw_percentage,
4395*d14abf15SRobert Mustacchi             pdev->params.dcbx_config_params.admin_configuration_ets_pg,
4396*d14abf15SRobert Mustacchi             ARRSIZE(pdev->params.dcbx_config_params.admin_configuration_bw_percentage) ,
4397*d14abf15SRobert Mustacchi             ARRSIZE(pdev->params.dcbx_config_params.admin_configuration_ets_pg));
4398*d14abf15SRobert Mustacchi 
4399*d14abf15SRobert Mustacchi         //For IEEE admin_recommendation_bw_percentage
4400*d14abf15SRobert Mustacchi         //For IEEE admin_recommendation_ets_pg
4401*d14abf15SRobert Mustacchi         admin_mib.features.pfc.pri_en_bitmap = (u8_t)pdev->params.dcbx_config_params.admin_pfc_bitmap;
4402*d14abf15SRobert Mustacchi 
4403*d14abf15SRobert Mustacchi         for(i = 0; i<ARRSIZE(pdev->params.dcbx_config_params.admin_priority_app_table); i++)
4404*d14abf15SRobert Mustacchi         {
4405*d14abf15SRobert Mustacchi             if(pdev->params.dcbx_config_params.admin_priority_app_table[i].valid)
4406*d14abf15SRobert Mustacchi             {
4407*d14abf15SRobert Mustacchi                 lm_dcbx_admin_mib_update_app_pri(pdev,
4408*d14abf15SRobert Mustacchi                                                  &admin_mib.features.app,
4409*d14abf15SRobert Mustacchi                                                  &next_free_app_id_entry,
4410*d14abf15SRobert Mustacchi                                                  (u16_t)pdev->params.dcbx_config_params.admin_priority_app_table[i].app_id,
4411*d14abf15SRobert Mustacchi                                                  (u8_t)pdev->params.dcbx_config_params.admin_priority_app_table[i].traffic_type,
4412*d14abf15SRobert Mustacchi                                                  (u8_t)pdev->params.dcbx_config_params.admin_priority_app_table[i].priority);
4413*d14abf15SRobert Mustacchi             }
4414*d14abf15SRobert Mustacchi         }
4415*d14abf15SRobert Mustacchi 
4416*d14abf15SRobert Mustacchi         admin_mib.features.app.tc_supported = next_free_app_id_entry;
4417*d14abf15SRobert Mustacchi         admin_mib.features.app.default_pri = (u8_t)pdev->params.dcbx_config_params.admin_default_priority;
4418*d14abf15SRobert Mustacchi 
4419*d14abf15SRobert Mustacchi         // There is a configuration set by BACS.
4420*d14abf15SRobert Mustacchi         lm_dcbx_config_drv_flags(
4421*d14abf15SRobert Mustacchi                    pdev,
4422*d14abf15SRobert Mustacchi                    lm_dcbx_drv_flags_set_bit,
4423*d14abf15SRobert Mustacchi                    DRV_FLAGS_DCB_MFW_CONFIGURED);
4424*d14abf15SRobert Mustacchi 
4425*d14abf15SRobert Mustacchi     }
4426*d14abf15SRobert Mustacchi     else
4427*d14abf15SRobert Mustacchi     {
4428*d14abf15SRobert Mustacchi         if(OVERWRITE_SETTINGS_ENABLE == pdev->params.dcbx_config_params.overwrite_settings)
4429*d14abf15SRobert Mustacchi         {
4430*d14abf15SRobert Mustacchi             pdev->params.dcbx_config_params.overwrite_settings = OVERWRITE_SETTINGS_INVALID;
4431*d14abf15SRobert Mustacchi         }
4432*d14abf15SRobert Mustacchi 
4433*d14abf15SRobert Mustacchi     }
4434*d14abf15SRobert Mustacchi 
4435*d14abf15SRobert Mustacchi     //Write the data.
4436*d14abf15SRobert Mustacchi     buff = (u32_t *)&admin_mib;
4437*d14abf15SRobert Mustacchi     for(i=0 ; i < sizeof(lldp_admin_mib_t); i+=4,buff++)
4438*d14abf15SRobert Mustacchi     {
4439*d14abf15SRobert Mustacchi         REG_WR(pdev, (offset + i) , *buff);
4440*d14abf15SRobert Mustacchi     }
4441*d14abf15SRobert Mustacchi }
4442*d14abf15SRobert Mustacchi /*******************************************************************************
4443*d14abf15SRobert Mustacchi  * Description: Update LLDP that changes deafault LLDP configuration.
4444*d14abf15SRobert Mustacchi  *              Only if the entire LLDP registry set is present and differ from
4445*d14abf15SRobert Mustacchi  *              0xFFFFFFFF (invalid value) the LLDP registry parameters are taken,
4446*d14abf15SRobert Mustacchi  *              otherwise the registry keys are ignored.
4447*d14abf15SRobert Mustacchi  * Return:
4448*d14abf15SRobert Mustacchi  *              LM_STATUS_FAILURE - All/Some of the parameters could not be read.
4449*d14abf15SRobert Mustacchi  *              LM_STATUS_SUCCESS - All the MIBs where read successfully.
4450*d14abf15SRobert Mustacchi ******************************************************************************/
4451*d14abf15SRobert Mustacchi STATIC void
lm_dcbx_init_lldp_updated_params(struct _lm_device_t * pdev,u32_t mf_cfg_offset_value)4452*d14abf15SRobert Mustacchi lm_dcbx_init_lldp_updated_params(struct _lm_device_t * pdev,
4453*d14abf15SRobert Mustacchi                                  u32_t                 mf_cfg_offset_value)
4454*d14abf15SRobert Mustacchi {
4455*d14abf15SRobert Mustacchi 
4456*d14abf15SRobert Mustacchi     lldp_params_t   lldp_params = {0};
4457*d14abf15SRobert Mustacchi     u32_t           i           = 0;
4458*d14abf15SRobert Mustacchi     u32_t           *buff       = NULL ;
4459*d14abf15SRobert Mustacchi     lm_status_t     lm_status   = LM_STATUS_SUCCESS;
4460*d14abf15SRobert Mustacchi     u32_t           offest      = mf_cfg_offset_value +
4461*d14abf15SRobert Mustacchi         PORT_ID(pdev) * sizeof(lldp_params_t);
4462*d14abf15SRobert Mustacchi 
4463*d14abf15SRobert Mustacchi     lm_status = lm_dcbx_init_check_params_valid(pdev,
4464*d14abf15SRobert Mustacchi                                     (u32_t *)(&(pdev->params.lldp_config_params)),
4465*d14abf15SRobert Mustacchi                                     (sizeof(pdev->params.lldp_config_params)/sizeof(u32_t)));
4466*d14abf15SRobert Mustacchi 
4467*d14abf15SRobert Mustacchi     if((LM_STATUS_SUCCESS == lm_status)&&
4468*d14abf15SRobert Mustacchi        (OVERWRITE_SETTINGS_ENABLE == pdev->params.lldp_config_params.overwrite_settings))
4469*d14abf15SRobert Mustacchi     {
4470*d14abf15SRobert Mustacchi         //Read the data first
4471*d14abf15SRobert Mustacchi         buff = (u32_t *)&lldp_params;
4472*d14abf15SRobert Mustacchi         for(i=0 ;i<sizeof(lldp_params_t); i+=4,buff++)
4473*d14abf15SRobert Mustacchi         {
4474*d14abf15SRobert Mustacchi             *buff = REG_RD(pdev,
4475*d14abf15SRobert Mustacchi                           (offest+ i));
4476*d14abf15SRobert Mustacchi         }
4477*d14abf15SRobert Mustacchi         lldp_params.msg_tx_hold             = (u8_t)pdev->params.lldp_config_params.msg_tx_hold;
4478*d14abf15SRobert Mustacchi         lldp_params.msg_fast_tx_interval    = (u8_t)pdev->params.lldp_config_params.msg_fast_tx;
4479*d14abf15SRobert Mustacchi         lldp_params.tx_crd_max              = (u8_t)pdev->params.lldp_config_params.tx_credit_max;
4480*d14abf15SRobert Mustacchi         lldp_params.msg_tx_interval         = (u8_t)pdev->params.lldp_config_params.msg_tx_interval;
4481*d14abf15SRobert Mustacchi         lldp_params.tx_fast                 = (u8_t)pdev->params.lldp_config_params.tx_fast;
4482*d14abf15SRobert Mustacchi 
4483*d14abf15SRobert Mustacchi         //Write the data.
4484*d14abf15SRobert Mustacchi         buff = (u32_t *)&lldp_params;
4485*d14abf15SRobert Mustacchi         for(i=0 ;i<sizeof(lldp_params_t); i+=4,buff++)
4486*d14abf15SRobert Mustacchi         {
4487*d14abf15SRobert Mustacchi             REG_WR(pdev, (offest+ i) , *buff);//Change to write
4488*d14abf15SRobert Mustacchi         }
4489*d14abf15SRobert Mustacchi     }
4490*d14abf15SRobert Mustacchi     else
4491*d14abf15SRobert Mustacchi     {
4492*d14abf15SRobert Mustacchi         if(OVERWRITE_SETTINGS_ENABLE == pdev->params.lldp_config_params.overwrite_settings)
4493*d14abf15SRobert Mustacchi         {
4494*d14abf15SRobert Mustacchi             pdev->params.lldp_config_params.overwrite_settings = OVERWRITE_SETTINGS_INVALID;
4495*d14abf15SRobert Mustacchi         }
4496*d14abf15SRobert Mustacchi 
4497*d14abf15SRobert Mustacchi     }
4498*d14abf15SRobert Mustacchi 
4499*d14abf15SRobert Mustacchi }
4500*d14abf15SRobert Mustacchi /*******************************************************************************
4501*d14abf15SRobert Mustacchi  * Description:
4502*d14abf15SRobert Mustacchi  *              Allocate physical memory for DCBX start ramrod
4503*d14abf15SRobert Mustacchi  *
4504*d14abf15SRobert Mustacchi  * Return:
4505*d14abf15SRobert Mustacchi ******************************************************************************/
4506*d14abf15SRobert Mustacchi lm_status_t
lm_dcbx_get_pfc_fw_cfg_phys_mem(IN struct _lm_device_t * pdev,IN const u8_t lm_cli_idx)4507*d14abf15SRobert Mustacchi lm_dcbx_get_pfc_fw_cfg_phys_mem(
4508*d14abf15SRobert Mustacchi     IN struct _lm_device_t  *pdev,
4509*d14abf15SRobert Mustacchi     IN const u8_t           lm_cli_idx)
4510*d14abf15SRobert Mustacchi {
4511*d14abf15SRobert Mustacchi     if (CHK_NULL(pdev->dcbx_info.pfc_fw_cfg_virt))
4512*d14abf15SRobert Mustacchi     {
4513*d14abf15SRobert Mustacchi         pdev->dcbx_info.pfc_fw_cfg_virt =
4514*d14abf15SRobert Mustacchi             mm_alloc_phys_mem(pdev,
4515*d14abf15SRobert Mustacchi                               sizeof(struct flow_control_configuration),
4516*d14abf15SRobert Mustacchi                               &pdev->dcbx_info.pfc_fw_cfg_phys,
4517*d14abf15SRobert Mustacchi                               0,
4518*d14abf15SRobert Mustacchi                               lm_cli_idx);
4519*d14abf15SRobert Mustacchi 
4520*d14abf15SRobert Mustacchi         if CHK_NULL(pdev->dcbx_info.pfc_fw_cfg_virt)
4521*d14abf15SRobert Mustacchi         {
4522*d14abf15SRobert Mustacchi             return LM_STATUS_RESOURCE;
4523*d14abf15SRobert Mustacchi         }
4524*d14abf15SRobert Mustacchi     }
4525*d14abf15SRobert Mustacchi 
4526*d14abf15SRobert Mustacchi     return LM_STATUS_SUCCESS;
4527*d14abf15SRobert Mustacchi }
4528*d14abf15SRobert Mustacchi /**
4529*d14abf15SRobert Mustacchi  * @description
4530*d14abf15SRobert Mustacchi  *  Called to clean dcbx info after D3
4531*d14abf15SRobert Mustacchi  * @param pdev
4532*d14abf15SRobert Mustacchi  *
4533*d14abf15SRobert Mustacchi  * @return lm_status_t
4534*d14abf15SRobert Mustacchi  */
4535*d14abf15SRobert Mustacchi lm_status_t
lm_dcbx_init_info(IN lm_device_t * pdev)4536*d14abf15SRobert Mustacchi lm_dcbx_init_info(
4537*d14abf15SRobert Mustacchi     IN lm_device_t *pdev
4538*d14abf15SRobert Mustacchi     )
4539*d14abf15SRobert Mustacchi {
4540*d14abf15SRobert Mustacchi     pdev->dcbx_info.is_enabled   = FALSE;
4541*d14abf15SRobert Mustacchi 
4542*d14abf15SRobert Mustacchi     return LM_STATUS_SUCCESS;
4543*d14abf15SRobert Mustacchi }
4544*d14abf15SRobert Mustacchi /*******************************************************************************
4545*d14abf15SRobert Mustacchi  * Description:
4546*d14abf15SRobert Mustacchi  *
4547*d14abf15SRobert Mustacchi  *
4548*d14abf15SRobert Mustacchi  * Return:
4549*d14abf15SRobert Mustacchi ******************************************************************************/
4550*d14abf15SRobert Mustacchi lm_status_t
lm_dcbx_free_resc(IN struct _lm_device_t * pdev)4551*d14abf15SRobert Mustacchi lm_dcbx_free_resc(
4552*d14abf15SRobert Mustacchi     IN struct _lm_device_t *pdev
4553*d14abf15SRobert Mustacchi     )
4554*d14abf15SRobert Mustacchi {
4555*d14abf15SRobert Mustacchi     pdev->dcbx_info.pfc_fw_cfg_virt = NULL;
4556*d14abf15SRobert Mustacchi     pdev->dcbx_info.is_enabled      = FALSE;
4557*d14abf15SRobert Mustacchi     return LM_STATUS_SUCCESS;
4558*d14abf15SRobert Mustacchi }
4559*d14abf15SRobert Mustacchi /**
4560*d14abf15SRobert Mustacchi  * lm_dcbx_ie_init_event_params
4561*d14abf15SRobert Mustacchi  * @param pdev
4562*d14abf15SRobert Mustacchi  * @param params
4563*d14abf15SRobert Mustacchi  * @param classif_table_size
4564*d14abf15SRobert Mustacchi  */
4565*d14abf15SRobert Mustacchi void
lm_dcbx_ie_init_event_params(IN struct _lm_device_t * pdev,IN dcb_indicate_event_params_t * params,IN const u32_t classif_table_size)4566*d14abf15SRobert Mustacchi lm_dcbx_ie_init_event_params(
4567*d14abf15SRobert Mustacchi     IN struct _lm_device_t          *pdev,
4568*d14abf15SRobert Mustacchi     IN dcb_indicate_event_params_t  *params,
4569*d14abf15SRobert Mustacchi     IN const u32_t                  classif_table_size)
4570*d14abf15SRobert Mustacchi {
4571*d14abf15SRobert Mustacchi     params->flags = 0;
4572*d14abf15SRobert Mustacchi 
4573*d14abf15SRobert Mustacchi     mm_mem_zero(&params->ets_params, sizeof(params->ets_params));
4574*d14abf15SRobert Mustacchi 
4575*d14abf15SRobert Mustacchi     mm_mem_zero(&params->pfc_params, sizeof(params->pfc_params));
4576*d14abf15SRobert Mustacchi 
4577*d14abf15SRobert Mustacchi     params->classif_params.classif_version = DCB_CLASSIFI_VER_SIMPLE_ELEM;
4578*d14abf15SRobert Mustacchi     params->classif_params.num_classif_elements = 0;
4579*d14abf15SRobert Mustacchi 
4580*d14abf15SRobert Mustacchi     if((NULL != params->classif_params.classif_table) &&
4581*d14abf15SRobert Mustacchi        classif_table_size)
4582*d14abf15SRobert Mustacchi     {
4583*d14abf15SRobert Mustacchi         mm_mem_zero( params->classif_params.classif_table,
4584*d14abf15SRobert Mustacchi                      classif_table_size);
4585*d14abf15SRobert Mustacchi     }
4586*d14abf15SRobert Mustacchi }
4587*d14abf15SRobert Mustacchi /**
4588*d14abf15SRobert Mustacchi  * lm_dcbx_ie_init_params
4589*d14abf15SRobert Mustacchi  *
4590*d14abf15SRobert Mustacchi  * @param pdev
4591*d14abf15SRobert Mustacchi  * @param b_only_setup
4592*d14abf15SRobert Mustacchi  */
4593*d14abf15SRobert Mustacchi void
lm_dcbx_ie_init_params(IN struct _lm_device_t * pdev,IN const u8_t b_only_setup)4594*d14abf15SRobert Mustacchi lm_dcbx_ie_init_params(
4595*d14abf15SRobert Mustacchi     IN struct _lm_device_t  *pdev,
4596*d14abf15SRobert Mustacchi     IN const u8_t           b_only_setup)
4597*d14abf15SRobert Mustacchi {
4598*d14abf15SRobert Mustacchi     lm_dcbx_indicate_event_t *indicate_event = &pdev->dcbx_info.indicate_event;
4599*d14abf15SRobert Mustacchi 
4600*d14abf15SRobert Mustacchi     if (TRUE == b_only_setup)
4601*d14abf15SRobert Mustacchi     {
4602*d14abf15SRobert Mustacchi         lm_dcbx_ie_init_event_params(pdev,
4603*d14abf15SRobert Mustacchi                                      &indicate_event->local_params,
4604*d14abf15SRobert Mustacchi                                      LM_DCBX_IE_CLASSIF_TABLE_ALOC_SIZE_LOCAL);
4605*d14abf15SRobert Mustacchi 
4606*d14abf15SRobert Mustacchi         lm_dcbx_ie_init_event_params(pdev,
4607*d14abf15SRobert Mustacchi                                      &indicate_event->remote_params,
4608*d14abf15SRobert Mustacchi                                      LM_DCBX_IE_CLASSIF_TABLE_ALOC_SIZE_REMOTE);
4609*d14abf15SRobert Mustacchi 
4610*d14abf15SRobert Mustacchi         lm_dcbx_ie_init_event_params(pdev,
4611*d14abf15SRobert Mustacchi                                      &indicate_event->dcb_params_given_dbg,
4612*d14abf15SRobert Mustacchi                                      LM_DCBX_IE_CLASSIF_TABLE_ALOC_SIZE_DBG);
4613*d14abf15SRobert Mustacchi     }
4614*d14abf15SRobert Mustacchi     else
4615*d14abf15SRobert Mustacchi     {
4616*d14abf15SRobert Mustacchi         mm_mem_zero(indicate_event, sizeof(lm_dcbx_indicate_event_t));
4617*d14abf15SRobert Mustacchi         indicate_event->lm_cli_idx = LM_CLI_IDX_MAX;
4618*d14abf15SRobert Mustacchi     }
4619*d14abf15SRobert Mustacchi 
4620*d14abf15SRobert Mustacchi     indicate_event->ets_config_state = lm_dcbx_ets_config_state_cee;
4621*d14abf15SRobert Mustacchi 
4622*d14abf15SRobert Mustacchi     indicate_event->is_ets_ieee_params_os_valid = FALSE;
4623*d14abf15SRobert Mustacchi     mm_mem_zero(&indicate_event->ets_ieee_params_os ,
4624*d14abf15SRobert Mustacchi                 sizeof(indicate_event->ets_ieee_params_os));
4625*d14abf15SRobert Mustacchi 
4626*d14abf15SRobert Mustacchi     indicate_event->ets_ieee_config_state = lm_dcbx_ets_ieee_config_not_valid;
4627*d14abf15SRobert Mustacchi     mm_mem_zero(&indicate_event->ets_ieee_params_config ,
4628*d14abf15SRobert Mustacchi                 sizeof(indicate_event->ets_ieee_params_config));
4629*d14abf15SRobert Mustacchi 
4630*d14abf15SRobert Mustacchi     indicate_event->iscsi_tcp_pri = LM_DCBX_ILLEGAL_PRI;
4631*d14abf15SRobert Mustacchi 
4632*d14abf15SRobert Mustacchi     indicate_event->dcb_current_oper_state_bitmap   = 0;
4633*d14abf15SRobert Mustacchi 
4634*d14abf15SRobert Mustacchi }
4635*d14abf15SRobert Mustacchi /*******************************************************************************
4636*d14abf15SRobert Mustacchi  * Description:
4637*d14abf15SRobert Mustacchi  *              Allocate physical memory for DCBX start ramrod
4638*d14abf15SRobert Mustacchi  *
4639*d14abf15SRobert Mustacchi  * Return:
4640*d14abf15SRobert Mustacchi ******************************************************************************/
4641*d14abf15SRobert Mustacchi lm_status_t
lm_dcbx_init_params(IN struct _lm_device_t * pdev,IN const u8_t b_only_setup)4642*d14abf15SRobert Mustacchi lm_dcbx_init_params(
4643*d14abf15SRobert Mustacchi     IN struct   _lm_device_t  *pdev,
4644*d14abf15SRobert Mustacchi     IN const    u8_t           b_only_setup)
4645*d14abf15SRobert Mustacchi {
4646*d14abf15SRobert Mustacchi     lm_status_t lm_status                       = LM_STATUS_SUCCESS;
4647*d14abf15SRobert Mustacchi     u8_t        lm_cli_idx      = LM_CLI_IDX_MAX;
4648*d14abf15SRobert Mustacchi     u32_t       dummy_offset    = 0;
4649*d14abf15SRobert Mustacchi 
4650*d14abf15SRobert Mustacchi     // All priorities are mapped by default to zero
4651*d14abf15SRobert Mustacchi     mm_mem_zero(pdev->dcbx_info.pri_to_cos, sizeof(pdev->dcbx_info.pri_to_cos));
4652*d14abf15SRobert Mustacchi 
4653*d14abf15SRobert Mustacchi     mm_mem_zero(&(pdev->params.dcbx_port_params), sizeof(pdev->params.dcbx_port_params));
4654*d14abf15SRobert Mustacchi 
4655*d14abf15SRobert Mustacchi     pdev->dcbx_info.dcbx_update_lpme_task_state = DCBX_UPDATE_TASK_STATE_FREE;
4656*d14abf15SRobert Mustacchi     pdev->dcbx_info.is_dcbx_neg_received        = FALSE;
4657*d14abf15SRobert Mustacchi 
4658*d14abf15SRobert Mustacchi     lm_dcbx_ie_init_params(pdev, b_only_setup);
4659*d14abf15SRobert Mustacchi 
4660*d14abf15SRobert Mustacchi     // Should not be used in MF this is only a pach until MCP will know how to return to default
4661*d14abf15SRobert Mustacchi     lm_status = lm_dcbx_read_admin_mib( pdev,
4662*d14abf15SRobert Mustacchi                                         &pdev->dcbx_info.admin_mib_org,
4663*d14abf15SRobert Mustacchi                                         &dummy_offset);
4664*d14abf15SRobert Mustacchi 
4665*d14abf15SRobert Mustacchi     if(LM_STATUS_SUCCESS != lm_status)
4666*d14abf15SRobert Mustacchi     {
4667*d14abf15SRobert Mustacchi         DbgBreakMsg(" lm_dcbx_admin_mib_updated_init lm_dcbx_read_admin_mib failed ");
4668*d14abf15SRobert Mustacchi         return lm_status;
4669*d14abf15SRobert Mustacchi     }
4670*d14abf15SRobert Mustacchi 
4671*d14abf15SRobert Mustacchi     if(FALSE == b_only_setup)
4672*d14abf15SRobert Mustacchi     {
4673*d14abf15SRobert Mustacchi         lm_status = lm_dcbx_get_pfc_fw_cfg_phys_mem(pdev, lm_cli_idx);
4674*d14abf15SRobert Mustacchi         if(LM_STATUS_SUCCESS != lm_status )
4675*d14abf15SRobert Mustacchi         {
4676*d14abf15SRobert Mustacchi             DbgBreakMsg("lm_dcbx_init_params : resource ");
4677*d14abf15SRobert Mustacchi             pdev->dcbx_info.dcbx_error |= DCBX_ERROR_RESOURCE;
4678*d14abf15SRobert Mustacchi             return lm_status;
4679*d14abf15SRobert Mustacchi         }
4680*d14abf15SRobert Mustacchi     }
4681*d14abf15SRobert Mustacchi 
4682*d14abf15SRobert Mustacchi 
4683*d14abf15SRobert Mustacchi     return lm_status;
4684*d14abf15SRobert Mustacchi }
4685*d14abf15SRobert Mustacchi 
4686*d14abf15SRobert Mustacchi /**
4687*d14abf15SRobert Mustacchi  * @description
4688*d14abf15SRobert Mustacchi  * Set in a shared port memory place if DCBX completion was
4689*d14abf15SRobert Mustacchi  * received. Function is needed for PMF migration in order to
4690*d14abf15SRobert Mustacchi  * synchronize the new PMF that DCBX results has ended.
4691*d14abf15SRobert Mustacchi  * @param pdev
4692*d14abf15SRobert Mustacchi  * @param is_completion_recv
4693*d14abf15SRobert Mustacchi  */
4694*d14abf15SRobert Mustacchi void
lm_dcbx_config_drv_flags(IN lm_device_t * pdev,IN const lm_dcbx_drv_flags_cmd_t drv_flags_cmd,IN const u32_t bit_drv_flags)4695*d14abf15SRobert Mustacchi lm_dcbx_config_drv_flags(
4696*d14abf15SRobert Mustacchi     IN          lm_device_t *pdev,
4697*d14abf15SRobert Mustacchi     IN const    lm_dcbx_drv_flags_cmd_t drv_flags_cmd,
4698*d14abf15SRobert Mustacchi     IN const    u32_t                   bit_drv_flags)
4699*d14abf15SRobert Mustacchi {
4700*d14abf15SRobert Mustacchi     const   u32_t drv_flags_offset = OFFSETOF(shmem2_region_t,drv_flags);
4701*d14abf15SRobert Mustacchi     u32_t   drv_flags = 0;
4702*d14abf15SRobert Mustacchi     lm_status_t     lm_status           = LM_STATUS_SUCCESS;
4703*d14abf15SRobert Mustacchi     const u8_t      port                = PORT_ID(pdev);
4704*d14abf15SRobert Mustacchi     u32_t           port_drv_flags      = DRV_FLAGS_FILED_BY_PORT(bit_drv_flags, port);
4705*d14abf15SRobert Mustacchi 
4706*d14abf15SRobert Mustacchi     if(!IS_PMF(pdev))
4707*d14abf15SRobert Mustacchi     {
4708*d14abf15SRobert Mustacchi         DbgBreakMsg("lm_dcbx_check_drv_flags error only PMF can access this field ");
4709*d14abf15SRobert Mustacchi         return;
4710*d14abf15SRobert Mustacchi     }
4711*d14abf15SRobert Mustacchi 
4712*d14abf15SRobert Mustacchi     lm_status = lm_hw_lock(pdev, HW_LOCK_RESOURCE_DRV_FLAGS, TRUE);
4713*d14abf15SRobert Mustacchi 
4714*d14abf15SRobert Mustacchi     if(LM_STATUS_SUCCESS != lm_status)
4715*d14abf15SRobert Mustacchi     {
4716*d14abf15SRobert Mustacchi         DbgBreakMsg("lm_dcbx_set_comp_recv_on_port_bit lm_hw_lock failed ");
4717*d14abf15SRobert Mustacchi         return;
4718*d14abf15SRobert Mustacchi     }
4719*d14abf15SRobert Mustacchi 
4720*d14abf15SRobert Mustacchi     lm_dcbx_read_shmem2_mcp_fields(pdev,
4721*d14abf15SRobert Mustacchi                                    drv_flags_offset,
4722*d14abf15SRobert Mustacchi                                    &drv_flags);
4723*d14abf15SRobert Mustacchi 
4724*d14abf15SRobert Mustacchi    switch(drv_flags_cmd)
4725*d14abf15SRobert Mustacchi     {
4726*d14abf15SRobert Mustacchi    case lm_dcbx_drv_flags_set_bit:
4727*d14abf15SRobert Mustacchi         SET_FLAGS(drv_flags,port_drv_flags);
4728*d14abf15SRobert Mustacchi         break;
4729*d14abf15SRobert Mustacchi     case lm_dcbx_drv_flags_reset_bit:
4730*d14abf15SRobert Mustacchi         RESET_FLAGS(drv_flags,port_drv_flags);
4731*d14abf15SRobert Mustacchi         break;
4732*d14abf15SRobert Mustacchi     case lm_dcbx_drv_flags_reset_flags:
4733*d14abf15SRobert Mustacchi         port_drv_flags = DRV_FLAGS_GET_PORT_MASK(port);
4734*d14abf15SRobert Mustacchi 
4735*d14abf15SRobert Mustacchi         RESET_FLAGS(drv_flags,port_drv_flags);
4736*d14abf15SRobert Mustacchi         break;
4737*d14abf15SRobert Mustacchi     default:
4738*d14abf15SRobert Mustacchi         DbgBreakMsg("lm_dcbx_set_comp_recv_on_port_bit : illegal drv_flags_cmd  ");
4739*d14abf15SRobert Mustacchi         return;
4740*d14abf15SRobert Mustacchi     };
4741*d14abf15SRobert Mustacchi 
4742*d14abf15SRobert Mustacchi     lm_dcbx_write_shmem2_mcp_fields(pdev,
4743*d14abf15SRobert Mustacchi                                    drv_flags_offset,
4744*d14abf15SRobert Mustacchi                                    drv_flags);
4745*d14abf15SRobert Mustacchi 
4746*d14abf15SRobert Mustacchi     lm_hw_unlock(pdev, HW_LOCK_RESOURCE_DRV_FLAGS);
4747*d14abf15SRobert Mustacchi }
4748*d14abf15SRobert Mustacchi /**
4749*d14abf15SRobert Mustacchi  * @description
4750*d14abf15SRobert Mustacchi  * Function is needed for PMF migration in order to synchronize
4751*d14abf15SRobert Mustacchi  * the new PMF that DCBX results has ended.
4752*d14abf15SRobert Mustacchi  * @param pdev
4753*d14abf15SRobert Mustacchi  *
4754*d14abf15SRobert Mustacchi  * @return u8_t
4755*d14abf15SRobert Mustacchi  * This function returns TRUE if DCBX completion received on
4756*d14abf15SRobert Mustacchi  * this port
4757*d14abf15SRobert Mustacchi  */
4758*d14abf15SRobert Mustacchi u8_t
lm_dcbx_check_drv_flags(IN lm_device_t * pdev,IN const u32_t flags_bits_to_check)4759*d14abf15SRobert Mustacchi lm_dcbx_check_drv_flags(
4760*d14abf15SRobert Mustacchi     IN          lm_device_t *pdev,
4761*d14abf15SRobert Mustacchi     IN const       u32_t       flags_bits_to_check)
4762*d14abf15SRobert Mustacchi {
4763*d14abf15SRobert Mustacchi     const   u32_t drv_flags_offset = OFFSETOF(shmem2_region_t,drv_flags);
4764*d14abf15SRobert Mustacchi     u32_t   drv_flags = 0;
4765*d14abf15SRobert Mustacchi     u8_t        is_flag_set         = FALSE;
4766*d14abf15SRobert Mustacchi     const u8_t  port                = PORT_ID(pdev);
4767*d14abf15SRobert Mustacchi     const u32_t port_flags_to_check = DRV_FLAGS_FILED_BY_PORT(flags_bits_to_check, port);
4768*d14abf15SRobert Mustacchi 
4769*d14abf15SRobert Mustacchi     if(!IS_PMF(pdev))
4770*d14abf15SRobert Mustacchi     {
4771*d14abf15SRobert Mustacchi         DbgBreakMsg("lm_dcbx_check_drv_flags error only PMF can access this field ");
4772*d14abf15SRobert Mustacchi         return FALSE;
4773*d14abf15SRobert Mustacchi     }
4774*d14abf15SRobert Mustacchi 
4775*d14abf15SRobert Mustacchi     lm_dcbx_read_shmem2_mcp_fields(pdev,
4776*d14abf15SRobert Mustacchi                                    drv_flags_offset,
4777*d14abf15SRobert Mustacchi                                    &drv_flags);
4778*d14abf15SRobert Mustacchi 
4779*d14abf15SRobert Mustacchi     if(GET_FLAGS(drv_flags, port_flags_to_check))
4780*d14abf15SRobert Mustacchi     {
4781*d14abf15SRobert Mustacchi         is_flag_set = TRUE;
4782*d14abf15SRobert Mustacchi     }
4783*d14abf15SRobert Mustacchi 
4784*d14abf15SRobert Mustacchi     return is_flag_set;
4785*d14abf15SRobert Mustacchi }
4786*d14abf15SRobert Mustacchi /**
4787*d14abf15SRobert Mustacchi  * @description
4788*d14abf15SRobert Mustacchi  * 1. Make sure all the DCBX init parameters for this function
4789*d14abf15SRobert Mustacchi  * are correct.
4790*d14abf15SRobert Mustacchi  * 2. Register a set DCBX params in order to let the new PMF
4791*d14abf15SRobert Mustacchi  * migration function to know the current DCBX settings and that
4792*d14abf15SRobert Mustacchi  * the pdev varibales will mach the HW configuration.
4793*d14abf15SRobert Mustacchi  * for example in MF when DCBX is configured to static
4794*d14abf15SRobert Mustacchi  * configuration ELINK_FEATURE_CONFIG_PFC_ENABLED is set in pdev
4795*d14abf15SRobert Mustacchi  * (we get only one interrupt)of only the original
4796*d14abf15SRobert Mustacchi  * function.After PMF migration the first link updated will
4797*d14abf15SRobert Mustacchi  * cause the PFC state to be incompatible.The function that
4798*d14abf15SRobert Mustacchi  * become PMF doesn't have ELINK_FEATURE_CONFIG_PFC_ENABLED set
4799*d14abf15SRobert Mustacchi  * @param pdev
4800*d14abf15SRobert Mustacchi  */
4801*d14abf15SRobert Mustacchi void
lm_dcbx_pmf_migration(IN struct _lm_device_t * pdev)4802*d14abf15SRobert Mustacchi lm_dcbx_pmf_migration(
4803*d14abf15SRobert Mustacchi     IN struct _lm_device_t *pdev)
4804*d14abf15SRobert Mustacchi {
4805*d14abf15SRobert Mustacchi     lm_status_t lm_status = LM_STATUS_SUCCESS;
4806*d14abf15SRobert Mustacchi     const u8_t is_completion_received_on_port =
4807*d14abf15SRobert Mustacchi         lm_dcbx_check_drv_flags(pdev, DRV_FLAGS_DCB_CONFIGURED);
4808*d14abf15SRobert Mustacchi 
4809*d14abf15SRobert Mustacchi     DbgBreakIf(TRUE != IS_DCB_ENABLED(pdev));
4810*d14abf15SRobert Mustacchi 
4811*d14abf15SRobert Mustacchi     // We called lm_dcbx_init_params at the beginning
4812*d14abf15SRobert Mustacchi     // verify all the parameters are correct and that there is no error.
4813*d14abf15SRobert Mustacchi     DbgBreakIf(FALSE != pdev->dcbx_info.is_dcbx_neg_received);
4814*d14abf15SRobert Mustacchi     DbgBreakIf(DCBX_UPDATE_TASK_STATE_FREE != pdev->dcbx_info.dcbx_update_lpme_task_state);
4815*d14abf15SRobert Mustacchi     DbgBreakIf(CHK_NULL(pdev->dcbx_info.pfc_fw_cfg_virt));
4816*d14abf15SRobert Mustacchi 
4817*d14abf15SRobert Mustacchi     // for this function the only error possibole is that the pfc_fw_cfg_virt wasn't allocated.
4818*d14abf15SRobert Mustacchi     if((DCBX_ERROR_NO_ERROR != pdev->dcbx_info.dcbx_error) ||
4819*d14abf15SRobert Mustacchi         (FALSE == IS_MULTI_VNIC(pdev)))
4820*d14abf15SRobert Mustacchi     {
4821*d14abf15SRobert Mustacchi         DbgBreakMsg("lm_dcbx_init : lm_mcp_cmd_send_recieve failed ");
4822*d14abf15SRobert Mustacchi         return;
4823*d14abf15SRobert Mustacchi     }
4824*d14abf15SRobert Mustacchi 
4825*d14abf15SRobert Mustacchi     // If we received the DCBX parameters before on this port the new PMF
4826*d14abf15SRobert Mustacchi     // will read the current DCBX parameters
4827*d14abf15SRobert Mustacchi     if(FALSE == is_completion_received_on_port)
4828*d14abf15SRobert Mustacchi     {
4829*d14abf15SRobert Mustacchi         // DCBX parameters were not received before
4830*d14abf15SRobert Mustacchi         return;
4831*d14abf15SRobert Mustacchi     }
4832*d14abf15SRobert Mustacchi     // Register a set params in order to let the new PMF migration
4833*d14abf15SRobert Mustacchi     // function to know the current DCBX settings.
4834*d14abf15SRobert Mustacchi     // A side effect of this function be to set the DCBX parameters again,
4835*d14abf15SRobert Mustacchi     // but this is a must because in case of an error(or if we have an
4836*d14abf15SRobert Mustacchi     // innterrupt from MCP that eas not handled) the seetings that are
4837*d14abf15SRobert Mustacchi     // currently on the chip may not be equale to the local settings.
4838*d14abf15SRobert Mustacchi     lm_status = MM_REGISTER_LPME(pdev,
4839*d14abf15SRobert Mustacchi                                  lm_dcbx_init_lpme_set_params,
4840*d14abf15SRobert Mustacchi                                  TRUE,
4841*d14abf15SRobert Mustacchi                                  FALSE);// DCBX sends ramrods
4842*d14abf15SRobert Mustacchi 
4843*d14abf15SRobert Mustacchi     if (LM_STATUS_SUCCESS != lm_status)
4844*d14abf15SRobert Mustacchi     {
4845*d14abf15SRobert Mustacchi         pdev->dcbx_info.dcbx_error |= DCBX_ERROR_REGISTER_LPME;
4846*d14abf15SRobert Mustacchi         // No rollback
4847*d14abf15SRobert Mustacchi         // Problem because if DCBX interrupt isn't receive the chip will be
4848*d14abf15SRobert Mustacchi         // stuck beacuse QM queues are stopped.
4849*d14abf15SRobert Mustacchi         // For release version this will call DCBX start that will restart QM queues.
4850*d14abf15SRobert Mustacchi         DbgBreakMsg("lm_dcbx_int : The chip QM queues are stuck until an interrupt from MCP");
4851*d14abf15SRobert Mustacchi     }
4852*d14abf15SRobert Mustacchi }
4853*d14abf15SRobert Mustacchi /**
4854*d14abf15SRobert Mustacchi  * First check if DCBX is enabled on port.Old MCP that doesn't
4855*d14abf15SRobert Mustacchi  * support the field dcbx_en should not be used in 4 port
4856*d14abf15SRobert Mustacchi  * because if one port supports DCBX but the other does't,
4857*d14abf15SRobert Mustacchi  * driver can't tell the difference according to
4858*d14abf15SRobert Mustacchi  * dcbx_lldp_params_offset.(dcbx_lldp_params_offset is valid if
4859*d14abf15SRobert Mustacchi  * one port is enabled)
4860*d14abf15SRobert Mustacchi  *
4861*d14abf15SRobert Mustacchi  * After check that dcbx_lldp_params_offset is valid for
4862*d14abf15SRobert Mustacchi  * backward compatibility(until 4 port).
4863*d14abf15SRobert Mustacchi  * If dcbx_en isn't zero dcbx_lldp_params_offset must be vaild.
4864*d14abf15SRobert Mustacchi  * @param pdev
4865*d14abf15SRobert Mustacchi  *
4866*d14abf15SRobert Mustacchi  * @return u8_t
4867*d14abf15SRobert Mustacchi  */
4868*d14abf15SRobert Mustacchi u8_t
lm_dcbx_port_enable_mcp(IN lm_device_t * pdev)4869*d14abf15SRobert Mustacchi lm_dcbx_port_enable_mcp(IN lm_device_t *pdev)
4870*d14abf15SRobert Mustacchi {
4871*d14abf15SRobert Mustacchi     u32_t       lldp_params_offset      = SHMEM_LLDP_DCBX_PARAMS_NONE;
4872*d14abf15SRobert Mustacchi     const u32_t mcp_lldp_params_offset  = OFFSETOF(shmem2_region_t,dcbx_lldp_params_offset);
4873*d14abf15SRobert Mustacchi     const u8_t  port                    = PORT_ID(pdev);
4874*d14abf15SRobert Mustacchi     const u32_t dcbx_en_offset          = OFFSETOF(shmem2_region_t,dcbx_en[port]);
4875*d14abf15SRobert Mustacchi     u32_t       read_dcbx_en            = 0;
4876*d14abf15SRobert Mustacchi 
4877*d14abf15SRobert Mustacchi     if(LM_SHMEM2_HAS(pdev, dcbx_en[port]))
4878*d14abf15SRobert Mustacchi     {
4879*d14abf15SRobert Mustacchi         LM_SHMEM2_READ(pdev, dcbx_en_offset, &read_dcbx_en);
4880*d14abf15SRobert Mustacchi 
4881*d14abf15SRobert Mustacchi         if(0 == read_dcbx_en)
4882*d14abf15SRobert Mustacchi         {
4883*d14abf15SRobert Mustacchi             return FALSE;
4884*d14abf15SRobert Mustacchi         }
4885*d14abf15SRobert Mustacchi     }
4886*d14abf15SRobert Mustacchi     else
4887*d14abf15SRobert Mustacchi     {
4888*d14abf15SRobert Mustacchi         DbgMessage(pdev, FATAL, "lm_dcbx_port_enable_mcp: Old MCP a new driver requires"
4889*d14abf15SRobert Mustacchi                               "a new MFW for knowing if DCBX is enabled in 4 port mode.\n");
4890*d14abf15SRobert Mustacchi     }
4891*d14abf15SRobert Mustacchi 
4892*d14abf15SRobert Mustacchi     lm_dcbx_read_shmem2_mcp_fields( pdev,
4893*d14abf15SRobert Mustacchi                                     mcp_lldp_params_offset,
4894*d14abf15SRobert Mustacchi                                     &lldp_params_offset);
4895*d14abf15SRobert Mustacchi 
4896*d14abf15SRobert Mustacchi     DbgBreakIf((0 != read_dcbx_en) &&
4897*d14abf15SRobert Mustacchi                (SHMEM_LLDP_DCBX_PARAMS_NONE == lldp_params_offset));
4898*d14abf15SRobert Mustacchi 
4899*d14abf15SRobert Mustacchi     return (SHMEM_LLDP_DCBX_PARAMS_NONE != lldp_params_offset);
4900*d14abf15SRobert Mustacchi }
4901*d14abf15SRobert Mustacchi /*******************************************************************************
4902*d14abf15SRobert Mustacchi  * Description:
4903*d14abf15SRobert Mustacchi  *              The PMF function starts the DCBX negotiation after sending the
4904*d14abf15SRobert Mustacchi  *              MIB DRV_MSG_LLDP_PMF_MSG with new LLDP/DCBX configurations if available.
4905*d14abf15SRobert Mustacchi  *              The PMF will call the function dcbx_stop_Hw_TX () that will ensure
4906*d14abf15SRobert Mustacchi  *              that no traffic can be sent. (The driver will send a ramrod to the
4907*d14abf15SRobert Mustacchi  *              FW that will stop all the queues in the QM)
4908*d14abf15SRobert Mustacchi  *              After 1 second (a timer elapsed) if DCBX negotiation didn't end
4909*d14abf15SRobert Mustacchi  *              (pdev.vars.dcbx_neg_received =0) and link is up a WI lm_dcbx_resume_TX()
4910*d14abf15SRobert Mustacchi  *              is scheduled .
4911*d14abf15SRobert Mustacchi  *              In WI read the configuration from local MIB and set DCBX parameters
4912*d14abf15SRobert Mustacchi  *              to the value in local_MIB.
4913*d14abf15SRobert Mustacchi  *
4914*d14abf15SRobert Mustacchi  * Return:
4915*d14abf15SRobert Mustacchi ******************************************************************************/
4916*d14abf15SRobert Mustacchi void
lm_dcbx_init(IN struct _lm_device_t * pdev,IN const u8_t b_only_setup)4917*d14abf15SRobert Mustacchi lm_dcbx_init(IN struct _lm_device_t *pdev,
4918*d14abf15SRobert Mustacchi              IN const u8_t          b_only_setup)
4919*d14abf15SRobert Mustacchi {
4920*d14abf15SRobert Mustacchi     u32_t       fw_resp                     = 0 ;
4921*d14abf15SRobert Mustacchi     lm_status_t lm_status                   = LM_STATUS_FAILURE ;
4922*d14abf15SRobert Mustacchi     u32_t       dcbx_lldp_params_offset     = SHMEM_LLDP_DCBX_PARAMS_NONE;
4923*d14abf15SRobert Mustacchi     const u32_t mcp_dcbx_lldp_params_offset = OFFSETOF(shmem2_region_t,dcbx_lldp_params_offset);
4924*d14abf15SRobert Mustacchi     u8_t is_mfw_config = FALSE;
4925*d14abf15SRobert Mustacchi 
4926*d14abf15SRobert Mustacchi     DbgBreakIf(FALSE != IS_DCB_ENABLED(pdev));
4927*d14abf15SRobert Mustacchi 
4928*d14abf15SRobert Mustacchi     if(IS_DCB_SUPPORTED(pdev))
4929*d14abf15SRobert Mustacchi     {// DCBX is supported on E1H. E2 only in 2 port mode.
4930*d14abf15SRobert Mustacchi         if (lm_dcbx_port_enable_mcp(pdev))
4931*d14abf15SRobert Mustacchi         {// DCBX supported in MCP
4932*d14abf15SRobert Mustacchi 
4933*d14abf15SRobert Mustacchi             lm_status = lm_dcbx_init_params(pdev, b_only_setup);
4934*d14abf15SRobert Mustacchi             if(LM_STATUS_SUCCESS != lm_status)
4935*d14abf15SRobert Mustacchi             {// If dcbx pfc_fw_cfg could not be allocated DCBX isn't supported
4936*d14abf15SRobert Mustacchi                 return;
4937*d14abf15SRobert Mustacchi             }
4938*d14abf15SRobert Mustacchi 
4939*d14abf15SRobert Mustacchi             if(IS_PMF_ORIGINAL(pdev))
4940*d14abf15SRobert Mustacchi             {//Only the PMF starts and handles
4941*d14abf15SRobert Mustacchi                 pdev->dcbx_info.is_enabled = TRUE;
4942*d14abf15SRobert Mustacchi 
4943*d14abf15SRobert Mustacchi                 lm_dcbx_read_shmem2_mcp_fields( pdev,
4944*d14abf15SRobert Mustacchi                                                 mcp_dcbx_lldp_params_offset,
4945*d14abf15SRobert Mustacchi                                                 &dcbx_lldp_params_offset);
4946*d14abf15SRobert Mustacchi 
4947*d14abf15SRobert Mustacchi                 DbgBreakIf(SHMEM_LLDP_DCBX_PARAMS_NONE == dcbx_lldp_params_offset);
4948*d14abf15SRobert Mustacchi 
4949*d14abf15SRobert Mustacchi                 lm_dcbx_init_lldp_updated_params( pdev,
4950*d14abf15SRobert Mustacchi                                                      dcbx_lldp_params_offset);
4951*d14abf15SRobert Mustacchi 
4952*d14abf15SRobert Mustacchi                 lm_dcbx_admin_mib_updated_init( pdev,
4953*d14abf15SRobert Mustacchi                                                      dcbx_lldp_params_offset);
4954*d14abf15SRobert Mustacchi 
4955*d14abf15SRobert Mustacchi                 lm_status = lm_mcp_cmd_send_recieve( pdev,
4956*d14abf15SRobert Mustacchi                                                      lm_mcp_mb_header,
4957*d14abf15SRobert Mustacchi                                                      DRV_MSG_CODE_DCBX_ADMIN_PMF_MSG,
4958*d14abf15SRobert Mustacchi                                                      0,
4959*d14abf15SRobert Mustacchi                                                      MCP_CMD_DEFAULT_TIMEOUT,
4960*d14abf15SRobert Mustacchi                                                      &fw_resp ) ;
4961*d14abf15SRobert Mustacchi 
4962*d14abf15SRobert Mustacchi                 if( lm_status != LM_STATUS_SUCCESS )
4963*d14abf15SRobert Mustacchi                 {
4964*d14abf15SRobert Mustacchi                     pdev->dcbx_info.dcbx_error |= DCBX_ERROR_MCP_CMD_FAILED;
4965*d14abf15SRobert Mustacchi                     DbgBreakMsg("lm_dcbx_init : lm_mcp_cmd_send_recieve failed ");
4966*d14abf15SRobert Mustacchi                     return;
4967*d14abf15SRobert Mustacchi                 }
4968*d14abf15SRobert Mustacchi                 is_mfw_config = lm_dcbx_check_drv_flags(pdev, DRV_FLAGS_DCB_MFW_CONFIGURED);
4969*d14abf15SRobert Mustacchi 
4970*d14abf15SRobert Mustacchi                 if(TRUE == is_mfw_config)
4971*d14abf15SRobert Mustacchi                 {
4972*d14abf15SRobert Mustacchi                     lm_status = MM_REGISTER_LPME(pdev,
4973*d14abf15SRobert Mustacchi                              lm_dcbx_init_lpme_set_params,
4974*d14abf15SRobert Mustacchi                              TRUE,
4975*d14abf15SRobert Mustacchi                              FALSE);// DCBX sends ramrods
4976*d14abf15SRobert Mustacchi 
4977*d14abf15SRobert Mustacchi                     if (LM_STATUS_SUCCESS != lm_status)
4978*d14abf15SRobert Mustacchi                     {
4979*d14abf15SRobert Mustacchi                         pdev->dcbx_info.dcbx_error |= DCBX_ERROR_REGISTER_LPME;
4980*d14abf15SRobert Mustacchi                         // No rollback
4981*d14abf15SRobert Mustacchi                         // Problem because if DCBX interrupt isn't receive the chip will be
4982*d14abf15SRobert Mustacchi                         // stuck beacuse QM queues are stopped.
4983*d14abf15SRobert Mustacchi                         // For release version this will call DCBX start that will restart QM queues.
4984*d14abf15SRobert Mustacchi                         DbgBreakMsg("lm_dcbx_int : The chip QM queues are stuck until an interrupt from MCP");
4985*d14abf15SRobert Mustacchi                     }
4986*d14abf15SRobert Mustacchi                 }
4987*d14abf15SRobert Mustacchi             }//PMF Original
4988*d14abf15SRobert Mustacchi             else
4989*d14abf15SRobert Mustacchi             {
4990*d14abf15SRobert Mustacchi                 pdev->dcbx_info.is_enabled = TRUE;
4991*d14abf15SRobert Mustacchi                 if(IS_PMF_MIGRATION(pdev))
4992*d14abf15SRobert Mustacchi                 {
4993*d14abf15SRobert Mustacchi                     // Send an attention on this Function.
4994*d14abf15SRobert Mustacchi                     // We create an interrupt on this function to make sure we will wake up another time
4995*d14abf15SRobert Mustacchi                     // to send the MCP ACK.
4996*d14abf15SRobert Mustacchi                     LM_GENERAL_ATTN_INTERRUPT_SET(pdev,FUNC_ID(pdev));
4997*d14abf15SRobert Mustacchi                 }
4998*d14abf15SRobert Mustacchi             }
4999*d14abf15SRobert Mustacchi         }// DCBX supported in MCP
5000*d14abf15SRobert Mustacchi     } //DCBX enabled.
5001*d14abf15SRobert Mustacchi }
5002*d14abf15SRobert Mustacchi /*******************************************************************************
5003*d14abf15SRobert Mustacchi  * Description:
5004*d14abf15SRobert Mustacchi  *
5005*d14abf15SRobert Mustacchi  * Return:
5006*d14abf15SRobert Mustacchi  ******************************************************************************/
5007*d14abf15SRobert Mustacchi static void
lm_dcbx_init_set_params_invalid(u32_t * buff_check,u32_t buff_size)5008*d14abf15SRobert Mustacchi lm_dcbx_init_set_params_invalid(u32_t       * buff_check,
5009*d14abf15SRobert Mustacchi                                 u32_t       buff_size)
5010*d14abf15SRobert Mustacchi {
5011*d14abf15SRobert Mustacchi     u32_t i=0;
5012*d14abf15SRobert Mustacchi     for (i=0 ; i < buff_size ; i++,buff_check++)
5013*d14abf15SRobert Mustacchi     {
5014*d14abf15SRobert Mustacchi         *buff_check = DCBX_CONFIG_INV_VALUE;
5015*d14abf15SRobert Mustacchi     }
5016*d14abf15SRobert Mustacchi }
5017*d14abf15SRobert Mustacchi /**
5018*d14abf15SRobert Mustacchi  * @description
5019*d14abf15SRobert Mustacchi  * Init dcbx init default params this function should be called
5020*d14abf15SRobert Mustacchi  * once before any other DCBX function is called.
5021*d14abf15SRobert Mustacchi  * @param pdev
5022*d14abf15SRobert Mustacchi  */
5023*d14abf15SRobert Mustacchi void
lm_dcbx_init_default_params(lm_device_t * pdev)5024*d14abf15SRobert Mustacchi lm_dcbx_init_default_params(lm_device_t *pdev)
5025*d14abf15SRobert Mustacchi {
5026*d14abf15SRobert Mustacchi     // Init dcbx and lldp params
5027*d14abf15SRobert Mustacchi 
5028*d14abf15SRobert Mustacchi     lm_dcbx_init_set_params_invalid((u32_t *)(&(pdev->params.lldp_config_params)),
5029*d14abf15SRobert Mustacchi                                     (sizeof(pdev->params.lldp_config_params)/sizeof(u32_t)));
5030*d14abf15SRobert Mustacchi 
5031*d14abf15SRobert Mustacchi     lm_dcbx_init_set_params_invalid((u32_t *)(&(pdev->params.dcbx_config_params)),
5032*d14abf15SRobert Mustacchi                                     (sizeof(pdev->params.dcbx_config_params)/sizeof(u32_t)));
5033*d14abf15SRobert Mustacchi 
5034*d14abf15SRobert Mustacchi     pdev->params.dcbx_config_params.dcb_enable        = 1; //DCB by default is disabled
5035*d14abf15SRobert Mustacchi     pdev->params.dcbx_config_params.admin_dcbx_enable = 1; //DCBX by default is enabled
5036*d14abf15SRobert Mustacchi 
5037*d14abf15SRobert Mustacchi     if((!(CHIP_IS_E1x(pdev))) &&
5038*d14abf15SRobert Mustacchi         IS_PFDEV(pdev))
5039*d14abf15SRobert Mustacchi     {
5040*d14abf15SRobert Mustacchi         pdev->params.b_dcb_indicate_event = TRUE;
5041*d14abf15SRobert Mustacchi }
5042*d14abf15SRobert Mustacchi }
5043*d14abf15SRobert Mustacchi 
5044*d14abf15SRobert Mustacchi /**********************end DCBX INIT FUNCTIONS**************************************/
5045*d14abf15SRobert Mustacchi 
5046*d14abf15SRobert Mustacchi /**********************start DCBX UPDATE FUNCTIONS**************************************/
5047*d14abf15SRobert Mustacchi /*******************************************************************************
5048*d14abf15SRobert Mustacchi  * Description:
5049*d14abf15SRobert Mustacchi  *              Any DCBX update will be treated as a runtime change.
5050*d14abf15SRobert Mustacchi  *              Runtime changes can take more than 1 second and can't be handled
5051*d14abf15SRobert Mustacchi  *              from DPC.
5052*d14abf15SRobert Mustacchi  *              When the PMF detects a DCBX update it will schedule a WI that
5053*d14abf15SRobert Mustacchi  *              will handle the job.
5054*d14abf15SRobert Mustacchi  *              This function should be called in PASSIVE IRQL (Currently called from
5055*d14abf15SRobert Mustacchi  *              DPC) and in mutual exclusion any acces to lm_dcbx_stop_HW_TX
5056*d14abf15SRobert Mustacchi  *              /lm_dcbx_resume_HW_TX.
5057*d14abf15SRobert Mustacchi  *
5058*d14abf15SRobert Mustacchi  * Return:
5059*d14abf15SRobert Mustacchi ******************************************************************************/
5060*d14abf15SRobert Mustacchi void
lm_dcbx_update_lpme_set_params(struct _lm_device_t * pdev)5061*d14abf15SRobert Mustacchi lm_dcbx_update_lpme_set_params(struct _lm_device_t *pdev)
5062*d14abf15SRobert Mustacchi {
5063*d14abf15SRobert Mustacchi     u32_t offset        = 0;
5064*d14abf15SRobert Mustacchi     u32_t drv_status    = 0;
5065*d14abf15SRobert Mustacchi     lm_status_t lm_status = LM_STATUS_SUCCESS;
5066*d14abf15SRobert Mustacchi 
5067*d14abf15SRobert Mustacchi     offset = OFFSETOF(shmem_region_t, func_mb[FUNC_MAILBOX_ID(pdev)].drv_status) ;
5068*d14abf15SRobert Mustacchi 
5069*d14abf15SRobert Mustacchi     // drv_status
5070*d14abf15SRobert Mustacchi     LM_SHMEM_READ(pdev,
5071*d14abf15SRobert Mustacchi                   offset,
5072*d14abf15SRobert Mustacchi                   &drv_status);
5073*d14abf15SRobert Mustacchi 
5074*d14abf15SRobert Mustacchi     if((IS_PMF(pdev))&&
5075*d14abf15SRobert Mustacchi        (GET_FLAGS( drv_status, DRV_STATUS_DCBX_NEGOTIATION_RESULTS))&&
5076*d14abf15SRobert Mustacchi        (DCBX_UPDATE_TASK_STATE_SCHEDULE == pdev->dcbx_info.dcbx_update_lpme_task_state))
5077*d14abf15SRobert Mustacchi     {
5078*d14abf15SRobert Mustacchi         // No lock is needed to be taken because lm_dcbx_set_params is only called from a WI
5079*d14abf15SRobert Mustacchi         lm_status = lm_dcbx_set_params_and_read_mib(pdev,
5080*d14abf15SRobert Mustacchi                                                     FALSE,
5081*d14abf15SRobert Mustacchi                                                     TRUE);
5082*d14abf15SRobert Mustacchi 
5083*d14abf15SRobert Mustacchi         DbgBreakIf(LM_STATUS_SUCCESS != lm_status);
5084*d14abf15SRobert Mustacchi 
5085*d14abf15SRobert Mustacchi         pdev->dcbx_info.dcbx_update_lpme_task_state =
5086*d14abf15SRobert Mustacchi             DCBX_UPDATE_TASK_STATE_HANDLED;
5087*d14abf15SRobert Mustacchi         // Send an attention on this Function.
5088*d14abf15SRobert Mustacchi         // We create an interrupt on this function to make sure we will wake up another time
5089*d14abf15SRobert Mustacchi         // to send the MCP ACK.
5090*d14abf15SRobert Mustacchi         LM_GENERAL_ATTN_INTERRUPT_SET(pdev,FUNC_ID(pdev));
5091*d14abf15SRobert Mustacchi     }
5092*d14abf15SRobert Mustacchi     else
5093*d14abf15SRobert Mustacchi     {
5094*d14abf15SRobert Mustacchi         DbgBreakMsg("lm_dcbx_update_lpme_set_params error");
5095*d14abf15SRobert Mustacchi     }
5096*d14abf15SRobert Mustacchi }
5097*d14abf15SRobert Mustacchi /**********************end DCBX UPDATE FUNCTIONS**************************************/
5098*d14abf15SRobert Mustacchi 
5099*d14abf15SRobert Mustacchi /**
5100*d14abf15SRobert Mustacchi  * @description
5101*d14abf15SRobert Mustacchi  * Enable indicate event to upper layer
5102*d14abf15SRobert Mustacchi  * @param pdev
5103*d14abf15SRobert Mustacchi  */
lm_dcbx_ie_update_state(INOUT struct _lm_device_t * pdev,IN const u8_t is_en)5104*d14abf15SRobert Mustacchi void lm_dcbx_ie_update_state(
5105*d14abf15SRobert Mustacchi     INOUT       struct _lm_device_t * pdev,
5106*d14abf15SRobert Mustacchi     IN const    u8_t                is_en)
5107*d14abf15SRobert Mustacchi {
5108*d14abf15SRobert Mustacchi     pdev->dcbx_info.is_indicate_event_en = is_en;
5109*d14abf15SRobert Mustacchi }
5110*d14abf15SRobert Mustacchi /**
5111*d14abf15SRobert Mustacchi  * @description
5112*d14abf15SRobert Mustacchi  *
5113*d14abf15SRobert Mustacchi  * @param pdev
5114*d14abf15SRobert Mustacchi  *
5115*d14abf15SRobert Mustacchi  * @return u8
5116*d14abf15SRobert Mustacchi  */
lm_dcbx_cos_max_num(INOUT const struct _lm_device_t * pdev)5117*d14abf15SRobert Mustacchi u8_t lm_dcbx_cos_max_num(
5118*d14abf15SRobert Mustacchi     INOUT   const struct _lm_device_t * pdev)
5119*d14abf15SRobert Mustacchi {
5120*d14abf15SRobert Mustacchi     u8_t cos_max_num = 0;
5121*d14abf15SRobert Mustacchi 
5122*d14abf15SRobert Mustacchi     if(CHIP_IS_E3B0(pdev))
5123*d14abf15SRobert Mustacchi     {
5124*d14abf15SRobert Mustacchi         cos_max_num = DCBX_COS_MAX_NUM_E3B0;
5125*d14abf15SRobert Mustacchi     }
5126*d14abf15SRobert Mustacchi     else
5127*d14abf15SRobert Mustacchi     {
5128*d14abf15SRobert Mustacchi         cos_max_num = DCBX_COS_MAX_NUM_E2E3A0;
5129*d14abf15SRobert Mustacchi     }
5130*d14abf15SRobert Mustacchi 
5131*d14abf15SRobert Mustacchi     return cos_max_num;
5132*d14abf15SRobert Mustacchi }
5133*d14abf15SRobert Mustacchi /**
5134*d14abf15SRobert Mustacchi  * @description
5135*d14abf15SRobert Mustacchi  * Validate the PFC parameters that were received can be
5136*d14abf15SRobert Mustacchi  * configured. The parameters will later be configured in WI.
5137*d14abf15SRobert Mustacchi  * @param pdev
5138*d14abf15SRobert Mustacchi  * @param pfc_params
5139*d14abf15SRobert Mustacchi  * @param dcbx_neg_res_offset - After the offset was read
5140*d14abf15SRobert Mustacchi  *                            correctly from Shmem.
5141*d14abf15SRobert Mustacchi  *
5142*d14abf15SRobert Mustacchi  * @return STATIC lm_status_t
5143*d14abf15SRobert Mustacchi  */
5144*d14abf15SRobert Mustacchi STATIC lm_status_t
lm_dcbx_ie_runtime_params_updated_validate_pfc(INOUT lm_device_t * pdev,IN const dcb_pfc_param_t * pfc_params)5145*d14abf15SRobert Mustacchi lm_dcbx_ie_runtime_params_updated_validate_pfc(
5146*d14abf15SRobert Mustacchi     INOUT       lm_device_t     *pdev,
5147*d14abf15SRobert Mustacchi     IN const    dcb_pfc_param_t *pfc_params
5148*d14abf15SRobert Mustacchi     )
5149*d14abf15SRobert Mustacchi {
5150*d14abf15SRobert Mustacchi     lm_status_t         lm_status           = LM_STATUS_SUCCESS;
5151*d14abf15SRobert Mustacchi 
5152*d14abf15SRobert Mustacchi     if(FALSE == pdev->dcbx_info.is_indicate_event_en)
5153*d14abf15SRobert Mustacchi     {
5154*d14abf15SRobert Mustacchi         DbgBreakMsg("lm_dcbx_runtime_params_updated_validate_pfc called but is_indicate_event_en is false");
5155*d14abf15SRobert Mustacchi         return LM_STATUS_FAILURE;
5156*d14abf15SRobert Mustacchi     }
5157*d14abf15SRobert Mustacchi 
5158*d14abf15SRobert Mustacchi     return lm_status;
5159*d14abf15SRobert Mustacchi }
5160*d14abf15SRobert Mustacchi /**
5161*d14abf15SRobert Mustacchi  * @description
5162*d14abf15SRobert Mustacchi  * Validate the ETS parameters that were received can be
5163*d14abf15SRobert Mustacchi  * configured. The parameters will later be configured in WI.
5164*d14abf15SRobert Mustacchi  * @param pdev
5165*d14abf15SRobert Mustacchi  * @param ets_params
5166*d14abf15SRobert Mustacchi  *
5167*d14abf15SRobert Mustacchi  * @return STATIC lm_status_t
5168*d14abf15SRobert Mustacchi  */
5169*d14abf15SRobert Mustacchi STATIC lm_status_t
lm_dcbx_ie_params_updated_validate_ets(INOUT lm_device_t * pdev,IN const dcb_ets_tsa_param_t * ets_params)5170*d14abf15SRobert Mustacchi lm_dcbx_ie_params_updated_validate_ets(
5171*d14abf15SRobert Mustacchi     INOUT       lm_device_t         *pdev,
5172*d14abf15SRobert Mustacchi     IN const    dcb_ets_tsa_param_t *ets_params
5173*d14abf15SRobert Mustacchi     )
5174*d14abf15SRobert Mustacchi {
5175*d14abf15SRobert Mustacchi     lm_status_t lm_status   = LM_STATUS_SUCCESS;
5176*d14abf15SRobert Mustacchi     const u8_t  cos_max_num = lm_dcbx_cos_max_num(pdev);
5177*d14abf15SRobert Mustacchi     u8_t        i           = 0;
5178*d14abf15SRobert Mustacchi     u8_t        tc_entry    = 0;
5179*d14abf15SRobert Mustacchi     u8_t        tc_entry_bitmap = 0;
5180*d14abf15SRobert Mustacchi     u8_t        tc_used_bitmap  = 0;
5181*d14abf15SRobert Mustacchi     u8_t        num_of_tc_used  = 0;
5182*d14abf15SRobert Mustacchi 
5183*d14abf15SRobert Mustacchi     if(cos_max_num < ets_params->num_traffic_classes )
5184*d14abf15SRobert Mustacchi     {
5185*d14abf15SRobert Mustacchi         DbgBreakMsg("lm_dcbx_runtime_params_updated_validate_ets num_traffic_classes can't be larger"
5186*d14abf15SRobert Mustacchi                     "than cos_max_num");
5187*d14abf15SRobert Mustacchi         return LM_STATUS_FAILURE;
5188*d14abf15SRobert Mustacchi     }
5189*d14abf15SRobert Mustacchi 
5190*d14abf15SRobert Mustacchi     if(LM_DCBX_IE_IS_ETS_DISABLE(ets_params->num_traffic_classes))
5191*d14abf15SRobert Mustacchi     {
5192*d14abf15SRobert Mustacchi         DbgMessage(pdev, INFORM, "ETS is disabled other ETS paramters not checked \n");
5193*d14abf15SRobert Mustacchi 
5194*d14abf15SRobert Mustacchi         return LM_STATUS_SUCCESS;
5195*d14abf15SRobert Mustacchi     }
5196*d14abf15SRobert Mustacchi 
5197*d14abf15SRobert Mustacchi     for(i = 0; i < ARRSIZE(ets_params->priority_assignment_table); i++)
5198*d14abf15SRobert Mustacchi     {
5199*d14abf15SRobert Mustacchi         //cos_max_num
5200*d14abf15SRobert Mustacchi         tc_entry = ets_params->priority_assignment_table[i];
5201*d14abf15SRobert Mustacchi         if(tc_entry >= DCBX_MAX_NUM_PG_BW_ENTRIES)
5202*d14abf15SRobert Mustacchi         {
5203*d14abf15SRobert Mustacchi             DbgBreakMsg("lm_dcbx_runtime_params_updated_validate_ets a tc_entry can't be larger"
5204*d14abf15SRobert Mustacchi                         "than the number of TC supported");
5205*d14abf15SRobert Mustacchi             return LM_STATUS_FAILURE;
5206*d14abf15SRobert Mustacchi         }
5207*d14abf15SRobert Mustacchi 
5208*d14abf15SRobert Mustacchi         tc_entry_bitmap = (1 << tc_entry);
5209*d14abf15SRobert Mustacchi         // Count the number of TC entries given and fill the appropriate COS entry.
5210*d14abf15SRobert Mustacchi         if(0 == (tc_used_bitmap & tc_entry_bitmap))
5211*d14abf15SRobert Mustacchi         {
5212*d14abf15SRobert Mustacchi             // New TC add it to the bitmask
5213*d14abf15SRobert Mustacchi             tc_used_bitmap |= tc_entry_bitmap;
5214*d14abf15SRobert Mustacchi             num_of_tc_used++;
5215*d14abf15SRobert Mustacchi             DbgBreakIf(cos_max_num < num_of_tc_used);
5216*d14abf15SRobert Mustacchi         }
5217*d14abf15SRobert Mustacchi 
5218*d14abf15SRobert Mustacchi 
5219*d14abf15SRobert Mustacchi         switch(ets_params->tsa_assignment_table[tc_entry])
5220*d14abf15SRobert Mustacchi         {
5221*d14abf15SRobert Mustacchi         case TSA_ASSIGNMENT_DCB_TSA_STRICT:
5222*d14abf15SRobert Mustacchi         case TSA_ASSIGNMENT_DCB_TSA_ETS: //fall through
5223*d14abf15SRobert Mustacchi             // Entry can be handled by VBD
5224*d14abf15SRobert Mustacchi             break;
5225*d14abf15SRobert Mustacchi 
5226*d14abf15SRobert Mustacchi         case TSA_ASSIGNMENT_DCB_TSA_CBS:
5227*d14abf15SRobert Mustacchi             DbgBreakMsg("TSA_ASSIGNMENT_DCB_TSA_CBS value isn't supported by VBD");
5228*d14abf15SRobert Mustacchi             return LM_STATUS_INVALID_PARAMETER;
5229*d14abf15SRobert Mustacchi             break;
5230*d14abf15SRobert Mustacchi         default:
5231*d14abf15SRobert Mustacchi             DbgBreakMsg("illegal value for tsa_assignment_table");
5232*d14abf15SRobert Mustacchi             break;
5233*d14abf15SRobert Mustacchi         }
5234*d14abf15SRobert Mustacchi     }
5235*d14abf15SRobert Mustacchi 
5236*d14abf15SRobert Mustacchi     if(ets_params->num_traffic_classes < num_of_tc_used )
5237*d14abf15SRobert Mustacchi     {
5238*d14abf15SRobert Mustacchi         if(0 == pdev->params.lm_dcb_dont_break_bad_oid)
5239*d14abf15SRobert Mustacchi         {
5240*d14abf15SRobert Mustacchi             DbgBreakMsg("OS gave more TC than mentioned in num_traffic_classes");
5241*d14abf15SRobert Mustacchi         }
5242*d14abf15SRobert Mustacchi         return LM_STATUS_INVALID_PARAMETER;
5243*d14abf15SRobert Mustacchi     }
5244*d14abf15SRobert Mustacchi 
5245*d14abf15SRobert Mustacchi     return lm_status;
5246*d14abf15SRobert Mustacchi }
5247*d14abf15SRobert Mustacchi /**
5248*d14abf15SRobert Mustacchi  * @description
5249*d14abf15SRobert Mustacchi  * For classification entries that will be supported are
5250*d14abf15SRobert Mustacchi  * returned with the flag DCB_CLASSIF_ENFORCED_BY_VBD set.
5251*d14abf15SRobert Mustacchi  *
5252*d14abf15SRobert Mustacchi  * Set the flag in classification entries that do not conflict
5253*d14abf15SRobert Mustacchi  * with the remote settings and is supported by the miniport,
5254*d14abf15SRobert Mustacchi  * and clear the flag in classification entries that do conflict
5255*d14abf15SRobert Mustacchi  * with remote settings or is not supported by the miniport.
5256*d14abf15SRobert Mustacchi  * @param pdev
5257*d14abf15SRobert Mustacchi  * @param classif_params
5258*d14abf15SRobert Mustacchi  * @param mcp_dcbx_neg_res_offset
5259*d14abf15SRobert Mustacchi  *
5260*d14abf15SRobert Mustacchi  * @return STATIC lm_status_t
5261*d14abf15SRobert Mustacchi  */
5262*d14abf15SRobert Mustacchi STATIC lm_status_t
lm_dcbx_ie_classif_entries_validate_and_set_enforced(IN struct _lm_device_t * pdev,INOUT dcb_classif_params_t * classif_params)5263*d14abf15SRobert Mustacchi lm_dcbx_ie_classif_entries_validate_and_set_enforced(
5264*d14abf15SRobert Mustacchi     IN      struct _lm_device_t             *pdev,
5265*d14abf15SRobert Mustacchi     INOUT       dcb_classif_params_t    *classif_params)
5266*d14abf15SRobert Mustacchi {
5267*d14abf15SRobert Mustacchi     dcb_classif_elem_t      *p_classif_elem = classif_params->classif_table;
5268*d14abf15SRobert Mustacchi     lm_status_t             lm_status       = LM_STATUS_SUCCESS;
5269*d14abf15SRobert Mustacchi     u8_t                    i               = 0;
5270*d14abf15SRobert Mustacchi 
5271*d14abf15SRobert Mustacchi     if(DCB_CLASSIFI_VER_SIMPLE_ELEM != classif_params->classif_version)
5272*d14abf15SRobert Mustacchi     {
5273*d14abf15SRobert Mustacchi         DbgBreakMsg("lm_dcbx_runtime_params_updated_en_classif_entries : classif_version not supported ");
5274*d14abf15SRobert Mustacchi         return LM_STATUS_FAILURE;
5275*d14abf15SRobert Mustacchi     }
5276*d14abf15SRobert Mustacchi 
5277*d14abf15SRobert Mustacchi     for(i = 0; i < classif_params->num_classif_elements; i++,p_classif_elem++)
5278*d14abf15SRobert Mustacchi     {
5279*d14abf15SRobert Mustacchi 
5280*d14abf15SRobert Mustacchi         if(NULL == p_classif_elem)
5281*d14abf15SRobert Mustacchi         {
5282*d14abf15SRobert Mustacchi             DbgBreakMsg("lm_dcbx_runtime_params_updated_en_classif_entries : p_classif_elem is null ");
5283*d14abf15SRobert Mustacchi             return LM_STATUS_FAILURE;
5284*d14abf15SRobert Mustacchi         }
5285*d14abf15SRobert Mustacchi 
5286*d14abf15SRobert Mustacchi         if(DCB_ACTION_PRIORITY != p_classif_elem->action_selector)
5287*d14abf15SRobert Mustacchi         {
5288*d14abf15SRobert Mustacchi             // VBD only supports condition_selector that is based on priority
5289*d14abf15SRobert Mustacchi             continue;
5290*d14abf15SRobert Mustacchi         }
5291*d14abf15SRobert Mustacchi         switch(p_classif_elem->condition_selector)
5292*d14abf15SRobert Mustacchi         {
5293*d14abf15SRobert Mustacchi         case DCB_CONDITION_DEFAULT:
5294*d14abf15SRobert Mustacchi             // Must be the first entry
5295*d14abf15SRobert Mustacchi             DbgBreakIf(0 != i);
5296*d14abf15SRobert Mustacchi             break;
5297*d14abf15SRobert Mustacchi 
5298*d14abf15SRobert Mustacchi         case DCB_CONDITION_TCP_PORT:
5299*d14abf15SRobert Mustacchi         case DCB_CONDITION_TCP_OR_UDP_PORT://Fall through
5300*d14abf15SRobert Mustacchi             if(TCP_PORT_ISCSI == p_classif_elem->condition_field)
5301*d14abf15SRobert Mustacchi             {
5302*d14abf15SRobert Mustacchi                 SET_FLAGS(p_classif_elem->flags, DCB_CLASSIF_ENFORCED_BY_VBD);
5303*d14abf15SRobert Mustacchi             }
5304*d14abf15SRobert Mustacchi             break;
5305*d14abf15SRobert Mustacchi 
5306*d14abf15SRobert Mustacchi         case DCB_CONDITION_ETHERTYPE:
5307*d14abf15SRobert Mustacchi             if(ETH_TYPE_FCOE == p_classif_elem->condition_field)
5308*d14abf15SRobert Mustacchi             {
5309*d14abf15SRobert Mustacchi                 SET_FLAGS(p_classif_elem->flags, DCB_CLASSIF_ENFORCED_BY_VBD);
5310*d14abf15SRobert Mustacchi             }
5311*d14abf15SRobert Mustacchi             break;
5312*d14abf15SRobert Mustacchi 
5313*d14abf15SRobert Mustacchi         case DCB_CONDITION_RESERVED:
5314*d14abf15SRobert Mustacchi         case DCB_CONDITION_UDP_PORT://Fall through
5315*d14abf15SRobert Mustacchi         case DCB_CONDITION_NETDIRECT_PORT://Fall through
5316*d14abf15SRobert Mustacchi             //Not supported by VBD
5317*d14abf15SRobert Mustacchi             break;
5318*d14abf15SRobert Mustacchi         case DCB_CONDITION_MAX:
5319*d14abf15SRobert Mustacchi         default:
5320*d14abf15SRobert Mustacchi             DbgBreakMsg("lm_dcbx_runtime_params_updated_en_classif_entries: illegal entry ");
5321*d14abf15SRobert Mustacchi             break;
5322*d14abf15SRobert Mustacchi         }
5323*d14abf15SRobert Mustacchi     }
5324*d14abf15SRobert Mustacchi     return lm_status;
5325*d14abf15SRobert Mustacchi }
5326*d14abf15SRobert Mustacchi /**
5327*d14abf15SRobert Mustacchi  * @description
5328*d14abf15SRobert Mustacchi  * The function will allocate room for the calcification entries
5329*d14abf15SRobert Mustacchi  * copy the miniport buffer + local MIB.
5330*d14abf15SRobert Mustacchi  * The function will also copy all valid entries to the
5331*d14abf15SRobert Mustacchi  * beggining classif_params_copy->classif_table
5332*d14abf15SRobert Mustacchi  * @param pdev
5333*d14abf15SRobert Mustacchi  * @param classif_params
5334*d14abf15SRobert Mustacchi  * @param classif_params_copy
5335*d14abf15SRobert Mustacchi  * @param lm_cli_idx
5336*d14abf15SRobert Mustacchi  *
5337*d14abf15SRobert Mustacchi  * @return STATIC lm_status_t
5338*d14abf15SRobert Mustacchi  */
5339*d14abf15SRobert Mustacchi STATIC lm_status_t
lm_dcbx_ie_copy_alloc_classif_buffer(INOUT lm_device_t * pdev,IN const dcb_classif_params_t * classif_params,OUT dcb_classif_params_t * classif_params_copy,IN const u8_t lm_cli_idx)5340*d14abf15SRobert Mustacchi lm_dcbx_ie_copy_alloc_classif_buffer(
5341*d14abf15SRobert Mustacchi     INOUT       lm_device_t                     *pdev,
5342*d14abf15SRobert Mustacchi     IN const    dcb_classif_params_t            *classif_params,
5343*d14abf15SRobert Mustacchi     OUT         dcb_classif_params_t            *classif_params_copy,
5344*d14abf15SRobert Mustacchi     IN const    u8_t                            lm_cli_idx
5345*d14abf15SRobert Mustacchi     )
5346*d14abf15SRobert Mustacchi {
5347*d14abf15SRobert Mustacchi     dcb_classif_elem_t  *p_classif_elem         = NULL;
5348*d14abf15SRobert Mustacchi     lm_status_t         lm_status               = LM_STATUS_SUCCESS;
5349*d14abf15SRobert Mustacchi     u8_t                i                       = 0;
5350*d14abf15SRobert Mustacchi 
5351*d14abf15SRobert Mustacchi     DbgBreakIf(lm_cli_idx != pdev->dcbx_info.indicate_event.lm_cli_idx);
5352*d14abf15SRobert Mustacchi 
5353*d14abf15SRobert Mustacchi 
5354*d14abf15SRobert Mustacchi     if(classif_params->num_classif_elements)
5355*d14abf15SRobert Mustacchi     {
5356*d14abf15SRobert Mustacchi         // The total size allocated
5357*d14abf15SRobert Mustacchi         classif_params_copy->classif_table =
5358*d14abf15SRobert Mustacchi             mm_rt_alloc_mem(pdev,
5359*d14abf15SRobert Mustacchi                             LM_DCBX_IE_CLASSIF_ENTRIES_TO_ALOC_SIZE(classif_params->num_classif_elements),
5360*d14abf15SRobert Mustacchi                             pdev->dcbx_info.indicate_event.lm_cli_idx);
5361*d14abf15SRobert Mustacchi 
5362*d14abf15SRobert Mustacchi         if(CHK_NULL(classif_params_copy->classif_table))
5363*d14abf15SRobert Mustacchi         {
5364*d14abf15SRobert Mustacchi             DbgBreakMsg(" lm_dcbx_ie_copy_alloc_classif_buffer allocation failure ");
5365*d14abf15SRobert Mustacchi             return LM_STATUS_RESOURCE;
5366*d14abf15SRobert Mustacchi         }
5367*d14abf15SRobert Mustacchi 
5368*d14abf15SRobert Mustacchi         classif_params_copy->num_classif_elements = classif_params->num_classif_elements;
5369*d14abf15SRobert Mustacchi 
5370*d14abf15SRobert Mustacchi         mm_memcpy(classif_params_copy->classif_table,
5371*d14abf15SRobert Mustacchi                   classif_params->classif_table,
5372*d14abf15SRobert Mustacchi                   LM_DCBX_IE_CLASSIF_ENTRIES_TO_ALOC_SIZE(classif_params_copy->num_classif_elements));
5373*d14abf15SRobert Mustacchi 
5374*d14abf15SRobert Mustacchi         p_classif_elem    = (dcb_classif_elem_t *)classif_params_copy->classif_table;
5375*d14abf15SRobert Mustacchi         //Clear all the DCB_CLASSIF_ENFORCED_BY_VBD from copy entries
5376*d14abf15SRobert Mustacchi         for(i = 0; i < classif_params_copy->num_classif_elements; i++,p_classif_elem++)
5377*d14abf15SRobert Mustacchi         {
5378*d14abf15SRobert Mustacchi             RESET_FLAGS(p_classif_elem->flags, DCB_CLASSIF_ENFORCED_BY_VBD);
5379*d14abf15SRobert Mustacchi         }
5380*d14abf15SRobert Mustacchi     }
5381*d14abf15SRobert Mustacchi 
5382*d14abf15SRobert Mustacchi     return lm_status;
5383*d14abf15SRobert Mustacchi }
5384*d14abf15SRobert Mustacchi /**
5385*d14abf15SRobert Mustacchi  * Copy dcb parameters given by OS.
5386*d14abf15SRobert Mustacchi  * @param pdev
5387*d14abf15SRobert Mustacchi  * @param dcb_params
5388*d14abf15SRobert Mustacchi  * @param dcb_params_copy
5389*d14abf15SRobert Mustacchi  * @param lm_cli_idx
5390*d14abf15SRobert Mustacchi  *
5391*d14abf15SRobert Mustacchi  * @return STATIC lm_status_t
5392*d14abf15SRobert Mustacchi  */
5393*d14abf15SRobert Mustacchi STATIC lm_status_t
lm_dcbx_ie_params_updated_copy_dcb_params(INOUT lm_device_t * pdev,IN dcb_indicate_event_params_t * dcb_params,OUT dcb_indicate_event_params_t * dcb_params_copy,IN const u8_t lm_cli_idx)5394*d14abf15SRobert Mustacchi lm_dcbx_ie_params_updated_copy_dcb_params(
5395*d14abf15SRobert Mustacchi     INOUT       lm_device_t                     *pdev,
5396*d14abf15SRobert Mustacchi     IN          dcb_indicate_event_params_t     *dcb_params,
5397*d14abf15SRobert Mustacchi     OUT         dcb_indicate_event_params_t     *dcb_params_copy,
5398*d14abf15SRobert Mustacchi     IN const    u8_t                            lm_cli_idx)
5399*d14abf15SRobert Mustacchi {
5400*d14abf15SRobert Mustacchi     lm_status_t lm_status = LM_STATUS_SUCCESS;
5401*d14abf15SRobert Mustacchi 
5402*d14abf15SRobert Mustacchi     mm_memcpy(dcb_params_copy,
5403*d14abf15SRobert Mustacchi               dcb_params,
5404*d14abf15SRobert Mustacchi               sizeof(dcb_indicate_event_params_t));
5405*d14abf15SRobert Mustacchi 
5406*d14abf15SRobert Mustacchi     // miniport pointers should not be used we will realloc a struct in lm_dcbx_ie_copy_alloc_classif_buffer
5407*d14abf15SRobert Mustacchi     dcb_params_copy->classif_params.classif_table           = NULL;
5408*d14abf15SRobert Mustacchi     dcb_params_copy->classif_params.num_classif_elements    = 0;
5409*d14abf15SRobert Mustacchi 
5410*d14abf15SRobert Mustacchi     lm_status = lm_dcbx_ie_copy_alloc_classif_buffer(pdev,
5411*d14abf15SRobert Mustacchi                                                      &dcb_params->classif_params,
5412*d14abf15SRobert Mustacchi                                                      &(dcb_params_copy->classif_params),
5413*d14abf15SRobert Mustacchi                                                      lm_cli_idx);
5414*d14abf15SRobert Mustacchi 
5415*d14abf15SRobert Mustacchi     if(LM_STATUS_SUCCESS != lm_status)
5416*d14abf15SRobert Mustacchi     {
5417*d14abf15SRobert Mustacchi         return lm_status;
5418*d14abf15SRobert Mustacchi     }
5419*d14abf15SRobert Mustacchi 
5420*d14abf15SRobert Mustacchi     return lm_status;
5421*d14abf15SRobert Mustacchi }
5422*d14abf15SRobert Mustacchi /**
5423*d14abf15SRobert Mustacchi  * @description
5424*d14abf15SRobert Mustacchi  * Validate the ETS and PFC parameters that were received can be
5425*d14abf15SRobert Mustacchi  * configured. The parameters will later be configured in WI.
5426*d14abf15SRobert Mustacchi  * For classification entries that will be supported are
5427*d14abf15SRobert Mustacchi  * returned with the flag DCB_CLASSIF_ENFORCED_BY_VBD set.
5428*d14abf15SRobert Mustacchi  * @param pdev
5429*d14abf15SRobert Mustacchi  * @param dcb_params
5430*d14abf15SRobert Mustacchi  *
5431*d14abf15SRobert Mustacchi  * @return lm_status_t
5432*d14abf15SRobert Mustacchi  */
5433*d14abf15SRobert Mustacchi lm_status_t
lm_dcbx_ie_params_updated_validate(INOUT struct _lm_device_t * pdev,OUT dcb_indicate_event_params_t * dcb_params,OUT dcb_indicate_event_params_t * dcb_params_copy,IN const u8_t lm_cli_idx)5434*d14abf15SRobert Mustacchi lm_dcbx_ie_params_updated_validate(
5435*d14abf15SRobert Mustacchi     INOUT       struct _lm_device_t             *pdev,
5436*d14abf15SRobert Mustacchi     OUT         dcb_indicate_event_params_t     *dcb_params,
5437*d14abf15SRobert Mustacchi     OUT         dcb_indicate_event_params_t     *dcb_params_copy,
5438*d14abf15SRobert Mustacchi     IN const    u8_t                            lm_cli_idx)
5439*d14abf15SRobert Mustacchi {
5440*d14abf15SRobert Mustacchi     lm_dcbx_indicate_event_t    *indicate_event = &pdev->dcbx_info.indicate_event;
5441*d14abf15SRobert Mustacchi     lm_status_t                 lm_status       = LM_STATUS_SUCCESS;
5442*d14abf15SRobert Mustacchi 
5443*d14abf15SRobert Mustacchi     DbgBreakIf(lm_cli_idx != indicate_event->lm_cli_idx);
5444*d14abf15SRobert Mustacchi 
5445*d14abf15SRobert Mustacchi     if((FALSE == pdev->dcbx_info.is_indicate_event_en) ||
5446*d14abf15SRobert Mustacchi        (IS_MULTI_VNIC(pdev)))
5447*d14abf15SRobert Mustacchi     {
5448*d14abf15SRobert Mustacchi         DbgBreakMsg("lm_dcbx_runtime_params_updated_validate_pfc called but is_indicate_event_en is false");
5449*d14abf15SRobert Mustacchi         return LM_STATUS_FAILURE;
5450*d14abf15SRobert Mustacchi     }
5451*d14abf15SRobert Mustacchi 
5452*d14abf15SRobert Mustacchi     if(GET_FLAGS(dcb_params->flags, DCB_PARAMS_PFC_ENABLED))
5453*d14abf15SRobert Mustacchi     {
5454*d14abf15SRobert Mustacchi         lm_status =
5455*d14abf15SRobert Mustacchi             lm_dcbx_ie_runtime_params_updated_validate_pfc(pdev,
5456*d14abf15SRobert Mustacchi                                                            &dcb_params->pfc_params);
5457*d14abf15SRobert Mustacchi 
5458*d14abf15SRobert Mustacchi         if(LM_STATUS_SUCCESS != lm_status)
5459*d14abf15SRobert Mustacchi         {
5460*d14abf15SRobert Mustacchi             return lm_status;
5461*d14abf15SRobert Mustacchi         }
5462*d14abf15SRobert Mustacchi     }
5463*d14abf15SRobert Mustacchi 
5464*d14abf15SRobert Mustacchi     if(GET_FLAGS(dcb_params->flags, DCB_PARAMS_ETS_ENABLED))
5465*d14abf15SRobert Mustacchi     {
5466*d14abf15SRobert Mustacchi         lm_status =
5467*d14abf15SRobert Mustacchi             lm_dcbx_ie_params_updated_validate_ets(pdev,
5468*d14abf15SRobert Mustacchi                                                    &dcb_params->ets_params);
5469*d14abf15SRobert Mustacchi 
5470*d14abf15SRobert Mustacchi         if(LM_STATUS_SUCCESS != lm_status)
5471*d14abf15SRobert Mustacchi         {
5472*d14abf15SRobert Mustacchi             return lm_status;
5473*d14abf15SRobert Mustacchi         }
5474*d14abf15SRobert Mustacchi     }
5475*d14abf15SRobert Mustacchi 
5476*d14abf15SRobert Mustacchi     if(GET_FLAGS(dcb_params->flags, DCB_PARAMS_CLASSIF_ENABLED))
5477*d14abf15SRobert Mustacchi     {
5478*d14abf15SRobert Mustacchi         lm_status =
5479*d14abf15SRobert Mustacchi             lm_dcbx_ie_classif_entries_validate_and_set_enforced(pdev,
5480*d14abf15SRobert Mustacchi                                                                  &dcb_params->classif_params);
5481*d14abf15SRobert Mustacchi 
5482*d14abf15SRobert Mustacchi         if(LM_STATUS_SUCCESS != lm_status)
5483*d14abf15SRobert Mustacchi         {
5484*d14abf15SRobert Mustacchi             return lm_status;
5485*d14abf15SRobert Mustacchi         }
5486*d14abf15SRobert Mustacchi     }
5487*d14abf15SRobert Mustacchi 
5488*d14abf15SRobert Mustacchi     lm_status = lm_dcbx_ie_params_updated_copy_dcb_params(pdev,
5489*d14abf15SRobert Mustacchi                                                           dcb_params,
5490*d14abf15SRobert Mustacchi                                                           dcb_params_copy,
5491*d14abf15SRobert Mustacchi                                                           indicate_event->lm_cli_idx);
5492*d14abf15SRobert Mustacchi     if(LM_STATUS_SUCCESS != lm_status)
5493*d14abf15SRobert Mustacchi     {
5494*d14abf15SRobert Mustacchi         return lm_status;
5495*d14abf15SRobert Mustacchi     }
5496*d14abf15SRobert Mustacchi 
5497*d14abf15SRobert Mustacchi     return lm_status;
5498*d14abf15SRobert Mustacchi }
5499*d14abf15SRobert Mustacchi /**
5500*d14abf15SRobert Mustacchi  * @description
5501*d14abf15SRobert Mustacchi  * Update the local copy of the configuration parameters free
5502*d14abf15SRobert Mustacchi  * the old buffer of the classification.
5503*d14abf15SRobert Mustacchi  * @param pdev
5504*d14abf15SRobert Mustacchi  * @param dcb_params
5505*d14abf15SRobert Mustacchi  * @param lm_cli_idx
5506*d14abf15SRobert Mustacchi  *
5507*d14abf15SRobert Mustacchi  * @return u8_t
5508*d14abf15SRobert Mustacchi  */
5509*d14abf15SRobert Mustacchi STATIC void
lm_dcbx_ie_update_local_params(INOUT struct _lm_device_t * pdev,INOUT dcb_indicate_event_params_t * dcb_params,OUT u8_t * is_local_ets_change,IN const u8_t lm_cli_idx,IN u8_t is_ets_admin_updated)5510*d14abf15SRobert Mustacchi lm_dcbx_ie_update_local_params(
5511*d14abf15SRobert Mustacchi     INOUT       struct _lm_device_t             *pdev,
5512*d14abf15SRobert Mustacchi     INOUT       dcb_indicate_event_params_t     *dcb_params,
5513*d14abf15SRobert Mustacchi     OUT         u8_t                            *is_local_ets_change,
5514*d14abf15SRobert Mustacchi     IN const    u8_t                            lm_cli_idx,
5515*d14abf15SRobert Mustacchi     IN          u8_t                            is_ets_admin_updated
5516*d14abf15SRobert Mustacchi     )
5517*d14abf15SRobert Mustacchi {
5518*d14abf15SRobert Mustacchi     lm_dcbx_indicate_event_t    *indicate_event     = &pdev->dcbx_info.indicate_event;
5519*d14abf15SRobert Mustacchi     dcb_ets_tsa_param_t         ets_params_cmp      = {0};
5520*d14abf15SRobert Mustacchi     // I do not want to look at changed in this
5521*d14abf15SRobert Mustacchi     const u32_t                 interesting_flags   = DCB_PARAMS_WILLING | DCB_PARAMS_ETS_ENABLED |
5522*d14abf15SRobert Mustacchi         DCB_PARAMS_PFC_ENABLED | DCB_PARAMS_CLASSIF_ENABLED;
5523*d14abf15SRobert Mustacchi 
5524*d14abf15SRobert Mustacchi     DbgBreakIf(lm_cli_idx != indicate_event->lm_cli_idx);
5525*d14abf15SRobert Mustacchi 
5526*d14abf15SRobert Mustacchi     // Must be reset each OS configuration
5527*d14abf15SRobert Mustacchi     indicate_event->is_ets_ieee_params_os_valid = FALSE;
5528*d14abf15SRobert Mustacchi 
5529*d14abf15SRobert Mustacchi     // Copy before overwriting
5530*d14abf15SRobert Mustacchi     mm_memcpy(&(ets_params_cmp),
5531*d14abf15SRobert Mustacchi               &(indicate_event->ets_ieee_params_os),
5532*d14abf15SRobert Mustacchi               sizeof(ets_params_cmp));
5533*d14abf15SRobert Mustacchi 
5534*d14abf15SRobert Mustacchi 
5535*d14abf15SRobert Mustacchi     if(GET_FLAGS(dcb_params->flags, DCB_PARAMS_ETS_ENABLED))
5536*d14abf15SRobert Mustacchi     {
5537*d14abf15SRobert Mustacchi         DbgBreakIf(FALSE == is_ets_admin_updated);
5538*d14abf15SRobert Mustacchi 
5539*d14abf15SRobert Mustacchi         mm_memcpy(&(indicate_event->ets_ieee_params_os),
5540*d14abf15SRobert Mustacchi                   &(dcb_params->ets_params),
5541*d14abf15SRobert Mustacchi                   sizeof(indicate_event->ets_ieee_params_os));
5542*d14abf15SRobert Mustacchi 
5543*d14abf15SRobert Mustacchi         if(is_ets_admin_updated)
5544*d14abf15SRobert Mustacchi         {
5545*d14abf15SRobert Mustacchi             indicate_event->is_ets_ieee_params_os_valid = TRUE;
5546*d14abf15SRobert Mustacchi         }
5547*d14abf15SRobert Mustacchi     }
5548*d14abf15SRobert Mustacchi     else
5549*d14abf15SRobert Mustacchi     {
5550*d14abf15SRobert Mustacchi         mm_mem_zero(&(indicate_event->ets_ieee_params_os),
5551*d14abf15SRobert Mustacchi                     sizeof(indicate_event->ets_ieee_params_os));
5552*d14abf15SRobert Mustacchi     }
5553*d14abf15SRobert Mustacchi 
5554*d14abf15SRobert Mustacchi     if(FALSE == mm_memcmp(&(indicate_event->ets_ieee_params_os),
5555*d14abf15SRobert Mustacchi                   &(ets_params_cmp),
5556*d14abf15SRobert Mustacchi                   sizeof(ets_params_cmp)))
5557*d14abf15SRobert Mustacchi     {
5558*d14abf15SRobert Mustacchi         *is_local_ets_change = TRUE;
5559*d14abf15SRobert Mustacchi     }
5560*d14abf15SRobert Mustacchi 
5561*d14abf15SRobert Mustacchi 
5562*d14abf15SRobert Mustacchi     //A final OID_QOS_PARAMETERS with *only* the NDIS_QOS_PARAMETERS_WILLING flag set is sent to an NDIS QOS capable miniport when:
5563*d14abf15SRobert Mustacchi     //  1. DCB feature is uninstalled or the msdcb.sys driver is being stopped by the admin.
5564*d14abf15SRobert Mustacchi     //  2. The miniport is being unbound by NDIS for whatever reason.
5565*d14abf15SRobert Mustacchi     if(DCB_PARAMS_WILLING == GET_FLAGS(dcb_params->flags, interesting_flags))
5566*d14abf15SRobert Mustacchi     {
5567*d14abf15SRobert Mustacchi         indicate_event->ets_config_state = lm_dcbx_ets_config_state_cee;
5568*d14abf15SRobert Mustacchi     }
5569*d14abf15SRobert Mustacchi     else
5570*d14abf15SRobert Mustacchi     {
5571*d14abf15SRobert Mustacchi         indicate_event->ets_config_state = lm_dcbx_ets_config_state_ieee;
5572*d14abf15SRobert Mustacchi     }
5573*d14abf15SRobert Mustacchi }
5574*d14abf15SRobert Mustacchi /**
5575*d14abf15SRobert Mustacchi  *  For debugging purpose only.
5576*d14abf15SRobert Mustacchi  * @param pdev
5577*d14abf15SRobert Mustacchi  * @param dcb_params
5578*d14abf15SRobert Mustacchi  * @param is_local_ets_change
5579*d14abf15SRobert Mustacchi  * @param lm_cli_idx
5580*d14abf15SRobert Mustacchi  *
5581*d14abf15SRobert Mustacchi  * @return STATIC void
5582*d14abf15SRobert Mustacchi  */
5583*d14abf15SRobert Mustacchi STATIC void
lm_dcbx_ie_dbg_copy_dcb_params(INOUT struct _lm_device_t * pdev,INOUT dcb_indicate_event_params_t * dcb_params,IN const u8_t lm_cli_idx)5584*d14abf15SRobert Mustacchi lm_dcbx_ie_dbg_copy_dcb_params(
5585*d14abf15SRobert Mustacchi     INOUT       struct _lm_device_t             *pdev,
5586*d14abf15SRobert Mustacchi     INOUT       dcb_indicate_event_params_t     *dcb_params,
5587*d14abf15SRobert Mustacchi     IN const    u8_t                            lm_cli_idx)
5588*d14abf15SRobert Mustacchi {
5589*d14abf15SRobert Mustacchi     dcb_indicate_event_params_t *dcb_params_dbg = &pdev->dcbx_info.indicate_event.dcb_params_given_dbg;
5590*d14abf15SRobert Mustacchi     const u32_t table_alloc_size_dbg =
5591*d14abf15SRobert Mustacchi         min(LM_DCBX_IE_CLASSIF_TABLE_ALOC_SIZE_DBG,
5592*d14abf15SRobert Mustacchi             LM_DCBX_IE_CLASSIF_ENTRIES_TO_ALOC_SIZE(dcb_params->classif_params.num_classif_elements));
5593*d14abf15SRobert Mustacchi 
5594*d14abf15SRobert Mustacchi     dcb_params_dbg->flags = dcb_params->flags;
5595*d14abf15SRobert Mustacchi 
5596*d14abf15SRobert Mustacchi     mm_memcpy(&dcb_params_dbg->ets_params,
5597*d14abf15SRobert Mustacchi               &dcb_params->ets_params,
5598*d14abf15SRobert Mustacchi               sizeof(dcb_params_dbg->ets_params));
5599*d14abf15SRobert Mustacchi 
5600*d14abf15SRobert Mustacchi     mm_memcpy(&dcb_params_dbg->pfc_params,
5601*d14abf15SRobert Mustacchi               &dcb_params->pfc_params,
5602*d14abf15SRobert Mustacchi               sizeof(dcb_params_dbg->pfc_params));
5603*d14abf15SRobert Mustacchi 
5604*d14abf15SRobert Mustacchi     dcb_params_dbg->classif_params.classif_version =
5605*d14abf15SRobert Mustacchi         dcb_params->classif_params.classif_version;
5606*d14abf15SRobert Mustacchi 
5607*d14abf15SRobert Mustacchi     // This can be equal or more than the classification
5608*d14abf15SRobert Mustacchi     // entries allocated by dbg and isn't used
5609*d14abf15SRobert Mustacchi     dcb_params_dbg->classif_params.num_classif_elements =
5610*d14abf15SRobert Mustacchi         dcb_params->classif_params.num_classif_elements;
5611*d14abf15SRobert Mustacchi 
5612*d14abf15SRobert Mustacchi     mm_mem_zero(dcb_params_dbg->classif_params.classif_table,
5613*d14abf15SRobert Mustacchi                 LM_DCBX_IE_CLASSIF_TABLE_ALOC_SIZE_DBG);
5614*d14abf15SRobert Mustacchi 
5615*d14abf15SRobert Mustacchi     if(NULL != dcb_params_dbg->classif_params.classif_table)
5616*d14abf15SRobert Mustacchi     {
5617*d14abf15SRobert Mustacchi         mm_memcpy(dcb_params_dbg->classif_params.classif_table,
5618*d14abf15SRobert Mustacchi                   dcb_params->classif_params.classif_table,
5619*d14abf15SRobert Mustacchi                   table_alloc_size_dbg);
5620*d14abf15SRobert Mustacchi     }
5621*d14abf15SRobert Mustacchi }
5622*d14abf15SRobert Mustacchi 
5623*d14abf15SRobert Mustacchi /**
5624*d14abf15SRobert Mustacchi  * @description
5625*d14abf15SRobert Mustacchi  * Creat the IEEE PFC settings from CEE PFC settings.
5626*d14abf15SRobert Mustacchi  * @param pdev
5627*d14abf15SRobert Mustacchi  * @param cee_pfc
5628*d14abf15SRobert Mustacchi  * @param ieee_pfc
5629*d14abf15SRobert Mustacchi  * @param flags
5630*d14abf15SRobert Mustacchi  *
5631*d14abf15SRobert Mustacchi  * @return STATIC void
5632*d14abf15SRobert Mustacchi  */
5633*d14abf15SRobert Mustacchi STATIC void
lm_dcbx_ie_pfc_cee_to_ieee_imp(INOUT lm_device_t * pdev,OUT dcb_pfc_param_t * ieee_pfc,OUT u32_t * flags,IN const u8_t is_pfc_en,IN const u8_t pri_en_bitmap)5634*d14abf15SRobert Mustacchi lm_dcbx_ie_pfc_cee_to_ieee_imp(
5635*d14abf15SRobert Mustacchi     INOUT       lm_device_t         *pdev,
5636*d14abf15SRobert Mustacchi     OUT         dcb_pfc_param_t     *ieee_pfc,
5637*d14abf15SRobert Mustacchi     OUT         u32_t               *flags,
5638*d14abf15SRobert Mustacchi     IN const    u8_t                is_pfc_en,
5639*d14abf15SRobert Mustacchi     IN const    u8_t                pri_en_bitmap
5640*d14abf15SRobert Mustacchi     )
5641*d14abf15SRobert Mustacchi {
5642*d14abf15SRobert Mustacchi     SET_FLAGS(*flags, DCB_PARAMS_PFC_ENABLED);
5643*d14abf15SRobert Mustacchi 
5644*d14abf15SRobert Mustacchi     if(0 == is_pfc_en)
5645*d14abf15SRobert Mustacchi     {
5646*d14abf15SRobert Mustacchi         return;
5647*d14abf15SRobert Mustacchi     }
5648*d14abf15SRobert Mustacchi 
5649*d14abf15SRobert Mustacchi     ieee_pfc->pfc_enable = pri_en_bitmap;
5650*d14abf15SRobert Mustacchi }
5651*d14abf15SRobert Mustacchi /**
5652*d14abf15SRobert Mustacchi  * @description
5653*d14abf15SRobert Mustacchi  * Creat the IEEE PFC settings from CEE PFC settings.
5654*d14abf15SRobert Mustacchi  * @param pdev
5655*d14abf15SRobert Mustacchi  * @param cee_pfc
5656*d14abf15SRobert Mustacchi  * @param ieee_pfc
5657*d14abf15SRobert Mustacchi  * @param flags
5658*d14abf15SRobert Mustacchi  *
5659*d14abf15SRobert Mustacchi  * @return STATIC void
5660*d14abf15SRobert Mustacchi  */
5661*d14abf15SRobert Mustacchi STATIC void
lm_dcbx_ie_pfc_cee_to_ieee(INOUT lm_device_t * pdev,IN const dcbx_pfc_feature_t * cee_pfc,OUT dcb_pfc_param_t * ieee_pfc,OUT u32_t * flags,IN const lm_event_code_t event)5662*d14abf15SRobert Mustacchi lm_dcbx_ie_pfc_cee_to_ieee(
5663*d14abf15SRobert Mustacchi     INOUT       lm_device_t         *pdev,
5664*d14abf15SRobert Mustacchi     IN const    dcbx_pfc_feature_t  *cee_pfc,
5665*d14abf15SRobert Mustacchi     OUT         dcb_pfc_param_t     *ieee_pfc,
5666*d14abf15SRobert Mustacchi     OUT         u32_t               *flags,
5667*d14abf15SRobert Mustacchi     IN const    lm_event_code_t     event
5668*d14abf15SRobert Mustacchi     )
5669*d14abf15SRobert Mustacchi {
5670*d14abf15SRobert Mustacchi     if( LM_EVENT_CODE_DCBX_OPERA_CHANGE == event)
5671*d14abf15SRobert Mustacchi     {
5672*d14abf15SRobert Mustacchi         lm_dcbx_ie_pfc_cee_to_ieee_imp(pdev,
5673*d14abf15SRobert Mustacchi                                        ieee_pfc,
5674*d14abf15SRobert Mustacchi                                        flags,
5675*d14abf15SRobert Mustacchi                                        (u8_t)pdev->params.dcbx_port_params.pfc.enabled,
5676*d14abf15SRobert Mustacchi                                        LM_DCBX_PFC_PRI_PAUSE_MASK(pdev));
5677*d14abf15SRobert Mustacchi     }
5678*d14abf15SRobert Mustacchi     else
5679*d14abf15SRobert Mustacchi     {
5680*d14abf15SRobert Mustacchi         DbgBreakIf( LM_EVENT_CODE_DCBX_REMOTE_CHANGE != event);
5681*d14abf15SRobert Mustacchi 
5682*d14abf15SRobert Mustacchi         lm_dcbx_ie_pfc_cee_to_ieee_imp(pdev,
5683*d14abf15SRobert Mustacchi                                        ieee_pfc,
5684*d14abf15SRobert Mustacchi                                        flags,
5685*d14abf15SRobert Mustacchi                                        cee_pfc->enabled,
5686*d14abf15SRobert Mustacchi                                        cee_pfc->pri_en_bitmap);
5687*d14abf15SRobert Mustacchi     }
5688*d14abf15SRobert Mustacchi }
5689*d14abf15SRobert Mustacchi /**
5690*d14abf15SRobert Mustacchi  * @description
5691*d14abf15SRobert Mustacchi  * Straight forward parsing.
5692*d14abf15SRobert Mustacchi  * The data given from the remote doesn't promise continues
5693*d14abf15SRobert Mustacchi  * entries and that for TC_x x is smaller than max TC
5694*d14abf15SRobert Mustacchi  * given.
5695*d14abf15SRobert Mustacchi  * Strict entry will always be the first TC_0.
5696*d14abf15SRobert Mustacchi  * Find an empty cell for strict and count the number of TC
5697*d14abf15SRobert Mustacchi  * entries used.
5698*d14abf15SRobert Mustacchi  * @param pdev
5699*d14abf15SRobert Mustacchi  * @param cee_ets
5700*d14abf15SRobert Mustacchi  * @param ieee_ets
5701*d14abf15SRobert Mustacchi  * @param flags
5702*d14abf15SRobert Mustacchi  * @param event
5703*d14abf15SRobert Mustacchi  *
5704*d14abf15SRobert Mustacchi  * @return STATIC void
5705*d14abf15SRobert Mustacchi  */
5706*d14abf15SRobert Mustacchi STATIC void
lm_dcbx_ie_ets_cee_to_ieee_unparse(INOUT lm_device_t * pdev,IN const dcbx_ets_feature_t * cee_ets,OUT dcb_ets_tsa_param_t * ieee_ets,OUT u32_t * flags)5707*d14abf15SRobert Mustacchi lm_dcbx_ie_ets_cee_to_ieee_unparse(
5708*d14abf15SRobert Mustacchi     INOUT       lm_device_t         *pdev,
5709*d14abf15SRobert Mustacchi     IN const    dcbx_ets_feature_t  *cee_ets,
5710*d14abf15SRobert Mustacchi     OUT         dcb_ets_tsa_param_t *ieee_ets,
5711*d14abf15SRobert Mustacchi     OUT         u32_t               *flags
5712*d14abf15SRobert Mustacchi     )
5713*d14abf15SRobert Mustacchi {
5714*d14abf15SRobert Mustacchi     u8_t        pri                 = 0;
5715*d14abf15SRobert Mustacchi     u8_t        b_found_strict      = FALSE;
5716*d14abf15SRobert Mustacchi     u8_t        tc_entry            = 0;
5717*d14abf15SRobert Mustacchi     u8_t        tc_entry_bitmap     = 0;
5718*d14abf15SRobert Mustacchi     u8_t        tc_used_bitmap_bw   = 0;
5719*d14abf15SRobert Mustacchi     u8_t        num_of_tc_used      = 0;
5720*d14abf15SRobert Mustacchi     u8_t        strict_tc           = 0;
5721*d14abf15SRobert Mustacchi 
5722*d14abf15SRobert Mustacchi     ASSERT_STATIC(DCBX_MAX_NUM_PRI_PG_ENTRIES == DCBX_MAX_NUM_PG_BW_ENTRIES);
5723*d14abf15SRobert Mustacchi     ASSERT_STATIC(DCBX_MAX_NUM_PRI_PG_ENTRIES == ARRSIZE(ieee_ets->priority_assignment_table));
5724*d14abf15SRobert Mustacchi     ASSERT_STATIC(DCBX_MAX_NUM_PG_BW_ENTRIES == ARRSIZE(ieee_ets->tc_bw_assignment_table));
5725*d14abf15SRobert Mustacchi     ASSERT_STATIC(DCBX_MAX_NUM_PG_BW_ENTRIES == ARRSIZE(ieee_ets->tsa_assignment_table));
5726*d14abf15SRobert Mustacchi 
5727*d14abf15SRobert Mustacchi     mm_mem_zero(ieee_ets, sizeof(dcb_ets_tsa_param_t));
5728*d14abf15SRobert Mustacchi     RESET_FLAGS(*flags, DCB_PARAMS_ETS_ENABLED);
5729*d14abf15SRobert Mustacchi 
5730*d14abf15SRobert Mustacchi     if(FALSE == cee_ets->enabled)
5731*d14abf15SRobert Mustacchi     {
5732*d14abf15SRobert Mustacchi         return;
5733*d14abf15SRobert Mustacchi     }
5734*d14abf15SRobert Mustacchi 
5735*d14abf15SRobert Mustacchi     /************ Find an empty cell for strict and count the number of TC entries used*******/
5736*d14abf15SRobert Mustacchi 
5737*d14abf15SRobert Mustacchi     // Map all BW TC to a bitfield and find if there is a strict TC
5738*d14abf15SRobert Mustacchi     for (pri = 0; pri < DCBX_MAX_NUM_PRI_PG_ENTRIES; pri++)
5739*d14abf15SRobert Mustacchi     {
5740*d14abf15SRobert Mustacchi         tc_entry = DCBX_PRI_PG_GET(cee_ets->pri_pg_tbl, pri);
5741*d14abf15SRobert Mustacchi 
5742*d14abf15SRobert Mustacchi         if(tc_entry < DCBX_MAX_NUM_PG_BW_ENTRIES)
5743*d14abf15SRobert Mustacchi         {
5744*d14abf15SRobert Mustacchi             // BW
5745*d14abf15SRobert Mustacchi             tc_entry_bitmap = (1 << tc_entry);
5746*d14abf15SRobert Mustacchi             // Count the number of TC entries given and fill the appropriate COS entry
5747*d14abf15SRobert Mustacchi             if (0 == (tc_used_bitmap_bw & tc_entry_bitmap))
5748*d14abf15SRobert Mustacchi             {
5749*d14abf15SRobert Mustacchi                 // New TC add it to the bitmask
5750*d14abf15SRobert Mustacchi                 tc_used_bitmap_bw |= tc_entry_bitmap;
5751*d14abf15SRobert Mustacchi                 num_of_tc_used++;
5752*d14abf15SRobert Mustacchi             }
5753*d14abf15SRobert Mustacchi         }
5754*d14abf15SRobert Mustacchi         else if(DCBX_STRICT_PRI_PG == tc_entry)
5755*d14abf15SRobert Mustacchi         {
5756*d14abf15SRobert Mustacchi             // Strict
5757*d14abf15SRobert Mustacchi             b_found_strict = TRUE;
5758*d14abf15SRobert Mustacchi         }
5759*d14abf15SRobert Mustacchi         else
5760*d14abf15SRobert Mustacchi         {
5761*d14abf15SRobert Mustacchi             DbgBreakMsg("lm_dcbx_runtime_params_updated_validate_ets a tc_entry can't be larger"
5762*d14abf15SRobert Mustacchi                         "than the number of TC supported");
5763*d14abf15SRobert Mustacchi             return;
5764*d14abf15SRobert Mustacchi         }
5765*d14abf15SRobert Mustacchi     }
5766*d14abf15SRobert Mustacchi 
5767*d14abf15SRobert Mustacchi     // Find an empty cell for strict
5768*d14abf15SRobert Mustacchi     if(TRUE == b_found_strict)
5769*d14abf15SRobert Mustacchi     {
5770*d14abf15SRobert Mustacchi         if((DCBX_MAX_NUM_PRI_PG_ENTRIES) != num_of_tc_used )
5771*d14abf15SRobert Mustacchi         {
5772*d14abf15SRobert Mustacchi             // Find a free TC for strict priority
5773*d14abf15SRobert Mustacchi             for (tc_entry  = 0; tc_entry < DCBX_MAX_NUM_PRI_PG_ENTRIES; tc_entry++)
5774*d14abf15SRobert Mustacchi             {
5775*d14abf15SRobert Mustacchi                 tc_entry_bitmap = (1 << tc_entry);
5776*d14abf15SRobert Mustacchi 
5777*d14abf15SRobert Mustacchi                 // Found an unused cell that will be used for strict
5778*d14abf15SRobert Mustacchi                 if( 0 == (tc_used_bitmap_bw & tc_entry_bitmap))
5779*d14abf15SRobert Mustacchi                 {
5780*d14abf15SRobert Mustacchi                     num_of_tc_used++;
5781*d14abf15SRobert Mustacchi                     strict_tc = tc_entry;
5782*d14abf15SRobert Mustacchi                     break;
5783*d14abf15SRobert Mustacchi                 }
5784*d14abf15SRobert Mustacchi             }
5785*d14abf15SRobert Mustacchi         }
5786*d14abf15SRobert Mustacchi         else
5787*d14abf15SRobert Mustacchi         {
5788*d14abf15SRobert Mustacchi             DbgBreakMsg("lm_dcbx_ie_ets_cee_to_ieee_unparse: this is a bug we cant have 9 TC");
5789*d14abf15SRobert Mustacchi             // In case we have 8 used TC and strict The last TC will be shared
5790*d14abf15SRobert Mustacchi             // between BW and streict.
5791*d14abf15SRobert Mustacchi             strict_tc = DCBX_MAX_NUM_PRI_PG_ENTRIES -1;
5792*d14abf15SRobert Mustacchi         }
5793*d14abf15SRobert Mustacchi     }
5794*d14abf15SRobert Mustacchi 
5795*d14abf15SRobert Mustacchi     for (pri = 0; pri < DCBX_MAX_NUM_PRI_PG_ENTRIES; pri++)
5796*d14abf15SRobert Mustacchi     {
5797*d14abf15SRobert Mustacchi         tc_entry = DCBX_PRI_PG_GET(cee_ets->pri_pg_tbl, pri);
5798*d14abf15SRobert Mustacchi 
5799*d14abf15SRobert Mustacchi         if(tc_entry < DCBX_MAX_NUM_PG_BW_ENTRIES)
5800*d14abf15SRobert Mustacchi         {
5801*d14abf15SRobert Mustacchi             // BW
5802*d14abf15SRobert Mustacchi             ieee_ets->priority_assignment_table[pri]    = tc_entry;
5803*d14abf15SRobert Mustacchi             ieee_ets->tsa_assignment_table[tc_entry]    = TSA_ASSIGNMENT_DCB_TSA_ETS;
5804*d14abf15SRobert Mustacchi             ieee_ets->tc_bw_assignment_table[tc_entry]  = DCBX_PG_BW_GET(cee_ets->pg_bw_tbl,tc_entry);
5805*d14abf15SRobert Mustacchi         }
5806*d14abf15SRobert Mustacchi         else if(DCBX_STRICT_PRI_PG == tc_entry)
5807*d14abf15SRobert Mustacchi         {
5808*d14abf15SRobert Mustacchi             // Strict
5809*d14abf15SRobert Mustacchi             ieee_ets->priority_assignment_table[pri]    = strict_tc;
5810*d14abf15SRobert Mustacchi             ieee_ets->tsa_assignment_table[strict_tc]   = TSA_ASSIGNMENT_DCB_TSA_STRICT;
5811*d14abf15SRobert Mustacchi             ieee_ets->tc_bw_assignment_table[strict_tc] = 0;
5812*d14abf15SRobert Mustacchi         }
5813*d14abf15SRobert Mustacchi         else
5814*d14abf15SRobert Mustacchi         {
5815*d14abf15SRobert Mustacchi             DbgBreakMsg("lm_dcbx_runtime_params_updated_validate_ets a tc_entry can't be larger"
5816*d14abf15SRobert Mustacchi                         "than the number of TC supported");
5817*d14abf15SRobert Mustacchi             return;
5818*d14abf15SRobert Mustacchi         }
5819*d14abf15SRobert Mustacchi     }
5820*d14abf15SRobert Mustacchi 
5821*d14abf15SRobert Mustacchi     ieee_ets->num_traffic_classes = num_of_tc_used;
5822*d14abf15SRobert Mustacchi 
5823*d14abf15SRobert Mustacchi     SET_FLAGS(*flags, DCB_PARAMS_ETS_ENABLED);
5824*d14abf15SRobert Mustacchi }
5825*d14abf15SRobert Mustacchi /**
5826*d14abf15SRobert Mustacchi  * @description
5827*d14abf15SRobert Mustacchi  * The ETS data is already parse and configured to chip. The use
5828*d14abf15SRobert Mustacchi  * of the parse struct is a must because there is an algorithm
5829*d14abf15SRobert Mustacchi  * that decide how to configure the chip, and the parsing isn't
5830*d14abf15SRobert Mustacchi  * straight forward.
5831*d14abf15SRobert Mustacchi  * @param pdev
5832*d14abf15SRobert Mustacchi  * @param cee_ets
5833*d14abf15SRobert Mustacchi  * @param ieee_ets
5834*d14abf15SRobert Mustacchi  * @param flags
5835*d14abf15SRobert Mustacchi  * @param event
5836*d14abf15SRobert Mustacchi  *
5837*d14abf15SRobert Mustacchi  * @return STATIC void
5838*d14abf15SRobert Mustacchi  */
5839*d14abf15SRobert Mustacchi STATIC void
lm_dcbx_ie_ets_cee_to_ieee_parsed_data(INOUT lm_device_t * pdev,OUT dcb_ets_tsa_param_t * ieee_ets,OUT u32_t * flags)5840*d14abf15SRobert Mustacchi lm_dcbx_ie_ets_cee_to_ieee_parsed_data(
5841*d14abf15SRobert Mustacchi     INOUT       lm_device_t         *pdev,
5842*d14abf15SRobert Mustacchi     OUT         dcb_ets_tsa_param_t *ieee_ets,
5843*d14abf15SRobert Mustacchi     OUT         u32_t               *flags
5844*d14abf15SRobert Mustacchi     )
5845*d14abf15SRobert Mustacchi {
5846*d14abf15SRobert Mustacchi     u8_t        i                   = 0;
5847*d14abf15SRobert Mustacchi     u8_t        tc_assign           = 0;
5848*d14abf15SRobert Mustacchi     const u8_t  max_tc_sup          = lm_dcbx_cos_max_num(pdev) ;
5849*d14abf15SRobert Mustacchi     pg_params_t *ets                = &(pdev->params.dcbx_port_params.ets);
5850*d14abf15SRobert Mustacchi     u16_t       pri_bit             = 0;
5851*d14abf15SRobert Mustacchi 
5852*d14abf15SRobert Mustacchi     ASSERT_STATIC(DCBX_MAX_NUM_PRI_PG_ENTRIES == DCBX_MAX_NUM_PG_BW_ENTRIES);
5853*d14abf15SRobert Mustacchi     ASSERT_STATIC(DCBX_MAX_NUM_PRI_PG_ENTRIES == ARRSIZE(ieee_ets->priority_assignment_table));
5854*d14abf15SRobert Mustacchi     ASSERT_STATIC(DCBX_MAX_NUM_PG_BW_ENTRIES == ARRSIZE(ieee_ets->tc_bw_assignment_table));
5855*d14abf15SRobert Mustacchi     ASSERT_STATIC(DCBX_MAX_NUM_PG_BW_ENTRIES == ARRSIZE(ieee_ets->tsa_assignment_table));
5856*d14abf15SRobert Mustacchi 
5857*d14abf15SRobert Mustacchi     SET_FLAGS(*flags, DCB_PARAMS_ETS_ENABLED);
5858*d14abf15SRobert Mustacchi 
5859*d14abf15SRobert Mustacchi     if((FALSE == ets->enabled) ||
5860*d14abf15SRobert Mustacchi        (max_tc_sup < ets->num_of_cos))
5861*d14abf15SRobert Mustacchi     {
5862*d14abf15SRobert Mustacchi         DbgBreakIf(max_tc_sup < ets->num_of_cos);
5863*d14abf15SRobert Mustacchi         return;
5864*d14abf15SRobert Mustacchi     }
5865*d14abf15SRobert Mustacchi 
5866*d14abf15SRobert Mustacchi     ieee_ets->num_traffic_classes  = ets->num_of_cos;
5867*d14abf15SRobert Mustacchi 
5868*d14abf15SRobert Mustacchi     for(i = 0; i < ARRSIZE(ieee_ets->priority_assignment_table) ; i++)
5869*d14abf15SRobert Mustacchi     {
5870*d14abf15SRobert Mustacchi         pri_bit = 1 << i;
5871*d14abf15SRobert Mustacchi         for(tc_assign = 0 ; tc_assign < ets->num_of_cos; tc_assign++)
5872*d14abf15SRobert Mustacchi         {
5873*d14abf15SRobert Mustacchi             if(0 != (pri_bit & ets->cos_params[tc_assign].pri_bitmask))
5874*d14abf15SRobert Mustacchi             {
5875*d14abf15SRobert Mustacchi                 break;
5876*d14abf15SRobert Mustacchi             }
5877*d14abf15SRobert Mustacchi         }
5878*d14abf15SRobert Mustacchi 
5879*d14abf15SRobert Mustacchi         // If the priority doesn't belong to non of the cos_params then
5880*d14abf15SRobert Mustacchi         // assign this priority to zero.
5881*d14abf15SRobert Mustacchi         if(ets->num_of_cos == tc_assign)
5882*d14abf15SRobert Mustacchi         {
5883*d14abf15SRobert Mustacchi             tc_assign = 0;
5884*d14abf15SRobert Mustacchi         }
5885*d14abf15SRobert Mustacchi 
5886*d14abf15SRobert Mustacchi         ieee_ets->priority_assignment_table[i]        = tc_assign;
5887*d14abf15SRobert Mustacchi     }
5888*d14abf15SRobert Mustacchi 
5889*d14abf15SRobert Mustacchi     for(tc_assign = 0 ; tc_assign < ets->num_of_cos; tc_assign++)
5890*d14abf15SRobert Mustacchi     {
5891*d14abf15SRobert Mustacchi         if(DCBX_S_PRI_INVALID != ets->cos_params[tc_assign].s_pri)
5892*d14abf15SRobert Mustacchi         {// COS is SP
5893*d14abf15SRobert Mustacchi             // Strict
5894*d14abf15SRobert Mustacchi             DbgBreakIf(DCBX_INVALID_COS_BW != ets->cos_params[tc_assign].bw_tbl);
5895*d14abf15SRobert Mustacchi 
5896*d14abf15SRobert Mustacchi             ieee_ets->tsa_assignment_table[tc_assign]     = TSA_ASSIGNMENT_DCB_TSA_STRICT;
5897*d14abf15SRobert Mustacchi             ieee_ets->tc_bw_assignment_table[tc_assign]   = 0;
5898*d14abf15SRobert Mustacchi         }
5899*d14abf15SRobert Mustacchi         else
5900*d14abf15SRobert Mustacchi         {// COS is BW
5901*d14abf15SRobert Mustacchi             DbgBreakIf(DCBX_INVALID_COS_BW == ets->cos_params[tc_assign].bw_tbl);
5902*d14abf15SRobert Mustacchi 
5903*d14abf15SRobert Mustacchi             ieee_ets->tsa_assignment_table[tc_assign]     = TSA_ASSIGNMENT_DCB_TSA_ETS;
5904*d14abf15SRobert Mustacchi             ieee_ets->tc_bw_assignment_table[tc_assign]   = (u8_t)ets->cos_params[tc_assign].bw_tbl;
5905*d14abf15SRobert Mustacchi         }
5906*d14abf15SRobert Mustacchi     }
5907*d14abf15SRobert Mustacchi }
5908*d14abf15SRobert Mustacchi /**
5909*d14abf15SRobert Mustacchi  * @description
5910*d14abf15SRobert Mustacchi  * Creat the IEEE ETS settings from CEE ETS settings.
5911*d14abf15SRobert Mustacchi  * @param pdev
5912*d14abf15SRobert Mustacchi  * @param cee_ets
5913*d14abf15SRobert Mustacchi  * @param ieee_ets
5914*d14abf15SRobert Mustacchi  * @param flags
5915*d14abf15SRobert Mustacchi  *
5916*d14abf15SRobert Mustacchi  * @return STATIC void
5917*d14abf15SRobert Mustacchi  */
5918*d14abf15SRobert Mustacchi STATIC void
lm_dcbx_ie_ets_cee_to_ieee(INOUT lm_device_t * pdev,IN const dcbx_ets_feature_t * cee_ets,OUT dcb_ets_tsa_param_t * ieee_ets,OUT u32_t * flags,IN const lm_event_code_t event)5919*d14abf15SRobert Mustacchi lm_dcbx_ie_ets_cee_to_ieee(
5920*d14abf15SRobert Mustacchi     INOUT       lm_device_t         *pdev,
5921*d14abf15SRobert Mustacchi     IN const    dcbx_ets_feature_t  *cee_ets,
5922*d14abf15SRobert Mustacchi     OUT         dcb_ets_tsa_param_t *ieee_ets,
5923*d14abf15SRobert Mustacchi     OUT         u32_t               *flags,
5924*d14abf15SRobert Mustacchi     IN const    lm_event_code_t     event
5925*d14abf15SRobert Mustacchi     )
5926*d14abf15SRobert Mustacchi {
5927*d14abf15SRobert Mustacchi     if( LM_EVENT_CODE_DCBX_OPERA_CHANGE == event)
5928*d14abf15SRobert Mustacchi     {
5929*d14abf15SRobert Mustacchi         lm_dcbx_ie_ets_cee_to_ieee_parsed_data(pdev, ieee_ets, flags);
5930*d14abf15SRobert Mustacchi     }
5931*d14abf15SRobert Mustacchi     else
5932*d14abf15SRobert Mustacchi     {
5933*d14abf15SRobert Mustacchi         DbgBreakIf( LM_EVENT_CODE_DCBX_REMOTE_CHANGE != event);
5934*d14abf15SRobert Mustacchi         lm_dcbx_ie_ets_cee_to_ieee_unparse(pdev,
5935*d14abf15SRobert Mustacchi                                            cee_ets,
5936*d14abf15SRobert Mustacchi                                            ieee_ets,
5937*d14abf15SRobert Mustacchi                                            flags);
5938*d14abf15SRobert Mustacchi     }
5939*d14abf15SRobert Mustacchi }
5940*d14abf15SRobert Mustacchi /**
5941*d14abf15SRobert Mustacchi  * Update the classification entry with the data given.
5942*d14abf15SRobert Mustacchi  *
5943*d14abf15SRobert Mustacchi  * @param pdev
5944*d14abf15SRobert Mustacchi  * @param classif_entry
5945*d14abf15SRobert Mustacchi  * @param condition_selector
5946*d14abf15SRobert Mustacchi  * @param condition_field
5947*d14abf15SRobert Mustacchi  * @param pri
5948*d14abf15SRobert Mustacchi  *
5949*d14abf15SRobert Mustacchi  * @return STATIC void
5950*d14abf15SRobert Mustacchi  */
5951*d14abf15SRobert Mustacchi STATIC void
lm_dcbx_ie_classif_set_entry(IN lm_device_t * pdev,IN dcb_classif_elem_t * classif_entry,IN dcb_condition_selector_t condition_selector,IN u16_t condition_field,IN u16_t pri)5952*d14abf15SRobert Mustacchi lm_dcbx_ie_classif_set_entry(
5953*d14abf15SRobert Mustacchi     IN  lm_device_t                 *pdev,
5954*d14abf15SRobert Mustacchi     IN  dcb_classif_elem_t          *classif_entry,
5955*d14abf15SRobert Mustacchi     IN  dcb_condition_selector_t    condition_selector,
5956*d14abf15SRobert Mustacchi     IN  u16_t                       condition_field,
5957*d14abf15SRobert Mustacchi     IN  u16_t                       pri)
5958*d14abf15SRobert Mustacchi {
5959*d14abf15SRobert Mustacchi     classif_entry->flags                = 0;
5960*d14abf15SRobert Mustacchi     classif_entry->condition_selector   = condition_selector;
5961*d14abf15SRobert Mustacchi     classif_entry->condition_field      = condition_field;
5962*d14abf15SRobert Mustacchi     classif_entry->action_selector      = DCB_ACTION_PRIORITY;
5963*d14abf15SRobert Mustacchi     classif_entry->action_field         = pri;
5964*d14abf15SRobert Mustacchi }
5965*d14abf15SRobert Mustacchi /**
5966*d14abf15SRobert Mustacchi  * This default entry must be the first one.
5967*d14abf15SRobert Mustacchi  * @param pdev
5968*d14abf15SRobert Mustacchi  * @param cee_classif
5969*d14abf15SRobert Mustacchi  * @param classif_entry
5970*d14abf15SRobert Mustacchi  *
5971*d14abf15SRobert Mustacchi  * @return STATIC u8_t return the number of entries used by the
5972*d14abf15SRobert Mustacchi  *         function.
5973*d14abf15SRobert Mustacchi  */
5974*d14abf15SRobert Mustacchi STATIC void
lm_dcbx_ie_classif_add_default(INOUT lm_device_t * pdev,IN const dcbx_app_priority_feature_t * cee_classif,IN dcb_classif_elem_t * classif_entry)5975*d14abf15SRobert Mustacchi lm_dcbx_ie_classif_add_default(
5976*d14abf15SRobert Mustacchi     INOUT       lm_device_t                 *pdev,
5977*d14abf15SRobert Mustacchi     IN const    dcbx_app_priority_feature_t *cee_classif,
5978*d14abf15SRobert Mustacchi     IN          dcb_classif_elem_t          *classif_entry)
5979*d14abf15SRobert Mustacchi {
5980*d14abf15SRobert Mustacchi     u16_t const  default_pri    = (cee_classif->default_pri < MAX_PFC_PRIORITIES)? cee_classif->default_pri: 0;
5981*d14abf15SRobert Mustacchi 
5982*d14abf15SRobert Mustacchi     lm_dcbx_ie_classif_set_entry( pdev,
5983*d14abf15SRobert Mustacchi                                   classif_entry,
5984*d14abf15SRobert Mustacchi                                   DCB_CONDITION_DEFAULT,
5985*d14abf15SRobert Mustacchi                                   0,
5986*d14abf15SRobert Mustacchi                                   default_pri);
5987*d14abf15SRobert Mustacchi }
5988*d14abf15SRobert Mustacchi /**
5989*d14abf15SRobert Mustacchi  * Parse the CEE entries to indicate event classification
5990*d14abf15SRobert Mustacchi  * entries.
5991*d14abf15SRobert Mustacchi  * @param pdev
5992*d14abf15SRobert Mustacchi  * @param cee_app_pri_tbl
5993*d14abf15SRobert Mustacchi  * @param cee_app_pri_tbl_size
5994*d14abf15SRobert Mustacchi  * @param classif_table
5995*d14abf15SRobert Mustacchi  * @param is_iscsi_cee_rec - There is an ISCSI CEE entry.
5996*d14abf15SRobert Mustacchi  * @param event
5997*d14abf15SRobert Mustacchi  *
5998*d14abf15SRobert Mustacchi  * @return STATIC u8_t return the number of entries used by the
5999*d14abf15SRobert Mustacchi  *         function.
6000*d14abf15SRobert Mustacchi  */
6001*d14abf15SRobert Mustacchi STATIC u8_t
lm_dcbx_ie_classif_parse_cee_arrray(INOUT lm_device_t * pdev,IN const dcbx_app_priority_entry_t * cee_app_pri_tbl,IN const u8_t cee_app_pri_tbl_size,INOUT dcb_classif_elem_t * classif_table,OUT u8_t * is_iscsi_cee_rec)6002*d14abf15SRobert Mustacchi lm_dcbx_ie_classif_parse_cee_arrray(
6003*d14abf15SRobert Mustacchi     INOUT       lm_device_t                 *pdev,
6004*d14abf15SRobert Mustacchi     IN const    dcbx_app_priority_entry_t   *cee_app_pri_tbl,
6005*d14abf15SRobert Mustacchi     IN const    u8_t                        cee_app_pri_tbl_size,
6006*d14abf15SRobert Mustacchi     INOUT       dcb_classif_elem_t          *classif_table,
6007*d14abf15SRobert Mustacchi     OUT         u8_t                        *is_iscsi_cee_rec
6008*d14abf15SRobert Mustacchi     )
6009*d14abf15SRobert Mustacchi {
6010*d14abf15SRobert Mustacchi     u8_t                        cee_index           = 0;
6011*d14abf15SRobert Mustacchi     u32_t                       pri                 = 0;
6012*d14abf15SRobert Mustacchi     dcb_condition_selector_t    condition_selector  = 0;
6013*d14abf15SRobert Mustacchi     u8_t                        num_entry_used      = 0;
6014*d14abf15SRobert Mustacchi     u8_t                        dummy_flag          = FALSE;
6015*d14abf15SRobert Mustacchi 
6016*d14abf15SRobert Mustacchi     if(CHK_NULL(cee_app_pri_tbl))
6017*d14abf15SRobert Mustacchi     {
6018*d14abf15SRobert Mustacchi         return 0;
6019*d14abf15SRobert Mustacchi     }
6020*d14abf15SRobert Mustacchi 
6021*d14abf15SRobert Mustacchi     for( cee_index = 0;
6022*d14abf15SRobert Mustacchi          (cee_index < cee_app_pri_tbl_size);
6023*d14abf15SRobert Mustacchi          cee_index++)
6024*d14abf15SRobert Mustacchi     {
6025*d14abf15SRobert Mustacchi         pri = MAX_PFC_PRIORITIES;
6026*d14abf15SRobert Mustacchi 
6027*d14abf15SRobert Mustacchi         if(0 == GET_FLAGS(cee_app_pri_tbl[cee_index].appBitfield, DCBX_APP_ENTRY_VALID))
6028*d14abf15SRobert Mustacchi         {
6029*d14abf15SRobert Mustacchi             continue;
6030*d14abf15SRobert Mustacchi         }
6031*d14abf15SRobert Mustacchi 
6032*d14abf15SRobert Mustacchi         /********************************************************************/
6033*d14abf15SRobert Mustacchi         /******** start parse entry to from CEE format to IEEE format********/
6034*d14abf15SRobert Mustacchi         if(GET_FLAGS(cee_app_pri_tbl[cee_index].appBitfield, DCBX_APP_SF_ETH_TYPE))
6035*d14abf15SRobert Mustacchi         {
6036*d14abf15SRobert Mustacchi             condition_selector = DCB_CONDITION_ETHERTYPE;
6037*d14abf15SRobert Mustacchi         }
6038*d14abf15SRobert Mustacchi         else if(GET_FLAGS(cee_app_pri_tbl[cee_index].appBitfield, DCBX_APP_SF_PORT))
6039*d14abf15SRobert Mustacchi         {
6040*d14abf15SRobert Mustacchi             condition_selector = DCB_CONDITION_TCP_OR_UDP_PORT;
6041*d14abf15SRobert Mustacchi         }
6042*d14abf15SRobert Mustacchi         else
6043*d14abf15SRobert Mustacchi         {
6044*d14abf15SRobert Mustacchi             DbgBreakMsg("lm_dcbx_classif_cee_to_ieee invalid appBitfield ");
6045*d14abf15SRobert Mustacchi             continue;
6046*d14abf15SRobert Mustacchi         }
6047*d14abf15SRobert Mustacchi 
6048*d14abf15SRobert Mustacchi         lm_dcbx_get_ap_priority(pdev, &pri, cee_app_pri_tbl[cee_index].pri_bitmap, &dummy_flag);
6049*d14abf15SRobert Mustacchi 
6050*d14abf15SRobert Mustacchi         if(MAX_PFC_PRIORITIES == pri)
6051*d14abf15SRobert Mustacchi         {
6052*d14abf15SRobert Mustacchi             if(0 == cee_app_pri_tbl[cee_index].pri_bitmap)
6053*d14abf15SRobert Mustacchi             {
6054*d14abf15SRobert Mustacchi                 // This is a patch:
6055*d14abf15SRobert Mustacchi                 // We don't assert as a request from DVT:(CQ64888 and CQ59423).
6056*d14abf15SRobert Mustacchi                 // A quote from Darshan (DVT) mail "Brocade expects (just like Navasota) that PFC
6057*d14abf15SRobert Mustacchi                 // be enabled on the iSCSI traffic class (which, I agree, is inappropriate). If the PFC is not set on the iSCSI
6058*d14abf15SRobert Mustacchi                 // traffic class then it sends the iSCSI App TLV with PRI bit map of zero irrespective of whatever PRI you have
6059*d14abf15SRobert Mustacchi                 // configured for iSCSI. Once PFC is enabled, it sends the correct App TLV bit map."
6060*d14abf15SRobert Mustacchi                 #if defined(DBG)
6061*d14abf15SRobert Mustacchi                 DbgMessage(pdev, FATAL, "lm_dcbx_ie_classif_parse_cee_arrray invalid pri for valid entry ");
6062*d14abf15SRobert Mustacchi                 #else
6063*d14abf15SRobert Mustacchi                 DbgBreakMsg("lm_dcbx_ie_classif_parse_cee_arrray invalid pri for valid entry ");
6064*d14abf15SRobert Mustacchi                 #endif
6065*d14abf15SRobert Mustacchi             }
6066*d14abf15SRobert Mustacchi             else
6067*d14abf15SRobert Mustacchi             {
6068*d14abf15SRobert Mustacchi                 DbgBreakMsg("lm_dcbx_ie_classif_parse_cee_arrray invalid pri for valid entry ");
6069*d14abf15SRobert Mustacchi             }
6070*d14abf15SRobert Mustacchi             continue;
6071*d14abf15SRobert Mustacchi         }
6072*d14abf15SRobert Mustacchi 
6073*d14abf15SRobert Mustacchi         lm_dcbx_ie_classif_set_entry( pdev,
6074*d14abf15SRobert Mustacchi                                       &(classif_table[num_entry_used]),
6075*d14abf15SRobert Mustacchi                                       condition_selector,
6076*d14abf15SRobert Mustacchi                                       cee_app_pri_tbl[cee_index].app_id,
6077*d14abf15SRobert Mustacchi                                       (u16_t)pri);
6078*d14abf15SRobert Mustacchi 
6079*d14abf15SRobert Mustacchi         num_entry_used++;
6080*d14abf15SRobert Mustacchi 
6081*d14abf15SRobert Mustacchi         // ISCSI is a special case until we will implement IEEE we can send DCB_CONDITION_TCP_PORT.
6082*d14abf15SRobert Mustacchi         if((DCB_CONDITION_TCP_OR_UDP_PORT == condition_selector) &&
6083*d14abf15SRobert Mustacchi            (TCP_PORT_ISCSI == cee_app_pri_tbl[cee_index].app_id))
6084*d14abf15SRobert Mustacchi         {
6085*d14abf15SRobert Mustacchi             (*is_iscsi_cee_rec) = TRUE;
6086*d14abf15SRobert Mustacchi         }
6087*d14abf15SRobert Mustacchi     }
6088*d14abf15SRobert Mustacchi 
6089*d14abf15SRobert Mustacchi     return num_entry_used;
6090*d14abf15SRobert Mustacchi }
6091*d14abf15SRobert Mustacchi /**
6092*d14abf15SRobert Mustacchi  * This function is only for verifying that the classification
6093*d14abf15SRobert Mustacchi  * Parameters sent to OS are coherent with local classification
6094*d14abf15SRobert Mustacchi  * parameters and that the parameters are generally coherent
6095*d14abf15SRobert Mustacchi  *
6096*d14abf15SRobert Mustacchi  * @param pdev
6097*d14abf15SRobert Mustacchi  * @param ieee_classif
6098*d14abf15SRobert Mustacchi  * @param event
6099*d14abf15SRobert Mustacchi  *
6100*d14abf15SRobert Mustacchi  * @return STATIC void
6101*d14abf15SRobert Mustacchi  */
6102*d14abf15SRobert Mustacchi STATIC void
lm_dcbx_ie_classif_cee_to_ieee_check_param_dbg(IN const lm_device_t * pdev,IN const dcb_classif_params_t * ieee_classif,IN const lm_event_code_t event)6103*d14abf15SRobert Mustacchi lm_dcbx_ie_classif_cee_to_ieee_check_param_dbg(
6104*d14abf15SRobert Mustacchi     IN const    lm_device_t             *pdev,
6105*d14abf15SRobert Mustacchi     IN const    dcb_classif_params_t    *ieee_classif,
6106*d14abf15SRobert Mustacchi     IN const    lm_event_code_t         event
6107*d14abf15SRobert Mustacchi     )
6108*d14abf15SRobert Mustacchi {
6109*d14abf15SRobert Mustacchi     dcb_classif_elem_t          *p_classif_elem                 = ieee_classif->classif_table;
6110*d14abf15SRobert Mustacchi     u8_t                        i                               = 0;
6111*d14abf15SRobert Mustacchi     lm_dcbx_ie_classif_dbg_t    classif_dbg[MAX_TRAFFIC_TYPE]   = {{0}};
6112*d14abf15SRobert Mustacchi 
6113*d14abf15SRobert Mustacchi     for(i = 0; i < ieee_classif->num_classif_elements; i++)
6114*d14abf15SRobert Mustacchi     {
6115*d14abf15SRobert Mustacchi         if(DCB_ACTION_PRIORITY != p_classif_elem[i].action_selector)
6116*d14abf15SRobert Mustacchi         {
6117*d14abf15SRobert Mustacchi             // VBD only supports condition_selector that is based on priority
6118*d14abf15SRobert Mustacchi             continue;
6119*d14abf15SRobert Mustacchi         }
6120*d14abf15SRobert Mustacchi 
6121*d14abf15SRobert Mustacchi         switch(p_classif_elem[i].condition_selector)
6122*d14abf15SRobert Mustacchi         {
6123*d14abf15SRobert Mustacchi         case DCB_CONDITION_DEFAULT:
6124*d14abf15SRobert Mustacchi             // Must be the first entry
6125*d14abf15SRobert Mustacchi             DbgBreakIf(0 != i);
6126*d14abf15SRobert Mustacchi             break;
6127*d14abf15SRobert Mustacchi 
6128*d14abf15SRobert Mustacchi         case DCB_CONDITION_TCP_PORT:
6129*d14abf15SRobert Mustacchi         case DCB_CONDITION_TCP_OR_UDP_PORT://Fall through
6130*d14abf15SRobert Mustacchi             if(TCP_PORT_ISCSI == p_classif_elem[i].condition_field)
6131*d14abf15SRobert Mustacchi             {
6132*d14abf15SRobert Mustacchi                 classif_dbg[LLFC_TRAFFIC_TYPE_ISCSI].pri = p_classif_elem[i].action_field;
6133*d14abf15SRobert Mustacchi                 classif_dbg[LLFC_TRAFFIC_TYPE_ISCSI].num_entries++;
6134*d14abf15SRobert Mustacchi             }
6135*d14abf15SRobert Mustacchi             break;
6136*d14abf15SRobert Mustacchi 
6137*d14abf15SRobert Mustacchi         case DCB_CONDITION_ETHERTYPE:
6138*d14abf15SRobert Mustacchi             if(ETH_TYPE_FCOE == p_classif_elem[i].condition_field)
6139*d14abf15SRobert Mustacchi             {
6140*d14abf15SRobert Mustacchi                 classif_dbg[LLFC_TRAFFIC_TYPE_FCOE].pri = p_classif_elem[i].action_field;
6141*d14abf15SRobert Mustacchi                 classif_dbg[LLFC_TRAFFIC_TYPE_FCOE].num_entries++;
6142*d14abf15SRobert Mustacchi             }
6143*d14abf15SRobert Mustacchi             break;
6144*d14abf15SRobert Mustacchi 
6145*d14abf15SRobert Mustacchi         case DCB_CONDITION_RESERVED:
6146*d14abf15SRobert Mustacchi         case DCB_CONDITION_UDP_PORT://Fall through
6147*d14abf15SRobert Mustacchi         case DCB_CONDITION_NETDIRECT_PORT://Fall through
6148*d14abf15SRobert Mustacchi             //Not supported by VBD
6149*d14abf15SRobert Mustacchi             break;
6150*d14abf15SRobert Mustacchi         case DCB_CONDITION_MAX:
6151*d14abf15SRobert Mustacchi         default:
6152*d14abf15SRobert Mustacchi             DbgBreakMsg("lm_dcbx_runtime_params_updated_en_classif_entries: illegal entry ");
6153*d14abf15SRobert Mustacchi             break;
6154*d14abf15SRobert Mustacchi         }
6155*d14abf15SRobert Mustacchi     }
6156*d14abf15SRobert Mustacchi 
6157*d14abf15SRobert Mustacchi     // traffic_type_priority and classification DCBX_OPERA parameters are derived both from local MIB
6158*d14abf15SRobert Mustacchi     if( LM_EVENT_CODE_DCBX_OPERA_CHANGE == event)
6159*d14abf15SRobert Mustacchi     {
6160*d14abf15SRobert Mustacchi         for(i = 0; i < MAX_TRAFFIC_TYPE; i++)
6161*d14abf15SRobert Mustacchi         {
6162*d14abf15SRobert Mustacchi             //num_entries is more interesting if num_entries =< 1 ,otherwise this is a unusually configuration.
6163*d14abf15SRobert Mustacchi             if(1 == classif_dbg[i].num_entries)
6164*d14abf15SRobert Mustacchi             {
6165*d14abf15SRobert Mustacchi                 DbgBreakIf(classif_dbg[i].pri !=
6166*d14abf15SRobert Mustacchi                            pdev->params.dcbx_port_params.app.traffic_type_priority[i]);
6167*d14abf15SRobert Mustacchi             }
6168*d14abf15SRobert Mustacchi         }
6169*d14abf15SRobert Mustacchi     }
6170*d14abf15SRobert Mustacchi 
6171*d14abf15SRobert Mustacchi }
6172*d14abf15SRobert Mustacchi /**
6173*d14abf15SRobert Mustacchi  * @description
6174*d14abf15SRobert Mustacchi  * Creat the IEEE settings from CEE settings.
6175*d14abf15SRobert Mustacchi  * If there is a given_tabel copy it to the beggining of the
6176*d14abf15SRobert Mustacchi  * ieee_classif.
6177*d14abf15SRobert Mustacchi  * After search the CEE (local /remote) entries (read from
6178*d14abf15SRobert Mustacchi  * chip)an add any valid CEE entry because it has a higher
6179*d14abf15SRobert Mustacchi  * priority than given_tabel.
6180*d14abf15SRobert Mustacchi  * @param pdev
6181*d14abf15SRobert Mustacchi  * @param cee_classif
6182*d14abf15SRobert Mustacchi  * @param ieee_classif
6183*d14abf15SRobert Mustacchi  * @param ieee_classif_alloc_size
6184*d14abf15SRobert Mustacchi  * @param given_tabel
6185*d14abf15SRobert Mustacchi  * @param given_tabel_alloc_size
6186*d14abf15SRobert Mustacchi  * @param flags
6187*d14abf15SRobert Mustacchi  *
6188*d14abf15SRobert Mustacchi  * @return STATIC void
6189*d14abf15SRobert Mustacchi  */
6190*d14abf15SRobert Mustacchi STATIC lm_status_t
lm_dcbx_ie_classif_cee_to_ieee(INOUT lm_device_t * pdev,IN const dcbx_app_priority_feature_t * cee_classif,IN const dcbx_app_priority_entry_t * cee_app_tbl_ext,IN const u8_t cee_app_tbl_ext_size,OUT dcb_classif_params_t * ieee_classif,IN const u32_t ieee_classif_alloc_size,OUT u32_t * flags,IN const lm_event_code_t event)6191*d14abf15SRobert Mustacchi lm_dcbx_ie_classif_cee_to_ieee(
6192*d14abf15SRobert Mustacchi     INOUT       lm_device_t                 *pdev,
6193*d14abf15SRobert Mustacchi     IN const    dcbx_app_priority_feature_t *cee_classif,
6194*d14abf15SRobert Mustacchi     IN const    dcbx_app_priority_entry_t   *cee_app_tbl_ext,
6195*d14abf15SRobert Mustacchi     IN const    u8_t                        cee_app_tbl_ext_size,
6196*d14abf15SRobert Mustacchi     OUT         dcb_classif_params_t        *ieee_classif,
6197*d14abf15SRobert Mustacchi     IN const    u32_t                       ieee_classif_alloc_size,
6198*d14abf15SRobert Mustacchi     OUT         u32_t                       *flags,
6199*d14abf15SRobert Mustacchi     IN const    lm_event_code_t             event
6200*d14abf15SRobert Mustacchi     )
6201*d14abf15SRobert Mustacchi {
6202*d14abf15SRobert Mustacchi     lm_dcbx_indicate_event_t    *indicate_event     = &pdev->dcbx_info.indicate_event;
6203*d14abf15SRobert Mustacchi     dcb_classif_elem_t          *classif_table      = ieee_classif->classif_table;
6204*d14abf15SRobert Mustacchi     lm_status_t                 lm_status           = LM_STATUS_SUCCESS;
6205*d14abf15SRobert Mustacchi     u16_t                       num_entry_used      = 0;
6206*d14abf15SRobert Mustacchi     u8_t                        is_iscsi_cee_rec    = FALSE;
6207*d14abf15SRobert Mustacchi 
6208*d14abf15SRobert Mustacchi     DbgBreakIf(0 != (ieee_classif_alloc_size % sizeof(dcb_classif_elem_t)));
6209*d14abf15SRobert Mustacchi 
6210*d14abf15SRobert Mustacchi     // Check enablement of classification
6211*d14abf15SRobert Mustacchi     if( LM_EVENT_CODE_DCBX_OPERA_CHANGE == event)
6212*d14abf15SRobert Mustacchi     {
6213*d14abf15SRobert Mustacchi         if(0 == pdev->params.dcbx_port_params.app.enabled)
6214*d14abf15SRobert Mustacchi         {
6215*d14abf15SRobert Mustacchi             return LM_STATUS_SUCCESS;
6216*d14abf15SRobert Mustacchi         }
6217*d14abf15SRobert Mustacchi         // Default must be the first entry.
6218*d14abf15SRobert Mustacchi         lm_dcbx_ie_classif_add_default(pdev,
6219*d14abf15SRobert Mustacchi                                        cee_classif,
6220*d14abf15SRobert Mustacchi                                        classif_table);
6221*d14abf15SRobert Mustacchi         num_entry_used++;
6222*d14abf15SRobert Mustacchi     }
6223*d14abf15SRobert Mustacchi     else
6224*d14abf15SRobert Mustacchi     {
6225*d14abf15SRobert Mustacchi         DbgBreakIf( LM_EVENT_CODE_DCBX_REMOTE_CHANGE != event);
6226*d14abf15SRobert Mustacchi         if(0 == cee_classif->enabled)
6227*d14abf15SRobert Mustacchi         {
6228*d14abf15SRobert Mustacchi             return LM_STATUS_SUCCESS;
6229*d14abf15SRobert Mustacchi         }
6230*d14abf15SRobert Mustacchi     }
6231*d14abf15SRobert Mustacchi 
6232*d14abf15SRobert Mustacchi     SET_FLAGS(*flags, DCB_PARAMS_CLASSIF_ENABLED);
6233*d14abf15SRobert Mustacchi 
6234*d14abf15SRobert Mustacchi     num_entry_used += lm_dcbx_ie_classif_parse_cee_arrray(
6235*d14abf15SRobert Mustacchi         pdev,
6236*d14abf15SRobert Mustacchi         cee_classif->app_pri_tbl,
6237*d14abf15SRobert Mustacchi         ARRSIZE(cee_classif->app_pri_tbl),
6238*d14abf15SRobert Mustacchi         &(classif_table[num_entry_used]),
6239*d14abf15SRobert Mustacchi         &is_iscsi_cee_rec);
6240*d14abf15SRobert Mustacchi 
6241*d14abf15SRobert Mustacchi     num_entry_used += lm_dcbx_ie_classif_parse_cee_arrray(
6242*d14abf15SRobert Mustacchi         pdev,
6243*d14abf15SRobert Mustacchi         cee_app_tbl_ext,
6244*d14abf15SRobert Mustacchi         cee_app_tbl_ext_size,
6245*d14abf15SRobert Mustacchi         &(classif_table[num_entry_used]),
6246*d14abf15SRobert Mustacchi         &is_iscsi_cee_rec);
6247*d14abf15SRobert Mustacchi 
6248*d14abf15SRobert Mustacchi     // If the operational configuration from MCP contains an entry with 'TCP or UDP port' = 3260 use that entry,
6249*d14abf15SRobert Mustacchi     //     Else if OS configuration contained an entry with 'TCP port' = 3260 use that entry,
6250*d14abf15SRobert Mustacchi     //     Else use the default configuration.
6251*d14abf15SRobert Mustacchi     if(( LM_EVENT_CODE_DCBX_OPERA_CHANGE == event) &&
6252*d14abf15SRobert Mustacchi         ( FALSE == is_iscsi_cee_rec) &&
6253*d14abf15SRobert Mustacchi         ( LM_DCBX_ILLEGAL_PRI != indicate_event->iscsi_tcp_pri))
6254*d14abf15SRobert Mustacchi     {
6255*d14abf15SRobert Mustacchi         DbgBreakIf(pdev->params.dcbx_port_params.app.traffic_type_priority[LLFC_TRAFFIC_TYPE_ISCSI] !=
6256*d14abf15SRobert Mustacchi                    indicate_event->iscsi_tcp_pri);
6257*d14abf15SRobert Mustacchi 
6258*d14abf15SRobert Mustacchi         lm_dcbx_ie_classif_set_entry( pdev,
6259*d14abf15SRobert Mustacchi                                       &(classif_table[num_entry_used]),
6260*d14abf15SRobert Mustacchi                                       DCB_CONDITION_TCP_PORT,
6261*d14abf15SRobert Mustacchi                                       TCP_PORT_ISCSI,
6262*d14abf15SRobert Mustacchi                                       indicate_event->iscsi_tcp_pri);
6263*d14abf15SRobert Mustacchi         num_entry_used++;
6264*d14abf15SRobert Mustacchi     }
6265*d14abf15SRobert Mustacchi 
6266*d14abf15SRobert Mustacchi     ieee_classif->num_classif_elements = num_entry_used;
6267*d14abf15SRobert Mustacchi 
6268*d14abf15SRobert Mustacchi     lm_dcbx_ie_classif_cee_to_ieee_check_param_dbg(pdev,
6269*d14abf15SRobert Mustacchi                                                    ieee_classif,
6270*d14abf15SRobert Mustacchi                                                    event);
6271*d14abf15SRobert Mustacchi 
6272*d14abf15SRobert Mustacchi     return lm_status;
6273*d14abf15SRobert Mustacchi }
6274*d14abf15SRobert Mustacchi /**
6275*d14abf15SRobert Mustacchi  * Check if there is a classification parameter update
6276*d14abf15SRobert Mustacchi  * @param pdev
6277*d14abf15SRobert Mustacchi  * @param params_prev
6278*d14abf15SRobert Mustacchi  * @param params_newest
6279*d14abf15SRobert Mustacchi  *
6280*d14abf15SRobert Mustacchi  * @return STATIC u8_t
6281*d14abf15SRobert Mustacchi  */
6282*d14abf15SRobert Mustacchi STATIC u8_t
lm_dcbx_ie_classif_check_if_params_changed(IN const dcb_classif_params_t * params_prev,IN const dcb_classif_params_t * params_newest)6283*d14abf15SRobert Mustacchi lm_dcbx_ie_classif_check_if_params_changed(
6284*d14abf15SRobert Mustacchi     IN  const dcb_classif_params_t    *params_prev,
6285*d14abf15SRobert Mustacchi     IN  const dcb_classif_params_t    *params_newest)
6286*d14abf15SRobert Mustacchi {
6287*d14abf15SRobert Mustacchi     dcb_classif_elem_t  *p_classif_prev = params_prev->classif_table;
6288*d14abf15SRobert Mustacchi     dcb_classif_elem_t  *p_classif_newest = params_newest->classif_table;
6289*d14abf15SRobert Mustacchi     u16_t               index_prev = 0;
6290*d14abf15SRobert Mustacchi     u16_t               index_newest = 0;
6291*d14abf15SRobert Mustacchi     u8_t                is_entry_found = 0;
6292*d14abf15SRobert Mustacchi 
6293*d14abf15SRobert Mustacchi     if(params_prev->num_classif_elements != params_newest->num_classif_elements)
6294*d14abf15SRobert Mustacchi     {
6295*d14abf15SRobert Mustacchi         return TRUE;
6296*d14abf15SRobert Mustacchi     }
6297*d14abf15SRobert Mustacchi 
6298*d14abf15SRobert Mustacchi     for(index_prev = 0 ; index_prev < params_prev->num_classif_elements ; index_prev++)
6299*d14abf15SRobert Mustacchi     {
6300*d14abf15SRobert Mustacchi         is_entry_found = FALSE;
6301*d14abf15SRobert Mustacchi         for(index_newest = 0 ; index_newest < params_prev->num_classif_elements ; index_newest++)
6302*d14abf15SRobert Mustacchi         {
6303*d14abf15SRobert Mustacchi             if(mm_memcmp(&(p_classif_prev[index_prev]),
6304*d14abf15SRobert Mustacchi                          &(p_classif_newest[index_newest]),
6305*d14abf15SRobert Mustacchi                          sizeof(p_classif_prev[index_prev])))
6306*d14abf15SRobert Mustacchi             {
6307*d14abf15SRobert Mustacchi                 is_entry_found = TRUE;
6308*d14abf15SRobert Mustacchi                 break;
6309*d14abf15SRobert Mustacchi             }
6310*d14abf15SRobert Mustacchi         }
6311*d14abf15SRobert Mustacchi 
6312*d14abf15SRobert Mustacchi         if(FALSE == is_entry_found)
6313*d14abf15SRobert Mustacchi         {
6314*d14abf15SRobert Mustacchi             return TRUE;
6315*d14abf15SRobert Mustacchi         }
6316*d14abf15SRobert Mustacchi     }
6317*d14abf15SRobert Mustacchi 
6318*d14abf15SRobert Mustacchi     return FALSE;
6319*d14abf15SRobert Mustacchi }
6320*d14abf15SRobert Mustacchi /**
6321*d14abf15SRobert Mustacchi  * @description
6322*d14abf15SRobert Mustacchi  * Creat the indicate event struct based on data read from chip.
6323*d14abf15SRobert Mustacchi  * If the data has change call upper layer indicate event.
6324*d14abf15SRobert Mustacchi  * @param pdev
6325*d14abf15SRobert Mustacchi  * @param indicate_params
6326*d14abf15SRobert Mustacchi  * @param dcbx_features
6327*d14abf15SRobert Mustacchi  * @param event
6328*d14abf15SRobert Mustacchi  * @param ieee_classif_alloc_size
6329*d14abf15SRobert Mustacchi  * @param given_tabel
6330*d14abf15SRobert Mustacchi  * @param given_tabel_alloc_size
6331*d14abf15SRobert Mustacchi  * @param ets_given
6332*d14abf15SRobert Mustacchi  * @param is_ets_change
6333*d14abf15SRobert Mustacchi  * @param is_classif_change
6334*d14abf15SRobert Mustacchi  *
6335*d14abf15SRobert Mustacchi  * @return STATIC lm_status_t
6336*d14abf15SRobert Mustacchi  */
6337*d14abf15SRobert Mustacchi STATIC lm_status_t
lm_dcbx_ie_check_if_param_change_common(INOUT lm_device_t * pdev,INOUT dcb_indicate_event_params_t * indicate_params,IN dcbx_features_t * dcbx_features,IN const dcbx_app_priority_entry_t * cee_app_tbl_ext,IN const u8_t cee_app_tbl_ext_size,IN const lm_event_code_t event,IN const u32_t ieee_classif_alloc_size,IN const lm_dcbx_ie_ets_ieee_config_state ets_ieee_config_state,IN const dcb_ets_tsa_param_t * ets_ieee_config,IN const u8_t is_ets_change)6338*d14abf15SRobert Mustacchi lm_dcbx_ie_check_if_param_change_common(
6339*d14abf15SRobert Mustacchi     INOUT       lm_device_t                         *pdev,
6340*d14abf15SRobert Mustacchi     INOUT       dcb_indicate_event_params_t         *indicate_params,
6341*d14abf15SRobert Mustacchi     IN          dcbx_features_t                     *dcbx_features,
6342*d14abf15SRobert Mustacchi     IN const    dcbx_app_priority_entry_t           *cee_app_tbl_ext,
6343*d14abf15SRobert Mustacchi     IN const    u8_t                                cee_app_tbl_ext_size,
6344*d14abf15SRobert Mustacchi     IN const    lm_event_code_t                     event,
6345*d14abf15SRobert Mustacchi     IN const    u32_t                               ieee_classif_alloc_size,
6346*d14abf15SRobert Mustacchi     IN const    lm_dcbx_ie_ets_ieee_config_state    ets_ieee_config_state,
6347*d14abf15SRobert Mustacchi     IN const    dcb_ets_tsa_param_t                 *ets_ieee_config,
6348*d14abf15SRobert Mustacchi     IN const    u8_t                                is_ets_change)
6349*d14abf15SRobert Mustacchi {
6350*d14abf15SRobert Mustacchi     dcb_indicate_event_params_t indicate_newest_params  = {0};
6351*d14abf15SRobert Mustacchi     lm_status_t                 lm_status               = LM_STATUS_SUCCESS;
6352*d14abf15SRobert Mustacchi     u8_t                        is_changed              = 0;
6353*d14abf15SRobert Mustacchi 
6354*d14abf15SRobert Mustacchi     // Allocate local buffer that is enough for all entries given and read from chip
6355*d14abf15SRobert Mustacchi     indicate_newest_params.classif_params.classif_table =
6356*d14abf15SRobert Mustacchi         mm_rt_alloc_mem(pdev, ieee_classif_alloc_size, pdev->dcbx_info.indicate_event.lm_cli_idx);
6357*d14abf15SRobert Mustacchi 
6358*d14abf15SRobert Mustacchi     if(CHK_NULL(indicate_newest_params.classif_params.classif_table))
6359*d14abf15SRobert Mustacchi     {
6360*d14abf15SRobert Mustacchi         return LM_STATUS_RESOURCE;
6361*d14abf15SRobert Mustacchi     }
6362*d14abf15SRobert Mustacchi     mm_mem_zero(indicate_newest_params.classif_params.classif_table, ieee_classif_alloc_size);
6363*d14abf15SRobert Mustacchi 
6364*d14abf15SRobert Mustacchi     lm_dcbx_ie_pfc_cee_to_ieee(pdev,
6365*d14abf15SRobert Mustacchi                                &dcbx_features->pfc,
6366*d14abf15SRobert Mustacchi                                &indicate_newest_params.pfc_params,
6367*d14abf15SRobert Mustacchi                                &indicate_newest_params.flags,
6368*d14abf15SRobert Mustacchi                                event
6369*d14abf15SRobert Mustacchi                                );
6370*d14abf15SRobert Mustacchi 
6371*d14abf15SRobert Mustacchi     if(FALSE == mm_memcmp(&indicate_params->pfc_params,
6372*d14abf15SRobert Mustacchi                           &indicate_newest_params.pfc_params ,
6373*d14abf15SRobert Mustacchi                           sizeof(dcb_pfc_param_t)))
6374*d14abf15SRobert Mustacchi     {
6375*d14abf15SRobert Mustacchi         is_changed = TRUE;
6376*d14abf15SRobert Mustacchi         SET_FLAGS(indicate_newest_params.flags, DCB_PARAMS_PFC_CHANGED);
6377*d14abf15SRobert Mustacchi     }
6378*d14abf15SRobert Mustacchi 
6379*d14abf15SRobert Mustacchi     if(lm_dcbx_ets_ieee_config_not_valid == ets_ieee_config_state)
6380*d14abf15SRobert Mustacchi     {
6381*d14abf15SRobert Mustacchi         lm_dcbx_ie_ets_cee_to_ieee(pdev,
6382*d14abf15SRobert Mustacchi                                    &dcbx_features->ets,
6383*d14abf15SRobert Mustacchi                                    &indicate_newest_params.ets_params,
6384*d14abf15SRobert Mustacchi                                    &indicate_newest_params.flags,
6385*d14abf15SRobert Mustacchi                                    event
6386*d14abf15SRobert Mustacchi                                    );
6387*d14abf15SRobert Mustacchi     }
6388*d14abf15SRobert Mustacchi     else
6389*d14abf15SRobert Mustacchi     {
6390*d14abf15SRobert Mustacchi         if(lm_dcbx_ets_ieee_config_en == ets_ieee_config_state)
6391*d14abf15SRobert Mustacchi         {
6392*d14abf15SRobert Mustacchi             SET_FLAGS(indicate_newest_params.flags, DCB_PARAMS_ETS_ENABLED);
6393*d14abf15SRobert Mustacchi             // copy the ets_params that were before (ETS params given from upper module)
6394*d14abf15SRobert Mustacchi             mm_memcpy(&indicate_newest_params.ets_params,
6395*d14abf15SRobert Mustacchi                       ets_ieee_config,
6396*d14abf15SRobert Mustacchi                       sizeof(dcb_ets_tsa_param_t));
6397*d14abf15SRobert Mustacchi         }
6398*d14abf15SRobert Mustacchi         else
6399*d14abf15SRobert Mustacchi         {
6400*d14abf15SRobert Mustacchi             DbgBreakIf(lm_dcbx_ets_ieee_config_di != ets_ieee_config_state);
6401*d14abf15SRobert Mustacchi 
6402*d14abf15SRobert Mustacchi             RESET_FLAGS(indicate_newest_params.flags, DCB_PARAMS_ETS_ENABLED);
6403*d14abf15SRobert Mustacchi             mm_mem_zero(&indicate_newest_params.ets_params,
6404*d14abf15SRobert Mustacchi                       sizeof(dcb_ets_tsa_param_t));
6405*d14abf15SRobert Mustacchi         }
6406*d14abf15SRobert Mustacchi     }
6407*d14abf15SRobert Mustacchi 
6408*d14abf15SRobert Mustacchi     if((FALSE == mm_memcmp(&indicate_params->ets_params,
6409*d14abf15SRobert Mustacchi                           &indicate_newest_params.ets_params ,
6410*d14abf15SRobert Mustacchi                           sizeof(dcb_ets_tsa_param_t))) ||
6411*d14abf15SRobert Mustacchi        (TRUE == is_ets_change))
6412*d14abf15SRobert Mustacchi     {
6413*d14abf15SRobert Mustacchi         is_changed = TRUE;
6414*d14abf15SRobert Mustacchi         if(GET_FLAGS(indicate_newest_params.flags, DCB_PARAMS_ETS_ENABLED))
6415*d14abf15SRobert Mustacchi         {
6416*d14abf15SRobert Mustacchi             SET_FLAGS(indicate_newest_params.flags, DCB_PARAMS_ETS_CHANGED);
6417*d14abf15SRobert Mustacchi         }
6418*d14abf15SRobert Mustacchi     }
6419*d14abf15SRobert Mustacchi 
6420*d14abf15SRobert Mustacchi     lm_status = lm_dcbx_ie_classif_cee_to_ieee(pdev,
6421*d14abf15SRobert Mustacchi                                               &dcbx_features->app,
6422*d14abf15SRobert Mustacchi                                               cee_app_tbl_ext,
6423*d14abf15SRobert Mustacchi                                               cee_app_tbl_ext_size,
6424*d14abf15SRobert Mustacchi                                               &indicate_newest_params.classif_params,
6425*d14abf15SRobert Mustacchi                                               ieee_classif_alloc_size,
6426*d14abf15SRobert Mustacchi                                               &indicate_newest_params.flags,
6427*d14abf15SRobert Mustacchi                                               event
6428*d14abf15SRobert Mustacchi                                               );
6429*d14abf15SRobert Mustacchi 
6430*d14abf15SRobert Mustacchi     DbgBreakIf(LM_STATUS_SUCCESS != lm_status);
6431*d14abf15SRobert Mustacchi 
6432*d14abf15SRobert Mustacchi     if(TRUE == lm_dcbx_ie_classif_check_if_params_changed(
6433*d14abf15SRobert Mustacchi                         &indicate_params->classif_params,
6434*d14abf15SRobert Mustacchi                         &indicate_newest_params.classif_params))
6435*d14abf15SRobert Mustacchi     {
6436*d14abf15SRobert Mustacchi         is_changed = TRUE;
6437*d14abf15SRobert Mustacchi         SET_FLAGS(indicate_newest_params.flags, DCB_PARAMS_CLASSIF_CHANGED);
6438*d14abf15SRobert Mustacchi     }
6439*d14abf15SRobert Mustacchi 
6440*d14abf15SRobert Mustacchi     if(TRUE == is_changed)
6441*d14abf15SRobert Mustacchi     {
6442*d14abf15SRobert Mustacchi 
6443*d14abf15SRobert Mustacchi         mm_memcpy(&indicate_params->flags,
6444*d14abf15SRobert Mustacchi                   &indicate_newest_params.flags,
6445*d14abf15SRobert Mustacchi                   sizeof(indicate_newest_params.flags));
6446*d14abf15SRobert Mustacchi 
6447*d14abf15SRobert Mustacchi         mm_memcpy(&indicate_params->pfc_params,
6448*d14abf15SRobert Mustacchi                   &indicate_newest_params.pfc_params,
6449*d14abf15SRobert Mustacchi                   sizeof(indicate_newest_params.pfc_params));
6450*d14abf15SRobert Mustacchi 
6451*d14abf15SRobert Mustacchi         mm_memcpy(&indicate_params->ets_params,
6452*d14abf15SRobert Mustacchi                   &indicate_newest_params.ets_params,
6453*d14abf15SRobert Mustacchi                   sizeof(indicate_newest_params.ets_params));
6454*d14abf15SRobert Mustacchi 
6455*d14abf15SRobert Mustacchi         /* Start Update indicate_params with newest temp buffer params  */
6456*d14abf15SRobert Mustacchi         mm_memcpy(indicate_params->classif_params.classif_table,
6457*d14abf15SRobert Mustacchi                   indicate_newest_params.classif_params.classif_table,
6458*d14abf15SRobert Mustacchi                   ieee_classif_alloc_size);
6459*d14abf15SRobert Mustacchi 
6460*d14abf15SRobert Mustacchi         indicate_params->classif_params.num_classif_elements = indicate_newest_params.classif_params.num_classif_elements;
6461*d14abf15SRobert Mustacchi 
6462*d14abf15SRobert Mustacchi 
6463*d14abf15SRobert Mustacchi         /* End: Update indicate_params with newest temp buffer params  */
6464*d14abf15SRobert Mustacchi #ifdef _VBD_CMD_
6465*d14abf15SRobert Mustacchi         MM_DCB_INDICATE_EVENT(pdev,event,(u8_t*)indicate_params, sizeof(dcb_indicate_event_params_t));
6466*d14abf15SRobert Mustacchi #endif
6467*d14abf15SRobert Mustacchi #ifdef _VBD_
6468*d14abf15SRobert Mustacchi         MM_DCB_INDICATE_EVENT(pdev,event,(u8_t*)indicate_params, sizeof(dcb_indicate_event_params_t));
6469*d14abf15SRobert Mustacchi #endif
6470*d14abf15SRobert Mustacchi     }
6471*d14abf15SRobert Mustacchi     // Free the local allocated buffer
6472*d14abf15SRobert Mustacchi     mm_rt_free_mem(pdev,
6473*d14abf15SRobert Mustacchi                    indicate_newest_params.classif_params.classif_table,
6474*d14abf15SRobert Mustacchi                    ieee_classif_alloc_size,
6475*d14abf15SRobert Mustacchi                    pdev->dcbx_info.indicate_event.lm_cli_idx);
6476*d14abf15SRobert Mustacchi     return lm_status;
6477*d14abf15SRobert Mustacchi }
6478*d14abf15SRobert Mustacchi /**
6479*d14abf15SRobert Mustacchi  * @description
6480*d14abf15SRobert Mustacchi  *  Check if local parameter has change , if they have change
6481*d14abf15SRobert Mustacchi  *  indicate event to upper layer.
6482*d14abf15SRobert Mustacchi  * @param pdev
6483*d14abf15SRobert Mustacchi  * @param p_local_mib
6484*d14abf15SRobert Mustacchi  * @param dcbx_neg_res_offset
6485*d14abf15SRobert Mustacchi  * @param is_ets_change
6486*d14abf15SRobert Mustacchi  * @param is_classif_change
6487*d14abf15SRobert Mustacchi  *
6488*d14abf15SRobert Mustacchi  * @return lm_status_t
6489*d14abf15SRobert Mustacchi  */
6490*d14abf15SRobert Mustacchi lm_status_t
lm_dcbx_ie_check_if_param_change_local(INOUT lm_device_t * pdev,IN lldp_local_mib_t * p_in_local_mib,IN lldp_local_mib_ext_t * p_in_local_mib_ext,IN const u8_t is_ets_change)6491*d14abf15SRobert Mustacchi lm_dcbx_ie_check_if_param_change_local(
6492*d14abf15SRobert Mustacchi     INOUT       lm_device_t             *pdev,
6493*d14abf15SRobert Mustacchi     IN          lldp_local_mib_t        *p_in_local_mib,
6494*d14abf15SRobert Mustacchi     IN          lldp_local_mib_ext_t    *p_in_local_mib_ext,
6495*d14abf15SRobert Mustacchi     IN const    u8_t                    is_ets_change)
6496*d14abf15SRobert Mustacchi {
6497*d14abf15SRobert Mustacchi     lm_dcbx_indicate_event_t    *indicate_event     = &pdev->dcbx_info.indicate_event;
6498*d14abf15SRobert Mustacchi     lldp_local_mib_t            local_mib           = {0};
6499*d14abf15SRobert Mustacchi     lldp_local_mib_ext_t        local_mib_ext       = {0};
6500*d14abf15SRobert Mustacchi     lm_status_t                 lm_status           = LM_STATUS_SUCCESS;
6501*d14abf15SRobert Mustacchi     lldp_local_mib_t            *p_local_mib        = p_in_local_mib;
6502*d14abf15SRobert Mustacchi     lldp_local_mib_ext_t        *p_local_mib_ext    = p_in_local_mib_ext;
6503*d14abf15SRobert Mustacchi 
6504*d14abf15SRobert Mustacchi     if(NULL == p_local_mib)
6505*d14abf15SRobert Mustacchi     {
6506*d14abf15SRobert Mustacchi         // Local MIB was not received read local MIB
6507*d14abf15SRobert Mustacchi         lm_status = lm_dcbx_read_local_mib_fields(pdev,
6508*d14abf15SRobert Mustacchi                                                   &local_mib,
6509*d14abf15SRobert Mustacchi                                                   &local_mib_ext);
6510*d14abf15SRobert Mustacchi 
6511*d14abf15SRobert Mustacchi         if(LM_STATUS_SUCCESS != lm_status)
6512*d14abf15SRobert Mustacchi         {
6513*d14abf15SRobert Mustacchi             return lm_status;
6514*d14abf15SRobert Mustacchi         }
6515*d14abf15SRobert Mustacchi 
6516*d14abf15SRobert Mustacchi         p_local_mib = &local_mib;
6517*d14abf15SRobert Mustacchi         p_local_mib_ext = &local_mib_ext;
6518*d14abf15SRobert Mustacchi     }
6519*d14abf15SRobert Mustacchi 
6520*d14abf15SRobert Mustacchi     if(CHK_NULL(p_local_mib) || CHK_NULL(p_local_mib_ext))
6521*d14abf15SRobert Mustacchi     {
6522*d14abf15SRobert Mustacchi         DbgBreakMsg("lm_get_dcbx_drv_param wrong in parameters ");
6523*d14abf15SRobert Mustacchi         return lm_status;
6524*d14abf15SRobert Mustacchi     }
6525*d14abf15SRobert Mustacchi 
6526*d14abf15SRobert Mustacchi     lm_status = lm_dcbx_ie_check_if_param_change_common(
6527*d14abf15SRobert Mustacchi         pdev,
6528*d14abf15SRobert Mustacchi         &(indicate_event->local_params),
6529*d14abf15SRobert Mustacchi         &p_local_mib->features,
6530*d14abf15SRobert Mustacchi         p_local_mib_ext->app_pri_tbl_ext,
6531*d14abf15SRobert Mustacchi         ARRSIZE(p_local_mib_ext->app_pri_tbl_ext),
6532*d14abf15SRobert Mustacchi         LM_EVENT_CODE_DCBX_OPERA_CHANGE,
6533*d14abf15SRobert Mustacchi         LM_DCBX_IE_CLASSIF_TABLE_ALOC_SIZE_LOCAL,
6534*d14abf15SRobert Mustacchi         indicate_event->ets_ieee_config_state,
6535*d14abf15SRobert Mustacchi         &indicate_event->ets_ieee_params_config,
6536*d14abf15SRobert Mustacchi         is_ets_change);
6537*d14abf15SRobert Mustacchi 
6538*d14abf15SRobert Mustacchi     DbgBreakIf(LM_STATUS_SUCCESS != lm_status);
6539*d14abf15SRobert Mustacchi 
6540*d14abf15SRobert Mustacchi     return lm_status;
6541*d14abf15SRobert Mustacchi }
6542*d14abf15SRobert Mustacchi /**
6543*d14abf15SRobert Mustacchi  * @description
6544*d14abf15SRobert Mustacchi  *  Check if Remote parameter has change , if they have change
6545*d14abf15SRobert Mustacchi  *  indicate event to upper layer.
6546*d14abf15SRobert Mustacchi  * @param pdev
6547*d14abf15SRobert Mustacchi  * @param dcbx_neg_res_offset
6548*d14abf15SRobert Mustacchi  *
6549*d14abf15SRobert Mustacchi  * @return lm_status_t
6550*d14abf15SRobert Mustacchi  */
6551*d14abf15SRobert Mustacchi lm_status_t
lm_dcbx_ie_check_if_param_change_remote(INOUT lm_device_t * pdev)6552*d14abf15SRobert Mustacchi lm_dcbx_ie_check_if_param_change_remote(
6553*d14abf15SRobert Mustacchi     INOUT   lm_device_t         *pdev)
6554*d14abf15SRobert Mustacchi {
6555*d14abf15SRobert Mustacchi     lldp_remote_mib_t   remote_mib  = {0};
6556*d14abf15SRobert Mustacchi     lm_status_t         lm_status   = LM_STATUS_SUCCESS;
6557*d14abf15SRobert Mustacchi 
6558*d14abf15SRobert Mustacchi     lm_status = lm_dcbx_read_remote_local_mib(pdev,
6559*d14abf15SRobert Mustacchi                                               (u32_t *)&remote_mib,
6560*d14abf15SRobert Mustacchi                                               DCBX_READ_REMOTE_MIB);
6561*d14abf15SRobert Mustacchi 
6562*d14abf15SRobert Mustacchi     if(LM_STATUS_SUCCESS != lm_status)
6563*d14abf15SRobert Mustacchi     {
6564*d14abf15SRobert Mustacchi         return lm_status;
6565*d14abf15SRobert Mustacchi     }
6566*d14abf15SRobert Mustacchi 
6567*d14abf15SRobert Mustacchi 
6568*d14abf15SRobert Mustacchi     lm_status = lm_dcbx_ie_check_if_param_change_common(
6569*d14abf15SRobert Mustacchi         pdev,
6570*d14abf15SRobert Mustacchi         &(pdev->dcbx_info.indicate_event.remote_params),
6571*d14abf15SRobert Mustacchi         &remote_mib.features,
6572*d14abf15SRobert Mustacchi         NULL,
6573*d14abf15SRobert Mustacchi         0,
6574*d14abf15SRobert Mustacchi         LM_EVENT_CODE_DCBX_REMOTE_CHANGE,
6575*d14abf15SRobert Mustacchi         LM_DCBX_IE_CLASSIF_TABLE_ALOC_SIZE_REMOTE,
6576*d14abf15SRobert Mustacchi         lm_dcbx_ets_ieee_config_not_valid,
6577*d14abf15SRobert Mustacchi         NULL,
6578*d14abf15SRobert Mustacchi         FALSE);
6579*d14abf15SRobert Mustacchi 
6580*d14abf15SRobert Mustacchi     DbgBreakIf(LM_STATUS_SUCCESS != lm_status);
6581*d14abf15SRobert Mustacchi 
6582*d14abf15SRobert Mustacchi     return lm_status;
6583*d14abf15SRobert Mustacchi }
6584*d14abf15SRobert Mustacchi /**
6585*d14abf15SRobert Mustacchi  * @description
6586*d14abf15SRobert Mustacchi  * This function will check if local or remote parameters have
6587*d14abf15SRobert Mustacchi  * changed if the parameters have change the function will
6588*d14abf15SRobert Mustacchi  * update upper layer.
6589*d14abf15SRobert Mustacchi  * Local parameters can be given :
6590*d14abf15SRobert Mustacchi  * 1. If we read local parameters to configure the chip we
6591*d14abf15SRobert Mustacchi  * should use the same parameter to update upper layer (although
6592*d14abf15SRobert Mustacchi  * if there was a change an interrupt is expected) 2.If we are
6593*d14abf15SRobert Mustacchi  * from update parameters flow from upper layer ETS and clasif
6594*d14abf15SRobert Mustacchi  * settings are not update to chip so if they change we will
6595*d14abf15SRobert Mustacchi  * update function.
6596*d14abf15SRobert Mustacchi  * @param pdev
6597*d14abf15SRobert Mustacchi  * @param p_local_mib
6598*d14abf15SRobert Mustacchi  * @param is_ets_change
6599*d14abf15SRobert Mustacchi  * @param is_classif_change
6600*d14abf15SRobert Mustacchi  *
6601*d14abf15SRobert Mustacchi  * @return lm_status_t
6602*d14abf15SRobert Mustacchi  */
6603*d14abf15SRobert Mustacchi lm_status_t
lm_dcbx_ie_check_if_param_change(INOUT lm_device_t * pdev,IN lldp_local_mib_t * p_local_mib,IN lldp_local_mib_ext_t * p_local_mib_ext,IN u8_t is_local_ets_change)6604*d14abf15SRobert Mustacchi lm_dcbx_ie_check_if_param_change(
6605*d14abf15SRobert Mustacchi     INOUT   lm_device_t             *pdev,
6606*d14abf15SRobert Mustacchi     IN      lldp_local_mib_t        *p_local_mib,
6607*d14abf15SRobert Mustacchi     IN      lldp_local_mib_ext_t    *p_local_mib_ext,
6608*d14abf15SRobert Mustacchi     IN      u8_t                    is_local_ets_change)
6609*d14abf15SRobert Mustacchi {
6610*d14abf15SRobert Mustacchi     lm_status_t lm_status               = LM_STATUS_SUCCESS;
6611*d14abf15SRobert Mustacchi     if(FALSE == pdev->dcbx_info.is_indicate_event_en)
6612*d14abf15SRobert Mustacchi     {
6613*d14abf15SRobert Mustacchi         DbgBreakMsg("lm_dcbx_runtime_params_updated_validate_pfc called but is_indicate_event_en is false");
6614*d14abf15SRobert Mustacchi         return LM_STATUS_FAILURE;
6615*d14abf15SRobert Mustacchi     }
6616*d14abf15SRobert Mustacchi 
6617*d14abf15SRobert Mustacchi 
6618*d14abf15SRobert Mustacchi     lm_status = lm_dcbx_ie_check_if_param_change_local(pdev,
6619*d14abf15SRobert Mustacchi                                                        p_local_mib,
6620*d14abf15SRobert Mustacchi                                                        p_local_mib_ext,
6621*d14abf15SRobert Mustacchi                                                        is_local_ets_change);
6622*d14abf15SRobert Mustacchi 
6623*d14abf15SRobert Mustacchi     DbgBreakIf(LM_STATUS_SUCCESS != lm_status);
6624*d14abf15SRobert Mustacchi 
6625*d14abf15SRobert Mustacchi     lm_status = lm_dcbx_ie_check_if_param_change_remote(pdev);
6626*d14abf15SRobert Mustacchi 
6627*d14abf15SRobert Mustacchi 
6628*d14abf15SRobert Mustacchi     DbgBreakIf(LM_STATUS_SUCCESS != lm_status);
6629*d14abf15SRobert Mustacchi 
6630*d14abf15SRobert Mustacchi     return lm_status;
6631*d14abf15SRobert Mustacchi }
6632*d14abf15SRobert Mustacchi /**
6633*d14abf15SRobert Mustacchi  *
6634*d14abf15SRobert Mustacchi  *
6635*d14abf15SRobert Mustacchi  * @author shayh (10/9/2011)
6636*d14abf15SRobert Mustacchi  *
6637*d14abf15SRobert Mustacchi  * @param pdev
6638*d14abf15SRobert Mustacchi  */
lm_dcbx_ie_update_bacs_state(INOUT lm_device_t * pdev,IN const u32_t flags)6639*d14abf15SRobert Mustacchi void lm_dcbx_ie_update_bacs_state(
6640*d14abf15SRobert Mustacchi     INOUT   lm_device_t *pdev,
6641*d14abf15SRobert Mustacchi     IN const    u32_t   flags
6642*d14abf15SRobert Mustacchi     )
6643*d14abf15SRobert Mustacchi {
6644*d14abf15SRobert Mustacchi     lm_dcbx_indicate_event_t *indicate_event = &pdev->dcbx_info.indicate_event;
6645*d14abf15SRobert Mustacchi 
6646*d14abf15SRobert Mustacchi     SET_FLAGS(indicate_event->dcb_current_oper_state_bitmap, DCB_STATE_CONFIGURED_BY_OS_QOS);
6647*d14abf15SRobert Mustacchi 
6648*d14abf15SRobert Mustacchi     if(GET_FLAGS(flags, DCB_PARAMS_WILLING))
6649*d14abf15SRobert Mustacchi     {
6650*d14abf15SRobert Mustacchi         SET_FLAGS(indicate_event->dcb_current_oper_state_bitmap,
6651*d14abf15SRobert Mustacchi                   DCB_STATE_CONFIGURED_BY_OS_QOS_TO_WILLING);
6652*d14abf15SRobert Mustacchi     }
6653*d14abf15SRobert Mustacchi     else
6654*d14abf15SRobert Mustacchi     {
6655*d14abf15SRobert Mustacchi         RESET_FLAGS(indicate_event->dcb_current_oper_state_bitmap,
6656*d14abf15SRobert Mustacchi                     DCB_STATE_CONFIGURED_BY_OS_QOS_TO_WILLING);
6657*d14abf15SRobert Mustacchi     }
6658*d14abf15SRobert Mustacchi }
6659*d14abf15SRobert Mustacchi /**
6660*d14abf15SRobert Mustacchi  * @description
6661*d14abf15SRobert Mustacchi  * 1.Update the local copy of the configuration parameters
6662*d14abf15SRobert Mustacchi  * 2.Set data to admin parameters (PFC settings classification
6663*d14abf15SRobert Mustacchi  * and PFC as willing ETS as not willing ) update MCP.
6664*d14abf15SRobert Mustacchi  * 3. If there are ETS or clasification changes to local
6665*d14abf15SRobert Mustacchi  * parameters Update HW/FW because MCP is only awre of PFC
6666*d14abf15SRobert Mustacchi  * changes (and will give us an interrupt if there are changes).
6667*d14abf15SRobert Mustacchi  * @param pdev
6668*d14abf15SRobert Mustacchi  * @param dcb_params
6669*d14abf15SRobert Mustacchi  * @param lm_cli_idx
6670*d14abf15SRobert Mustacchi  *
6671*d14abf15SRobert Mustacchi  * @return lm_status_t
6672*d14abf15SRobert Mustacchi  */
6673*d14abf15SRobert Mustacchi lm_status_t
lm_dcbx_ie_runtime_params_updated(INOUT struct _lm_device_t * pdev,INOUT dcb_indicate_event_params_t * dcb_params,IN const u8_t lm_cli_idx)6674*d14abf15SRobert Mustacchi lm_dcbx_ie_runtime_params_updated(
6675*d14abf15SRobert Mustacchi     INOUT       struct _lm_device_t             *pdev,
6676*d14abf15SRobert Mustacchi     INOUT       dcb_indicate_event_params_t     *dcb_params,
6677*d14abf15SRobert Mustacchi     IN const    u8_t                            lm_cli_idx)
6678*d14abf15SRobert Mustacchi {
6679*d14abf15SRobert Mustacchi     lm_dcbx_indicate_event_t *indicate_event    = &pdev->dcbx_info.indicate_event;
6680*d14abf15SRobert Mustacchi     lm_status_t lm_status                       = LM_STATUS_SUCCESS;
6681*d14abf15SRobert Mustacchi     u8_t        is_local_ets_change             = FALSE;
6682*d14abf15SRobert Mustacchi     u8_t        classif_change_mcp_not_aware    = FALSE;
6683*d14abf15SRobert Mustacchi     u8_t        is_ets_admin_updated            = FALSE;
6684*d14abf15SRobert Mustacchi 
6685*d14abf15SRobert Mustacchi     DbgBreakIf(lm_cli_idx != indicate_event->lm_cli_idx);
6686*d14abf15SRobert Mustacchi 
6687*d14abf15SRobert Mustacchi     if(FALSE == pdev->dcbx_info.is_indicate_event_en)
6688*d14abf15SRobert Mustacchi     {
6689*d14abf15SRobert Mustacchi         DbgBreakMsg("lm_dcbx_runtime_params_updated_validate_pfc called but is_indicate_event_en is false");
6690*d14abf15SRobert Mustacchi         return LM_STATUS_FAILURE;
6691*d14abf15SRobert Mustacchi     }
6692*d14abf15SRobert Mustacchi 
6693*d14abf15SRobert Mustacchi     /* Update admin MIB*/
6694*d14abf15SRobert Mustacchi     lm_status = lm_dcbx_ie_admin_mib_updated_runtime(pdev,
6695*d14abf15SRobert Mustacchi                                                      dcb_params,
6696*d14abf15SRobert Mustacchi                                                      &classif_change_mcp_not_aware,
6697*d14abf15SRobert Mustacchi                                                      &is_ets_admin_updated);
6698*d14abf15SRobert Mustacchi 
6699*d14abf15SRobert Mustacchi     if(LM_STATUS_SUCCESS != lm_status)
6700*d14abf15SRobert Mustacchi     {
6701*d14abf15SRobert Mustacchi         return lm_status;
6702*d14abf15SRobert Mustacchi     }
6703*d14abf15SRobert Mustacchi 
6704*d14abf15SRobert Mustacchi     lm_dcbx_ie_update_local_params(pdev,
6705*d14abf15SRobert Mustacchi                                    dcb_params,
6706*d14abf15SRobert Mustacchi                                    &is_local_ets_change,
6707*d14abf15SRobert Mustacchi                                    indicate_event->lm_cli_idx,
6708*d14abf15SRobert Mustacchi                                    is_ets_admin_updated
6709*d14abf15SRobert Mustacchi                                    );
6710*d14abf15SRobert Mustacchi 
6711*d14abf15SRobert Mustacchi     lm_dcbx_ie_dbg_copy_dcb_params(pdev,
6712*d14abf15SRobert Mustacchi                                    dcb_params,
6713*d14abf15SRobert Mustacchi                                    indicate_event->lm_cli_idx);
6714*d14abf15SRobert Mustacchi 
6715*d14abf15SRobert Mustacchi     lm_dcbx_ie_update_bacs_state(pdev,
6716*d14abf15SRobert Mustacchi                                  dcb_params->flags);
6717*d14abf15SRobert Mustacchi 
6718*d14abf15SRobert Mustacchi     if((TRUE == is_local_ets_change)||
6719*d14abf15SRobert Mustacchi         (TRUE == classif_change_mcp_not_aware))
6720*d14abf15SRobert Mustacchi     {
6721*d14abf15SRobert Mustacchi         // Update HW/FW with new ETS classification configuration.
6722*d14abf15SRobert Mustacchi         lm_status = lm_dcbx_set_params_and_read_mib(pdev,
6723*d14abf15SRobert Mustacchi                                                     is_local_ets_change,
6724*d14abf15SRobert Mustacchi                                                     TRUE);
6725*d14abf15SRobert Mustacchi 
6726*d14abf15SRobert Mustacchi     }
6727*d14abf15SRobert Mustacchi 
6728*d14abf15SRobert Mustacchi     return LM_STATUS_SUCCESS;
6729*d14abf15SRobert Mustacchi }
6730*d14abf15SRobert Mustacchi /**
6731*d14abf15SRobert Mustacchi  * @description
6732*d14abf15SRobert Mustacchi  *  Allocate indicate event bind structs.
6733*d14abf15SRobert Mustacchi  *  The dcb_local_params->classif_params.classif_table is RT and
6734*d14abf15SRobert Mustacchi  *  will be changed acording to the amount of entries that are
6735*d14abf15SRobert Mustacchi  *  given from upper layer.
6736*d14abf15SRobert Mustacchi  * @param lm_cli_idx
6737*d14abf15SRobert Mustacchi  *
6738*d14abf15SRobert Mustacchi  * @return lm_status_t
6739*d14abf15SRobert Mustacchi  */
6740*d14abf15SRobert Mustacchi lm_status_t
lm_dcbx_ie_initialize(INOUT struct _lm_device_t * pdev,IN const u8_t lm_cli_idx)6741*d14abf15SRobert Mustacchi lm_dcbx_ie_initialize(
6742*d14abf15SRobert Mustacchi     INOUT       struct _lm_device_t         *pdev,
6743*d14abf15SRobert Mustacchi     IN const    u8_t                        lm_cli_idx)
6744*d14abf15SRobert Mustacchi {
6745*d14abf15SRobert Mustacchi     lm_dcbx_indicate_event_t *indicate_event    = &pdev->dcbx_info.indicate_event;
6746*d14abf15SRobert Mustacchi     const u32_t classif_table_aloc_size_local   = LM_DCBX_IE_CLASSIF_TABLE_ALOC_SIZE_LOCAL;
6747*d14abf15SRobert Mustacchi     const u32_t classif_table_aloc_size_remote  = LM_DCBX_IE_CLASSIF_TABLE_ALOC_SIZE_REMOTE;
6748*d14abf15SRobert Mustacchi 
6749*d14abf15SRobert Mustacchi     DbgBreakIf(LM_CLI_IDX_MAX != indicate_event->lm_cli_idx);
6750*d14abf15SRobert Mustacchi     DbgBreakIf ((0 == pdev->params.b_dcb_indicate_event));
6751*d14abf15SRobert Mustacchi 
6752*d14abf15SRobert Mustacchi     DbgBreakIf((NULL != indicate_event->remote_params.classif_params.classif_table) ||
6753*d14abf15SRobert Mustacchi                (NULL != indicate_event->local_params.classif_params.classif_table)  ||
6754*d14abf15SRobert Mustacchi                (NULL != indicate_event->dcb_params_given_dbg.classif_params.classif_table));
6755*d14abf15SRobert Mustacchi 
6756*d14abf15SRobert Mustacchi     indicate_event->lm_cli_idx = lm_cli_idx;
6757*d14abf15SRobert Mustacchi 
6758*d14abf15SRobert Mustacchi     // Allocate dcb_remote_params
6759*d14abf15SRobert Mustacchi     indicate_event->remote_params.classif_params.classif_table =
6760*d14abf15SRobert Mustacchi         mm_alloc_mem(pdev, classif_table_aloc_size_remote, indicate_event->lm_cli_idx);
6761*d14abf15SRobert Mustacchi 
6762*d14abf15SRobert Mustacchi     if(CHK_NULL(indicate_event->remote_params.classif_params.classif_table))
6763*d14abf15SRobert Mustacchi     {
6764*d14abf15SRobert Mustacchi         DbgBreakMsg("lm_dcbx_ie_alloc_bind_structs allocation failed remote ");
6765*d14abf15SRobert Mustacchi         return LM_STATUS_RESOURCE;
6766*d14abf15SRobert Mustacchi     }
6767*d14abf15SRobert Mustacchi 
6768*d14abf15SRobert Mustacchi     // Allocate dcb_local_params
6769*d14abf15SRobert Mustacchi     //The only RT memory is the local table that can include upper layer classification entries
6770*d14abf15SRobert Mustacchi     indicate_event->local_params.classif_params.classif_table =
6771*d14abf15SRobert Mustacchi         mm_alloc_mem(pdev, classif_table_aloc_size_local, indicate_event->lm_cli_idx);
6772*d14abf15SRobert Mustacchi 
6773*d14abf15SRobert Mustacchi     if(CHK_NULL(indicate_event->local_params.classif_params.classif_table))
6774*d14abf15SRobert Mustacchi     {
6775*d14abf15SRobert Mustacchi         DbgBreakMsg("lm_dcbx_ie_alloc_bind_structs allocation failed local ");
6776*d14abf15SRobert Mustacchi         return LM_STATUS_RESOURCE;
6777*d14abf15SRobert Mustacchi     }
6778*d14abf15SRobert Mustacchi 
6779*d14abf15SRobert Mustacchi     indicate_event->dcb_params_given_dbg.classif_params.classif_table =
6780*d14abf15SRobert Mustacchi         mm_alloc_mem(pdev, LM_DCBX_IE_CLASSIF_TABLE_ALOC_SIZE_DBG, indicate_event->lm_cli_idx);
6781*d14abf15SRobert Mustacchi 
6782*d14abf15SRobert Mustacchi     if(CHK_NULL(indicate_event->dcb_params_given_dbg.classif_params.classif_table))
6783*d14abf15SRobert Mustacchi     {
6784*d14abf15SRobert Mustacchi         DbgBreakMsg("lm_dcbx_ie_alloc_bind_structs allocation failed given DBG");
6785*d14abf15SRobert Mustacchi         return LM_STATUS_RESOURCE;
6786*d14abf15SRobert Mustacchi     }
6787*d14abf15SRobert Mustacchi 
6788*d14abf15SRobert Mustacchi     return LM_STATUS_SUCCESS;
6789*d14abf15SRobert Mustacchi }
6790*d14abf15SRobert Mustacchi /**
6791*d14abf15SRobert Mustacchi  * @description
6792*d14abf15SRobert Mustacchi  * Free indicate event structs that were allocated by RT.
6793*d14abf15SRobert Mustacchi  * This code must be done from LPME while is_indicate_event_en
6794*d14abf15SRobert Mustacchi  * is still valid to avoid a race.
6795*d14abf15SRobert Mustacchi  * @param lm_cli_idx
6796*d14abf15SRobert Mustacchi  *
6797*d14abf15SRobert Mustacchi  * @return void
6798*d14abf15SRobert Mustacchi  */
6799*d14abf15SRobert Mustacchi void
lm_dcbx_ie_deinitialize(INOUT struct _lm_device_t * pdev,IN const u8_t lm_cli_idx)6800*d14abf15SRobert Mustacchi lm_dcbx_ie_deinitialize(
6801*d14abf15SRobert Mustacchi     INOUT       struct _lm_device_t         *pdev,
6802*d14abf15SRobert Mustacchi     IN const    u8_t                        lm_cli_idx)
6803*d14abf15SRobert Mustacchi {
6804*d14abf15SRobert Mustacchi     lm_dcbx_indicate_event_t    *indicate_event     = &pdev->dcbx_info.indicate_event;
6805*d14abf15SRobert Mustacchi 
6806*d14abf15SRobert Mustacchi     DbgBreakIf(lm_cli_idx != indicate_event->lm_cli_idx);
6807*d14abf15SRobert Mustacchi 
6808*d14abf15SRobert Mustacchi     DbgBreakIf(NULL == indicate_event->local_params.classif_params.classif_table);
6809*d14abf15SRobert Mustacchi     DbgBreakIf(NULL == indicate_event->remote_params.classif_params.classif_table);
6810*d14abf15SRobert Mustacchi     DbgBreakIf(NULL == indicate_event->dcb_params_given_dbg.classif_params.classif_table);
6811*d14abf15SRobert Mustacchi 
6812*d14abf15SRobert Mustacchi     lm_dcbx_ie_init_params(pdev, FALSE);
6813*d14abf15SRobert Mustacchi }
6814