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  *      This file contains functions that handle HW and FW attention
35*d14abf15SRobert Mustacchi  *
36*d14abf15SRobert Mustacchi  ******************************************************************************/
37*d14abf15SRobert Mustacchi 
38*d14abf15SRobert Mustacchi #include "lm5710.h"
39*d14abf15SRobert Mustacchi #include "general_atten_bits.h"
40*d14abf15SRobert Mustacchi #include "aeu_inputs.h"
41*d14abf15SRobert Mustacchi #include "command.h"
42*d14abf15SRobert Mustacchi 
lm_inc_er_debug_idx(lm_device_t * pdev)43*d14abf15SRobert Mustacchi static INLINE void lm_inc_er_debug_idx(lm_device_t * pdev)
44*d14abf15SRobert Mustacchi {
45*d14abf15SRobert Mustacchi     pdev->debug_info.curr_er_debug_idx++;
46*d14abf15SRobert Mustacchi     if (pdev->debug_info.curr_er_debug_idx == MAX_ER_DEBUG_ENTRIES)
47*d14abf15SRobert Mustacchi     {
48*d14abf15SRobert Mustacchi         pdev->debug_info.curr_er_debug_idx=0;
49*d14abf15SRobert Mustacchi     }
50*d14abf15SRobert Mustacchi }
51*d14abf15SRobert Mustacchi 
52*d14abf15SRobert Mustacchi /**
53*d14abf15SRobert Mustacchi  * @description
54*d14abf15SRobert Mustacchi  *      called from attention handling routines, checks if the
55*d14abf15SRobert Mustacchi  *      attention received is an error which is recoverable via
56*d14abf15SRobert Mustacchi  *      process kill. If error recovery is disabled this
57*d14abf15SRobert Mustacchi  *      function always returns FALSE;
58*d14abf15SRobert Mustacchi  *
59*d14abf15SRobert Mustacchi  * @param pdev
60*d14abf15SRobert Mustacchi  * @param attn_sig : values of the after_invert registers read
61*d14abf15SRobert Mustacchi  *                 in the misc that indicate which attention
62*d14abf15SRobert Mustacchi  *                 occured
63*d14abf15SRobert Mustacchi  *
64*d14abf15SRobert Mustacchi  *
65*d14abf15SRobert Mustacchi  * @return u8_t TRUE: attention requires process_kill. FALSE o/w
66*d14abf15SRobert Mustacchi  */
lm_recoverable_error(lm_device_t * pdev,u32_t * attn_sig,u32_t arr_size)67*d14abf15SRobert Mustacchi u8_t lm_recoverable_error(lm_device_t *pdev, u32_t * attn_sig, u32_t arr_size)
68*d14abf15SRobert Mustacchi {
69*d14abf15SRobert Mustacchi     lm_er_debug_info_t * debug_info = NULL;
70*d14abf15SRobert Mustacchi     u32_t                i;
71*d14abf15SRobert Mustacchi 
72*d14abf15SRobert Mustacchi     if (!pdev->params.enable_error_recovery || CHIP_IS_E1x(pdev))
73*d14abf15SRobert Mustacchi     {
74*d14abf15SRobert Mustacchi         return FALSE;
75*d14abf15SRobert Mustacchi     }
76*d14abf15SRobert Mustacchi 
77*d14abf15SRobert Mustacchi     ASSERT_STATIC(ARRSIZE(debug_info->attn_sig) >= MAX_ATTN_REGS);
78*d14abf15SRobert Mustacchi     DbgBreakIf(arr_size < MAX_ATTN_REGS);
79*d14abf15SRobert Mustacchi 
80*d14abf15SRobert Mustacchi     if ((attn_sig[0] & HW_PRTY_ASSERT_SET_0) || (attn_sig[1] & HW_PRTY_ASSERT_SET_1) ||
81*d14abf15SRobert Mustacchi         (attn_sig[2] & HW_PRTY_ASSERT_SET_2) || (attn_sig[3] & HW_PRTY_ASSERT_SET_3))
82*d14abf15SRobert Mustacchi     {
83*d14abf15SRobert Mustacchi         /* Parity Error... Assuming we only enable parities we can deal with
84*d14abf15SRobert Mustacchi          * this is a recoverable error...
85*d14abf15SRobert Mustacchi          */
86*d14abf15SRobert Mustacchi         debug_info = &((pdev)->debug_info.er_debug_info[pdev->debug_info.curr_er_debug_idx]);
87*d14abf15SRobert Mustacchi         for (i = 0; i < arr_size; i++)
88*d14abf15SRobert Mustacchi         {
89*d14abf15SRobert Mustacchi             debug_info->attn_sig[i] = attn_sig[i];
90*d14abf15SRobert Mustacchi         }
91*d14abf15SRobert Mustacchi         lm_inc_er_debug_idx(pdev);
92*d14abf15SRobert Mustacchi 
93*d14abf15SRobert Mustacchi         /* TODO: maybe get GRCDump here in the future... */
94*d14abf15SRobert Mustacchi         DbgMessage(pdev, FATAL, "lm_recoverable_error: funcid:%d, 0:0x%x, 0:0x%x, 0:0x%x, 0:0x%x\n",
95*d14abf15SRobert Mustacchi                    ABS_FUNC_ID(pdev), attn_sig[0], attn_sig[1], attn_sig[2], attn_sig[3]);
96*d14abf15SRobert Mustacchi 
97*d14abf15SRobert Mustacchi         return TRUE;
98*d14abf15SRobert Mustacchi     }
99*d14abf15SRobert Mustacchi 
100*d14abf15SRobert Mustacchi     /* HW Attentions (other than parity ) */
101*d14abf15SRobert Mustacchi     if (attn_sig[1] & HW_INTERRUT_ASSERT_SET_1)
102*d14abf15SRobert Mustacchi     {
103*d14abf15SRobert Mustacchi         /* QM Interrupt is recoverable */
104*d14abf15SRobert Mustacchi         if (attn_sig[1] & AEU_INPUTS_ATTN_BITS_QM_HW_INTERRUPT)
105*d14abf15SRobert Mustacchi         {
106*d14abf15SRobert Mustacchi             debug_info = &((pdev)->debug_info.er_debug_info[pdev->debug_info.curr_er_debug_idx]);
107*d14abf15SRobert Mustacchi             for (i = 0; i < arr_size; i++)
108*d14abf15SRobert Mustacchi             {
109*d14abf15SRobert Mustacchi                 debug_info->attn_sig[i] = attn_sig[i];
110*d14abf15SRobert Mustacchi             }
111*d14abf15SRobert Mustacchi             lm_inc_er_debug_idx(pdev);
112*d14abf15SRobert Mustacchi 
113*d14abf15SRobert Mustacchi             DbgMessage(pdev, FATAL, "lm_recoverable_error: funcid:%d, 0:0x%x, 0:0x%x, 0:0x%x, 0:0x%x\n",
114*d14abf15SRobert Mustacchi                    ABS_FUNC_ID(pdev), attn_sig[0], attn_sig[1], attn_sig[2], attn_sig[3]);
115*d14abf15SRobert Mustacchi             return TRUE;
116*d14abf15SRobert Mustacchi         }
117*d14abf15SRobert Mustacchi 
118*d14abf15SRobert Mustacchi     }
119*d14abf15SRobert Mustacchi 
120*d14abf15SRobert Mustacchi     if (attn_sig[3] & EVEREST_GEN_ATTN_IN_USE_MASK)
121*d14abf15SRobert Mustacchi     {
122*d14abf15SRobert Mustacchi         if ( GENERAL_ATTEN_OFFSET(ERROR_RECOVERY_ATTENTION_BIT) & attn_sig[3])
123*d14abf15SRobert Mustacchi         {
124*d14abf15SRobert Mustacchi             debug_info = &((pdev)->debug_info.er_debug_info[pdev->debug_info.curr_er_debug_idx]);
125*d14abf15SRobert Mustacchi             for (i = 0; i < arr_size; i++)
126*d14abf15SRobert Mustacchi             {
127*d14abf15SRobert Mustacchi                 debug_info->attn_sig[i] = attn_sig[i];
128*d14abf15SRobert Mustacchi             }
129*d14abf15SRobert Mustacchi             lm_inc_er_debug_idx(pdev);
130*d14abf15SRobert Mustacchi 
131*d14abf15SRobert Mustacchi             DbgMessage(pdev, FATAL, "lm_recoverable_error: funcid:%d, 0:0x%x, 0:0x%x, 0:0x%x, 0:0x%x\n",
132*d14abf15SRobert Mustacchi                    ABS_FUNC_ID(pdev), attn_sig[0], attn_sig[1], attn_sig[2], attn_sig[3]);
133*d14abf15SRobert Mustacchi             return TRUE;
134*d14abf15SRobert Mustacchi         }
135*d14abf15SRobert Mustacchi     }
136*d14abf15SRobert Mustacchi 
137*d14abf15SRobert Mustacchi     return FALSE;
138*d14abf15SRobert Mustacchi }
139*d14abf15SRobert Mustacchi 
enable_blocks_attention(struct _lm_device_t * pdev)140*d14abf15SRobert Mustacchi void enable_blocks_attention(struct _lm_device_t *pdev)
141*d14abf15SRobert Mustacchi {
142*d14abf15SRobert Mustacchi     u32_t val = 0;
143*d14abf15SRobert Mustacchi 
144*d14abf15SRobert Mustacchi     REG_WR(pdev,PXP_REG_PXP_INT_MASK_0,0);
145*d14abf15SRobert Mustacchi     if (!CHIP_IS_E1x(pdev))
146*d14abf15SRobert Mustacchi     {
147*d14abf15SRobert Mustacchi         REG_WR(pdev,PXP_REG_PXP_INT_MASK_1, (PXP_PXP_INT_MASK_1_REG_HST_INCORRECT_ACCESS
148*d14abf15SRobert Mustacchi                                              | PXP_PXP_INT_MASK_1_REG_HST_VF_DISABLED_ACCESS /*Temporary solution*/
149*d14abf15SRobert Mustacchi                                              | PXP_PXP_INT_MASK_1_REG_HST_PERMISSION_VIOLATION) /*Win8 MMIO (security test)???*/);
150*d14abf15SRobert Mustacchi     }
151*d14abf15SRobert Mustacchi     REG_WR(pdev,DORQ_REG_DORQ_INT_MASK,0);
152*d14abf15SRobert Mustacchi     /* CFC_REG_CFC_INT_MASK see in init_cfc_common */
153*d14abf15SRobert Mustacchi 
154*d14abf15SRobert Mustacchi 
155*d14abf15SRobert Mustacchi     //mask read length error interrupts in brb for parser (parsing unit and 'checksum and crc' unit)
156*d14abf15SRobert Mustacchi     //these errors are legal (PU reads fixe length and CAC can cause read length error on truncated packets)
157*d14abf15SRobert Mustacchi     REG_WR(pdev,BRB1_REG_BRB1_INT_MASK ,0xFC00);
158*d14abf15SRobert Mustacchi 
159*d14abf15SRobert Mustacchi     REG_WR(pdev,QM_REG_QM_INT_MASK ,0);
160*d14abf15SRobert Mustacchi     REG_WR(pdev,TM_REG_TM_INT_MASK ,0);
161*d14abf15SRobert Mustacchi     REG_WR(pdev,XSDM_REG_XSDM_INT_MASK_0 ,0);
162*d14abf15SRobert Mustacchi     REG_WR(pdev,XSDM_REG_XSDM_INT_MASK_1 ,0);
163*d14abf15SRobert Mustacchi     REG_WR(pdev,XCM_REG_XCM_INT_MASK ,0);
164*d14abf15SRobert Mustacchi     //REG_WR(pdev,XSEM_REG_XSEM_INT_MASK_0 ,0);
165*d14abf15SRobert Mustacchi     //REG_WR(pdev,XSEM_REG_XSEM_INT_MASK_1 ,0);
166*d14abf15SRobert Mustacchi     REG_WR(pdev,USDM_REG_USDM_INT_MASK_0 ,0);
167*d14abf15SRobert Mustacchi     REG_WR(pdev,USDM_REG_USDM_INT_MASK_1 ,0);
168*d14abf15SRobert Mustacchi     REG_WR(pdev,UCM_REG_UCM_INT_MASK ,0);
169*d14abf15SRobert Mustacchi     //REG_WR(pdev,USEM_REG_USEM_INT_MASK_0 ,0);
170*d14abf15SRobert Mustacchi     //REG_WR(pdev,USEM_REG_USEM_INT_MASK_1 ,0);
171*d14abf15SRobert Mustacchi     REG_WR(pdev,GRCBASE_UPB+PB_REG_PB_INT_MASK ,0);
172*d14abf15SRobert Mustacchi     REG_WR(pdev,CSDM_REG_CSDM_INT_MASK_0 ,0);
173*d14abf15SRobert Mustacchi     REG_WR(pdev,CSDM_REG_CSDM_INT_MASK_1 ,0);
174*d14abf15SRobert Mustacchi     REG_WR(pdev,CCM_REG_CCM_INT_MASK ,0);
175*d14abf15SRobert Mustacchi     //REG_WR(pdev,CSEM_REG_CSEM_INT_MASK_0 ,0);
176*d14abf15SRobert Mustacchi     //REG_WR(pdev,CSEM_REG_CSEM_INT_MASK_1 ,0);
177*d14abf15SRobert Mustacchi     val = PXP2_PXP2_INT_MASK_0_REG_PGL_CPL_AFT  |
178*d14abf15SRobert Mustacchi           PXP2_PXP2_INT_MASK_0_REG_PGL_CPL_OF |
179*d14abf15SRobert Mustacchi           PXP2_PXP2_INT_MASK_0_REG_PGL_PCIE_ATTN;
180*d14abf15SRobert Mustacchi     if (!CHIP_IS_E1x(pdev))
181*d14abf15SRobert Mustacchi     {
182*d14abf15SRobert Mustacchi         val |= PXP2_PXP2_INT_MASK_0_REG_PGL_READ_BLOCKED |
183*d14abf15SRobert Mustacchi                PXP2_PXP2_INT_MASK_0_REG_PGL_WRITE_BLOCKED;
184*d14abf15SRobert Mustacchi     }
185*d14abf15SRobert Mustacchi     REG_WR(pdev, PXP2_REG_PXP2_INT_MASK_0, val);
186*d14abf15SRobert Mustacchi 
187*d14abf15SRobert Mustacchi     REG_WR(pdev,TSDM_REG_TSDM_INT_MASK_0 ,0);
188*d14abf15SRobert Mustacchi     REG_WR(pdev,TSDM_REG_TSDM_INT_MASK_1 ,0);
189*d14abf15SRobert Mustacchi     REG_WR(pdev,TCM_REG_TCM_INT_MASK ,0);
190*d14abf15SRobert Mustacchi     //REG_WR(pdev,TSEM_REG_TSEM_INT_MASK_0 ,0);
191*d14abf15SRobert Mustacchi     //REG_WR(pdev,TSEM_REG_TSEM_INT_MASK_1 ,0);
192*d14abf15SRobert Mustacchi     REG_WR(pdev,CDU_REG_CDU_INT_MASK ,0);
193*d14abf15SRobert Mustacchi     REG_WR(pdev,DMAE_REG_DMAE_INT_MASK ,0);
194*d14abf15SRobert Mustacchi     //REG_WR(pdev,GRCBASE_MISC+MISC_REGISTERS_MISC_INT_MASK ,0);
195*d14abf15SRobert Mustacchi     //MASK BIT 3,4
196*d14abf15SRobert Mustacchi     REG_WR(pdev,PBF_REG_PBF_INT_MASK ,0X18);
197*d14abf15SRobert Mustacchi 
198*d14abf15SRobert Mustacchi }
199*d14abf15SRobert Mustacchi 
disable_blocks_attention(struct _lm_device_t * pdev)200*d14abf15SRobert Mustacchi void disable_blocks_attention(struct _lm_device_t *pdev)
201*d14abf15SRobert Mustacchi {
202*d14abf15SRobert Mustacchi #define MASK_VALUE_GENERATE(_val) ((u32_t)((((u64_t)0x1)<<_val)-1))
203*d14abf15SRobert Mustacchi     typedef struct _block_mask_info_t
204*d14abf15SRobert Mustacchi     {
205*d14abf15SRobert Mustacchi         u32_t reg_offset;    /* the register offset */
206*d14abf15SRobert Mustacchi         u32_t mask_value[3]; /* the mask value per hw (e1 =0 /e1.5 = 1/e2 = 2)*/
207*d14abf15SRobert Mustacchi     } block_mask_info_t;
208*d14abf15SRobert Mustacchi 
209*d14abf15SRobert Mustacchi     u8_t  chip_idx   = 0;
210*d14abf15SRobert Mustacchi     u32_t mask_idx   = 0;
211*d14abf15SRobert Mustacchi     u32_t val        = 0;
212*d14abf15SRobert Mustacchi     u32_t offset     = 0;
213*d14abf15SRobert Mustacchi     u32_t mask_value = 0;
214*d14abf15SRobert Mustacchi 
215*d14abf15SRobert Mustacchi     static const block_mask_info_t init_mask_values_arr[] =
216*d14abf15SRobert Mustacchi     {
217*d14abf15SRobert Mustacchi         { ATC_REG_ATC_INT_MASK,           { 0,
218*d14abf15SRobert Mustacchi                                             0,
219*d14abf15SRobert Mustacchi                                             6 } },
220*d14abf15SRobert Mustacchi 
221*d14abf15SRobert Mustacchi         { BRB1_REG_BRB1_INT_MASK,         { 19,
222*d14abf15SRobert Mustacchi                                             19,
223*d14abf15SRobert Mustacchi                                             19} },
224*d14abf15SRobert Mustacchi 
225*d14abf15SRobert Mustacchi         { CCM_REG_CCM_INT_MASK,           { 11,
226*d14abf15SRobert Mustacchi                                             11,
227*d14abf15SRobert Mustacchi                                             11 } },
228*d14abf15SRobert Mustacchi 
229*d14abf15SRobert Mustacchi         { CDU_REG_CDU_INT_MASK,           { 7,
230*d14abf15SRobert Mustacchi                                             7,
231*d14abf15SRobert Mustacchi                                             7 } },
232*d14abf15SRobert Mustacchi 
233*d14abf15SRobert Mustacchi         { CFC_REG_CFC_INT_MASK,           { 2,
234*d14abf15SRobert Mustacchi                                             2,
235*d14abf15SRobert Mustacchi                                             2  } },
236*d14abf15SRobert Mustacchi 
237*d14abf15SRobert Mustacchi         { CSDM_REG_CSDM_INT_MASK_0,       { 32,
238*d14abf15SRobert Mustacchi                                             32,
239*d14abf15SRobert Mustacchi                                             32 } },
240*d14abf15SRobert Mustacchi 
241*d14abf15SRobert Mustacchi         { CSDM_REG_CSDM_INT_MASK_1,       { 10,
242*d14abf15SRobert Mustacchi                                             10,
243*d14abf15SRobert Mustacchi                                             11 } },
244*d14abf15SRobert Mustacchi 
245*d14abf15SRobert Mustacchi #if 0
246*d14abf15SRobert Mustacchi         { CSEM_REG_CSEM_INT_MASK_0,       { 32,
247*d14abf15SRobert Mustacchi                                             32,
248*d14abf15SRobert Mustacchi                                             32 } },
249*d14abf15SRobert Mustacchi 
250*d14abf15SRobert Mustacchi         { CSEM_REG_CSEM_INT_MASK_1,       { 10,
251*d14abf15SRobert Mustacchi                                             11,
252*d14abf15SRobert Mustacchi                                             11} },
253*d14abf15SRobert Mustacchi 
254*d14abf15SRobert Mustacchi         { DBG_REG_DBG_INT_MASK,           { 2,
255*d14abf15SRobert Mustacchi                                             2,
256*d14abf15SRobert Mustacchi                                             2 } },
257*d14abf15SRobert Mustacchi #endif //0
258*d14abf15SRobert Mustacchi 
259*d14abf15SRobert Mustacchi         { DMAE_REG_DMAE_INT_MASK,         { 2,
260*d14abf15SRobert Mustacchi                                             2,
261*d14abf15SRobert Mustacchi                                             2 } },
262*d14abf15SRobert Mustacchi 
263*d14abf15SRobert Mustacchi         { DORQ_REG_DORQ_INT_MASK,         { 5,
264*d14abf15SRobert Mustacchi                                             5,
265*d14abf15SRobert Mustacchi                                             6 } },
266*d14abf15SRobert Mustacchi #if 0
267*d14abf15SRobert Mustacchi         { HC_REG_HC_INT_MASK,             { 7,
268*d14abf15SRobert Mustacchi                                             7,
269*d14abf15SRobert Mustacchi                                             7 } },
270*d14abf15SRobert Mustacchi #endif //0
271*d14abf15SRobert Mustacchi 
272*d14abf15SRobert Mustacchi         { IGU_REG_IGU_INT_MASK,           { 0,
273*d14abf15SRobert Mustacchi                                             0,
274*d14abf15SRobert Mustacchi                                             11 } },
275*d14abf15SRobert Mustacchi #if 0
276*d14abf15SRobert Mustacchi         { MISC_REGISTERS_MISC_INT_MASK,   { 4,
277*d14abf15SRobert Mustacchi                                             4,
278*d14abf15SRobert Mustacchi                                             8 } },
279*d14abf15SRobert Mustacchi 
280*d14abf15SRobert Mustacchi         { NIG_REGISTERS_NIG_INT_MASK_0,   { 32,
281*d14abf15SRobert Mustacchi                                             32,
282*d14abf15SRobert Mustacchi                                             32 } },
283*d14abf15SRobert Mustacchi 
284*d14abf15SRobert Mustacchi         { NIG_REGISTERS_NIG_INT_MASK_1,   { 2,
285*d14abf15SRobert Mustacchi                                             4,
286*d14abf15SRobert Mustacchi                                             14 } },
287*d14abf15SRobert Mustacchi 
288*d14abf15SRobert Mustacchi         { PB_REGISTERS_PB_INT_MASK,       { 2,
289*d14abf15SRobert Mustacchi                                             2,
290*d14abf15SRobert Mustacchi                                             2} },
291*d14abf15SRobert Mustacchi #endif // 0
292*d14abf15SRobert Mustacchi 
293*d14abf15SRobert Mustacchi         { PBF_REG_PBF_INT_MASK,           { 5,
294*d14abf15SRobert Mustacchi                                             5,
295*d14abf15SRobert Mustacchi                                             7 } },
296*d14abf15SRobert Mustacchi 
297*d14abf15SRobert Mustacchi         { PGLUE_B_REG_PGLUE_B_INT_MASK,   { 0,
298*d14abf15SRobert Mustacchi                                             0,
299*d14abf15SRobert Mustacchi                                             9 } },
300*d14abf15SRobert Mustacchi #if 0
301*d14abf15SRobert Mustacchi         { PRS_REG_PRS_INT_MASK,           { 1,
302*d14abf15SRobert Mustacchi                                             1,
303*d14abf15SRobert Mustacchi                                             1 } },
304*d14abf15SRobert Mustacchi #endif // 0
305*d14abf15SRobert Mustacchi 
306*d14abf15SRobert Mustacchi         { PXP2_REG_PXP2_INT_MASK_0,       { 25,
307*d14abf15SRobert Mustacchi                                             32,
308*d14abf15SRobert Mustacchi                                             32 } },
309*d14abf15SRobert Mustacchi 
310*d14abf15SRobert Mustacchi #if 0
311*d14abf15SRobert Mustacchi         { PXP2_REG_PXP2_INT_MASK_1,       { 0,
312*d14abf15SRobert Mustacchi                                             6,
313*d14abf15SRobert Mustacchi                                             16} },
314*d14abf15SRobert Mustacchi #endif //0
315*d14abf15SRobert Mustacchi 
316*d14abf15SRobert Mustacchi         { PXP_REG_PXP_INT_MASK_0,         { 32,
317*d14abf15SRobert Mustacchi                                             32,
318*d14abf15SRobert Mustacchi                                             32 } },
319*d14abf15SRobert Mustacchi 
320*d14abf15SRobert Mustacchi         { PXP_REG_PXP_INT_MASK_1,         { 5,
321*d14abf15SRobert Mustacchi                                             5,
322*d14abf15SRobert Mustacchi                                             8 } },
323*d14abf15SRobert Mustacchi 
324*d14abf15SRobert Mustacchi         { QM_REG_QM_INT_MASK,             { 2,
325*d14abf15SRobert Mustacchi                                             2,
326*d14abf15SRobert Mustacchi                                             14 } },
327*d14abf15SRobert Mustacchi #if 0
328*d14abf15SRobert Mustacchi         { SEM_FAST_REG_SEM_FAST_INT_MASK, { 1, // This offset is actually 4 different registers (per SEM)
329*d14abf15SRobert Mustacchi                                             1,
330*d14abf15SRobert Mustacchi                                             1} },
331*d14abf15SRobert Mustacchi 
332*d14abf15SRobert Mustacchi         { SRC_REG_SRC_INT_MASK,           { 1,
333*d14abf15SRobert Mustacchi                                             3,
334*d14abf15SRobert Mustacchi                                             3 } },
335*d14abf15SRobert Mustacchi #endif //0
336*d14abf15SRobert Mustacchi 
337*d14abf15SRobert Mustacchi         { TCM_REG_TCM_INT_MASK,           { 11,
338*d14abf15SRobert Mustacchi                                             11,
339*d14abf15SRobert Mustacchi                                             11 } },
340*d14abf15SRobert Mustacchi 
341*d14abf15SRobert Mustacchi         { TM_REG_TM_INT_MASK,             { 1,
342*d14abf15SRobert Mustacchi                                             1,
343*d14abf15SRobert Mustacchi                                             1} },
344*d14abf15SRobert Mustacchi 
345*d14abf15SRobert Mustacchi         { TSDM_REG_TSDM_INT_MASK_0,       { 32,
346*d14abf15SRobert Mustacchi                                             32,
347*d14abf15SRobert Mustacchi                                             32 } },
348*d14abf15SRobert Mustacchi 
349*d14abf15SRobert Mustacchi         { TSDM_REG_TSDM_INT_MASK_1,       { 10,
350*d14abf15SRobert Mustacchi                                             10,
351*d14abf15SRobert Mustacchi                                             11 } },
352*d14abf15SRobert Mustacchi #if 0
353*d14abf15SRobert Mustacchi         { TSEM_REG_TSEM_INT_MASK_0,       { 32,
354*d14abf15SRobert Mustacchi                                             32,
355*d14abf15SRobert Mustacchi                                             32 } },
356*d14abf15SRobert Mustacchi 
357*d14abf15SRobert Mustacchi         { TSEM_REG_TSEM_INT_MASK_1,       { 10,
358*d14abf15SRobert Mustacchi                                             11,
359*d14abf15SRobert Mustacchi                                             13 } },
360*d14abf15SRobert Mustacchi #endif // 0
361*d14abf15SRobert Mustacchi 
362*d14abf15SRobert Mustacchi         { UCM_REG_UCM_INT_MASK,           { 11,
363*d14abf15SRobert Mustacchi                                             11,
364*d14abf15SRobert Mustacchi                                             11} },
365*d14abf15SRobert Mustacchi 
366*d14abf15SRobert Mustacchi         { USDM_REG_USDM_INT_MASK_0,       { 32,
367*d14abf15SRobert Mustacchi                                             32,
368*d14abf15SRobert Mustacchi                                             32 } },
369*d14abf15SRobert Mustacchi 
370*d14abf15SRobert Mustacchi         { USDM_REG_USDM_INT_MASK_1,       { 10,
371*d14abf15SRobert Mustacchi                                             10,
372*d14abf15SRobert Mustacchi                                             11 } },
373*d14abf15SRobert Mustacchi #if 0
374*d14abf15SRobert Mustacchi         { USEM_REG_USEM_INT_MASK_0,       { 32,
375*d14abf15SRobert Mustacchi                                             32,
376*d14abf15SRobert Mustacchi                                             32 } },
377*d14abf15SRobert Mustacchi 
378*d14abf15SRobert Mustacchi         { USEM_REG_USEM_INT_MASK_1,       { 10,
379*d14abf15SRobert Mustacchi                                             11,
380*d14abf15SRobert Mustacchi                                             11 } },
381*d14abf15SRobert Mustacchi #endif //0
382*d14abf15SRobert Mustacchi 
383*d14abf15SRobert Mustacchi         { VFC_REG_VFC_INT_MASK,           { 0,
384*d14abf15SRobert Mustacchi                                             0,
385*d14abf15SRobert Mustacchi                                             1 } },
386*d14abf15SRobert Mustacchi 
387*d14abf15SRobert Mustacchi         { XCM_REG_XCM_INT_MASK,           { 14,
388*d14abf15SRobert Mustacchi                                             14,
389*d14abf15SRobert Mustacchi                                             14 } },
390*d14abf15SRobert Mustacchi 
391*d14abf15SRobert Mustacchi         { XSDM_REG_XSDM_INT_MASK_0,       { 32,
392*d14abf15SRobert Mustacchi                                             32,
393*d14abf15SRobert Mustacchi                                             32 } },
394*d14abf15SRobert Mustacchi 
395*d14abf15SRobert Mustacchi         { XSDM_REG_XSDM_INT_MASK_1,       { 10,
396*d14abf15SRobert Mustacchi                                             10,
397*d14abf15SRobert Mustacchi                                             11} },
398*d14abf15SRobert Mustacchi #if 0
399*d14abf15SRobert Mustacchi         { XSEM_REG_XSEM_INT_MASK_0,      { 32,
400*d14abf15SRobert Mustacchi                                            32,
401*d14abf15SRobert Mustacchi                                            32 } },
402*d14abf15SRobert Mustacchi 
403*d14abf15SRobert Mustacchi         { XSEM_REG_XSEM_INT_MASK_1,      { 10,
404*d14abf15SRobert Mustacchi                                            11,
405*d14abf15SRobert Mustacchi                                            13 } } ,
406*d14abf15SRobert Mustacchi #endif // 0
407*d14abf15SRobert Mustacchi     }; // init_mask_values_arr
408*d14abf15SRobert Mustacchi 
409*d14abf15SRobert Mustacchi     if (IS_VFDEV(pdev))
410*d14abf15SRobert Mustacchi     {
411*d14abf15SRobert Mustacchi         return;
412*d14abf15SRobert Mustacchi     }
413*d14abf15SRobert Mustacchi     if CHIP_IS_E1( pdev )
414*d14abf15SRobert Mustacchi     {
415*d14abf15SRobert Mustacchi         chip_idx = 0; // E1.0
416*d14abf15SRobert Mustacchi     }
417*d14abf15SRobert Mustacchi     else if CHIP_IS_E1H(pdev)
418*d14abf15SRobert Mustacchi     {
419*d14abf15SRobert Mustacchi         chip_idx = 1; // E1.5
420*d14abf15SRobert Mustacchi     }
421*d14abf15SRobert Mustacchi     else if CHIP_IS_E2E3(pdev)
422*d14abf15SRobert Mustacchi     {
423*d14abf15SRobert Mustacchi         chip_idx = 2; // E2
424*d14abf15SRobert Mustacchi     }
425*d14abf15SRobert Mustacchi     else
426*d14abf15SRobert Mustacchi     {
427*d14abf15SRobert Mustacchi         // New chip!!!
428*d14abf15SRobert Mustacchi         DbgBreakIf(1); // E??
429*d14abf15SRobert Mustacchi     }
430*d14abf15SRobert Mustacchi 
431*d14abf15SRobert Mustacchi     DbgBreakIf( chip_idx >= ARRSIZE( init_mask_values_arr[0].mask_value ) );
432*d14abf15SRobert Mustacchi 
433*d14abf15SRobert Mustacchi     for( mask_idx = 0; mask_idx < ARRSIZE(init_mask_values_arr);  mask_idx++ )
434*d14abf15SRobert Mustacchi     {
435*d14abf15SRobert Mustacchi         mask_value = init_mask_values_arr[mask_idx].mask_value[chip_idx] ;
436*d14abf15SRobert Mustacchi 
437*d14abf15SRobert Mustacchi         if( mask_value )
438*d14abf15SRobert Mustacchi         {
439*d14abf15SRobert Mustacchi             val        = MASK_VALUE_GENERATE(mask_value);
440*d14abf15SRobert Mustacchi             offset     = init_mask_values_arr[mask_idx].reg_offset;
441*d14abf15SRobert Mustacchi             REG_WR(pdev, offset, val );
442*d14abf15SRobert Mustacchi         }
443*d14abf15SRobert Mustacchi     }
444*d14abf15SRobert Mustacchi     /*
445*d14abf15SRobert Mustacchi 
446*d14abf15SRobert Mustacchi     REG_WR(pdev,PXP_REG_PXP_INT_MASK_0,0xffffffff);
447*d14abf15SRobert Mustacchi     if (IS_E2(pdev)) {
448*d14abf15SRobert Mustacchi         REG_WR(pdev,PXP_REG_PXP_INT_MASK_1,0xff);
449*d14abf15SRobert Mustacchi     } else {
450*d14abf15SRobert Mustacchi     REG_WR(pdev,PXP_REG_PXP_INT_MASK_1,0x1f);
451*d14abf15SRobert Mustacchi     }
452*d14abf15SRobert Mustacchi     REG_WR(pdev,DORQ_REG_DORQ_INT_MASK,0x1f);
453*d14abf15SRobert Mustacchi     REG_WR(pdev,CFC_REG_CFC_INT_MASK ,0x3);
454*d14abf15SRobert Mustacchi     REG_WR(pdev,QM_REG_QM_INT_MASK ,0x3);
455*d14abf15SRobert Mustacchi     REG_WR(pdev,TM_REG_TM_INT_MASK ,0x1);
456*d14abf15SRobert Mustacchi     REG_WR(pdev,XSDM_REG_XSDM_INT_MASK_0 ,0xffffffff);
457*d14abf15SRobert Mustacchi     REG_WR(pdev,XSDM_REG_XSDM_INT_MASK_1 ,0x3ff);
458*d14abf15SRobert Mustacchi     REG_WR(pdev,XCM_REG_XCM_INT_MASK,0x3fff);
459*d14abf15SRobert Mustacchi     //REG_WR(pdev,XSEM_REG_XSEM_INT_MASK_0 ,0);
460*d14abf15SRobert Mustacchi     //REG_WR(pdev,XSEM_REG_XSEM_INT_MASK_1 ,0);
461*d14abf15SRobert Mustacchi     REG_WR(pdev,USDM_REG_USDM_INT_MASK_0 ,0xffffffff);
462*d14abf15SRobert Mustacchi     REG_WR(pdev,USDM_REG_USDM_INT_MASK_1 ,0x3ff);
463*d14abf15SRobert Mustacchi     REG_WR(pdev,UCM_REG_UCM_INT_MASK ,0x7ff);
464*d14abf15SRobert Mustacchi     //REG_WR(pdev,USEM_REG_USEM_INT_MASK_0 ,0);
465*d14abf15SRobert Mustacchi     //REG_WR(pdev,USEM_REG_USEM_INT_MASK_1 ,0);
466*d14abf15SRobert Mustacchi     REG_WR(pdev,GRCBASE_UPB+PB_REG_PB_INT_MASK ,0x3);
467*d14abf15SRobert Mustacchi     REG_WR(pdev,CSDM_REG_CSDM_INT_MASK_0 ,0xffffffff);
468*d14abf15SRobert Mustacchi     REG_WR(pdev,CSDM_REG_CSDM_INT_MASK_1 ,0x3ff);
469*d14abf15SRobert Mustacchi     REG_WR(pdev,CCM_REG_CCM_INT_MASK ,0x7ff);
470*d14abf15SRobert Mustacchi     //REG_WR(pdev,CSEM_REG_CSEM_INT_MASK_0 ,0);
471*d14abf15SRobert Mustacchi     //REG_WR(pdev,CSEM_REG_CSEM_INT_MASK_1 ,0);
472*d14abf15SRobert Mustacchi 
473*d14abf15SRobert Mustacchi     REG_WR(pdev,PXP2_REG_PXP2_INT_MASK_0,0xffffffff);
474*d14abf15SRobert Mustacchi 
475*d14abf15SRobert Mustacchi     REG_WR(pdev,TSDM_REG_TSDM_INT_MASK_0 ,0xffffffff);
476*d14abf15SRobert Mustacchi     REG_WR(pdev,TSDM_REG_TSDM_INT_MASK_1 ,0x3ff);
477*d14abf15SRobert Mustacchi     REG_WR(pdev,TCM_REG_TCM_INT_MASK ,0x7ff);
478*d14abf15SRobert Mustacchi     //REG_WR(pdev,TSEM_REG_TSEM_INT_MASK_0 ,0);
479*d14abf15SRobert Mustacchi     //REG_WR(pdev,TSEM_REG_TSEM_INT_MASK_1 ,0);
480*d14abf15SRobert Mustacchi     REG_WR(pdev,CDU_REG_CDU_INT_MASK ,0x7f);
481*d14abf15SRobert Mustacchi     REG_WR(pdev,DMAE_REG_DMAE_INT_MASK ,0x3);
482*d14abf15SRobert Mustacchi     //REG_WR(pdev,GRCBASE_MISC+MISC_REGISTERS_MISC_INT_MASK ,0);
483*d14abf15SRobert Mustacchi     //MASK BIT 3,4
484*d14abf15SRobert Mustacchi     REG_WR(pdev,PBF_REG_PBF_INT_MASK ,0x1f);
485*d14abf15SRobert Mustacchi     */
486*d14abf15SRobert Mustacchi 
487*d14abf15SRobert Mustacchi     // disable MCP's attentions
488*d14abf15SRobert Mustacchi     REG_WR(pdev,MISC_REG_AEU_ENABLE4_FUNC_0_OUT_0,0);
489*d14abf15SRobert Mustacchi     REG_WR(pdev,MISC_REG_AEU_ENABLE4_FUNC_0_OUT_1,0);
490*d14abf15SRobert Mustacchi     REG_WR(pdev,MISC_REG_AEU_ENABLE4_FUNC_0_OUT_2,0);
491*d14abf15SRobert Mustacchi     REG_WR(pdev,MISC_REG_AEU_ENABLE4_FUNC_0_OUT_3,0);
492*d14abf15SRobert Mustacchi     REG_WR(pdev,MISC_REG_AEU_ENABLE4_FUNC_1_OUT_0,0);
493*d14abf15SRobert Mustacchi     REG_WR(pdev,MISC_REG_AEU_ENABLE4_FUNC_1_OUT_1,0);
494*d14abf15SRobert Mustacchi     REG_WR(pdev,MISC_REG_AEU_ENABLE4_FUNC_1_OUT_2,0);
495*d14abf15SRobert Mustacchi     REG_WR(pdev,MISC_REG_AEU_ENABLE4_FUNC_1_OUT_3,0);
496*d14abf15SRobert Mustacchi     REG_WR(pdev,MISC_REG_AEU_ENABLE4_FUNC_0_OUT_4,0);
497*d14abf15SRobert Mustacchi     REG_WR(pdev,MISC_REG_AEU_ENABLE4_FUNC_0_OUT_5,0);
498*d14abf15SRobert Mustacchi     REG_WR(pdev,MISC_REG_AEU_ENABLE4_FUNC_0_OUT_6,0);
499*d14abf15SRobert Mustacchi     REG_WR(pdev,MISC_REG_AEU_ENABLE4_FUNC_0_OUT_7,0);
500*d14abf15SRobert Mustacchi     REG_WR(pdev,MISC_REG_AEU_ENABLE4_FUNC_1_OUT_4,0);
501*d14abf15SRobert Mustacchi     REG_WR(pdev,MISC_REG_AEU_ENABLE4_FUNC_1_OUT_5,0);
502*d14abf15SRobert Mustacchi     REG_WR(pdev,MISC_REG_AEU_ENABLE4_FUNC_1_OUT_6,0);
503*d14abf15SRobert Mustacchi     REG_WR(pdev,MISC_REG_AEU_ENABLE4_FUNC_1_OUT_7,0);
504*d14abf15SRobert Mustacchi }
505*d14abf15SRobert Mustacchi 
lm_reset_mask_attn(struct _lm_device_t * pdev)506*d14abf15SRobert Mustacchi void lm_reset_mask_attn(struct _lm_device_t *pdev)
507*d14abf15SRobert Mustacchi {
508*d14abf15SRobert Mustacchi     // mask the pxp attentions
509*d14abf15SRobert Mustacchi     REG_WR(pdev,PXP_REG_PXP_INT_MASK_0,0xffffffff); // 32 bits
510*d14abf15SRobert Mustacchi     if (CHIP_IS_E1x(pdev))
511*d14abf15SRobert Mustacchi     {
512*d14abf15SRobert Mustacchi         REG_WR(pdev,PXP_REG_PXP_INT_MASK_1,0x1f); // 5 bits
513*d14abf15SRobert Mustacchi     }
514*d14abf15SRobert Mustacchi     else
515*d14abf15SRobert Mustacchi     {
516*d14abf15SRobert Mustacchi         REG_WR(pdev,PXP_REG_PXP_INT_MASK_1,0xff); // 8 bits
517*d14abf15SRobert Mustacchi     }
518*d14abf15SRobert Mustacchi     REG_WR(pdev,PXP2_REG_PXP2_INT_MASK_0,0xffffffff); // 32 bits
519*d14abf15SRobert Mustacchi 
520*d14abf15SRobert Mustacchi     /* We never unmask this register so no need to re-mask it*/
521*d14abf15SRobert Mustacchi     //REG_WR(pdev,PXP2_REG_PXP2_INT_MASK_1,0x3f); // 32 bits
522*d14abf15SRobert Mustacchi }
523*d14abf15SRobert Mustacchi 
lm_latch_attn_everest_processing(lm_device_t * pdev,u32_t sig_word_aft_inv)524*d14abf15SRobert Mustacchi static void lm_latch_attn_everest_processing(lm_device_t *pdev, u32_t sig_word_aft_inv)
525*d14abf15SRobert Mustacchi {
526*d14abf15SRobert Mustacchi     u32_t latch_bit_to_clr = 0;
527*d14abf15SRobert Mustacchi     u32_t val              = 0;
528*d14abf15SRobert Mustacchi     u32_t offset           = 0;
529*d14abf15SRobert Mustacchi 
530*d14abf15SRobert Mustacchi     //pass over all latched attentions
531*d14abf15SRobert Mustacchi     offset = GENERAL_ATTEN_OFFSET(LATCHED_ATTN_RBCR);
532*d14abf15SRobert Mustacchi     if ( offset & sig_word_aft_inv)
533*d14abf15SRobert Mustacchi     {
534*d14abf15SRobert Mustacchi         latch_bit_to_clr = 0x1;
535*d14abf15SRobert Mustacchi         REG_WR(pdev, MISC_REG_AEU_CLR_LATCH_SIGNAL, latch_bit_to_clr);
536*d14abf15SRobert Mustacchi         DbgMessage(pdev, FATAL, "lm_latch_attn_everest_processing: LATCHED_ATTN_RBCR received!!!\n");
537*d14abf15SRobert Mustacchi         DbgBreakIfAll(1);
538*d14abf15SRobert Mustacchi     }
539*d14abf15SRobert Mustacchi     offset = GENERAL_ATTEN_OFFSET(LATCHED_ATTN_RBCT);
540*d14abf15SRobert Mustacchi     if ( offset & sig_word_aft_inv)
541*d14abf15SRobert Mustacchi     {
542*d14abf15SRobert Mustacchi         latch_bit_to_clr = 0x2;
543*d14abf15SRobert Mustacchi         REG_WR(pdev, MISC_REG_AEU_CLR_LATCH_SIGNAL, latch_bit_to_clr);
544*d14abf15SRobert Mustacchi         DbgMessage(pdev, FATAL, "lm_latch_attn_everest_processing: LATCHED_ATTN_RBCT received!!!\n");
545*d14abf15SRobert Mustacchi         DbgBreakIfAll(1);
546*d14abf15SRobert Mustacchi     }
547*d14abf15SRobert Mustacchi     offset = GENERAL_ATTEN_OFFSET(LATCHED_ATTN_RBCN);
548*d14abf15SRobert Mustacchi     if ( offset & sig_word_aft_inv)
549*d14abf15SRobert Mustacchi     {
550*d14abf15SRobert Mustacchi         latch_bit_to_clr = 0x4;
551*d14abf15SRobert Mustacchi         REG_WR(pdev, MISC_REG_AEU_CLR_LATCH_SIGNAL, latch_bit_to_clr);
552*d14abf15SRobert Mustacchi         DbgMessage(pdev, FATAL, "lm_latch_attn_everest_processing: LATCHED_ATTN_RBCN received!!!\n");
553*d14abf15SRobert Mustacchi         DbgBreakIfAll(1);
554*d14abf15SRobert Mustacchi     }
555*d14abf15SRobert Mustacchi     offset = GENERAL_ATTEN_OFFSET(LATCHED_ATTN_RBCU);
556*d14abf15SRobert Mustacchi     if ( offset & sig_word_aft_inv)
557*d14abf15SRobert Mustacchi     {
558*d14abf15SRobert Mustacchi         latch_bit_to_clr = 0x8;
559*d14abf15SRobert Mustacchi         REG_WR(pdev, MISC_REG_AEU_CLR_LATCH_SIGNAL, latch_bit_to_clr);
560*d14abf15SRobert Mustacchi         DbgMessage(pdev, FATAL, "lm_latch_attn_everest_processing: LATCHED_ATTN_RBCU received!!!\n");
561*d14abf15SRobert Mustacchi         DbgBreakIfAll(1);
562*d14abf15SRobert Mustacchi     }
563*d14abf15SRobert Mustacchi     offset = GENERAL_ATTEN_OFFSET(LATCHED_ATTN_RBCP);
564*d14abf15SRobert Mustacchi     if ( offset & sig_word_aft_inv)
565*d14abf15SRobert Mustacchi     {
566*d14abf15SRobert Mustacchi         latch_bit_to_clr = 0x10;
567*d14abf15SRobert Mustacchi         REG_WR(pdev, MISC_REG_AEU_CLR_LATCH_SIGNAL, latch_bit_to_clr);
568*d14abf15SRobert Mustacchi         DbgMessage(pdev, FATAL, "lm_latch_attn_everest_processing: LATCHED_ATTN_RBCP received!!! \n");
569*d14abf15SRobert Mustacchi         DbgBreakIfAll(1);
570*d14abf15SRobert Mustacchi     }
571*d14abf15SRobert Mustacchi     offset = GENERAL_ATTEN_OFFSET(LATCHED_ATTN_TIMEOUT_GRC);
572*d14abf15SRobert Mustacchi     if ( offset & sig_word_aft_inv)
573*d14abf15SRobert Mustacchi     {
574*d14abf15SRobert Mustacchi #define GRC_TIMEOUT_MASK_ADDRESS(_val)  ( (_val)     & ((1<<19)-1)) // 0x000fffff
575*d14abf15SRobert Mustacchi #define GRC_TIMEOUT_MASK_FUNCTION(_val) ( (_val>>20) & ((1<<3)-1))  // 0x00700000
576*d14abf15SRobert Mustacchi #define GRC_TIMEOUT_MASK_MASTER(_val)   ( (_val>>24) & ((1<<4)-1))  // 0x0f000000
577*d14abf15SRobert Mustacchi 
578*d14abf15SRobert Mustacchi         u32_t       addr                            = 0;
579*d14abf15SRobert Mustacchi         u32_t       func                            = 0;
580*d14abf15SRobert Mustacchi         u32_t       master                          = 0;
581*d14abf15SRobert Mustacchi         u32_t       grc_timeout_cnt                 = 0;
582*d14abf15SRobert Mustacchi         u8_t        b_assert                        = TRUE;
583*d14abf15SRobert Mustacchi         u8_t        b_nig_reset_called              = lm_is_nig_reset_called(pdev);
584*d14abf15SRobert Mustacchi         const u32_t grc_timeout_max_ignore          = pdev->params.grc_timeout_max_ignore;
585*d14abf15SRobert Mustacchi 
586*d14abf15SRobert Mustacchi         latch_bit_to_clr = 0x20;
587*d14abf15SRobert Mustacchi 
588*d14abf15SRobert Mustacchi         // we check if nig reset was done
589*d14abf15SRobert Mustacchi         if( b_nig_reset_called )
590*d14abf15SRobert Mustacchi         {
591*d14abf15SRobert Mustacchi             b_assert = FALSE;
592*d14abf15SRobert Mustacchi         }
593*d14abf15SRobert Mustacchi 
594*d14abf15SRobert Mustacchi         if (!CHIP_IS_E1(pdev))
595*d14abf15SRobert Mustacchi         {
596*d14abf15SRobert Mustacchi             val    = REG_RD(pdev, MISC_REG_GRC_TIMEOUT_ATTN);
597*d14abf15SRobert Mustacchi             addr   = GRC_TIMEOUT_MASK_ADDRESS(val);
598*d14abf15SRobert Mustacchi             func   = GRC_TIMEOUT_MASK_FUNCTION(val);
599*d14abf15SRobert Mustacchi             master = GRC_TIMEOUT_MASK_MASTER(val);
600*d14abf15SRobert Mustacchi 
601*d14abf15SRobert Mustacchi             // in non E1 we can verify it is mcp cause (due to nig probably)
602*d14abf15SRobert Mustacchi             if( 2 != master ) // 2 is mcp cause
603*d14abf15SRobert Mustacchi             {
604*d14abf15SRobert Mustacchi                 b_assert = TRUE;
605*d14abf15SRobert Mustacchi             }
606*d14abf15SRobert Mustacchi         }
607*d14abf15SRobert Mustacchi 
608*d14abf15SRobert Mustacchi         REG_WR(pdev, MISC_REG_AEU_CLR_LATCH_SIGNAL, latch_bit_to_clr);
609*d14abf15SRobert Mustacchi         DbgMessage(pdev, FATAL, "lm_latch_attn_everest_processing: LATCHED_ATTN_TIMEOUT_GRC received!!! val=0x%08x master=0x%x func=0x%x addr=0x%xx4=0x%X)\n"
610*d14abf15SRobert Mustacchi                                ,val, master, func, addr, addr*4 );
611*d14abf15SRobert Mustacchi 
612*d14abf15SRobert Mustacchi         // NOTE: we ignore b_nig_reset_called and ASSERT only according to grc_timeout_max_ignore value (default is 0x10)
613*d14abf15SRobert Mustacchi 
614*d14abf15SRobert Mustacchi         grc_timeout_cnt = lm_inc_cnt_grc_timeout_ignore(pdev, val);
615*d14abf15SRobert Mustacchi         // if we are here it means we ignore the ASSERT inc counter
616*d14abf15SRobert Mustacchi         if( grc_timeout_cnt >= grc_timeout_max_ignore )
617*d14abf15SRobert Mustacchi         {
618*d14abf15SRobert Mustacchi             b_assert = TRUE;
619*d14abf15SRobert Mustacchi         }
620*d14abf15SRobert Mustacchi         else
621*d14abf15SRobert Mustacchi         {
622*d14abf15SRobert Mustacchi             b_assert = FALSE;
623*d14abf15SRobert Mustacchi         }
624*d14abf15SRobert Mustacchi 
625*d14abf15SRobert Mustacchi         if( b_assert )
626*d14abf15SRobert Mustacchi         {
627*d14abf15SRobert Mustacchi             DbgBreakIf(1);
628*d14abf15SRobert Mustacchi         }
629*d14abf15SRobert Mustacchi 
630*d14abf15SRobert Mustacchi         if( b_nig_reset_called )
631*d14abf15SRobert Mustacchi         {
632*d14abf15SRobert Mustacchi             // we reset the flag (we "allow" one timeout after nig reset)
633*d14abf15SRobert Mustacchi             lm_clear_nig_reset_called(pdev);
634*d14abf15SRobert Mustacchi         }
635*d14abf15SRobert Mustacchi     }
636*d14abf15SRobert Mustacchi     offset = GENERAL_ATTEN_OFFSET(LATCHED_ATTN_RSVD_GRC);
637*d14abf15SRobert Mustacchi     if ( offset & sig_word_aft_inv)
638*d14abf15SRobert Mustacchi     {
639*d14abf15SRobert Mustacchi         latch_bit_to_clr = 0x40;
640*d14abf15SRobert Mustacchi         REG_WR(pdev, MISC_REG_AEU_CLR_LATCH_SIGNAL, latch_bit_to_clr);
641*d14abf15SRobert Mustacchi         DbgMessage(pdev, FATAL, "lm_latch_attn_everest_processing: LATCHED_ATTN_RSVD_GRC received!!!\n");
642*d14abf15SRobert Mustacchi         DbgBreakIfAll(1);
643*d14abf15SRobert Mustacchi     }
644*d14abf15SRobert Mustacchi     offset = GENERAL_ATTEN_OFFSET(LATCHED_ATTN_ROM_PARITY_MCP);
645*d14abf15SRobert Mustacchi     if ( offset & sig_word_aft_inv)
646*d14abf15SRobert Mustacchi     {
647*d14abf15SRobert Mustacchi         latch_bit_to_clr = 0x80;
648*d14abf15SRobert Mustacchi         REG_WR(pdev, MISC_REG_AEU_CLR_LATCH_SIGNAL, latch_bit_to_clr);
649*d14abf15SRobert Mustacchi         val = lm_mcp_check(pdev);
650*d14abf15SRobert Mustacchi         DbgMessage(pdev, FATAL, "lm_latch_attn_everest_processing: LATCHED_ATTN_ROM_PARITY_MCP received!!!\n");
651*d14abf15SRobert Mustacchi         /* For E2, at the time this code was written (e2-bringup ) the parity is (somehow) expected */
652*d14abf15SRobert Mustacchi         if (CHIP_IS_E1x(pdev))
653*d14abf15SRobert Mustacchi         {
654*d14abf15SRobert Mustacchi             DbgBreakIfAll(1);
655*d14abf15SRobert Mustacchi         }
656*d14abf15SRobert Mustacchi         else
657*d14abf15SRobert Mustacchi         {
658*d14abf15SRobert Mustacchi             DbgBreakIf(1);
659*d14abf15SRobert Mustacchi         }
660*d14abf15SRobert Mustacchi     }
661*d14abf15SRobert Mustacchi     offset = GENERAL_ATTEN_OFFSET(LATCHED_ATTN_UM_RX_PARITY_MCP);
662*d14abf15SRobert Mustacchi     if ( offset & sig_word_aft_inv)
663*d14abf15SRobert Mustacchi     {
664*d14abf15SRobert Mustacchi         latch_bit_to_clr = 0x100;
665*d14abf15SRobert Mustacchi         REG_WR(pdev, MISC_REG_AEU_CLR_LATCH_SIGNAL, latch_bit_to_clr);
666*d14abf15SRobert Mustacchi         val = lm_mcp_check(pdev);
667*d14abf15SRobert Mustacchi         DbgMessage(pdev, FATAL, "lm_latch_attn_everest_processing: LATCHED_ATTN_UM_RX_PARITY_MCP received!!!\n");
668*d14abf15SRobert Mustacchi         DbgBreakIfAll(1);
669*d14abf15SRobert Mustacchi     }
670*d14abf15SRobert Mustacchi     offset = GENERAL_ATTEN_OFFSET(LATCHED_ATTN_UM_TX_PARITY_MCP);
671*d14abf15SRobert Mustacchi     if ( offset & sig_word_aft_inv)
672*d14abf15SRobert Mustacchi     {
673*d14abf15SRobert Mustacchi         latch_bit_to_clr = 0x200;
674*d14abf15SRobert Mustacchi         REG_WR(pdev, MISC_REG_AEU_CLR_LATCH_SIGNAL, latch_bit_to_clr);
675*d14abf15SRobert Mustacchi         val = lm_mcp_check(pdev);
676*d14abf15SRobert Mustacchi         DbgMessage(pdev, FATAL, "lm_latch_attn_everest_processing: LATCHED_ATTN_UM_TX_PARITY_MCP received!!!\n");
677*d14abf15SRobert Mustacchi         DbgBreakIfAll(1);
678*d14abf15SRobert Mustacchi     }
679*d14abf15SRobert Mustacchi     offset = GENERAL_ATTEN_OFFSET(LATCHED_ATTN_SCPAD_PARITY_MCP);
680*d14abf15SRobert Mustacchi     if ( offset & sig_word_aft_inv)
681*d14abf15SRobert Mustacchi     {
682*d14abf15SRobert Mustacchi         latch_bit_to_clr = 0x400;
683*d14abf15SRobert Mustacchi         REG_WR(pdev, MISC_REG_AEU_CLR_LATCH_SIGNAL, latch_bit_to_clr);
684*d14abf15SRobert Mustacchi         val = lm_mcp_check(pdev);
685*d14abf15SRobert Mustacchi         DbgMessage(pdev, FATAL, "lm_latch_attn_everest_processing: LATCHED_ATTN_SCPAD_PARITY_MCP received!!!\n");
686*d14abf15SRobert Mustacchi         DbgBreakIfAll(1);
687*d14abf15SRobert Mustacchi     }
688*d14abf15SRobert Mustacchi }
689*d14abf15SRobert Mustacchi 
lm_hard_wired_processing(lm_device_t * pdev,u16_t assertion_proc_flgs)690*d14abf15SRobert Mustacchi static void lm_hard_wired_processing(lm_device_t *pdev, u16_t assertion_proc_flgs)
691*d14abf15SRobert Mustacchi {
692*d14abf15SRobert Mustacchi     /* processing of highest 8-15 bits of 8 "hard-wired" attention signals toward IGU.
693*d14abf15SRobert Mustacchi        Excluding NIG & PXP "close the gates"
694*d14abf15SRobert Mustacchi 
695*d14abf15SRobert Mustacchi        ! No need to lock here since this is an uncommon group whether there is a recovery procedure or not.
696*d14abf15SRobert Mustacchi 
697*d14abf15SRobert Mustacchi        Signal name         Bit position    SOURCE       Type        Required Destination
698*d14abf15SRobert Mustacchi        -----------------------------------------------------------------------------
699*d14abf15SRobert Mustacchi        NIG attention for port0  D8         NIG          Event       MCP/Driver0(PHY)
700*d14abf15SRobert Mustacchi        SW timer#4 port0         D9         MISC         Event       MCP -> Ignore!
701*d14abf15SRobert Mustacchi        GPIO#2 port0             D10        MISC         Event       MCP
702*d14abf15SRobert Mustacchi        GPIO#3 port0             D11        MISC         Event       MCP
703*d14abf15SRobert Mustacchi        GPIO#4 port0             D12        MISC         Event       MCP
704*d14abf15SRobert Mustacchi        General attn1            D13        GRC mapped   Attention   MCP/Driver0/Driver1 -> ASSERT!
705*d14abf15SRobert Mustacchi        General attn2            D14        GRC mapped   Attention   MCP/Driver0/Driver1 -> ASSERT!
706*d14abf15SRobert Mustacchi        General attn3            D15        GRC mapped   Attention   MCP/Driver0/Driver1 -> ASSERT!
707*d14abf15SRobert Mustacchi     */
708*d14abf15SRobert Mustacchi     //TODO: for the required attn signals, need to "clean the hw block" (INT_STS_CLR..)
709*d14abf15SRobert Mustacchi     if (PORT_ID(pdev) == 0)
710*d14abf15SRobert Mustacchi     {
711*d14abf15SRobert Mustacchi #if 0   // Timer 4 is being used by OCBB now
712*d14abf15SRobert Mustacchi         if (assertion_proc_flgs & ATTN_SW_TIMER_4_FUNC)
713*d14abf15SRobert Mustacchi         {
714*d14abf15SRobert Mustacchi             //DbgMessage(pdev, FATAL, "lm_hard_wired_processing: ATTN_SW_TIMER_4_FUNC!\n");
715*d14abf15SRobert Mustacchi             //to deal with this signal, add dispatch func call here
716*d14abf15SRobert Mustacchi         }
717*d14abf15SRobert Mustacchi #endif
718*d14abf15SRobert Mustacchi         if (assertion_proc_flgs & GPIO_2_FUNC)
719*d14abf15SRobert Mustacchi         {
720*d14abf15SRobert Mustacchi             DbgMessage(pdev, WARN, "lm_hard_wired_processing: GPIO_1_FUNC!\n");
721*d14abf15SRobert Mustacchi             //to deal with this signal, add dispatch func call here
722*d14abf15SRobert Mustacchi         }
723*d14abf15SRobert Mustacchi         if (assertion_proc_flgs & GPIO_3_FUNC)
724*d14abf15SRobert Mustacchi         {
725*d14abf15SRobert Mustacchi             DbgMessage(pdev, WARN, "lm_hard_wired_processing: GPIO_2_FUNC!\n");
726*d14abf15SRobert Mustacchi             //to deal with this signal, add dispatch func call here
727*d14abf15SRobert Mustacchi         }
728*d14abf15SRobert Mustacchi         if (assertion_proc_flgs & GPIO_4_FUNC)
729*d14abf15SRobert Mustacchi         {
730*d14abf15SRobert Mustacchi         DbgMessage(pdev, WARN, "lm_hard_wired_processing: GPIO_3_FUNC0!\n");
731*d14abf15SRobert Mustacchi         // Will be handled in deassertion
732*d14abf15SRobert Mustacchi         }
733*d14abf15SRobert Mustacchi         if (assertion_proc_flgs & ATTN_GENERAL_ATTN_1)
734*d14abf15SRobert Mustacchi         {
735*d14abf15SRobert Mustacchi             DbgMessage(pdev, FATAL, "lm_hard_wired_processing: ATTN_GENERAL_ATTN_1! and clean it!!!\n");
736*d14abf15SRobert Mustacchi             REG_WR(pdev,MISC_REG_AEU_GENERAL_ATTN_1,0x0);
737*d14abf15SRobert Mustacchi         }
738*d14abf15SRobert Mustacchi         if (assertion_proc_flgs & ATTN_GENERAL_ATTN_2)
739*d14abf15SRobert Mustacchi         {
740*d14abf15SRobert Mustacchi             DbgMessage(pdev, FATAL, "lm_hard_wired_processing: ATTN_GENERAL_ATTN_2! and clean it!!!\n");
741*d14abf15SRobert Mustacchi             REG_WR(pdev,MISC_REG_AEU_GENERAL_ATTN_2,0x0);
742*d14abf15SRobert Mustacchi         }
743*d14abf15SRobert Mustacchi         if (assertion_proc_flgs & ATTN_GENERAL_ATTN_3)
744*d14abf15SRobert Mustacchi         {
745*d14abf15SRobert Mustacchi             DbgMessage(pdev, FATAL, "lm_hard_wired_processing: ATTN_GENERAL_ATTN_3! and clean it!!!\n");
746*d14abf15SRobert Mustacchi             REG_WR(pdev,MISC_REG_AEU_GENERAL_ATTN_3,0x0);
747*d14abf15SRobert Mustacchi         }
748*d14abf15SRobert Mustacchi     }
749*d14abf15SRobert Mustacchi     else
750*d14abf15SRobert Mustacchi     {
751*d14abf15SRobert Mustacchi         DbgBreakIf(PORT_ID(pdev) != 1);
752*d14abf15SRobert Mustacchi 
753*d14abf15SRobert Mustacchi         if (assertion_proc_flgs & ATTN_SW_TIMER_4_FUNC1)
754*d14abf15SRobert Mustacchi         {
755*d14abf15SRobert Mustacchi             //DbgMessage(pdev, FATAL, "lm_hard_wired_processing: ATTN_SW_TIMER_4_FUNC1!\n");
756*d14abf15SRobert Mustacchi             //to deal with this signal, add dispatch func call here
757*d14abf15SRobert Mustacchi         }
758*d14abf15SRobert Mustacchi         if (assertion_proc_flgs & GPIO_2_FUNC1)
759*d14abf15SRobert Mustacchi         {
760*d14abf15SRobert Mustacchi             DbgMessage(pdev, WARN, "lm_hard_wired_processing: GPIO_1_FUNC1!\n");
761*d14abf15SRobert Mustacchi             //to deal with this signal, add dispatch func call here
762*d14abf15SRobert Mustacchi         }
763*d14abf15SRobert Mustacchi         if (assertion_proc_flgs & GPIO_3_FUNC1)
764*d14abf15SRobert Mustacchi         {
765*d14abf15SRobert Mustacchi             DbgMessage(pdev, WARN, "lm_hard_wired_processing: GPIO_2_FUNC1!\n");
766*d14abf15SRobert Mustacchi             //to deal with this signal, add dispatch func call here
767*d14abf15SRobert Mustacchi         }
768*d14abf15SRobert Mustacchi         if (assertion_proc_flgs & GPIO_4_FUNC1)
769*d14abf15SRobert Mustacchi         {
770*d14abf15SRobert Mustacchi             DbgMessage(pdev, WARN, "lm_hard_wired_processing: GPIO_3_FUNC1!\n");
771*d14abf15SRobert Mustacchi             // Will be handled in deassertion
772*d14abf15SRobert Mustacchi         }
773*d14abf15SRobert Mustacchi         if (assertion_proc_flgs & ATTN_GENERAL_ATTN_4)
774*d14abf15SRobert Mustacchi         {
775*d14abf15SRobert Mustacchi             DbgMessage(pdev, FATAL, "lm_hard_wired_processing: ATTN_GENERAL_ATTN_4! and clean it!!!\n");
776*d14abf15SRobert Mustacchi             REG_WR(pdev,MISC_REG_AEU_GENERAL_ATTN_4,0x0);
777*d14abf15SRobert Mustacchi         }
778*d14abf15SRobert Mustacchi         if (assertion_proc_flgs & ATTN_GENERAL_ATTN_5)
779*d14abf15SRobert Mustacchi         {
780*d14abf15SRobert Mustacchi             DbgMessage(pdev, FATAL, "lm_hard_wired_processing: ATTN_GENERAL_ATTN_5! and clean it!!!\n");
781*d14abf15SRobert Mustacchi             REG_WR(pdev,MISC_REG_AEU_GENERAL_ATTN_5,0x0);
782*d14abf15SRobert Mustacchi         }
783*d14abf15SRobert Mustacchi         if (assertion_proc_flgs & ATTN_GENERAL_ATTN_6)
784*d14abf15SRobert Mustacchi         {
785*d14abf15SRobert Mustacchi             DbgMessage(pdev, FATAL, "lm_hard_wired_processing: ATTN_GENERAL_ATTN_6! and clean it!!!\n");
786*d14abf15SRobert Mustacchi             REG_WR(pdev,MISC_REG_AEU_GENERAL_ATTN_6,0x0);
787*d14abf15SRobert Mustacchi         }
788*d14abf15SRobert Mustacchi     }
789*d14abf15SRobert Mustacchi }
790*d14abf15SRobert Mustacchi 
lm_nig_processing(lm_device_t * pdev)791*d14abf15SRobert Mustacchi static void lm_nig_processing(lm_device_t *pdev)
792*d14abf15SRobert Mustacchi {
793*d14abf15SRobert Mustacchi     u32_t nig_status_port          = 0;
794*d14abf15SRobert Mustacchi     u32_t unicore_val              = 0;
795*d14abf15SRobert Mustacchi     u32_t is_unicore_intr_asserted = 0;
796*d14abf15SRobert Mustacchi     // save nig interrupt mask and set it back later
797*d14abf15SRobert Mustacchi     lm_link_update(pdev);
798*d14abf15SRobert Mustacchi     if (PORT_ID(pdev) == 0)
799*d14abf15SRobert Mustacchi     {
800*d14abf15SRobert Mustacchi         //read the status interrupt of the NIG for the appropriate port (will do read-modify-write)
801*d14abf15SRobert Mustacchi         nig_status_port = REG_RD(pdev,  NIG_REG_STATUS_INTERRUPT_PORT0);
802*d14abf15SRobert Mustacchi 
803*d14abf15SRobert Mustacchi         //pass over each of the 24 NIG REG to find out why the NIG attention was asserted.
804*d14abf15SRobert Mustacchi         //every unicore interrupt read, in case it differs from the corresponding bit in the
805*d14abf15SRobert Mustacchi         //NIG_REG_STATUS_INTERRUPT_PORT0, then we need to assign the value read into the apporpriate bit
806*d14abf15SRobert Mustacchi         // in NIG_REG_STATUS_INTERRUPT_PORT0 register.
807*d14abf15SRobert Mustacchi 
808*d14abf15SRobert Mustacchi         //HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_EMAC0_STATUS_MISC_MI_INT, &unicore_val, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_EMAC0_MISC_MI_INT, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_EMAC0_MISC_MI_INT_SIZE);
809*d14abf15SRobert Mustacchi         HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_EMAC0_STATUS_MISC_MI_COMPLETE, &unicore_val, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_EMAC0_MISC_MI_COMPLETE, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_EMAC0_MISC_MI_COMPLETE_SIZE);
810*d14abf15SRobert Mustacchi         HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_EMAC0_STATUS_MISC_CFG_CHANGE, &unicore_val, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_EMAC0_MISC_CFG_CHANGE, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_EMAC0_MISC_CFG_CHANGE_SIZE);
811*d14abf15SRobert Mustacchi         HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_EMAC0_STATUS_MISC_LINK_STATUS, &unicore_val, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_EMAC0_MISC_LINK_STATUS, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_EMAC0_MISC_LINK_STATUS_SIZE);
812*d14abf15SRobert Mustacchi         HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_EMAC0_STATUS_MISC_LINK_CHANGE, &unicore_val, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_EMAC0_MISC_LINK_CHANGE, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_EMAC0_MISC_LINK_CHANGE_SIZE);
813*d14abf15SRobert Mustacchi         HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_EMAC0_STATUS_MISC_ATTN, &unicore_val, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_EMAC0_MISC_ATTN, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_EMAC0_MISC_ATTN_SIZE);
814*d14abf15SRobert Mustacchi         HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_SERDES0_STATUS_MAC_CRS, &unicore_val, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_SERDES0_MAC_CRS, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_SERDES0_MAC_CRS_SIZE);
815*d14abf15SRobert Mustacchi         HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_SERDES0_STATUS_AUTONEG_COMPLETE, &unicore_val, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_SERDES0_AUTONEG_COMPLETE, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_SERDES0_AUTONEG_COMPLETE_SIZE);
816*d14abf15SRobert Mustacchi         HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_SERDES0_STATUS_FIBER_RXACT, &unicore_val, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_SERDES0_FIBER_RXACT, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_SERDES0_FIBER_RXACT_SIZE);
817*d14abf15SRobert Mustacchi         //HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_SERDES0_STATUS_LINK_STATUS, &unicore_val, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_SERDES0_LINK_STATUS, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_SERDES0_LINK_STATUS_SIZE);
818*d14abf15SRobert Mustacchi         HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_SERDES0_STATUS_MR_PAGE_RX, &unicore_val, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_SERDES0_MR_PAGE_RX, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_SERDES0_MR_PAGE_RX_SIZE);
819*d14abf15SRobert Mustacchi         HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_SERDES0_STATUS_CL73_AN_COMPLETE, &unicore_val, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_SERDES0_CL73_AN_COMPLETE, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_SERDES0_CL73_AN_COMPLETE_SIZE);
820*d14abf15SRobert Mustacchi         HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_SERDES0_STATUS_CL73_MR_PAGE_RX, &unicore_val, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_SERDES0_CL73_MR_PAGE_RX, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_SERDES0_CL73_MR_PAGE_RX_SIZE);
821*d14abf15SRobert Mustacchi         HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_SERDES0_STATUS_RX_SIGDET, &unicore_val, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_SERDES0_RX_SIGDET, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_SERDES0_RX_SIGDET_SIZE);
822*d14abf15SRobert Mustacchi         HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_XGXS0_STATUS_REMOTEMDIOREQ, &unicore_val, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_XGXS0_REMOTEMDIOREQ, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_XGXS0_REMOTEMDIOREQ_SIZE);
823*d14abf15SRobert Mustacchi         //HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_XGXS0_STATUS_LINK10G, &unicore_val, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_XGXS0_LINK10G, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_XGXS0_LINK10G_SIZE);
824*d14abf15SRobert Mustacchi         HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_XGXS0_STATUS_AUTONEG_COMPLETE, &unicore_val, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_XGXS0_AUTONEG_COMPLETE, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_XGXS0_AUTONEG_COMPLETE_SIZE);
825*d14abf15SRobert Mustacchi         HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_XGXS0_STATUS_FIBER_RXACT, &unicore_val, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_XGXS0_FIBER_RXACT, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_XGXS0_FIBER_RXACT_SIZE);
826*d14abf15SRobert Mustacchi         //HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_XGXS0_STATUS_LINK_STATUS, &unicore_val, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_XGXS0_LINK_STATUS, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_XGXS0_LINK_STATUS_SIZE);
827*d14abf15SRobert Mustacchi         HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_XGXS0_STATUS_MR_PAGE_RX, &unicore_val, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_XGXS0_MR_PAGE_RX, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_XGXS0_MR_PAGE_RX_SIZE);
828*d14abf15SRobert Mustacchi         HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_XGXS0_STATUS_CL73_AN_COMPLETE, &unicore_val, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_XGXS0_CL73_AN_COMPLETE, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_XGXS0_CL73_AN_COMPLETE_SIZE);
829*d14abf15SRobert Mustacchi         HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_XGXS0_STATUS_CL73_MR_PAGE_RX, &unicore_val, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_XGXS0_CL73_MR_PAGE_RX, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_XGXS0_CL73_MR_PAGE_RX_SIZE);
830*d14abf15SRobert Mustacchi         HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_XGXS0_STATUS_RX_SIGDET, &unicore_val, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_XGXS0_RX_SIGDET, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_XGXS0_RX_SIGDET_SIZE);
831*d14abf15SRobert Mustacchi         HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_XGXS0_STATUS_MAC_CRS, &unicore_val, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_XGXS0_MAC_CRS, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_XGXS0_MAC_CRS_SIZE);
832*d14abf15SRobert Mustacchi 
833*d14abf15SRobert Mustacchi         //write back the updated status interrupt of the NIG for the appropriate port.
834*d14abf15SRobert Mustacchi         REG_WR(pdev,  NIG_REG_STATUS_INTERRUPT_PORT0, nig_status_port);
835*d14abf15SRobert Mustacchi     }
836*d14abf15SRobert Mustacchi     else
837*d14abf15SRobert Mustacchi     {
838*d14abf15SRobert Mustacchi         DbgBreakIf(PORT_ID(pdev) != 1);
839*d14abf15SRobert Mustacchi         nig_status_port = REG_RD(pdev,  NIG_REG_STATUS_INTERRUPT_PORT1);
840*d14abf15SRobert Mustacchi 
841*d14abf15SRobert Mustacchi         //HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_EMAC1_STATUS_MISC_MI_INT, &unicore_val, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_EMAC1_MISC_MI_INT, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_EMAC1_MISC_MI_INT_SIZE);
842*d14abf15SRobert Mustacchi         HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_EMAC1_STATUS_MISC_MI_COMPLETE, &unicore_val, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_EMAC1_MISC_MI_COMPLETE, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_EMAC1_MISC_MI_COMPLETE_SIZE);
843*d14abf15SRobert Mustacchi         HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_EMAC1_STATUS_MISC_CFG_CHANGE, &unicore_val, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_EMAC1_MISC_CFG_CHANGE, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_EMAC1_MISC_CFG_CHANGE_SIZE);
844*d14abf15SRobert Mustacchi         HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_EMAC1_STATUS_MISC_LINK_STATUS, &unicore_val, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_EMAC1_MISC_LINK_STATUS, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_EMAC1_MISC_LINK_STATUS_SIZE);
845*d14abf15SRobert Mustacchi         HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_EMAC1_STATUS_MISC_LINK_CHANGE, &unicore_val, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_EMAC1_MISC_LINK_CHANGE, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_EMAC1_MISC_LINK_CHANGE_SIZE);
846*d14abf15SRobert Mustacchi         HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_EMAC1_STATUS_MISC_ATTN, &unicore_val, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_EMAC1_MISC_ATTN, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_EMAC1_MISC_ATTN_SIZE);
847*d14abf15SRobert Mustacchi         HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_SERDES1_STATUS_MAC_CRS, &unicore_val, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_SERDES1_MAC_CRS, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_SERDES1_MAC_CRS_SIZE);
848*d14abf15SRobert Mustacchi         HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_SERDES1_STATUS_AUTONEG_COMPLETE, &unicore_val, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_SERDES1_AUTONEG_COMPLETE, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_SERDES1_AUTONEG_COMPLETE_SIZE);
849*d14abf15SRobert Mustacchi         HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_SERDES1_STATUS_FIBER_RXACT, &unicore_val, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_SERDES1_FIBER_RXACT, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_SERDES1_FIBER_RXACT_SIZE);
850*d14abf15SRobert Mustacchi         //HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_SERDES1_STATUS_LINK_STATUS, &unicore_val, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_SERDES1_LINK_STATUS, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_SERDES1_LINK_STATUS_SIZE);
851*d14abf15SRobert Mustacchi         HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_SERDES1_STATUS_MR_PAGE_RX, &unicore_val, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_SERDES1_MR_PAGE_RX, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_SERDES1_MR_PAGE_RX_SIZE);
852*d14abf15SRobert Mustacchi         HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_SERDES1_STATUS_CL73_AN_COMPLETE, &unicore_val, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_SERDES1_CL73_AN_COMPLETE, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_SERDES1_CL73_AN_COMPLETE_SIZE);
853*d14abf15SRobert Mustacchi         HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_SERDES1_STATUS_CL73_MR_PAGE_RX, &unicore_val, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_SERDES1_CL73_MR_PAGE_RX, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_SERDES1_CL73_MR_PAGE_RX_SIZE);
854*d14abf15SRobert Mustacchi         HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_SERDES1_STATUS_RX_SIGDET, &unicore_val, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_SERDES1_RX_SIGDET, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_SERDES1_RX_SIGDET_SIZE);
855*d14abf15SRobert Mustacchi         HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_XGXS1_STATUS_REMOTEMDIOREQ, &unicore_val, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_XGXS1_REMOTEMDIOREQ, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_XGXS1_REMOTEMDIOREQ_SIZE);
856*d14abf15SRobert Mustacchi         //HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_XGXS1_STATUS_LINK10G, &unicore_val, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_XGXS1_LINK10G, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_XGXS1_LINK10G_SIZE);
857*d14abf15SRobert Mustacchi         HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_XGXS1_STATUS_AUTONEG_COMPLETE, &unicore_val, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_XGXS1_AUTONEG_COMPLETE, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_XGXS1_AUTONEG_COMPLETE_SIZE);
858*d14abf15SRobert Mustacchi         HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_XGXS1_STATUS_FIBER_RXACT, &unicore_val, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_XGXS1_FIBER_RXACT, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_XGXS1_FIBER_RXACT_SIZE);
859*d14abf15SRobert Mustacchi         //HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_XGXS1_STATUS_LINK_STATUS, &unicore_val, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_XGXS1_LINK_STATUS, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_XGXS1_LINK_STATUS_SIZE);
860*d14abf15SRobert Mustacchi         HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_XGXS1_STATUS_MR_PAGE_RX, &unicore_val, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_XGXS1_MR_PAGE_RX, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_XGXS1_MR_PAGE_RX_SIZE);
861*d14abf15SRobert Mustacchi         HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_XGXS1_STATUS_CL73_AN_COMPLETE, &unicore_val, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_XGXS1_CL73_AN_COMPLETE, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_XGXS1_CL73_AN_COMPLETE_SIZE);
862*d14abf15SRobert Mustacchi         HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_XGXS1_STATUS_CL73_MR_PAGE_RX, &unicore_val, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_XGXS1_CL73_MR_PAGE_RX, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_XGXS1_CL73_MR_PAGE_RX_SIZE);
863*d14abf15SRobert Mustacchi         HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_XGXS1_STATUS_RX_SIGDET, &unicore_val, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_XGXS1_RX_SIGDET, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_XGXS1_RX_SIGDET_SIZE);
864*d14abf15SRobert Mustacchi         HANDLE_UNICORE_INT_ASSERTED(pdev, NIG_REG_XGXS1_STATUS_MAC_CRS, &unicore_val, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_XGXS1_MAC_CRS, &nig_status_port, &is_unicore_intr_asserted, NIG_STATUS_INTERRUPT_PORT1_REG_STATUS_XGXS1_MAC_CRS_SIZE);
865*d14abf15SRobert Mustacchi 
866*d14abf15SRobert Mustacchi         REG_WR(pdev,  NIG_REG_STATUS_INTERRUPT_PORT1, nig_status_port);
867*d14abf15SRobert Mustacchi 
868*d14abf15SRobert Mustacchi     }
869*d14abf15SRobert Mustacchi }
870*d14abf15SRobert Mustacchi 
lm_handle_assertion_processing(lm_device_t * pdev,u16_t assertion_proc_flgs)871*d14abf15SRobert Mustacchi void lm_handle_assertion_processing(lm_device_t *pdev, u16_t assertion_proc_flgs)
872*d14abf15SRobert Mustacchi {
873*d14abf15SRobert Mustacchi     u32_t       val           = 0;
874*d14abf15SRobert Mustacchi     u32_t       port_reg_name = 0;
875*d14abf15SRobert Mustacchi     u32_t       mask_val      = 0;
876*d14abf15SRobert Mustacchi     u32_t       nig_mask      = 0;
877*d14abf15SRobert Mustacchi 
878*d14abf15SRobert Mustacchi     DbgMessage(pdev, INFORM, "lm_handle_assertion_processing: assertion_proc_flgs:%d\n", assertion_proc_flgs);
879*d14abf15SRobert Mustacchi 
880*d14abf15SRobert Mustacchi     //mask only appropriate attention output signals from configured routing and unifier logic toward IGU.
881*d14abf15SRobert Mustacchi     //This is for driver/chip sync to eventually return to '00' monitored state
882*d14abf15SRobert Mustacchi     //in both leading & trailing latch.
883*d14abf15SRobert Mustacchi     //mask non-hard-wired dynamic groups only
884*d14abf15SRobert Mustacchi 
885*d14abf15SRobert Mustacchi     DbgBreakIf(pdev->vars.attn_state & assertion_proc_flgs);
886*d14abf15SRobert Mustacchi 
887*d14abf15SRobert Mustacchi     //mask relevant AEU attn lines
888*d14abf15SRobert Mustacchi     //             mask  assert_flgs  new mask
889*d14abf15SRobert Mustacchi     //legal:        0       0       ->    0
890*d14abf15SRobert Mustacchi     //              1       0       ->    1
891*d14abf15SRobert Mustacchi     //              1       1       ->    0
892*d14abf15SRobert Mustacchi     //ASSERT:       0       1 -> this won't change us thanks to & ~
893*d14abf15SRobert Mustacchi 
894*d14abf15SRobert Mustacchi     ASSERT_STATIC( HW_LOCK_RESOURCE_PORT0_ATT_MASK +1 == HW_LOCK_RESOURCE_PORT1_ATT_MASK );
895*d14abf15SRobert Mustacchi     ASSERT_STATIC( NIG_REG_MASK_INTERRUPT_PORT0 + 4   == NIG_REG_MASK_INTERRUPT_PORT1 );
896*d14abf15SRobert Mustacchi 
897*d14abf15SRobert Mustacchi     lm_hw_lock(pdev, HW_LOCK_RESOURCE_PORT0_ATT_MASK + PORT_ID(pdev), TRUE);
898*d14abf15SRobert Mustacchi     port_reg_name = PORT_ID(pdev) ? MISC_REG_AEU_MASK_ATTN_FUNC_1 : MISC_REG_AEU_MASK_ATTN_FUNC_0;
899*d14abf15SRobert Mustacchi     // read the hw current mask value
900*d14abf15SRobert Mustacchi     mask_val=REG_RD(pdev, port_reg_name);
901*d14abf15SRobert Mustacchi     //changed rrom XOR to & ~
902*d14abf15SRobert Mustacchi     pdev->vars.aeu_mask_attn_func = mask_val & 0xff;
903*d14abf15SRobert Mustacchi     DbgMessage(pdev, INFORM, "lm_handle_assertion_processing: BEFORE: aeu_mask_attn_func:0x%x\n", pdev->vars.aeu_mask_attn_func);
904*d14abf15SRobert Mustacchi     //changed rrom XOR to & ~
905*d14abf15SRobert Mustacchi     pdev->vars.aeu_mask_attn_func &= ~(assertion_proc_flgs & 0xff);
906*d14abf15SRobert Mustacchi     REG_WR(pdev, port_reg_name, pdev->vars.aeu_mask_attn_func);
907*d14abf15SRobert Mustacchi     DbgMessage(pdev, INFORM, "lm_handle_assertion_processing: AFTER : aeu_mask_attn_func:0x%x\n", pdev->vars.aeu_mask_attn_func);
908*d14abf15SRobert Mustacchi     lm_hw_unlock(pdev, HW_LOCK_RESOURCE_PORT0_ATT_MASK + PORT_ID(pdev));
909*d14abf15SRobert Mustacchi     //update the bits states
910*d14abf15SRobert Mustacchi 
911*d14abf15SRobert Mustacchi     //        state  assert_flgs  new state
912*d14abf15SRobert Mustacchi     //legal:    0       0         -> 0
913*d14abf15SRobert Mustacchi     //          0       1         -> 1
914*d14abf15SRobert Mustacchi     //          1       0         -> 1
915*d14abf15SRobert Mustacchi     //error:    1       1 -> this won't change us thanks to |
916*d14abf15SRobert Mustacchi     DbgMessage(pdev, INFORM, "lm_handle_assertion_processing: BEFORE: attn_state:0x%x\n", pdev->vars.attn_state);
917*d14abf15SRobert Mustacchi     //changed from XOR to OR for safety
918*d14abf15SRobert Mustacchi     pdev->vars.attn_state |= assertion_proc_flgs;
919*d14abf15SRobert Mustacchi 
920*d14abf15SRobert Mustacchi     DbgMessage(pdev, INFORM, "lm_handle_assertion_processing: AFTER : attn_state:0x%x\n", pdev->vars.attn_state);
921*d14abf15SRobert Mustacchi     //process only hard-wired lines in case any got up
922*d14abf15SRobert Mustacchi     if (assertion_proc_flgs & ATTN_HARD_WIRED_MASK)
923*d14abf15SRobert Mustacchi     {
924*d14abf15SRobert Mustacchi         lm_hard_wired_processing(pdev, assertion_proc_flgs);
925*d14abf15SRobert Mustacchi     }
926*d14abf15SRobert Mustacchi 
927*d14abf15SRobert Mustacchi     // now handle nig
928*d14abf15SRobert Mustacchi     if (assertion_proc_flgs & ATTN_NIG_FOR_FUNC)
929*d14abf15SRobert Mustacchi     {
930*d14abf15SRobert Mustacchi         MM_ACQUIRE_PHY_LOCK(pdev);
931*d14abf15SRobert Mustacchi          // save nig interrupt mask and set it back later
932*d14abf15SRobert Mustacchi         nig_mask = REG_RD(pdev,  NIG_REG_MASK_INTERRUPT_PORT0 + 4*PORT_ID(pdev));
933*d14abf15SRobert Mustacchi         REG_WR(pdev,  NIG_REG_MASK_INTERRUPT_PORT0 + 4*PORT_ID(pdev), 0);
934*d14abf15SRobert Mustacchi 
935*d14abf15SRobert Mustacchi         // we'll handle the attention only if mask is not 0
936*d14abf15SRobert Mustacchi         // if mask is 0, it means that "old" and irrelevant is sent
937*d14abf15SRobert Mustacchi         // and we should not hnalde it (e.g. CQ48990 - got link down event after loopback mode was set).
938*d14abf15SRobert Mustacchi         if( nig_mask )
939*d14abf15SRobert Mustacchi         {
940*d14abf15SRobert Mustacchi             lm_nig_processing(pdev);
941*d14abf15SRobert Mustacchi         }
942*d14abf15SRobert Mustacchi         else
943*d14abf15SRobert Mustacchi         {
944*d14abf15SRobert Mustacchi             DbgMessage(pdev, WARN, "lm_handle_deassertion_processing: got attention when nig_mask is 0\n" );
945*d14abf15SRobert Mustacchi         }
946*d14abf15SRobert Mustacchi     }
947*d14abf15SRobert Mustacchi 
948*d14abf15SRobert Mustacchi     //parallel write to IGU to set the attn_ack for _all asserted_ lines.
949*d14abf15SRobert Mustacchi     val = assertion_proc_flgs;
950*d14abf15SRobert Mustacchi 
951*d14abf15SRobert Mustacchi     // attntion bits set
952*d14abf15SRobert Mustacchi     if (INTR_BLK_TYPE(pdev) == INTR_BLK_HC)
953*d14abf15SRobert Mustacchi     {
954*d14abf15SRobert Mustacchi         REG_WR(pdev,  HC_REG_COMMAND_REG + PORT_ID(pdev)*32 + COMMAND_REG_ATTN_BITS_SET,val);
955*d14abf15SRobert Mustacchi     }
956*d14abf15SRobert Mustacchi     else
957*d14abf15SRobert Mustacchi     {
958*d14abf15SRobert Mustacchi         u32_t cmd_addr = IGU_CMD_ATTN_BIT_SET_UPPER;
959*d14abf15SRobert Mustacchi         if (INTR_BLK_ACCESS(pdev) == INTR_BLK_ACCESS_IGUMEM)
960*d14abf15SRobert Mustacchi         {
961*d14abf15SRobert Mustacchi             REG_WR(pdev, BAR_IGU_INTMEM + cmd_addr*8, val);
962*d14abf15SRobert Mustacchi         }
963*d14abf15SRobert Mustacchi         else
964*d14abf15SRobert Mustacchi         {
965*d14abf15SRobert Mustacchi             struct igu_ctrl_reg cmd_ctrl;
966*d14abf15SRobert Mustacchi             u8_t                igu_func_id = 0;
967*d14abf15SRobert Mustacchi             /* GRC ACCESS: */
968*d14abf15SRobert Mustacchi             /* Write the Data, then the control */
969*d14abf15SRobert Mustacchi              /* [18:12] - FID (if VF - [18] = 0; [17:12] = VF number; if PF - [18] = 1; [17:14] = 0; [13:12] = PF number) */
970*d14abf15SRobert Mustacchi             igu_func_id = IGU_FUNC_ID(pdev);
971*d14abf15SRobert Mustacchi             cmd_ctrl.ctrl_data =
972*d14abf15SRobert Mustacchi                 ((cmd_addr << IGU_CTRL_REG_ADDRESS_SHIFT) |
973*d14abf15SRobert Mustacchi                  (igu_func_id << IGU_CTRL_REG_FID_SHIFT) |
974*d14abf15SRobert Mustacchi                  (IGU_CTRL_CMD_TYPE_WR << IGU_CTRL_REG_TYPE_SHIFT));
975*d14abf15SRobert Mustacchi 
976*d14abf15SRobert Mustacchi             REG_WR(pdev, IGU_REG_COMMAND_REG_32LSB_DATA, val);
977*d14abf15SRobert Mustacchi             REG_WR(pdev, IGU_REG_COMMAND_REG_CTRL, cmd_ctrl.ctrl_data);
978*d14abf15SRobert Mustacchi         }
979*d14abf15SRobert Mustacchi     }
980*d14abf15SRobert Mustacchi 
981*d14abf15SRobert Mustacchi     // now set back the mask
982*d14abf15SRobert Mustacchi     if (assertion_proc_flgs & ATTN_NIG_FOR_FUNC)
983*d14abf15SRobert Mustacchi     {
984*d14abf15SRobert Mustacchi         u8_t blk_type   = INTR_BLK_TYPE(pdev);
985*d14abf15SRobert Mustacchi         u8_t blk_access = INTR_BLK_ACCESS(pdev);
986*d14abf15SRobert Mustacchi 
987*d14abf15SRobert Mustacchi         if ( ( blk_type != INTR_BLK_HC ) && ( blk_access == INTR_BLK_ACCESS_IGUMEM ))
988*d14abf15SRobert Mustacchi         {
989*d14abf15SRobert Mustacchi             u32 cnt = 0;
990*d14abf15SRobert Mustacchi             // Verify that IGU ack through BAR was written before restoring NIG mask.
991*d14abf15SRobert Mustacchi             // This loop should exit after 2-3 iterations max.
992*d14abf15SRobert Mustacchi             do
993*d14abf15SRobert Mustacchi             {
994*d14abf15SRobert Mustacchi                 val = REG_RD(pdev, IGU_REG_ATTENTION_ACK_BITS);
995*d14abf15SRobert Mustacchi             }
996*d14abf15SRobert Mustacchi             while (((val & ATTN_NIG_FOR_FUNC) == 0) && (++cnt < MAX_IGU_ATTN_ACK_TO));
997*d14abf15SRobert Mustacchi 
998*d14abf15SRobert Mustacchi             if (!val)
999*d14abf15SRobert Mustacchi             {
1000*d14abf15SRobert Mustacchi                 DbgMessage(pdev, FATAL, "Failed to verify IGU ack on time\n");
1001*d14abf15SRobert Mustacchi             }
1002*d14abf15SRobert Mustacchi         }
1003*d14abf15SRobert Mustacchi         REG_WR(pdev,  NIG_REG_MASK_INTERRUPT_PORT0 + 4*PORT_ID(pdev), nig_mask);
1004*d14abf15SRobert Mustacchi         MM_RELEASE_PHY_LOCK(pdev);
1005*d14abf15SRobert Mustacchi     }
1006*d14abf15SRobert Mustacchi }
1007*d14abf15SRobert Mustacchi 
lm_cfc_attn_everest_processing(lm_device_t * pdev)1008*d14abf15SRobert Mustacchi static u32_t lm_cfc_attn_everest_processing(lm_device_t *pdev)
1009*d14abf15SRobert Mustacchi {
1010*d14abf15SRobert Mustacchi     u32_t val, valc;
1011*d14abf15SRobert Mustacchi     val = REG_RD(pdev,CFC_REG_CFC_INT_STS);
1012*d14abf15SRobert Mustacchi 
1013*d14abf15SRobert Mustacchi     // TODO add defines here
1014*d14abf15SRobert Mustacchi     DbgMessage(pdev, FATAL, "CFC hw attention 0x%x\n",val);
1015*d14abf15SRobert Mustacchi     if (val) {
1016*d14abf15SRobert Mustacchi         pdev->vars.cfc_int_status_cnt++;
1017*d14abf15SRobert Mustacchi     // CFC error attention
1018*d14abf15SRobert Mustacchi     if (val & 0x2)
1019*d14abf15SRobert Mustacchi     {
1020*d14abf15SRobert Mustacchi                 //DbgBreakIfAll(1);
1021*d14abf15SRobert Mustacchi     }
1022*d14abf15SRobert Mustacchi }
1023*d14abf15SRobert Mustacchi     valc = REG_RD(pdev,CFC_REG_CFC_INT_STS_CLR);
1024*d14abf15SRobert Mustacchi     return val;
1025*d14abf15SRobert Mustacchi }
lm_pxp_attn_everest_processing(lm_device_t * pdev)1026*d14abf15SRobert Mustacchi static void lm_pxp_attn_everest_processing(lm_device_t *pdev)
1027*d14abf15SRobert Mustacchi {
1028*d14abf15SRobert Mustacchi     u32_t val = REG_RD(pdev,PXP_REG_PXP_INT_STS_0);
1029*d14abf15SRobert Mustacchi 
1030*d14abf15SRobert Mustacchi     // TODO add defines here
1031*d14abf15SRobert Mustacchi     DbgMessage(pdev, FATAL, "PXP hw attention 0x%x\n",val);
1032*d14abf15SRobert Mustacchi     // RQ_USDMDP_FIFO_OVERFLOW attention
1033*d14abf15SRobert Mustacchi     if (val & 0x18000)
1034*d14abf15SRobert Mustacchi     {
1035*d14abf15SRobert Mustacchi         DbgBreakIfAll(1);
1036*d14abf15SRobert Mustacchi     }
1037*d14abf15SRobert Mustacchi 
1038*d14abf15SRobert Mustacchi }
1039*d14abf15SRobert Mustacchi /*
1040*d14abf15SRobert Mustacchi  *Function Name:lm_spio5_attn_everest_processing
1041*d14abf15SRobert Mustacchi  *
1042*d14abf15SRobert Mustacchi  *Parameters:
1043*d14abf15SRobert Mustacchi  *
1044*d14abf15SRobert Mustacchi  *Description:
1045*d14abf15SRobert Mustacchi  *  Indicates fan failure on specific external_phy_config (PORT_HW_CFG_XGXS_EXT_PHY_TYPE_SFX7101)
1046*d14abf15SRobert Mustacchi  *Returns:
1047*d14abf15SRobert Mustacchi  *
1048*d14abf15SRobert Mustacchi  */
lm_spio5_attn_everest_processing(lm_device_t * pdev)1049*d14abf15SRobert Mustacchi static void lm_spio5_attn_everest_processing(lm_device_t *pdev)
1050*d14abf15SRobert Mustacchi {
1051*d14abf15SRobert Mustacchi     u32_t      val            = 0;
1052*d14abf15SRobert Mustacchi     u32_t      offset         = 0;
1053*d14abf15SRobert Mustacchi     u32_t      ext_phy_config = 0;
1054*d14abf15SRobert Mustacchi     const u8_t port_id        = PORT_ID(pdev);
1055*d14abf15SRobert Mustacchi 
1056*d14abf15SRobert Mustacchi    // Special fan failure handling for boards with external PHY SFX7101 (which include fan)
1057*d14abf15SRobert Mustacchi     PHY_HW_LOCK(pdev);
1058*d14abf15SRobert Mustacchi     elink_hw_reset_phy(&pdev->params.link);
1059*d14abf15SRobert Mustacchi     PHY_HW_UNLOCK(pdev);
1060*d14abf15SRobert Mustacchi 
1061*d14abf15SRobert Mustacchi     offset = ( 0 == port_id ) ? MISC_REG_AEU_ENABLE1_FUNC_0_OUT_0 : MISC_REG_AEU_ENABLE1_FUNC_1_OUT_0 ;
1062*d14abf15SRobert Mustacchi 
1063*d14abf15SRobert Mustacchi     val = REG_RD(pdev, offset );
1064*d14abf15SRobert Mustacchi 
1065*d14abf15SRobert Mustacchi     DbgMessage(pdev, FATAL, "lm_spio5_attn_everest_processing: SPIO5 hw attention 0x%x\n",val);
1066*d14abf15SRobert Mustacchi 
1067*d14abf15SRobert Mustacchi     // mask flags so we won't get this attention anymore
1068*d14abf15SRobert Mustacchi     RESET_FLAGS(val, AEU_INPUTS_ATTN_BITS_SPIO5 ) ;
1069*d14abf15SRobert Mustacchi     REG_WR(pdev, offset, val ) ;
1070*d14abf15SRobert Mustacchi 
1071*d14abf15SRobert Mustacchi     // change phy_type to type failure (under phy lock)
1072*d14abf15SRobert Mustacchi     MM_ACQUIRE_PHY_LOCK(pdev);
1073*d14abf15SRobert Mustacchi 
1074*d14abf15SRobert Mustacchi     offset = OFFSETOF(shmem_region_t,dev_info.port_hw_config[port_id].external_phy_config);
1075*d14abf15SRobert Mustacchi 
1076*d14abf15SRobert Mustacchi     LM_SHMEM_READ(pdev, offset, &ext_phy_config);
1077*d14abf15SRobert Mustacchi 
1078*d14abf15SRobert Mustacchi     RESET_FLAGS(ext_phy_config, PORT_HW_CFG_XGXS_EXT_PHY_TYPE_MASK ) ;
1079*d14abf15SRobert Mustacchi     SET_FLAGS(ext_phy_config, PORT_HW_CFG_XGXS_EXT_PHY_TYPE_FAILURE ) ;
1080*d14abf15SRobert Mustacchi 
1081*d14abf15SRobert Mustacchi     // Set external phy type to failure for MCP to know about the failure
1082*d14abf15SRobert Mustacchi     LM_SHMEM_WRITE(pdev, offset, ext_phy_config);
1083*d14abf15SRobert Mustacchi 
1084*d14abf15SRobert Mustacchi     DbgMessage(pdev, WARN, "lm_spio5_attn_everest_processing: external_phy_type 0x%x\n",ext_phy_config);
1085*d14abf15SRobert Mustacchi 
1086*d14abf15SRobert Mustacchi     // Indicate "link-down". elink_hw_reset_phy takes care of the physical part, but part of the function
1087*d14abf15SRobert Mustacchi     // masks attentions, which means we won't get a link event from anywhere else. Therefore we need to
1088*d14abf15SRobert Mustacchi     // indicate link down at this point to OS... to supress traffic and upload toe connections...
1089*d14abf15SRobert Mustacchi     // we do this under lock since we change the link status...
1090*d14abf15SRobert Mustacchi     pdev->vars.link_status = LM_STATUS_LINK_DOWN;
1091*d14abf15SRobert Mustacchi 
1092*d14abf15SRobert Mustacchi     mm_indicate_link(pdev, pdev->vars.link_status, pdev->vars.medium);
1093*d14abf15SRobert Mustacchi 
1094*d14abf15SRobert Mustacchi     MM_RELEASE_PHY_LOCK(pdev);
1095*d14abf15SRobert Mustacchi 
1096*d14abf15SRobert Mustacchi     // write to the event log!
1097*d14abf15SRobert Mustacchi     mm_event_log_generic( pdev, LM_LOG_ID_FAN_FAILURE );
1098*d14abf15SRobert Mustacchi 
1099*d14abf15SRobert Mustacchi     mm_indicate_hw_failure(pdev);
1100*d14abf15SRobert Mustacchi }
1101*d14abf15SRobert Mustacchi 
1102*d14abf15SRobert Mustacchi // Check current fan failure state - report in case signaled.
lm_check_fan_failure(struct _lm_device_t * pdev)1103*d14abf15SRobert Mustacchi void lm_check_fan_failure(struct _lm_device_t *pdev)
1104*d14abf15SRobert Mustacchi {
1105*d14abf15SRobert Mustacchi     u32_t val = 0;
1106*d14abf15SRobert Mustacchi 
1107*d14abf15SRobert Mustacchi     if (IS_VFDEV(pdev))
1108*d14abf15SRobert Mustacchi     {
1109*d14abf15SRobert Mustacchi         return;
1110*d14abf15SRobert Mustacchi     }
1111*d14abf15SRobert Mustacchi 
1112*d14abf15SRobert Mustacchi     val = REG_RD(pdev, MISC_REG_AEU_AFTER_INVERT_1_FUNC_0 + PORT_ID(pdev)*4);
1113*d14abf15SRobert Mustacchi 
1114*d14abf15SRobert Mustacchi     if( GET_FLAGS(val, AEU_INPUTS_ATTN_BITS_SPIO5))
1115*d14abf15SRobert Mustacchi     {
1116*d14abf15SRobert Mustacchi         lm_spio5_attn_everest_processing(pdev);
1117*d14abf15SRobert Mustacchi     }
1118*d14abf15SRobert Mustacchi }
1119*d14abf15SRobert Mustacchi 
1120*d14abf15SRobert Mustacchi // Change PMF or link change
1121*d14abf15SRobert Mustacchi // PMF sent link updates to all func (but himself) OR I become a PMF from MCP notification
1122*d14abf15SRobert Mustacchi // on some cases PMF sends link event to himself as well if errors occured in the mac.
lm_pmf_or_link_event(lm_device_t * pdev,u32_t drv_status)1123*d14abf15SRobert Mustacchi static void lm_pmf_or_link_event(lm_device_t *pdev, u32_t drv_status)
1124*d14abf15SRobert Mustacchi {
1125*d14abf15SRobert Mustacchi     u32_t val = 0;
1126*d14abf15SRobert Mustacchi 
1127*d14abf15SRobert Mustacchi 
1128*d14abf15SRobert Mustacchi     DbgMessage(pdev, WARN, "lm_pmf_or_link_event: sync general attention received!!! for func%d\n",FUNC_ID(pdev));
1129*d14abf15SRobert Mustacchi 
1130*d14abf15SRobert Mustacchi     // sync with link
1131*d14abf15SRobert Mustacchi     MM_ACQUIRE_PHY_LOCK(pdev);
1132*d14abf15SRobert Mustacchi     elink_link_status_update(&pdev->params.link,&pdev->vars.link);
1133*d14abf15SRobert Mustacchi     lm_link_report(pdev);
1134*d14abf15SRobert Mustacchi     MM_RELEASE_PHY_LOCK(pdev);
1135*d14abf15SRobert Mustacchi 
1136*d14abf15SRobert Mustacchi     if (!IS_PMF(pdev) && GET_FLAGS(drv_status,DRV_STATUS_PMF))
1137*d14abf15SRobert Mustacchi     {
1138*d14abf15SRobert Mustacchi         //pmf migration
1139*d14abf15SRobert Mustacchi         pdev->vars.is_pmf = PMF_MIGRATION;
1140*d14abf15SRobert Mustacchi         // load stat from MCP
1141*d14abf15SRobert Mustacchi         MM_ACQUIRE_PHY_LOCK(pdev);
1142*d14abf15SRobert Mustacchi         lm_stats_on_pmf_update(pdev,TRUE);
1143*d14abf15SRobert Mustacchi         MM_RELEASE_PHY_LOCK(pdev);
1144*d14abf15SRobert Mustacchi 
1145*d14abf15SRobert Mustacchi         // Connect to NIG attentions
1146*d14abf15SRobert Mustacchi         val = (0xff0f | (1 << (VNIC_ID(pdev) + 4)));
1147*d14abf15SRobert Mustacchi         if (INTR_BLK_TYPE(pdev) == INTR_BLK_HC)
1148*d14abf15SRobert Mustacchi         {
1149*d14abf15SRobert Mustacchi             REG_WR(pdev,  (PORT_ID(pdev) ? HC_REG_TRAILING_EDGE_1 : HC_REG_TRAILING_EDGE_0), val);
1150*d14abf15SRobert Mustacchi             REG_WR(pdev,  (PORT_ID(pdev) ? HC_REG_LEADING_EDGE_1  : HC_REG_LEADING_EDGE_0) , val);
1151*d14abf15SRobert Mustacchi         }
1152*d14abf15SRobert Mustacchi         else
1153*d14abf15SRobert Mustacchi         {
1154*d14abf15SRobert Mustacchi             if (CHIP_IS_E3(pdev))
1155*d14abf15SRobert Mustacchi             {
1156*d14abf15SRobert Mustacchi                 val &= ~ATTN_SW_TIMER_4_FUNC; // To prevent Timer4 expiration attention
1157*d14abf15SRobert Mustacchi             }
1158*d14abf15SRobert Mustacchi             REG_WR(pdev,  IGU_REG_TRAILING_EDGE_LATCH, val);
1159*d14abf15SRobert Mustacchi             REG_WR(pdev,  IGU_REG_LEADING_EDGE_LATCH, val);
1160*d14abf15SRobert Mustacchi         }
1161*d14abf15SRobert Mustacchi 
1162*d14abf15SRobert Mustacchi         if(TRUE == IS_DCB_ENABLED(pdev))
1163*d14abf15SRobert Mustacchi         {
1164*d14abf15SRobert Mustacchi             lm_dcbx_pmf_migration(pdev);
1165*d14abf15SRobert Mustacchi         }
1166*d14abf15SRobert Mustacchi     }
1167*d14abf15SRobert Mustacchi }
1168*d14abf15SRobert Mustacchi 
lm_dcc_event(lm_device_t * pdev,u32_t dcc_event)1169*d14abf15SRobert Mustacchi static void lm_dcc_event(lm_device_t *pdev, u32_t dcc_event)
1170*d14abf15SRobert Mustacchi {
1171*d14abf15SRobert Mustacchi     u32_t       val               = 0;
1172*d14abf15SRobert Mustacchi     u32_t       event_val_current = 0;
1173*d14abf15SRobert Mustacchi     u32_t       fw_resp           = 0 ;
1174*d14abf15SRobert Mustacchi     lm_status_t lm_status         = LM_STATUS_FAILURE ;
1175*d14abf15SRobert Mustacchi 
1176*d14abf15SRobert Mustacchi     DbgMessage(pdev, WARN, "lm_dcc_event: dcc_event=0x%x\n",dcc_event);
1177*d14abf15SRobert Mustacchi 
1178*d14abf15SRobert Mustacchi     if( !IS_MULTI_VNIC(pdev) )
1179*d14abf15SRobert Mustacchi     {
1180*d14abf15SRobert Mustacchi         DbgBreakIf(1);
1181*d14abf15SRobert Mustacchi         return;
1182*d14abf15SRobert Mustacchi     }
1183*d14abf15SRobert Mustacchi 
1184*d14abf15SRobert Mustacchi     // read shemem
1185*d14abf15SRobert Mustacchi 
1186*d14abf15SRobert Mustacchi     // Read new mf config from shemem
1187*d14abf15SRobert Mustacchi     LM_MFCFG_READ(pdev, OFFSETOF(mf_cfg_t, func_mf_config[ABS_FUNC_ID(pdev)].config), &val);
1188*d14abf15SRobert Mustacchi 
1189*d14abf15SRobert Mustacchi     pdev->hw_info.mf_info.func_mf_cfg = val ;
1190*d14abf15SRobert Mustacchi 
1191*d14abf15SRobert Mustacchi     // is it enable/disable
1192*d14abf15SRobert Mustacchi     event_val_current = DRV_STATUS_DCC_DISABLE_ENABLE_PF ;
1193*d14abf15SRobert Mustacchi 
1194*d14abf15SRobert Mustacchi     if GET_FLAGS( dcc_event, event_val_current )
1195*d14abf15SRobert Mustacchi     {
1196*d14abf15SRobert Mustacchi         if( GET_FLAGS( pdev->hw_info.mf_info.func_mf_cfg, FUNC_MF_CFG_FUNC_DISABLED ) )
1197*d14abf15SRobert Mustacchi         {
1198*d14abf15SRobert Mustacchi             DbgMessage(pdev, WARN, "lm_dcc_event: mf_cfg function disabled val=0x%x\n",val);
1199*d14abf15SRobert Mustacchi 
1200*d14abf15SRobert Mustacchi             // TODO - receive packets fronm another machine when link is down - expected - miniport drop packets
1201*d14abf15SRobert Mustacchi             // TBD - disable RX & TX
1202*d14abf15SRobert Mustacchi         }
1203*d14abf15SRobert Mustacchi         else
1204*d14abf15SRobert Mustacchi         {
1205*d14abf15SRobert Mustacchi             DbgMessage(pdev, WARN, "lm_dcc_event: mf_cfg function enabled val=0x%x\n",val);
1206*d14abf15SRobert Mustacchi             // TBD - enable RX & TX
1207*d14abf15SRobert Mustacchi         }
1208*d14abf15SRobert Mustacchi         lm_status = LM_STATUS_SUCCESS ;
1209*d14abf15SRobert Mustacchi         RESET_FLAGS( dcc_event, event_val_current );
1210*d14abf15SRobert Mustacchi     }
1211*d14abf15SRobert Mustacchi 
1212*d14abf15SRobert Mustacchi     event_val_current = DRV_STATUS_DCC_BANDWIDTH_ALLOCATION ;
1213*d14abf15SRobert Mustacchi 
1214*d14abf15SRobert Mustacchi     if GET_FLAGS(dcc_event, event_val_current)
1215*d14abf15SRobert Mustacchi     {
1216*d14abf15SRobert Mustacchi         if( !IS_PMF(pdev) )
1217*d14abf15SRobert Mustacchi         {
1218*d14abf15SRobert Mustacchi             DbgBreakIf(1);
1219*d14abf15SRobert Mustacchi             return;
1220*d14abf15SRobert Mustacchi         }
1221*d14abf15SRobert Mustacchi         lm_status = LM_STATUS_SUCCESS ;
1222*d14abf15SRobert Mustacchi         RESET_FLAGS( dcc_event, event_val_current );
1223*d14abf15SRobert Mustacchi     }
1224*d14abf15SRobert Mustacchi 
1225*d14abf15SRobert Mustacchi     /* Report results to MCP */
1226*d14abf15SRobert Mustacchi     if (dcc_event)
1227*d14abf15SRobert Mustacchi     {
1228*d14abf15SRobert Mustacchi         // unknown event
1229*d14abf15SRobert Mustacchi         lm_status = lm_mcp_cmd_send_recieve( pdev, lm_mcp_mb_header, DRV_MSG_CODE_DCC_FAILURE, 0, MCP_CMD_DEFAULT_TIMEOUT, &fw_resp ) ;
1230*d14abf15SRobert Mustacchi     }
1231*d14abf15SRobert Mustacchi     else
1232*d14abf15SRobert Mustacchi     {
1233*d14abf15SRobert Mustacchi         // we are done
1234*d14abf15SRobert Mustacchi         if( LM_STATUS_SUCCESS == lm_status )
1235*d14abf15SRobert Mustacchi         {
1236*d14abf15SRobert Mustacchi             // sync with link --> update min max/link for all function
1237*d14abf15SRobert Mustacchi             MM_ACQUIRE_PHY_LOCK(pdev);
1238*d14abf15SRobert Mustacchi             elink_link_status_update(&pdev->params.link,&pdev->vars.link);
1239*d14abf15SRobert Mustacchi             lm_link_report(pdev);
1240*d14abf15SRobert Mustacchi             MM_RELEASE_PHY_LOCK(pdev);
1241*d14abf15SRobert Mustacchi         }
1242*d14abf15SRobert Mustacchi         lm_status = lm_mcp_cmd_send_recieve( pdev, lm_mcp_mb_header, DRV_MSG_CODE_DCC_OK, 0, MCP_CMD_DEFAULT_TIMEOUT, &fw_resp ) ;
1243*d14abf15SRobert Mustacchi         //bnx2x_fw_command(bp, DRV_MSG_CODE_DCC_OK);
1244*d14abf15SRobert Mustacchi     }
1245*d14abf15SRobert Mustacchi     DbgBreakIf( lm_status != LM_STATUS_SUCCESS );
1246*d14abf15SRobert Mustacchi }
1247*d14abf15SRobert Mustacchi 
lm_set_bandwidth_event(lm_device_t * pdev)1248*d14abf15SRobert Mustacchi static lm_status_t lm_set_bandwidth_event(lm_device_t *pdev)
1249*d14abf15SRobert Mustacchi {
1250*d14abf15SRobert Mustacchi     u32_t       mcp_resp    = 0;
1251*d14abf15SRobert Mustacchi     lm_status_t lm_status   = LM_STATUS_SUCCESS;
1252*d14abf15SRobert Mustacchi 
1253*d14abf15SRobert Mustacchi     DbgBreakIf(!IS_SD_UFP_MODE(pdev) && (!IS_MULTI_VNIC(pdev) || !pdev->vars.is_pmf));
1254*d14abf15SRobert Mustacchi 
1255*d14abf15SRobert Mustacchi     MM_ACQUIRE_PHY_LOCK(pdev);
1256*d14abf15SRobert Mustacchi 
1257*d14abf15SRobert Mustacchi     //update CMNG data from SHMEM
1258*d14abf15SRobert Mustacchi     lm_reload_link_and_cmng(pdev);
1259*d14abf15SRobert Mustacchi 
1260*d14abf15SRobert Mustacchi     //acknoledge the MCP event
1261*d14abf15SRobert Mustacchi     lm_mcp_cmd_send_recieve(pdev,lm_mcp_mb_header, DRV_MSG_CODE_SET_MF_BW_ACK, 0, MCP_CMD_DEFAULT_TIMEOUT, &mcp_resp);
1262*d14abf15SRobert Mustacchi 
1263*d14abf15SRobert Mustacchi     if ( mcp_resp != FW_MSG_CODE_SET_MF_BW_DONE)
1264*d14abf15SRobert Mustacchi     {
1265*d14abf15SRobert Mustacchi         DbgBreakIf(mcp_resp != FW_MSG_CODE_SET_MF_BW_DONE);
1266*d14abf15SRobert Mustacchi         lm_status = LM_STATUS_FAILURE;
1267*d14abf15SRobert Mustacchi         goto _exit;
1268*d14abf15SRobert Mustacchi     }
1269*d14abf15SRobert Mustacchi 
1270*d14abf15SRobert Mustacchi     //indicate link change to OS, since sync_link_status does not generate a link event for the PMF.
1271*d14abf15SRobert Mustacchi     mm_indicate_link(pdev, pdev->vars.link_status, pdev->vars.medium);
1272*d14abf15SRobert Mustacchi 
1273*d14abf15SRobert Mustacchi     //notify all functions
1274*d14abf15SRobert Mustacchi     sync_link_status(pdev);
1275*d14abf15SRobert Mustacchi 
1276*d14abf15SRobert Mustacchi _exit:
1277*d14abf15SRobert Mustacchi     MM_RELEASE_PHY_LOCK(pdev);
1278*d14abf15SRobert Mustacchi     return lm_status;
1279*d14abf15SRobert Mustacchi }
1280*d14abf15SRobert Mustacchi 
1281*d14abf15SRobert Mustacchi typedef enum drv_info_opcode drv_info_opcode_t;
1282*d14abf15SRobert Mustacchi 
lm_stats_drv_info_to_mfw_event(struct _lm_device_t * pdev)1283*d14abf15SRobert Mustacchi lm_status_t lm_stats_drv_info_to_mfw_event( struct _lm_device_t* pdev )
1284*d14abf15SRobert Mustacchi {
1285*d14abf15SRobert Mustacchi     u32_t              val             = 0;
1286*d14abf15SRobert Mustacchi     u32_t              drv_msg         = 0;
1287*d14abf15SRobert Mustacchi     u32_t              ver             = 0;
1288*d14abf15SRobert Mustacchi     u32_t              fw_resp         = 0 ;
1289*d14abf15SRobert Mustacchi     lm_status_t        lm_status       = LM_STATUS_SUCCESS ;
1290*d14abf15SRobert Mustacchi     drv_info_opcode_t  drv_info_op     = -1;
1291*d14abf15SRobert Mustacchi 
1292*d14abf15SRobert Mustacchi     if( !LM_SHMEM2_HAS(pdev, drv_info_control) )
1293*d14abf15SRobert Mustacchi     {
1294*d14abf15SRobert Mustacchi         // We should never get here...
1295*d14abf15SRobert Mustacchi         DbgBreakIfAll(!LM_SHMEM2_HAS(pdev, drv_info_control));
1296*d14abf15SRobert Mustacchi         return LM_STATUS_FAILURE;
1297*d14abf15SRobert Mustacchi     }
1298*d14abf15SRobert Mustacchi 
1299*d14abf15SRobert Mustacchi     LM_SHMEM2_READ(pdev, OFFSETOF(shmem2_region_t, drv_info_control), &val );
1300*d14abf15SRobert Mustacchi 
1301*d14abf15SRobert Mustacchi     ver = ( GET_FLAGS( val, DRV_INFO_CONTROL_VER_MASK ) ) >> DRV_INFO_CONTROL_VER_SHIFT ;
1302*d14abf15SRobert Mustacchi 
1303*d14abf15SRobert Mustacchi     do
1304*d14abf15SRobert Mustacchi     {
1305*d14abf15SRobert Mustacchi         if( DRV_INFO_CUR_VER != ver )
1306*d14abf15SRobert Mustacchi         {
1307*d14abf15SRobert Mustacchi             // We don't support this interface verison
1308*d14abf15SRobert Mustacchi             drv_msg = DRV_MSG_CODE_DRV_INFO_NACK;
1309*d14abf15SRobert Mustacchi             break;
1310*d14abf15SRobert Mustacchi         }
1311*d14abf15SRobert Mustacchi 
1312*d14abf15SRobert Mustacchi         drv_info_op = ( GET_FLAGS( val, DRV_INFO_CONTROL_OP_CODE_MASK ) ) >> DRV_INFO_CONTROL_OP_CODE_SHIFT;
1313*d14abf15SRobert Mustacchi 
1314*d14abf15SRobert Mustacchi         lm_status = lm_stats_drv_info_to_mfw_assign(pdev, drv_info_op );
1315*d14abf15SRobert Mustacchi 
1316*d14abf15SRobert Mustacchi         if( LM_STATUS_SUCCESS != lm_status )
1317*d14abf15SRobert Mustacchi         {
1318*d14abf15SRobert Mustacchi             // We don't support this interface verison/opcode
1319*d14abf15SRobert Mustacchi             drv_msg = DRV_MSG_CODE_DRV_INFO_NACK;
1320*d14abf15SRobert Mustacchi             break;
1321*d14abf15SRobert Mustacchi         }
1322*d14abf15SRobert Mustacchi 
1323*d14abf15SRobert Mustacchi         LM_SHMEM2_WRITE(pdev, OFFSETOF(shmem2_region_t, drv_info_host_addr_lo), pdev->vars.stats.stats_collect.drv_info_to_mfw.drv_info_to_mfw_phys_addr.as_u32.low );
1324*d14abf15SRobert Mustacchi         LM_SHMEM2_WRITE(pdev, OFFSETOF(shmem2_region_t, drv_info_host_addr_hi), pdev->vars.stats.stats_collect.drv_info_to_mfw.drv_info_to_mfw_phys_addr.as_u32.high );
1325*d14abf15SRobert Mustacchi 
1326*d14abf15SRobert Mustacchi         drv_msg = DRV_MSG_CODE_DRV_INFO_ACK;
1327*d14abf15SRobert Mustacchi 
1328*d14abf15SRobert Mustacchi     } while(0);
1329*d14abf15SRobert Mustacchi 
1330*d14abf15SRobert Mustacchi     lm_status = lm_mcp_cmd_send_recieve( pdev, lm_mcp_mb_header, drv_msg, 0, MCP_CMD_DEFAULT_TIMEOUT, &fw_resp );
1331*d14abf15SRobert Mustacchi 
1332*d14abf15SRobert Mustacchi     return lm_status;
1333*d14abf15SRobert Mustacchi }
1334*d14abf15SRobert Mustacchi 
lm_ufp_pf_disable(lm_device_t * pdev)1335*d14abf15SRobert Mustacchi static lm_status_t lm_ufp_pf_disable(lm_device_t *pdev)
1336*d14abf15SRobert Mustacchi {
1337*d14abf15SRobert Mustacchi     lm_status_t status        = LM_STATUS_SUCCESS;
1338*d14abf15SRobert Mustacchi     u32_t       mcp_resp      = 0;
1339*d14abf15SRobert Mustacchi 
1340*d14abf15SRobert Mustacchi     /*TODO: Have to do some processing based on fi the pF is enabled or disabled*/
1341*d14abf15SRobert Mustacchi     ///indicate "link-down"
1342*d14abf15SRobert Mustacchi     MM_ACQUIRE_PHY_LOCK(pdev);
1343*d14abf15SRobert Mustacchi 
1344*d14abf15SRobert Mustacchi     pdev->vars.link_status = LM_STATUS_LINK_DOWN;
1345*d14abf15SRobert Mustacchi     mm_indicate_link(pdev, pdev->vars.link_status, pdev->vars.medium);
1346*d14abf15SRobert Mustacchi 
1347*d14abf15SRobert Mustacchi     MM_RELEASE_PHY_LOCK(pdev);
1348*d14abf15SRobert Mustacchi 
1349*d14abf15SRobert Mustacchi     /* Report results to MCP */
1350*d14abf15SRobert Mustacchi     ///ACK the MCP message
1351*d14abf15SRobert Mustacchi     if(status == LM_STATUS_SUCCESS)
1352*d14abf15SRobert Mustacchi         lm_mcp_cmd_send_recieve(pdev, lm_mcp_mb_header, DRV_MSG_CODE_OEM_OK, 0, MCP_CMD_DEFAULT_TIMEOUT, &mcp_resp);
1353*d14abf15SRobert Mustacchi     else
1354*d14abf15SRobert Mustacchi         lm_mcp_cmd_send_recieve(pdev, lm_mcp_mb_header, DRV_MSG_CODE_OEM_FAILURE, 0, MCP_CMD_DEFAULT_TIMEOUT, &mcp_resp);
1355*d14abf15SRobert Mustacchi 
1356*d14abf15SRobert Mustacchi     DbgBreakIf(mcp_resp != FW_MSG_CODE_OEM_ACK);
1357*d14abf15SRobert Mustacchi     return status;
1358*d14abf15SRobert Mustacchi }
1359*d14abf15SRobert Mustacchi 
lm_ufp_pf_enable(lm_device_t * pdev)1360*d14abf15SRobert Mustacchi static void lm_ufp_pf_enable(lm_device_t *pdev)
1361*d14abf15SRobert Mustacchi {
1362*d14abf15SRobert Mustacchi     lm_status_t                  status    = LM_STATUS_SUCCESS;
1363*d14abf15SRobert Mustacchi     u32_t                        mcp_resp  = 0;
1364*d14abf15SRobert Mustacchi     struct function_update_data  *data     = LM_SLOWPATH(pdev, ufp_function_update_data);
1365*d14abf15SRobert Mustacchi     const lm_address_t           data_phys = LM_SLOWPATH_PHYS(pdev, ufp_function_update_data);
1366*d14abf15SRobert Mustacchi     lm_hardware_mf_info_t        *mf_info  = &pdev->hw_info.mf_info;
1367*d14abf15SRobert Mustacchi     u32_t                        tag       = 0;
1368*d14abf15SRobert Mustacchi 
1369*d14abf15SRobert Mustacchi     //Reconfigure rate-limit
1370*d14abf15SRobert Mustacchi     MM_ACQUIRE_PHY_LOCK(pdev);
1371*d14abf15SRobert Mustacchi     lm_reload_link_and_cmng(pdev);
1372*d14abf15SRobert Mustacchi     MM_RELEASE_PHY_LOCK(pdev);
1373*d14abf15SRobert Mustacchi 
1374*d14abf15SRobert Mustacchi     /* Other than vlan tag what are other UFP specific data?
1375*d14abf15SRobert Mustacchi      * Should we read the priority etc
1376*d14abf15SRobert Mustacchi      */
1377*d14abf15SRobert Mustacchi 
1378*d14abf15SRobert Mustacchi     /* get ovlan if we're in switch-dependent mode... */
1379*d14abf15SRobert Mustacchi     LM_MFCFG_READ(pdev, OFFSETOF(mf_cfg_t, func_mf_config[ABS_FUNC_ID(pdev)].e1hov_tag),&tag);
1380*d14abf15SRobert Mustacchi     mf_info->ext_id    = (u16_t)tag;
1381*d14abf15SRobert Mustacchi     pdev->params.ovlan = (u16_t)tag;
1382*d14abf15SRobert Mustacchi 
1383*d14abf15SRobert Mustacchi     /* modify the NIG LLH registers */
1384*d14abf15SRobert Mustacchi     init_nig_func(pdev);
1385*d14abf15SRobert Mustacchi 
1386*d14abf15SRobert Mustacchi     DbgBreakIf(pdev->slowpath_info.ufp_func_ramrod_state != UFP_RAMROD_NOT_POSTED);
1387*d14abf15SRobert Mustacchi 
1388*d14abf15SRobert Mustacchi     /* send function update ramrod to change the tag in the FW */
1389*d14abf15SRobert Mustacchi     data->sd_vlan_tag_change_flg = TRUE;
1390*d14abf15SRobert Mustacchi     data->sd_vlan_tag            = mm_cpu_to_le16((u16_t)tag);
1391*d14abf15SRobert Mustacchi     data->echo                   = FUNC_UPDATE_RAMROD_SOURCE_UFP;
1392*d14abf15SRobert Mustacchi 
1393*d14abf15SRobert Mustacchi     status = lm_eq_ramrod_post_sync(pdev,
1394*d14abf15SRobert Mustacchi                                     RAMROD_CMD_ID_COMMON_FUNCTION_UPDATE,
1395*d14abf15SRobert Mustacchi                                     data_phys.as_u64,CMD_PRIORITY_NORMAL,
1396*d14abf15SRobert Mustacchi                                     &pdev->slowpath_info.ufp_func_ramrod_state,
1397*d14abf15SRobert Mustacchi                                     UFP_RAMROD_PF_LINK_UPDATE_POSTED,
1398*d14abf15SRobert Mustacchi                                     UFP_RAMROD_COMPLETED);
1399*d14abf15SRobert Mustacchi 
1400*d14abf15SRobert Mustacchi     /* Report results to MCP */
1401*d14abf15SRobert Mustacchi     ///ACK the MCP message
1402*d14abf15SRobert Mustacchi     if(status == LM_STATUS_SUCCESS)
1403*d14abf15SRobert Mustacchi         lm_mcp_cmd_send_recieve(pdev, lm_mcp_mb_header, DRV_MSG_CODE_OEM_OK, 0, MCP_CMD_DEFAULT_TIMEOUT, &mcp_resp);
1404*d14abf15SRobert Mustacchi     else
1405*d14abf15SRobert Mustacchi         lm_mcp_cmd_send_recieve(pdev, lm_mcp_mb_header, DRV_MSG_CODE_OEM_FAILURE, 0, MCP_CMD_DEFAULT_TIMEOUT, &mcp_resp);
1406*d14abf15SRobert Mustacchi 
1407*d14abf15SRobert Mustacchi     DbgBreakIf(mcp_resp != FW_MSG_CODE_OEM_ACK);
1408*d14abf15SRobert Mustacchi 
1409*d14abf15SRobert Mustacchi     pdev->slowpath_info.ufp_func_ramrod_state = UFP_RAMROD_NOT_POSTED;
1410*d14abf15SRobert Mustacchi }
1411*d14abf15SRobert Mustacchi 
lm_oem_event(lm_device_t * pdev,u32_t event)1412*d14abf15SRobert Mustacchi static lm_status_t lm_oem_event(lm_device_t *pdev, u32_t event)
1413*d14abf15SRobert Mustacchi {
1414*d14abf15SRobert Mustacchi     lm_status_t lm_status = LM_STATUS_SUCCESS;
1415*d14abf15SRobert Mustacchi     const u32_t offset    = OFFSETOF(mf_cfg_t, func_mf_config[ABS_FUNC_ID(pdev)].config);
1416*d14abf15SRobert Mustacchi     u32_t       config    = 0;
1417*d14abf15SRobert Mustacchi 
1418*d14abf15SRobert Mustacchi     DbgMessage(pdev, INFORM, "oem_event 0x%x\n", event);
1419*d14abf15SRobert Mustacchi 
1420*d14abf15SRobert Mustacchi     ///read FUNC-DISABLED and FUNC-DELETED from func_mf_cfg
1421*d14abf15SRobert Mustacchi     LM_MFCFG_READ(pdev, offset, &config);
1422*d14abf15SRobert Mustacchi     pdev->hw_info.mf_info.func_mf_cfg = config ;
1423*d14abf15SRobert Mustacchi 
1424*d14abf15SRobert Mustacchi     if (event & DRV_STATUS_OEM_DISABLE_ENABLE_PF)
1425*d14abf15SRobert Mustacchi     {
1426*d14abf15SRobert Mustacchi         if((config & FUNC_MF_CFG_FUNC_DISABLED) || (config & FUNC_MF_CFG_FUNC_DELETED))
1427*d14abf15SRobert Mustacchi         {
1428*d14abf15SRobert Mustacchi             lm_status = lm_ufp_pf_disable(pdev);
1429*d14abf15SRobert Mustacchi             if (lm_status != LM_STATUS_SUCCESS)
1430*d14abf15SRobert Mustacchi             {
1431*d14abf15SRobert Mustacchi                 DbgBreakIf(lm_status != LM_STATUS_SUCCESS);
1432*d14abf15SRobert Mustacchi                 return lm_status;
1433*d14abf15SRobert Mustacchi             }
1434*d14abf15SRobert Mustacchi         }
1435*d14abf15SRobert Mustacchi         else
1436*d14abf15SRobert Mustacchi         {
1437*d14abf15SRobert Mustacchi #ifdef EDIAG
1438*d14abf15SRobert Mustacchi             lm_ufp_pf_enable(pdev);
1439*d14abf15SRobert Mustacchi #else
1440*d14abf15SRobert Mustacchi             lm_status = MM_REGISTER_LPME(pdev, lm_ufp_pf_enable, TRUE, TRUE);
1441*d14abf15SRobert Mustacchi #endif
1442*d14abf15SRobert Mustacchi             if (lm_status != LM_STATUS_SUCCESS)
1443*d14abf15SRobert Mustacchi             {
1444*d14abf15SRobert Mustacchi                 DbgBreakIf(lm_status != LM_STATUS_SUCCESS);
1445*d14abf15SRobert Mustacchi                 return lm_status;
1446*d14abf15SRobert Mustacchi             }
1447*d14abf15SRobert Mustacchi         }
1448*d14abf15SRobert Mustacchi     }
1449*d14abf15SRobert Mustacchi     else if (event & DRV_STATUS_OEM_BANDWIDTH_ALLOCATION)
1450*d14abf15SRobert Mustacchi     {
1451*d14abf15SRobert Mustacchi         //lm_hardware_mf_info_t *mf_info = &pdev->hw_info.mf_info;
1452*d14abf15SRobert Mustacchi 
1453*d14abf15SRobert Mustacchi         ///* get min/max bw */
1454*d14abf15SRobert Mustacchi         //mf_info->min_bw[vnic] = (GET_FLAGS(config, FUNC_MF_CFG_MIN_BW_MASK) >> FUNC_MF_CFG_MIN_BW_SHIFT);
1455*d14abf15SRobert Mustacchi         //mf_info->max_bw[vnic] = (GET_FLAGS(config, FUNC_MF_CFG_MAX_BW_MASK) >> FUNC_MF_CFG_MAX_BW_SHIFT);
1456*d14abf15SRobert Mustacchi 
1457*d14abf15SRobert Mustacchi         /* this function reads the bw configuration and does the necessary processing..
1458*d14abf15SRobert Mustacchi          * only drawback is it reads the configuration for all the functions?
1459*d14abf15SRobert Mustacchi          *. todo check if we should be using this or not...
1460*d14abf15SRobert Mustacchi          */
1461*d14abf15SRobert Mustacchi         lm_status = lm_set_bandwidth_event(pdev);
1462*d14abf15SRobert Mustacchi         if (lm_status != LM_STATUS_SUCCESS)
1463*d14abf15SRobert Mustacchi         {
1464*d14abf15SRobert Mustacchi             DbgBreakIf(lm_status != LM_STATUS_SUCCESS);
1465*d14abf15SRobert Mustacchi             return lm_status;
1466*d14abf15SRobert Mustacchi         }
1467*d14abf15SRobert Mustacchi     }
1468*d14abf15SRobert Mustacchi 
1469*d14abf15SRobert Mustacchi     return lm_status;
1470*d14abf15SRobert Mustacchi }
1471*d14abf15SRobert Mustacchi 
lm_update_svid(lm_device_t * pdev)1472*d14abf15SRobert Mustacchi static void lm_update_svid(lm_device_t *pdev)
1473*d14abf15SRobert Mustacchi {
1474*d14abf15SRobert Mustacchi     lm_hardware_mf_info_t          *mf_info        = &pdev->hw_info.mf_info;
1475*d14abf15SRobert Mustacchi     u32_t                          tag             = 0;
1476*d14abf15SRobert Mustacchi     u32_t                          mcp_resp        = 0;
1477*d14abf15SRobert Mustacchi     lm_status_t                    lm_status       = LM_STATUS_SUCCESS;
1478*d14abf15SRobert Mustacchi     struct function_update_data    *data           = LM_SLOWPATH(pdev, ufp_function_update_data);
1479*d14abf15SRobert Mustacchi     const lm_address_t             data_phys       = LM_SLOWPATH_PHYS(pdev, ufp_function_update_data);
1480*d14abf15SRobert Mustacchi 
1481*d14abf15SRobert Mustacchi     /* get ovlan if we're in switch-dependent mode... */
1482*d14abf15SRobert Mustacchi     LM_MFCFG_READ(pdev, OFFSETOF(mf_cfg_t, func_mf_config[ABS_FUNC_ID(pdev)].e1hov_tag),&tag);
1483*d14abf15SRobert Mustacchi     mf_info->ext_id      = (u16_t)tag;
1484*d14abf15SRobert Mustacchi     pdev->params.ovlan   = (u16_t)tag;
1485*d14abf15SRobert Mustacchi 
1486*d14abf15SRobert Mustacchi     /* modify the NIG LLH registers */
1487*d14abf15SRobert Mustacchi     init_nig_func(pdev);
1488*d14abf15SRobert Mustacchi 
1489*d14abf15SRobert Mustacchi     DbgBreakIf(pdev->slowpath_info.ufp_func_ramrod_state != UFP_RAMROD_NOT_POSTED);
1490*d14abf15SRobert Mustacchi 
1491*d14abf15SRobert Mustacchi     /* send function update ramrod to change the tag in the FW */
1492*d14abf15SRobert Mustacchi     data->sd_vlan_tag_change_flg = TRUE;
1493*d14abf15SRobert Mustacchi     data->sd_vlan_tag            = mm_cpu_to_le16((u16_t)tag);
1494*d14abf15SRobert Mustacchi     data->echo	                 = FUNC_UPDATE_RAMROD_SOURCE_UFP;
1495*d14abf15SRobert Mustacchi 
1496*d14abf15SRobert Mustacchi     lm_status = lm_eq_ramrod_post_sync(pdev,
1497*d14abf15SRobert Mustacchi                                        RAMROD_CMD_ID_COMMON_FUNCTION_UPDATE,
1498*d14abf15SRobert Mustacchi                                        data_phys.as_u64,CMD_PRIORITY_NORMAL,
1499*d14abf15SRobert Mustacchi                                        &pdev->slowpath_info.ufp_func_ramrod_state,
1500*d14abf15SRobert Mustacchi                                        UFP_RAMROD_PF_UPDATE_POSTED,
1501*d14abf15SRobert Mustacchi                                        UFP_RAMROD_COMPLETED);
1502*d14abf15SRobert Mustacchi 
1503*d14abf15SRobert Mustacchi     /* Report results to MCP */
1504*d14abf15SRobert Mustacchi     if(lm_status == LM_STATUS_SUCCESS)
1505*d14abf15SRobert Mustacchi         lm_mcp_cmd_send_recieve(pdev, lm_mcp_mb_header, DRV_MSG_CODE_OEM_UPDATE_SVID_OK, 0, MCP_CMD_DEFAULT_TIMEOUT, &mcp_resp);
1506*d14abf15SRobert Mustacchi     else
1507*d14abf15SRobert Mustacchi         lm_mcp_cmd_send_recieve(pdev, lm_mcp_mb_header, DRV_MSG_CODE_OEM_UPDATE_SVID_FAILURE, 0, MCP_CMD_DEFAULT_TIMEOUT, &mcp_resp);
1508*d14abf15SRobert Mustacchi 
1509*d14abf15SRobert Mustacchi     DbgBreakIf(mcp_resp != DRV_MSG_CODE_OEM_UPDATE_SVID_ACK);
1510*d14abf15SRobert Mustacchi     pdev->slowpath_info.ufp_func_ramrod_state = UFP_RAMROD_NOT_POSTED;
1511*d14abf15SRobert Mustacchi }
1512*d14abf15SRobert Mustacchi 
1513*d14abf15SRobert Mustacchi #ifndef EDIAG
lm_ufp_update_priority(lm_device_t * pdev)1514*d14abf15SRobert Mustacchi static void lm_ufp_update_priority(lm_device_t *pdev)
1515*d14abf15SRobert Mustacchi {
1516*d14abf15SRobert Mustacchi     lm_hardware_mf_info_t          *mf_info        = &pdev->hw_info.mf_info;
1517*d14abf15SRobert Mustacchi     u32_t                          new_priority    = 0;
1518*d14abf15SRobert Mustacchi     u32_t                          mcp_resp        = 0;
1519*d14abf15SRobert Mustacchi     lm_status_t                    lm_status       = LM_STATUS_SUCCESS;
1520*d14abf15SRobert Mustacchi     struct function_update_data    *data           = LM_SLOWPATH(pdev, ufp_function_update_data);
1521*d14abf15SRobert Mustacchi     const lm_address_t             data_phys       = LM_SLOWPATH_PHYS(pdev, ufp_function_update_data);
1522*d14abf15SRobert Mustacchi 
1523*d14abf15SRobert Mustacchi     DbgBreakIf(pdev->slowpath_info.ufp_func_ramrod_state != UFP_RAMROD_NOT_POSTED);
1524*d14abf15SRobert Mustacchi 
1525*d14abf15SRobert Mustacchi     /* Todo get the priority from somewhere */
1526*d14abf15SRobert Mustacchi 
1527*d14abf15SRobert Mustacchi     /* send function update ramrod to change the tag in the FW */
1528*d14abf15SRobert Mustacchi     data->sd_vlan_force_pri_change_flg = TRUE;
1529*d14abf15SRobert Mustacchi     data->sd_vlan_force_pri_flg        = TRUE;
1530*d14abf15SRobert Mustacchi     //data->sd_vlan_force_pri_val        = mm_cpu_to_le16((u16_t)new_priority);
1531*d14abf15SRobert Mustacchi 
1532*d14abf15SRobert Mustacchi     data->echo	                       = FUNC_UPDATE_RAMROD_SOURCE_UFP;
1533*d14abf15SRobert Mustacchi 
1534*d14abf15SRobert Mustacchi     lm_status = lm_eq_ramrod_post_sync(pdev,
1535*d14abf15SRobert Mustacchi                                        RAMROD_CMD_ID_COMMON_FUNCTION_UPDATE,
1536*d14abf15SRobert Mustacchi                                        data_phys.as_u64,CMD_PRIORITY_NORMAL,
1537*d14abf15SRobert Mustacchi                                        &pdev->slowpath_info.ufp_func_ramrod_state,
1538*d14abf15SRobert Mustacchi                                        UFP_RAMROD_PF_UPDATE_POSTED,
1539*d14abf15SRobert Mustacchi                                        UFP_RAMROD_COMPLETED);
1540*d14abf15SRobert Mustacchi     /*Todo Report results to mcp?*/
1541*d14abf15SRobert Mustacchi     pdev->slowpath_info.ufp_func_ramrod_state = UFP_RAMROD_NOT_POSTED;
1542*d14abf15SRobert Mustacchi }
1543*d14abf15SRobert Mustacchi #endif
1544*d14abf15SRobert Mustacchi 
lm_svid_event(lm_device_t * pdev)1545*d14abf15SRobert Mustacchi static lm_status_t lm_svid_event(lm_device_t *pdev)
1546*d14abf15SRobert Mustacchi {
1547*d14abf15SRobert Mustacchi     lm_status_t lm_status = LM_STATUS_SUCCESS;
1548*d14abf15SRobert Mustacchi #ifdef EDIAG
1549*d14abf15SRobert Mustacchi     lm_update_svid(pdev);
1550*d14abf15SRobert Mustacchi #else
1551*d14abf15SRobert Mustacchi     lm_status = MM_REGISTER_LPME(pdev, lm_update_svid, TRUE, TRUE);
1552*d14abf15SRobert Mustacchi #endif
1553*d14abf15SRobert Mustacchi     if (lm_status != LM_STATUS_SUCCESS)
1554*d14abf15SRobert Mustacchi     {
1555*d14abf15SRobert Mustacchi             DbgBreakIf(lm_status != LM_STATUS_SUCCESS);
1556*d14abf15SRobert Mustacchi             return lm_status;
1557*d14abf15SRobert Mustacchi     }
1558*d14abf15SRobert Mustacchi 
1559*d14abf15SRobert Mustacchi     return lm_status;
1560*d14abf15SRobert Mustacchi }
1561*d14abf15SRobert Mustacchi 
lm_generic_event(lm_device_t * pdev)1562*d14abf15SRobert Mustacchi static void lm_generic_event(lm_device_t *pdev)
1563*d14abf15SRobert Mustacchi {
1564*d14abf15SRobert Mustacchi     u32_t      val              = 0;
1565*d14abf15SRobert Mustacchi     u32_t      offset           = 0; // for debugging convenient
1566*d14abf15SRobert Mustacchi     u8_t       call_pmf_or_link = FALSE;
1567*d14abf15SRobert Mustacchi     const u8_t func_id          = FUNC_ID(pdev);
1568*d14abf15SRobert Mustacchi 
1569*d14abf15SRobert Mustacchi 
1570*d14abf15SRobert Mustacchi     offset = MISC_REG_AEU_GENERAL_ATTN_12 + 4*func_id;
1571*d14abf15SRobert Mustacchi 
1572*d14abf15SRobert Mustacchi     // reset attention
1573*d14abf15SRobert Mustacchi     REG_WR(pdev, offset ,0x0);
1574*d14abf15SRobert Mustacchi 
1575*d14abf15SRobert Mustacchi     offset = OFFSETOF(shmem_region_t, func_mb[FUNC_MAILBOX_ID(pdev)].drv_status) ;
1576*d14abf15SRobert Mustacchi 
1577*d14abf15SRobert Mustacchi     // drv_status
1578*d14abf15SRobert Mustacchi     LM_SHMEM_READ(pdev,
1579*d14abf15SRobert Mustacchi                   offset,
1580*d14abf15SRobert Mustacchi                   &val);
1581*d14abf15SRobert Mustacchi 
1582*d14abf15SRobert Mustacchi     // E1H NIG status sync attention mapped to group 4-7
1583*d14abf15SRobert Mustacchi 
1584*d14abf15SRobert Mustacchi     if (GET_FLAGS( val, DRV_STATUS_VF_DISABLED))
1585*d14abf15SRobert Mustacchi     {
1586*d14abf15SRobert Mustacchi         u32_t mcp_vf_disabled[E2_VF_MAX / 32] = {0};
1587*d14abf15SRobert Mustacchi         u32_t i, fw_resp = 0;
1588*d14abf15SRobert Mustacchi 
1589*d14abf15SRobert Mustacchi         // Read VFs
1590*d14abf15SRobert Mustacchi         for (i = 0; i < ARRSIZE(mcp_vf_disabled); i++)
1591*d14abf15SRobert Mustacchi         {
1592*d14abf15SRobert Mustacchi             LM_SHMEM2_READ(pdev, OFFSETOF(shmem2_region_t,mcp_vf_disabled[i]), &mcp_vf_disabled[i]);
1593*d14abf15SRobert Mustacchi         }
1594*d14abf15SRobert Mustacchi         DbgMessage(pdev, FATAL, "lm_generic_event: DRV_STATUS_VF_DISABLED received for vfs bitmap %x %x!!!\n", mcp_vf_disabled[0], mcp_vf_disabled[1]);
1595*d14abf15SRobert Mustacchi 
1596*d14abf15SRobert Mustacchi         // SHMULIK, PLACE YOUR CODE HERE ( Handle only VFs of this PF )
1597*d14abf15SRobert Mustacchi 
1598*d14abf15SRobert Mustacchi         // Acknoledge the VFs you handled ( This array is per PF driver on path )
1599*d14abf15SRobert Mustacchi         for (i = 0; i < ARRSIZE(mcp_vf_disabled) ; i++)
1600*d14abf15SRobert Mustacchi         {
1601*d14abf15SRobert Mustacchi             LM_SHMEM2_WRITE(pdev, OFFSETOF(shmem2_region_t,drv_ack_vf_disabled[FUNC_MAILBOX_ID(pdev)][i]), mcp_vf_disabled[i]);
1602*d14abf15SRobert Mustacchi         }
1603*d14abf15SRobert Mustacchi         lm_mcp_cmd_send_recieve( pdev,
1604*d14abf15SRobert Mustacchi                                  lm_mcp_mb_header,
1605*d14abf15SRobert Mustacchi                                  DRV_MSG_CODE_VF_DISABLED_DONE,
1606*d14abf15SRobert Mustacchi                                  0,
1607*d14abf15SRobert Mustacchi                                  MCP_CMD_DEFAULT_TIMEOUT,
1608*d14abf15SRobert Mustacchi                                  &fw_resp);
1609*d14abf15SRobert Mustacchi         return; // YANIV - DEBUG @@@!!!
1610*d14abf15SRobert Mustacchi     }
1611*d14abf15SRobert Mustacchi     if(IS_MULTI_VNIC(pdev))
1612*d14abf15SRobert Mustacchi     {
1613*d14abf15SRobert Mustacchi         if( GET_FLAGS( val, DRV_STATUS_DCC_EVENT_MASK ) )
1614*d14abf15SRobert Mustacchi         {
1615*d14abf15SRobert Mustacchi             lm_dcc_event(pdev, (DRV_STATUS_DCC_EVENT_MASK & val) );
1616*d14abf15SRobert Mustacchi         }
1617*d14abf15SRobert Mustacchi 
1618*d14abf15SRobert Mustacchi         if (GET_FLAGS(val, DRV_STATUS_SET_MF_BW ))
1619*d14abf15SRobert Mustacchi         {
1620*d14abf15SRobert Mustacchi             lm_set_bandwidth_event(pdev);
1621*d14abf15SRobert Mustacchi         }
1622*d14abf15SRobert Mustacchi 
1623*d14abf15SRobert Mustacchi         //if val has any NIV event flags, call lm_niv_event
1624*d14abf15SRobert Mustacchi         if ( GET_FLAGS(val, DRV_STATUS_AFEX_EVENT_MASK) )
1625*d14abf15SRobert Mustacchi         {
1626*d14abf15SRobert Mustacchi             lm_niv_event(pdev, GET_FLAGS(val, DRV_STATUS_AFEX_EVENT_MASK) );
1627*d14abf15SRobert Mustacchi         }
1628*d14abf15SRobert Mustacchi     }
1629*d14abf15SRobert Mustacchi 
1630*d14abf15SRobert Mustacchi     if GET_FLAGS(val, DRV_STATUS_DRV_INFO_REQ)
1631*d14abf15SRobert Mustacchi     {
1632*d14abf15SRobert Mustacchi         lm_stats_drv_info_to_mfw_event(pdev);
1633*d14abf15SRobert Mustacchi     }
1634*d14abf15SRobert Mustacchi 
1635*d14abf15SRobert Mustacchi     // NOTE:
1636*d14abf15SRobert Mustacchi     // once we have events such as DCC and NIV, this condition doesn't stand anymore
1637*d14abf15SRobert Mustacchi     // we might get here TRUE although we are in MULTI_VNIC AND we are not PMF
1638*d14abf15SRobert Mustacchi     // and this is not for link change or pmf migration
1639*d14abf15SRobert Mustacchi     // the potential problem (redundant link report to OS CQ60223)
1640*d14abf15SRobert Mustacchi     // is resolved in "lm_link_report" function that check current link
1641*d14abf15SRobert Mustacchi     // with previous reported link
1642*d14abf15SRobert Mustacchi 
1643*d14abf15SRobert Mustacchi     /* Check if pmf or link event function should be called: */
1644*d14abf15SRobert Mustacchi     call_pmf_or_link = IS_MULTI_VNIC(pdev) && !pdev->vars.is_pmf;
1645*d14abf15SRobert Mustacchi 
1646*d14abf15SRobert Mustacchi 
1647*d14abf15SRobert Mustacchi     /* PMF or link event */
1648*d14abf15SRobert Mustacchi     if (GET_FLAGS(pdev->vars.link.periodic_flags, ELINK_PERIODIC_FLAGS_LINK_EVENT))
1649*d14abf15SRobert Mustacchi     {
1650*d14abf15SRobert Mustacchi         DbgMessage(pdev, WARN, "lm_generic_event: ELINK_PERIODIC_FLAGS_LINK_EVENT func_id=%d!!!\n", func_id );
1651*d14abf15SRobert Mustacchi 
1652*d14abf15SRobert Mustacchi         /*  sync with link */
1653*d14abf15SRobert Mustacchi         MM_ACQUIRE_PHY_LOCK_DPC(pdev);
1654*d14abf15SRobert Mustacchi         RESET_FLAGS(pdev->vars.link.periodic_flags, ELINK_PERIODIC_FLAGS_LINK_EVENT);
1655*d14abf15SRobert Mustacchi         MM_RELEASE_PHY_LOCK_DPC(pdev);
1656*d14abf15SRobert Mustacchi 
1657*d14abf15SRobert Mustacchi         call_pmf_or_link = TRUE;
1658*d14abf15SRobert Mustacchi     }
1659*d14abf15SRobert Mustacchi 
1660*d14abf15SRobert Mustacchi     if(call_pmf_or_link)
1661*d14abf15SRobert Mustacchi     {
1662*d14abf15SRobert Mustacchi         lm_pmf_or_link_event(pdev, val);
1663*d14abf15SRobert Mustacchi     }
1664*d14abf15SRobert Mustacchi 
1665*d14abf15SRobert Mustacchi     if GET_FLAGS(val, DRV_STATUS_OEM_EVENT_MASK)
1666*d14abf15SRobert Mustacchi     {
1667*d14abf15SRobert Mustacchi         lm_oem_event(pdev, val);
1668*d14abf15SRobert Mustacchi     }
1669*d14abf15SRobert Mustacchi 
1670*d14abf15SRobert Mustacchi     if GET_FLAGS(val, DRV_STATUS_OEM_UPDATE_SVID)
1671*d14abf15SRobert Mustacchi     {
1672*d14abf15SRobert Mustacchi         lm_svid_event(pdev);
1673*d14abf15SRobert Mustacchi     }
1674*d14abf15SRobert Mustacchi 
1675*d14abf15SRobert Mustacchi     lm_dcbx_event(pdev,val);
1676*d14abf15SRobert Mustacchi }
1677*d14abf15SRobert Mustacchi 
lm_gen_attn_everest_processing(lm_device_t * pdev,u32_t sig_word_aft_inv)1678*d14abf15SRobert Mustacchi static void lm_gen_attn_everest_processing(lm_device_t *pdev, u32_t sig_word_aft_inv)
1679*d14abf15SRobert Mustacchi {
1680*d14abf15SRobert Mustacchi     u32_t offset = 0; // for debugging convenient
1681*d14abf15SRobert Mustacchi     u32_t val    = 0;
1682*d14abf15SRobert Mustacchi 
1683*d14abf15SRobert Mustacchi     //pass over all attention generals which are wired to a dynamic group of the lower 8 bits
1684*d14abf15SRobert Mustacchi     offset = GENERAL_ATTEN_OFFSET(TSTORM_FATAL_ASSERT_ATTENTION_BIT) ;
1685*d14abf15SRobert Mustacchi     if ( offset & sig_word_aft_inv)
1686*d14abf15SRobert Mustacchi     {
1687*d14abf15SRobert Mustacchi         REG_WR(pdev,MISC_REG_AEU_GENERAL_ATTN_7,0x0);
1688*d14abf15SRobert Mustacchi         DbgMessage(pdev, FATAL, "lm_gen_attn_everest_processing: TSTORM_FATAL_ASSERT_ATTENTION_BIT received!!!\n");
1689*d14abf15SRobert Mustacchi         DbgBreakIfAll(1);
1690*d14abf15SRobert Mustacchi     }
1691*d14abf15SRobert Mustacchi     offset = GENERAL_ATTEN_OFFSET(USTORM_FATAL_ASSERT_ATTENTION_BIT);
1692*d14abf15SRobert Mustacchi     if ( offset & sig_word_aft_inv)
1693*d14abf15SRobert Mustacchi     {
1694*d14abf15SRobert Mustacchi         REG_WR(pdev,MISC_REG_AEU_GENERAL_ATTN_8,0x0);
1695*d14abf15SRobert Mustacchi         DbgMessage(pdev, FATAL, "lm_gen_attn_everest_processing: USTORM_FATAL_ASSERT_ATTENTION_BIT received!!!\n");
1696*d14abf15SRobert Mustacchi         DbgBreakIfAll(1);
1697*d14abf15SRobert Mustacchi     }
1698*d14abf15SRobert Mustacchi     offset = GENERAL_ATTEN_OFFSET(CSTORM_FATAL_ASSERT_ATTENTION_BIT);
1699*d14abf15SRobert Mustacchi     if ( offset & sig_word_aft_inv)
1700*d14abf15SRobert Mustacchi     {
1701*d14abf15SRobert Mustacchi         REG_WR(pdev,MISC_REG_AEU_GENERAL_ATTN_9,0x0);
1702*d14abf15SRobert Mustacchi         DbgMessage(pdev, FATAL, "lm_gen_attn_everest_processing: CSTORM_FATAL_ASSERT_ATTENTION_BIT received!!!\n");
1703*d14abf15SRobert Mustacchi         DbgBreakIfAll(1);
1704*d14abf15SRobert Mustacchi     }
1705*d14abf15SRobert Mustacchi     offset = GENERAL_ATTEN_OFFSET(XSTORM_FATAL_ASSERT_ATTENTION_BIT);
1706*d14abf15SRobert Mustacchi     if ( offset & sig_word_aft_inv)
1707*d14abf15SRobert Mustacchi     {
1708*d14abf15SRobert Mustacchi         REG_WR(pdev,MISC_REG_AEU_GENERAL_ATTN_10,0x0);
1709*d14abf15SRobert Mustacchi         DbgMessage(pdev, FATAL, "lm_gen_attn_everest_processing: XSTORM_FATAL_ASSERT_ATTENTION_BIT received!!!\n");
1710*d14abf15SRobert Mustacchi         DbgBreakIfAll(1);
1711*d14abf15SRobert Mustacchi     }
1712*d14abf15SRobert Mustacchi     offset = GENERAL_ATTEN_OFFSET(MCP_FATAL_ASSERT_ATTENTION_BIT);
1713*d14abf15SRobert Mustacchi     if ( offset & sig_word_aft_inv)
1714*d14abf15SRobert Mustacchi     {
1715*d14abf15SRobert Mustacchi         REG_WR(pdev,MISC_REG_AEU_GENERAL_ATTN_11,0x0);
1716*d14abf15SRobert Mustacchi         val = lm_mcp_check(pdev);
1717*d14abf15SRobert Mustacchi         DbgMessage(pdev, FATAL, "lm_gen_attn_everest_processing: MCP_FATAL_ASSERT_ATTENTION_BIT received mcp_check=0x%x!!!\n" , val);
1718*d14abf15SRobert Mustacchi         DbgBreakIfAll(1);
1719*d14abf15SRobert Mustacchi     }
1720*d14abf15SRobert Mustacchi      // E1H NIG status sync attention mapped to group 4-7
1721*d14abf15SRobert Mustacchi     if (!CHIP_IS_E1(pdev))
1722*d14abf15SRobert Mustacchi     {
1723*d14abf15SRobert Mustacchi         // PMF change or link update
1724*d14abf15SRobert Mustacchi         offset = GENERAL_ATTEN_OFFSET(LINK_SYNC_ATTENTION_BIT_FUNC_0 + FUNC_ID(pdev));
1725*d14abf15SRobert Mustacchi 
1726*d14abf15SRobert Mustacchi         if ( offset & sig_word_aft_inv)
1727*d14abf15SRobert Mustacchi         {
1728*d14abf15SRobert Mustacchi            lm_generic_event(pdev);
1729*d14abf15SRobert Mustacchi         }
1730*d14abf15SRobert Mustacchi     }
1731*d14abf15SRobert Mustacchi }
1732*d14abf15SRobert Mustacchi 
lm_read_attn_regs(lm_device_t * pdev,u32_t * attn_sig_af_inv_arr,u32_t arr_size)1733*d14abf15SRobert Mustacchi void lm_read_attn_regs(lm_device_t *pdev, u32_t * attn_sig_af_inv_arr, u32_t arr_size)
1734*d14abf15SRobert Mustacchi {
1735*d14abf15SRobert Mustacchi     u8_t i;
1736*d14abf15SRobert Mustacchi     DbgBreakIf( pdev->vars.num_attn_sig_regs > arr_size );
1737*d14abf15SRobert Mustacchi     DbgBreakIf( pdev->vars.num_attn_sig_regs > ARRSIZE(pdev->vars.attn_sig_af_inv_reg_addr) );
1738*d14abf15SRobert Mustacchi 
1739*d14abf15SRobert Mustacchi     //Read the 128 attn signals bits after inverter
1740*d14abf15SRobert Mustacchi     for (i = 0; i < pdev->vars.num_attn_sig_regs; i++)
1741*d14abf15SRobert Mustacchi     {
1742*d14abf15SRobert Mustacchi         attn_sig_af_inv_arr[i] = REG_RD(pdev, pdev->vars.attn_sig_af_inv_reg_addr[i]);
1743*d14abf15SRobert Mustacchi     }
1744*d14abf15SRobert Mustacchi 
1745*d14abf15SRobert Mustacchi     DbgMessage(pdev, INFORM, "lm_handle_deassertion_processing: attn_sig_aft_invert_1:0x%x; attn_sig_aft_invert_2:0x%x; attn_sig_aft_invert_3:0x%x; attn_sig_aft_invert_4:0x%x,attn_sig_aft_invert_5:0x%x\n",
1746*d14abf15SRobert Mustacchi                 attn_sig_af_inv_arr[0],
1747*d14abf15SRobert Mustacchi                 attn_sig_af_inv_arr[1],
1748*d14abf15SRobert Mustacchi                 attn_sig_af_inv_arr[2],
1749*d14abf15SRobert Mustacchi                 attn_sig_af_inv_arr[3],
1750*d14abf15SRobert Mustacchi                 attn_sig_af_inv_arr[4]);
1751*d14abf15SRobert Mustacchi }
1752*d14abf15SRobert Mustacchi 
1753*d14abf15SRobert Mustacchi 
1754*d14abf15SRobert Mustacchi 
lm_get_attn_info(lm_device_t * pdev,u16_t * attn_bits,u16_t * attn_ack)1755*d14abf15SRobert Mustacchi void lm_get_attn_info(lm_device_t *pdev, u16_t *attn_bits, u16_t *attn_ack)
1756*d14abf15SRobert Mustacchi {
1757*d14abf15SRobert Mustacchi     volatile struct atten_sp_status_block *       attention_sb = NULL;
1758*d14abf15SRobert Mustacchi     u16_t                                   lcl_attn_sb_index = 0;
1759*d14abf15SRobert Mustacchi 
1760*d14abf15SRobert Mustacchi     DbgBreakIf(!(pdev && attn_bits && attn_ack));
1761*d14abf15SRobert Mustacchi 
1762*d14abf15SRobert Mustacchi     attention_sb = lm_get_attention_status_block(pdev);
1763*d14abf15SRobert Mustacchi 
1764*d14abf15SRobert Mustacchi     //guard against dynamic change of attn lines - 15 interations max
1765*d14abf15SRobert Mustacchi     //the main idea here is to assure that we work on synchronized snapshots of the attn_bits and
1766*d14abf15SRobert Mustacchi     //attn_ack and avoid a faulty scenario where attn_ack we read in sanpshot #2 corresponds to attn_bits
1767*d14abf15SRobert Mustacchi     //of snapshot #1 which occured on different time frames.
1768*d14abf15SRobert Mustacchi     do
1769*d14abf15SRobert Mustacchi     {
1770*d14abf15SRobert Mustacchi         lcl_attn_sb_index = mm_le16_to_cpu(attention_sb->attn_bits_index);
1771*d14abf15SRobert Mustacchi         *attn_bits = (u16_t)mm_le32_to_cpu(attention_sb->attn_bits);
1772*d14abf15SRobert Mustacchi         *attn_ack  = (u16_t)mm_le32_to_cpu(attention_sb->attn_bits_ack);
1773*d14abf15SRobert Mustacchi 
1774*d14abf15SRobert Mustacchi     } while (lcl_attn_sb_index != mm_le16_to_cpu(attention_sb->attn_bits_index));
1775*d14abf15SRobert Mustacchi     //the lcl_attn_sb_index differs from the real local attn_index in the pdev since in this while loop it could
1776*d14abf15SRobert Mustacchi     //have been changed, we don't save it locally, and thus we will definitely receive an interrupt in case the
1777*d14abf15SRobert Mustacchi     //while condition is met.
1778*d14abf15SRobert Mustacchi 
1779*d14abf15SRobert Mustacchi     DbgMessage(pdev,
1780*d14abf15SRobert Mustacchi                INFORMi,
1781*d14abf15SRobert Mustacchi                "lm_get_attn_info: def_sb->attn_bits:0x%x, def_sb->attn_ack:0x%x, attn_bits:0x%x, attn_ack:0x%x\n",
1782*d14abf15SRobert Mustacchi                mm_le32_to_cpu(attention_sb->attn_bits),
1783*d14abf15SRobert Mustacchi                mm_le32_to_cpu(attention_sb->attn_bits_ack),
1784*d14abf15SRobert Mustacchi                *attn_bits,
1785*d14abf15SRobert Mustacchi                *attn_ack);
1786*d14abf15SRobert Mustacchi }
1787*d14abf15SRobert Mustacchi 
1788*d14abf15SRobert Mustacchi 
lm_dq_attn_everest_processing(lm_device_t * pdev)1789*d14abf15SRobert Mustacchi static u32_t lm_dq_attn_everest_processing(lm_device_t *pdev)
1790*d14abf15SRobert Mustacchi {
1791*d14abf15SRobert Mustacchi     u32_t val,valc;
1792*d14abf15SRobert Mustacchi     val=REG_RD(pdev,DORQ_REG_DORQ_INT_STS);
1793*d14abf15SRobert Mustacchi     // TODO add defines here
1794*d14abf15SRobert Mustacchi     DbgMessage(pdev, FATAL, "DB hw attention 0x%x\n",val);
1795*d14abf15SRobert Mustacchi     if (val) {
1796*d14abf15SRobert Mustacchi         pdev->vars.dq_int_status_cnt++;
1797*d14abf15SRobert Mustacchi         if (val & DORQ_DORQ_INT_STS_REG_DB_DISCARD)
1798*d14abf15SRobert Mustacchi         {
1799*d14abf15SRobert Mustacchi     // DORQ discard attention
1800*d14abf15SRobert Mustacchi             pdev->vars.dq_int_status_discard_cnt++;//DbgBreakIfAll(1);
1801*d14abf15SRobert Mustacchi         }
1802*d14abf15SRobert Mustacchi         if (val & DORQ_DORQ_INT_STS_REG_TYPE_VAL_ERR)
1803*d14abf15SRobert Mustacchi     {
1804*d14abf15SRobert Mustacchi             // DORQ discard attention
1805*d14abf15SRobert Mustacchi             pdev->vars.dq_int_status_vf_val_err_cnt++;//DbgBreakIfAll(1);
1806*d14abf15SRobert Mustacchi             pdev->vars.dq_vf_type_val_err_fid = REG_RD(pdev,DORQ_REG_VF_TYPE_VAL_ERR_FID);
1807*d14abf15SRobert Mustacchi             pdev->vars.dq_vf_type_val_err_mcid = REG_RD(pdev,DORQ_REG_VF_TYPE_VAL_ERR_MCID);
1808*d14abf15SRobert Mustacchi     }
1809*d14abf15SRobert Mustacchi     }
1810*d14abf15SRobert Mustacchi     valc = REG_RD(pdev,DORQ_REG_DORQ_INT_STS_CLR);
1811*d14abf15SRobert Mustacchi     return val;
1812*d14abf15SRobert Mustacchi }
1813*d14abf15SRobert Mustacchi 
lm_handle_deassertion_processing(lm_device_t * pdev,u16_t deassertion_proc_flgs)1814*d14abf15SRobert Mustacchi void lm_handle_deassertion_processing(lm_device_t *pdev, u16_t deassertion_proc_flgs)
1815*d14abf15SRobert Mustacchi {
1816*d14abf15SRobert Mustacchi     lm_status_t lm_status                     = LM_STATUS_SUCCESS;
1817*d14abf15SRobert Mustacchi     u32_t  val                                = 0;
1818*d14abf15SRobert Mustacchi     u32_t  port_reg_name                      = 0;
1819*d14abf15SRobert Mustacchi     u8_t   index                              = 0;
1820*d14abf15SRobert Mustacchi     u8_t   i                                  = 0;
1821*d14abf15SRobert Mustacchi     u32_t  mask_val                           = 0;
1822*d14abf15SRobert Mustacchi     u32_t  attn_sig_af_inv_arr[MAX_ATTN_REGS] = {0};
1823*d14abf15SRobert Mustacchi     u32_t  group_mask_arr[MAX_ATTN_REGS]      = {0};
1824*d14abf15SRobert Mustacchi     u32_t  mask_arr_val[MAX_ATTN_REGS]        = {0};
1825*d14abf15SRobert Mustacchi     u32_t  dq_int_sts, cfc_int_sts;
1826*d14abf15SRobert Mustacchi 
1827*d14abf15SRobert Mustacchi     DbgBreakIf(!pdev);
1828*d14abf15SRobert Mustacchi     DbgMessage(pdev, INFORM, "lm_handle_deassertion_processing: deassertion_proc_flgs:%d\n", deassertion_proc_flgs);
1829*d14abf15SRobert Mustacchi 
1830*d14abf15SRobert Mustacchi 
1831*d14abf15SRobert Mustacchi     //acquire split lock for attention signals handling
1832*d14abf15SRobert Mustacchi     acquire_split_alr(pdev);
1833*d14abf15SRobert Mustacchi 
1834*d14abf15SRobert Mustacchi     lm_read_attn_regs(pdev, attn_sig_af_inv_arr, ARRSIZE(attn_sig_af_inv_arr));
1835*d14abf15SRobert Mustacchi 
1836*d14abf15SRobert Mustacchi     if (lm_recoverable_error(pdev, attn_sig_af_inv_arr,ARRSIZE(attn_sig_af_inv_arr)))
1837*d14abf15SRobert Mustacchi     {
1838*d14abf15SRobert Mustacchi         DbgMessage(pdev, WARNer, "Starting lm recover flow ");
1839*d14abf15SRobert Mustacchi         lm_status = mm_er_initiate_recovery(pdev);
1840*d14abf15SRobert Mustacchi         if (lm_status == LM_STATUS_SUCCESS)
1841*d14abf15SRobert Mustacchi         {
1842*d14abf15SRobert Mustacchi             /* Continue only on success... */
1843*d14abf15SRobert Mustacchi             /* Disable HW interrupts */
1844*d14abf15SRobert Mustacchi             lm_disable_int(pdev);
1845*d14abf15SRobert Mustacchi 
1846*d14abf15SRobert Mustacchi             release_split_alr(pdev);
1847*d14abf15SRobert Mustacchi             /* In case of recoverable error don't handle attention so that
1848*d14abf15SRobert Mustacchi             * other functions get this parity as well.
1849*d14abf15SRobert Mustacchi             */
1850*d14abf15SRobert Mustacchi             return;
1851*d14abf15SRobert Mustacchi         }
1852*d14abf15SRobert Mustacchi         DbgMessage(pdev, WARNer, "mm_er_initiate_recovery returned status %d ", lm_status);
1853*d14abf15SRobert Mustacchi 
1854*d14abf15SRobert Mustacchi         /* Recovery failed... we'll keep going, and eventually hit
1855*d14abf15SRobert Mustacchi          * the attnetion and assert...
1856*d14abf15SRobert Mustacchi          */
1857*d14abf15SRobert Mustacchi     }
1858*d14abf15SRobert Mustacchi 
1859*d14abf15SRobert Mustacchi     //For all deasserted groups, pass over entire attn_bits after inverter and if they
1860*d14abf15SRobert Mustacchi     // are members of that particular gruop, treat each one of them accordingly.
1861*d14abf15SRobert Mustacchi     for (index = 0; index < ARRSIZE(pdev->vars.attn_groups_output); index++)
1862*d14abf15SRobert Mustacchi     {
1863*d14abf15SRobert Mustacchi         if (deassertion_proc_flgs & (1 << index))
1864*d14abf15SRobert Mustacchi         {
1865*d14abf15SRobert Mustacchi             for (i = 0; i < ARRSIZE(group_mask_arr); i++)
1866*d14abf15SRobert Mustacchi             {
1867*d14abf15SRobert Mustacchi                 group_mask_arr[i] = pdev->vars.attn_groups_output[index].attn_sig_dword[i];
1868*d14abf15SRobert Mustacchi             }
1869*d14abf15SRobert Mustacchi 
1870*d14abf15SRobert Mustacchi             DbgMessage(pdev, WARN, "lm_handle_deassertion_processing: group #%d got attention on it!\n", index);
1871*d14abf15SRobert Mustacchi             DbgMessage(pdev, WARN, "lm_handle_deassertion_processing: mask1:0x%x, mask2:0x%x, mask3:0x%x, mask4:0x%x,mask5:0x%x\n",
1872*d14abf15SRobert Mustacchi                        group_mask_arr[0],
1873*d14abf15SRobert Mustacchi                        group_mask_arr[1],
1874*d14abf15SRobert Mustacchi                        group_mask_arr[2],
1875*d14abf15SRobert Mustacchi                        group_mask_arr[3],
1876*d14abf15SRobert Mustacchi                        group_mask_arr[4]);
1877*d14abf15SRobert Mustacchi             DbgMessage(pdev, WARN, "lm_handle_deassertion_processing: attn1:0x%x, attn2:0x%x, attn3:0x%x, attn4:0x%x,attn5:0x%x\n",
1878*d14abf15SRobert Mustacchi                        attn_sig_af_inv_arr[0],
1879*d14abf15SRobert Mustacchi                        attn_sig_af_inv_arr[1],
1880*d14abf15SRobert Mustacchi                        attn_sig_af_inv_arr[2],
1881*d14abf15SRobert Mustacchi                        attn_sig_af_inv_arr[3],
1882*d14abf15SRobert Mustacchi                        attn_sig_af_inv_arr[4]);
1883*d14abf15SRobert Mustacchi 
1884*d14abf15SRobert Mustacchi             if (attn_sig_af_inv_arr[3] & EVEREST_GEN_ATTN_IN_USE_MASK & group_mask_arr[3])
1885*d14abf15SRobert Mustacchi             {
1886*d14abf15SRobert Mustacchi                 lm_gen_attn_everest_processing(pdev, attn_sig_af_inv_arr[3]);
1887*d14abf15SRobert Mustacchi             }
1888*d14abf15SRobert Mustacchi 
1889*d14abf15SRobert Mustacchi             // DQ attn
1890*d14abf15SRobert Mustacchi             if (attn_sig_af_inv_arr[1] & AEU_INPUTS_ATTN_BITS_DOORBELLQ_HW_INTERRUPT & group_mask_arr[1])
1891*d14abf15SRobert Mustacchi             {
1892*d14abf15SRobert Mustacchi                 dq_int_sts = lm_dq_attn_everest_processing(pdev);
1893*d14abf15SRobert Mustacchi             }
1894*d14abf15SRobert Mustacchi             // CFC attn
1895*d14abf15SRobert Mustacchi             if (attn_sig_af_inv_arr[2] & AEU_INPUTS_ATTN_BITS_CFC_HW_INTERRUPT & group_mask_arr[2])
1896*d14abf15SRobert Mustacchi             {
1897*d14abf15SRobert Mustacchi                 cfc_int_sts = lm_cfc_attn_everest_processing(pdev);
1898*d14abf15SRobert Mustacchi             }
1899*d14abf15SRobert Mustacchi             // PXP attn
1900*d14abf15SRobert Mustacchi             if (attn_sig_af_inv_arr[2] & AEU_INPUTS_ATTN_BITS_PXP_HW_INTERRUPT & group_mask_arr[2])
1901*d14abf15SRobert Mustacchi             {
1902*d14abf15SRobert Mustacchi                 lm_pxp_attn_everest_processing(pdev);
1903*d14abf15SRobert Mustacchi             }
1904*d14abf15SRobert Mustacchi             // SPIO 5 bit in register 0
1905*d14abf15SRobert Mustacchi             if (attn_sig_af_inv_arr[0] & AEU_INPUTS_ATTN_BITS_SPIO5 & group_mask_arr[0])
1906*d14abf15SRobert Mustacchi             {
1907*d14abf15SRobert Mustacchi                 lm_spio5_attn_everest_processing(pdev);
1908*d14abf15SRobert Mustacchi             }
1909*d14abf15SRobert Mustacchi 
1910*d14abf15SRobert Mustacchi             // GPIO3 bits in register 0
1911*d14abf15SRobert Mustacchi             if (attn_sig_af_inv_arr[0] & pdev->vars.link.aeu_int_mask & group_mask_arr[0])
1912*d14abf15SRobert Mustacchi             {
1913*d14abf15SRobert Mustacchi                 // Handle it only for PMF
1914*d14abf15SRobert Mustacchi                 if (IS_PMF(pdev))
1915*d14abf15SRobert Mustacchi                 {
1916*d14abf15SRobert Mustacchi                     MM_ACQUIRE_PHY_LOCK(pdev);
1917*d14abf15SRobert Mustacchi                     PHY_HW_LOCK(pdev);
1918*d14abf15SRobert Mustacchi                     elink_handle_module_detect_int(&pdev->params.link);
1919*d14abf15SRobert Mustacchi                     PHY_HW_UNLOCK(pdev);
1920*d14abf15SRobert Mustacchi                     MM_RELEASE_PHY_LOCK(pdev);
1921*d14abf15SRobert Mustacchi                 }
1922*d14abf15SRobert Mustacchi             }
1923*d14abf15SRobert Mustacchi 
1924*d14abf15SRobert Mustacchi             //TODO: attribute each attention signal arrived and which is a member of a group and give it its own
1925*d14abf15SRobert Mustacchi             // specific treatment. later, for each attn, do "clean the hw block" via the INT_STS_CLR.
1926*d14abf15SRobert Mustacchi 
1927*d14abf15SRobert Mustacchi             //Check for lattched attn signals
1928*d14abf15SRobert Mustacchi             if (attn_sig_af_inv_arr[3] & EVEREST_LATCHED_ATTN_IN_USE_MASK & group_mask_arr[3])
1929*d14abf15SRobert Mustacchi             {
1930*d14abf15SRobert Mustacchi                 lm_latch_attn_everest_processing(pdev, attn_sig_af_inv_arr[3]);
1931*d14abf15SRobert Mustacchi             }
1932*d14abf15SRobert Mustacchi 
1933*d14abf15SRobert Mustacchi             // general hw block attention
1934*d14abf15SRobert Mustacchi             i = 0;
1935*d14abf15SRobert Mustacchi             mask_arr_val[i] = attn_sig_af_inv_arr[i] & HW_INTERRUT_ASSERT_SET_0 & group_mask_arr[i];
1936*d14abf15SRobert Mustacchi             i = 1;
1937*d14abf15SRobert Mustacchi             mask_arr_val[i] = attn_sig_af_inv_arr[i] & HW_INTERRUT_ASSERT_SET_1 & group_mask_arr[i];
1938*d14abf15SRobert Mustacchi             i = 2;
1939*d14abf15SRobert Mustacchi             mask_arr_val[i] = attn_sig_af_inv_arr[i] & HW_INTERRUT_ASSERT_SET_2 & group_mask_arr[i];
1940*d14abf15SRobert Mustacchi             i = 4;
1941*d14abf15SRobert Mustacchi             mask_arr_val[i] = attn_sig_af_inv_arr[i] & HW_INTERRUT_ASSERT_SET_4 & group_mask_arr[i];
1942*d14abf15SRobert Mustacchi 
1943*d14abf15SRobert Mustacchi             if (mask_arr_val[2] & AEU_INPUTS_ATTN_BITS_PXP_HW_INTERRUPT) {
1944*d14abf15SRobert Mustacchi                 pdev->vars.pxp_hw_interrupts_cnt++;
1945*d14abf15SRobert Mustacchi             }
1946*d14abf15SRobert Mustacchi 
1947*d14abf15SRobert Mustacchi             if ( (mask_arr_val[0]) ||
1948*d14abf15SRobert Mustacchi                  (mask_arr_val[1] & ~AEU_INPUTS_ATTN_BITS_DOORBELLQ_HW_INTERRUPT) ||
1949*d14abf15SRobert Mustacchi                  (mask_arr_val[2] & ~(AEU_INPUTS_ATTN_BITS_PXP_HW_INTERRUPT | AEU_INPUTS_ATTN_BITS_CFC_HW_INTERRUPT)) ||
1950*d14abf15SRobert Mustacchi                  (mask_arr_val[4]) )
1951*d14abf15SRobert Mustacchi             {
1952*d14abf15SRobert Mustacchi                 DbgMessage(pdev, FATAL, "hw block attention:\n");
1953*d14abf15SRobert Mustacchi                 DbgMessage(pdev, FATAL, "0: 0x%08x\n", mask_arr_val[0]);
1954*d14abf15SRobert Mustacchi                 DbgMessage(pdev, FATAL, "1: 0x%08x\n", mask_arr_val[1]);
1955*d14abf15SRobert Mustacchi                 DbgMessage(pdev, FATAL, "2: 0x%08x\n", mask_arr_val[2]);
1956*d14abf15SRobert Mustacchi                 DbgMessage(pdev, FATAL, "4: 0x%08x\n", mask_arr_val[4]);
1957*d14abf15SRobert Mustacchi                 DbgBreakIfAll(1);
1958*d14abf15SRobert Mustacchi             }
1959*d14abf15SRobert Mustacchi             // general hw block mem prty
1960*d14abf15SRobert Mustacchi             i = 0;
1961*d14abf15SRobert Mustacchi             mask_arr_val[i] = attn_sig_af_inv_arr[i] & HW_PRTY_ASSERT_SET_0 & group_mask_arr[i];
1962*d14abf15SRobert Mustacchi             i = 1;
1963*d14abf15SRobert Mustacchi             mask_arr_val[i] = attn_sig_af_inv_arr[i] & HW_PRTY_ASSERT_SET_1 & group_mask_arr[i];
1964*d14abf15SRobert Mustacchi             i = 2;
1965*d14abf15SRobert Mustacchi             mask_arr_val[i] = attn_sig_af_inv_arr[i] & HW_PRTY_ASSERT_SET_2 & group_mask_arr[i];
1966*d14abf15SRobert Mustacchi             i = 4;
1967*d14abf15SRobert Mustacchi             mask_arr_val[i] = attn_sig_af_inv_arr[i] & HW_PRTY_ASSERT_SET_4 & group_mask_arr[i];
1968*d14abf15SRobert Mustacchi 
1969*d14abf15SRobert Mustacchi             if ( (mask_arr_val[0]) ||
1970*d14abf15SRobert Mustacchi                  (mask_arr_val[1]) ||
1971*d14abf15SRobert Mustacchi                  (mask_arr_val[2]) ||
1972*d14abf15SRobert Mustacchi                  (mask_arr_val[4]) )
1973*d14abf15SRobert Mustacchi             {
1974*d14abf15SRobert Mustacchi                 DbgMessage(pdev, FATAL, "hw block parity attention\n");
1975*d14abf15SRobert Mustacchi                 DbgMessage(pdev, FATAL, "0: 0x%08x\n", mask_arr_val[0]);
1976*d14abf15SRobert Mustacchi                 DbgMessage(pdev, FATAL, "1: 0x%08x\n", mask_arr_val[1]);
1977*d14abf15SRobert Mustacchi                 DbgMessage(pdev, FATAL, "2: 0x%08x\n", mask_arr_val[2]);
1978*d14abf15SRobert Mustacchi                 DbgMessage(pdev, FATAL, "4: 0x%08x\n", mask_arr_val[4]);
1979*d14abf15SRobert Mustacchi                 DbgBreakIfAll(1);
1980*d14abf15SRobert Mustacchi             }
1981*d14abf15SRobert Mustacchi         }
1982*d14abf15SRobert Mustacchi     }
1983*d14abf15SRobert Mustacchi 
1984*d14abf15SRobert Mustacchi     //release split lock
1985*d14abf15SRobert Mustacchi     release_split_alr(pdev);
1986*d14abf15SRobert Mustacchi 
1987*d14abf15SRobert Mustacchi     //TODO: the attn_ack bits to clear must be passed with '0'
1988*d14abf15SRobert Mustacchi     //val = deassertion_proc_flgs;
1989*d14abf15SRobert Mustacchi     val = ~deassertion_proc_flgs;
1990*d14abf15SRobert Mustacchi     // attntion bits clear
1991*d14abf15SRobert Mustacchi     if (INTR_BLK_TYPE(pdev) == INTR_BLK_HC)
1992*d14abf15SRobert Mustacchi     {
1993*d14abf15SRobert Mustacchi         REG_WR(pdev,  HC_REG_COMMAND_REG + PORT_ID(pdev)*32 + COMMAND_REG_ATTN_BITS_CLR,val);
1994*d14abf15SRobert Mustacchi     }
1995*d14abf15SRobert Mustacchi     else
1996*d14abf15SRobert Mustacchi     {
1997*d14abf15SRobert Mustacchi         u32_t cmd_addr = IGU_CMD_ATTN_BIT_CLR_UPPER;
1998*d14abf15SRobert Mustacchi 
1999*d14abf15SRobert Mustacchi         if (INTR_BLK_ACCESS(pdev) == INTR_BLK_ACCESS_IGUMEM)
2000*d14abf15SRobert Mustacchi         {
2001*d14abf15SRobert Mustacchi             REG_WR(pdev, BAR_IGU_INTMEM + cmd_addr*8, val);
2002*d14abf15SRobert Mustacchi         }
2003*d14abf15SRobert Mustacchi         else
2004*d14abf15SRobert Mustacchi         {
2005*d14abf15SRobert Mustacchi             struct igu_ctrl_reg cmd_ctrl;
2006*d14abf15SRobert Mustacchi             u8_t                igu_func_id = 0;
2007*d14abf15SRobert Mustacchi 
2008*d14abf15SRobert Mustacchi             /* GRC ACCESS: */
2009*d14abf15SRobert Mustacchi             /* Write the Data, then the control */
2010*d14abf15SRobert Mustacchi              /* [18:12] - FID (if VF - [18] = 0; [17:12] = VF number; if PF - [18] = 1; [17:14] = 0; [13:12] = PF number) */
2011*d14abf15SRobert Mustacchi             igu_func_id = IGU_FUNC_ID(pdev);
2012*d14abf15SRobert Mustacchi             cmd_ctrl.ctrl_data =
2013*d14abf15SRobert Mustacchi                 ((cmd_addr << IGU_CTRL_REG_ADDRESS_SHIFT) |
2014*d14abf15SRobert Mustacchi                  (igu_func_id << IGU_CTRL_REG_FID_SHIFT) |
2015*d14abf15SRobert Mustacchi                  (IGU_CTRL_CMD_TYPE_WR << IGU_CTRL_REG_TYPE_SHIFT));
2016*d14abf15SRobert Mustacchi 
2017*d14abf15SRobert Mustacchi             REG_WR(pdev, IGU_REG_COMMAND_REG_32LSB_DATA, val);
2018*d14abf15SRobert Mustacchi             REG_WR(pdev, IGU_REG_COMMAND_REG_CTRL, cmd_ctrl.ctrl_data);
2019*d14abf15SRobert Mustacchi         }
2020*d14abf15SRobert Mustacchi     }
2021*d14abf15SRobert Mustacchi 
2022*d14abf15SRobert Mustacchi     //unmask only appropriate attention output signals from configured routing and unifier logic toward IGU.
2023*d14abf15SRobert Mustacchi     //This is for driver/chip sync to eventually return to '00' monitored state
2024*d14abf15SRobert Mustacchi     //in both leading & trailing latch.
2025*d14abf15SRobert Mustacchi     //unmask non-hard-wired dynamic groups only
2026*d14abf15SRobert Mustacchi 
2027*d14abf15SRobert Mustacchi     DbgBreakIf(~pdev->vars.attn_state & deassertion_proc_flgs);
2028*d14abf15SRobert Mustacchi 
2029*d14abf15SRobert Mustacchi     //unmask relevant AEU attn lines
2030*d14abf15SRobert Mustacchi     //             mask  deassert_flgs  new mask
2031*d14abf15SRobert Mustacchi     //legal:        0       0       ->    0
2032*d14abf15SRobert Mustacchi     //              0       1       ->    1
2033*d14abf15SRobert Mustacchi     //              1       0       ->    1
2034*d14abf15SRobert Mustacchi     //ASSERT:       1       1 -> this won't change us thanks to the |
2035*d14abf15SRobert Mustacchi 
2036*d14abf15SRobert Mustacchi     port_reg_name = PORT_ID(pdev) ? MISC_REG_AEU_MASK_ATTN_FUNC_1 : MISC_REG_AEU_MASK_ATTN_FUNC_0;
2037*d14abf15SRobert Mustacchi 
2038*d14abf15SRobert Mustacchi     lm_hw_lock(pdev, HW_LOCK_RESOURCE_PORT0_ATT_MASK + PORT_ID(pdev), TRUE);
2039*d14abf15SRobert Mustacchi 
2040*d14abf15SRobert Mustacchi     mask_val = REG_RD(pdev, port_reg_name);
2041*d14abf15SRobert Mustacchi 
2042*d14abf15SRobert Mustacchi     pdev->vars.aeu_mask_attn_func = mask_val & 0xff;
2043*d14abf15SRobert Mustacchi 
2044*d14abf15SRobert Mustacchi     DbgMessage(pdev, INFORM, "lm_handle_deassertion_processing: BEFORE: aeu_mask_attn_func:0x%x\n", pdev->vars.aeu_mask_attn_func);
2045*d14abf15SRobert Mustacchi     //changed from XOR to OR for safely
2046*d14abf15SRobert Mustacchi     pdev->vars.aeu_mask_attn_func |= (deassertion_proc_flgs & 0xff);
2047*d14abf15SRobert Mustacchi 
2048*d14abf15SRobert Mustacchi     DbgMessage(pdev, INFORM, "lm_handle_deassertion_processing: AFTER : aeu_mask_attn_func:0x%x\n", pdev->vars.aeu_mask_attn_func);
2049*d14abf15SRobert Mustacchi 
2050*d14abf15SRobert Mustacchi     REG_WR(pdev, port_reg_name, pdev->vars.aeu_mask_attn_func);
2051*d14abf15SRobert Mustacchi     lm_hw_unlock(pdev, HW_LOCK_RESOURCE_PORT0_ATT_MASK + PORT_ID(pdev));
2052*d14abf15SRobert Mustacchi     //update the attn bits states
2053*d14abf15SRobert Mustacchi     //            state  deassert_flgs  new state
2054*d14abf15SRobert Mustacchi     //legal:        0       0       ->    0
2055*d14abf15SRobert Mustacchi     //              1       0       ->    1
2056*d14abf15SRobert Mustacchi     //              1       1       ->    0
2057*d14abf15SRobert Mustacchi     //ASSERT:       0       1 -> this won't change our state thanks to & ~ !
2058*d14abf15SRobert Mustacchi     DbgMessage(pdev, INFORM, "lm_handle_deassertion_processing: BEFORE: attn_state:0x%x\n", pdev->vars.attn_state);
2059*d14abf15SRobert Mustacchi 
2060*d14abf15SRobert Mustacchi     //changed from XOR to : AND ~ for safety
2061*d14abf15SRobert Mustacchi     pdev->vars.attn_state &= ~deassertion_proc_flgs;
2062*d14abf15SRobert Mustacchi 
2063*d14abf15SRobert Mustacchi     DbgMessage(pdev, INFORM, "lm_handle_deassertion_processing: AFTER : attn_state:0x%x\n", pdev->vars.attn_state);
2064*d14abf15SRobert Mustacchi }
2065