bnx2x: removed unused variables
[linux-2.6.git] / drivers / net / bnx2x / bnx2x_main.c
1 /* bnx2x_main.c: Broadcom Everest network driver.
2  *
3  * Copyright (c) 2007-2011 Broadcom Corporation
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation.
8  *
9  * Maintained by: Eilon Greenstein <eilong@broadcom.com>
10  * Written by: Eliezer Tamir
11  * Based on code from Michael Chan's bnx2 driver
12  * UDP CSUM errata workaround by Arik Gendelman
13  * Slowpath and fastpath rework by Vladislav Zolotarov
14  * Statistics and Link management by Yitchak Gertner
15  *
16  */
17
18 #include <linux/module.h>
19 #include <linux/moduleparam.h>
20 #include <linux/kernel.h>
21 #include <linux/device.h>  /* for dev_info() */
22 #include <linux/timer.h>
23 #include <linux/errno.h>
24 #include <linux/ioport.h>
25 #include <linux/slab.h>
26 #include <linux/interrupt.h>
27 #include <linux/pci.h>
28 #include <linux/init.h>
29 #include <linux/netdevice.h>
30 #include <linux/etherdevice.h>
31 #include <linux/skbuff.h>
32 #include <linux/dma-mapping.h>
33 #include <linux/bitops.h>
34 #include <linux/irq.h>
35 #include <linux/delay.h>
36 #include <asm/byteorder.h>
37 #include <linux/time.h>
38 #include <linux/ethtool.h>
39 #include <linux/mii.h>
40 #include <linux/if_vlan.h>
41 #include <net/ip.h>
42 #include <net/tcp.h>
43 #include <net/checksum.h>
44 #include <net/ip6_checksum.h>
45 #include <linux/workqueue.h>
46 #include <linux/crc32.h>
47 #include <linux/crc32c.h>
48 #include <linux/prefetch.h>
49 #include <linux/zlib.h>
50 #include <linux/io.h>
51 #include <linux/stringify.h>
52
53 #define BNX2X_MAIN
54 #include "bnx2x.h"
55 #include "bnx2x_init.h"
56 #include "bnx2x_init_ops.h"
57 #include "bnx2x_cmn.h"
58 #include "bnx2x_dcb.h"
59
60 #include <linux/firmware.h>
61 #include "bnx2x_fw_file_hdr.h"
62 /* FW files */
63 #define FW_FILE_VERSION                                 \
64         __stringify(BCM_5710_FW_MAJOR_VERSION) "."      \
65         __stringify(BCM_5710_FW_MINOR_VERSION) "."      \
66         __stringify(BCM_5710_FW_REVISION_VERSION) "."   \
67         __stringify(BCM_5710_FW_ENGINEERING_VERSION)
68 #define FW_FILE_NAME_E1         "bnx2x/bnx2x-e1-" FW_FILE_VERSION ".fw"
69 #define FW_FILE_NAME_E1H        "bnx2x/bnx2x-e1h-" FW_FILE_VERSION ".fw"
70 #define FW_FILE_NAME_E2         "bnx2x/bnx2x-e2-" FW_FILE_VERSION ".fw"
71
72 /* Time in jiffies before concluding the transmitter is hung */
73 #define TX_TIMEOUT              (5*HZ)
74
75 static char version[] __devinitdata =
76         "Broadcom NetXtreme II 5771x 10Gigabit Ethernet Driver "
77         DRV_MODULE_NAME " " DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n";
78
79 MODULE_AUTHOR("Eliezer Tamir");
80 MODULE_DESCRIPTION("Broadcom NetXtreme II "
81                    "BCM57710/57711/57711E/57712/57712E Driver");
82 MODULE_LICENSE("GPL");
83 MODULE_VERSION(DRV_MODULE_VERSION);
84 MODULE_FIRMWARE(FW_FILE_NAME_E1);
85 MODULE_FIRMWARE(FW_FILE_NAME_E1H);
86 MODULE_FIRMWARE(FW_FILE_NAME_E2);
87
88 static int multi_mode = 1;
89 module_param(multi_mode, int, 0);
90 MODULE_PARM_DESC(multi_mode, " Multi queue mode "
91                              "(0 Disable; 1 Enable (default))");
92
93 int num_queues;
94 module_param(num_queues, int, 0);
95 MODULE_PARM_DESC(num_queues, " Number of queues for multi_mode=1"
96                                 " (default is as a number of CPUs)");
97
98 static int disable_tpa;
99 module_param(disable_tpa, int, 0);
100 MODULE_PARM_DESC(disable_tpa, " Disable the TPA (LRO) feature");
101
102 #define INT_MODE_INTx                   1
103 #define INT_MODE_MSI                    2
104 static int int_mode;
105 module_param(int_mode, int, 0);
106 MODULE_PARM_DESC(int_mode, " Force interrupt mode other then MSI-X "
107                                 "(1 INT#x; 2 MSI)");
108
109 static int dropless_fc;
110 module_param(dropless_fc, int, 0);
111 MODULE_PARM_DESC(dropless_fc, " Pause on exhausted host ring");
112
113 static int poll;
114 module_param(poll, int, 0);
115 MODULE_PARM_DESC(poll, " Use polling (for debug)");
116
117 static int mrrs = -1;
118 module_param(mrrs, int, 0);
119 MODULE_PARM_DESC(mrrs, " Force Max Read Req Size (0..3) (for debug)");
120
121 static int debug;
122 module_param(debug, int, 0);
123 MODULE_PARM_DESC(debug, " Default debug msglevel");
124
125 static struct workqueue_struct *bnx2x_wq;
126
127 #ifdef BCM_CNIC
128 static u8 ALL_ENODE_MACS[] = {0x01, 0x10, 0x18, 0x01, 0x00, 0x01};
129 #endif
130
131 enum bnx2x_board_type {
132         BCM57710 = 0,
133         BCM57711 = 1,
134         BCM57711E = 2,
135         BCM57712 = 3,
136         BCM57712E = 4
137 };
138
139 /* indexed by board_type, above */
140 static struct {
141         char *name;
142 } board_info[] __devinitdata = {
143         { "Broadcom NetXtreme II BCM57710 XGb" },
144         { "Broadcom NetXtreme II BCM57711 XGb" },
145         { "Broadcom NetXtreme II BCM57711E XGb" },
146         { "Broadcom NetXtreme II BCM57712 XGb" },
147         { "Broadcom NetXtreme II BCM57712E XGb" }
148 };
149
150 static DEFINE_PCI_DEVICE_TABLE(bnx2x_pci_tbl) = {
151         { PCI_VDEVICE(BROADCOM, PCI_DEVICE_ID_NX2_57710), BCM57710 },
152         { PCI_VDEVICE(BROADCOM, PCI_DEVICE_ID_NX2_57711), BCM57711 },
153         { PCI_VDEVICE(BROADCOM, PCI_DEVICE_ID_NX2_57711E), BCM57711E },
154         { PCI_VDEVICE(BROADCOM, PCI_DEVICE_ID_NX2_57712), BCM57712 },
155         { PCI_VDEVICE(BROADCOM, PCI_DEVICE_ID_NX2_57712E), BCM57712E },
156         { 0 }
157 };
158
159 MODULE_DEVICE_TABLE(pci, bnx2x_pci_tbl);
160
161 /****************************************************************************
162 * General service functions
163 ****************************************************************************/
164
165 static inline void __storm_memset_dma_mapping(struct bnx2x *bp,
166                                        u32 addr, dma_addr_t mapping)
167 {
168         REG_WR(bp,  addr, U64_LO(mapping));
169         REG_WR(bp,  addr + 4, U64_HI(mapping));
170 }
171
172 static inline void __storm_memset_fill(struct bnx2x *bp,
173                                        u32 addr, size_t size, u32 val)
174 {
175         int i;
176         for (i = 0; i < size/4; i++)
177                 REG_WR(bp,  addr + (i * 4), val);
178 }
179
180 static inline void storm_memset_ustats_zero(struct bnx2x *bp,
181                                             u8 port, u16 stat_id)
182 {
183         size_t size = sizeof(struct ustorm_per_client_stats);
184
185         u32 addr = BAR_USTRORM_INTMEM +
186                         USTORM_PER_COUNTER_ID_STATS_OFFSET(port, stat_id);
187
188         __storm_memset_fill(bp, addr, size, 0);
189 }
190
191 static inline void storm_memset_tstats_zero(struct bnx2x *bp,
192                                             u8 port, u16 stat_id)
193 {
194         size_t size = sizeof(struct tstorm_per_client_stats);
195
196         u32 addr = BAR_TSTRORM_INTMEM +
197                         TSTORM_PER_COUNTER_ID_STATS_OFFSET(port, stat_id);
198
199         __storm_memset_fill(bp, addr, size, 0);
200 }
201
202 static inline void storm_memset_xstats_zero(struct bnx2x *bp,
203                                             u8 port, u16 stat_id)
204 {
205         size_t size = sizeof(struct xstorm_per_client_stats);
206
207         u32 addr = BAR_XSTRORM_INTMEM +
208                         XSTORM_PER_COUNTER_ID_STATS_OFFSET(port, stat_id);
209
210         __storm_memset_fill(bp, addr, size, 0);
211 }
212
213
214 static inline void storm_memset_spq_addr(struct bnx2x *bp,
215                                          dma_addr_t mapping, u16 abs_fid)
216 {
217         u32 addr = XSEM_REG_FAST_MEMORY +
218                         XSTORM_SPQ_PAGE_BASE_OFFSET(abs_fid);
219
220         __storm_memset_dma_mapping(bp, addr, mapping);
221 }
222
223 static inline void storm_memset_ov(struct bnx2x *bp, u16 ov, u16 abs_fid)
224 {
225         REG_WR16(bp, BAR_XSTRORM_INTMEM + XSTORM_E1HOV_OFFSET(abs_fid), ov);
226 }
227
228 static inline void storm_memset_func_cfg(struct bnx2x *bp,
229                                 struct tstorm_eth_function_common_config *tcfg,
230                                 u16 abs_fid)
231 {
232         size_t size = sizeof(struct tstorm_eth_function_common_config);
233
234         u32 addr = BAR_TSTRORM_INTMEM +
235                         TSTORM_FUNCTION_COMMON_CONFIG_OFFSET(abs_fid);
236
237         __storm_memset_struct(bp, addr, size, (u32 *)tcfg);
238 }
239
240 static inline void storm_memset_xstats_flags(struct bnx2x *bp,
241                                 struct stats_indication_flags *flags,
242                                 u16 abs_fid)
243 {
244         size_t size = sizeof(struct stats_indication_flags);
245
246         u32 addr = BAR_XSTRORM_INTMEM + XSTORM_STATS_FLAGS_OFFSET(abs_fid);
247
248         __storm_memset_struct(bp, addr, size, (u32 *)flags);
249 }
250
251 static inline void storm_memset_tstats_flags(struct bnx2x *bp,
252                                 struct stats_indication_flags *flags,
253                                 u16 abs_fid)
254 {
255         size_t size = sizeof(struct stats_indication_flags);
256
257         u32 addr = BAR_TSTRORM_INTMEM + TSTORM_STATS_FLAGS_OFFSET(abs_fid);
258
259         __storm_memset_struct(bp, addr, size, (u32 *)flags);
260 }
261
262 static inline void storm_memset_ustats_flags(struct bnx2x *bp,
263                                 struct stats_indication_flags *flags,
264                                 u16 abs_fid)
265 {
266         size_t size = sizeof(struct stats_indication_flags);
267
268         u32 addr = BAR_USTRORM_INTMEM + USTORM_STATS_FLAGS_OFFSET(abs_fid);
269
270         __storm_memset_struct(bp, addr, size, (u32 *)flags);
271 }
272
273 static inline void storm_memset_cstats_flags(struct bnx2x *bp,
274                                 struct stats_indication_flags *flags,
275                                 u16 abs_fid)
276 {
277         size_t size = sizeof(struct stats_indication_flags);
278
279         u32 addr = BAR_CSTRORM_INTMEM + CSTORM_STATS_FLAGS_OFFSET(abs_fid);
280
281         __storm_memset_struct(bp, addr, size, (u32 *)flags);
282 }
283
284 static inline void storm_memset_xstats_addr(struct bnx2x *bp,
285                                            dma_addr_t mapping, u16 abs_fid)
286 {
287         u32 addr = BAR_XSTRORM_INTMEM +
288                 XSTORM_ETH_STATS_QUERY_ADDR_OFFSET(abs_fid);
289
290         __storm_memset_dma_mapping(bp, addr, mapping);
291 }
292
293 static inline void storm_memset_tstats_addr(struct bnx2x *bp,
294                                            dma_addr_t mapping, u16 abs_fid)
295 {
296         u32 addr = BAR_TSTRORM_INTMEM +
297                 TSTORM_ETH_STATS_QUERY_ADDR_OFFSET(abs_fid);
298
299         __storm_memset_dma_mapping(bp, addr, mapping);
300 }
301
302 static inline void storm_memset_ustats_addr(struct bnx2x *bp,
303                                            dma_addr_t mapping, u16 abs_fid)
304 {
305         u32 addr = BAR_USTRORM_INTMEM +
306                 USTORM_ETH_STATS_QUERY_ADDR_OFFSET(abs_fid);
307
308         __storm_memset_dma_mapping(bp, addr, mapping);
309 }
310
311 static inline void storm_memset_cstats_addr(struct bnx2x *bp,
312                                            dma_addr_t mapping, u16 abs_fid)
313 {
314         u32 addr = BAR_CSTRORM_INTMEM +
315                 CSTORM_ETH_STATS_QUERY_ADDR_OFFSET(abs_fid);
316
317         __storm_memset_dma_mapping(bp, addr, mapping);
318 }
319
320 static inline void storm_memset_vf_to_pf(struct bnx2x *bp, u16 abs_fid,
321                                          u16 pf_id)
322 {
323         REG_WR8(bp, BAR_XSTRORM_INTMEM + XSTORM_VF_TO_PF_OFFSET(abs_fid),
324                 pf_id);
325         REG_WR8(bp, BAR_CSTRORM_INTMEM + CSTORM_VF_TO_PF_OFFSET(abs_fid),
326                 pf_id);
327         REG_WR8(bp, BAR_TSTRORM_INTMEM + TSTORM_VF_TO_PF_OFFSET(abs_fid),
328                 pf_id);
329         REG_WR8(bp, BAR_USTRORM_INTMEM + USTORM_VF_TO_PF_OFFSET(abs_fid),
330                 pf_id);
331 }
332
333 static inline void storm_memset_func_en(struct bnx2x *bp, u16 abs_fid,
334                                         u8 enable)
335 {
336         REG_WR8(bp, BAR_XSTRORM_INTMEM + XSTORM_FUNC_EN_OFFSET(abs_fid),
337                 enable);
338         REG_WR8(bp, BAR_CSTRORM_INTMEM + CSTORM_FUNC_EN_OFFSET(abs_fid),
339                 enable);
340         REG_WR8(bp, BAR_TSTRORM_INTMEM + TSTORM_FUNC_EN_OFFSET(abs_fid),
341                 enable);
342         REG_WR8(bp, BAR_USTRORM_INTMEM + USTORM_FUNC_EN_OFFSET(abs_fid),
343                 enable);
344 }
345
346 static inline void storm_memset_eq_data(struct bnx2x *bp,
347                                 struct event_ring_data *eq_data,
348                                 u16 pfid)
349 {
350         size_t size = sizeof(struct event_ring_data);
351
352         u32 addr = BAR_CSTRORM_INTMEM + CSTORM_EVENT_RING_DATA_OFFSET(pfid);
353
354         __storm_memset_struct(bp, addr, size, (u32 *)eq_data);
355 }
356
357 static inline void storm_memset_eq_prod(struct bnx2x *bp, u16 eq_prod,
358                                         u16 pfid)
359 {
360         u32 addr = BAR_CSTRORM_INTMEM + CSTORM_EVENT_RING_PROD_OFFSET(pfid);
361         REG_WR16(bp, addr, eq_prod);
362 }
363
364 static inline void storm_memset_hc_timeout(struct bnx2x *bp, u8 port,
365                                              u16 fw_sb_id, u8 sb_index,
366                                              u8 ticks)
367 {
368
369         int index_offset = CHIP_IS_E2(bp) ?
370                 offsetof(struct hc_status_block_data_e2, index_data) :
371                 offsetof(struct hc_status_block_data_e1x, index_data);
372         u32 addr = BAR_CSTRORM_INTMEM +
373                         CSTORM_STATUS_BLOCK_DATA_OFFSET(fw_sb_id) +
374                         index_offset +
375                         sizeof(struct hc_index_data)*sb_index +
376                         offsetof(struct hc_index_data, timeout);
377         REG_WR8(bp, addr, ticks);
378         DP(NETIF_MSG_HW, "port %x fw_sb_id %d sb_index %d ticks %d\n",
379                           port, fw_sb_id, sb_index, ticks);
380 }
381 static inline void storm_memset_hc_disable(struct bnx2x *bp, u8 port,
382                                              u16 fw_sb_id, u8 sb_index,
383                                              u8 disable)
384 {
385         u32 enable_flag = disable ? 0 : (1 << HC_INDEX_DATA_HC_ENABLED_SHIFT);
386         int index_offset = CHIP_IS_E2(bp) ?
387                 offsetof(struct hc_status_block_data_e2, index_data) :
388                 offsetof(struct hc_status_block_data_e1x, index_data);
389         u32 addr = BAR_CSTRORM_INTMEM +
390                         CSTORM_STATUS_BLOCK_DATA_OFFSET(fw_sb_id) +
391                         index_offset +
392                         sizeof(struct hc_index_data)*sb_index +
393                         offsetof(struct hc_index_data, flags);
394         u16 flags = REG_RD16(bp, addr);
395         /* clear and set */
396         flags &= ~HC_INDEX_DATA_HC_ENABLED;
397         flags |= enable_flag;
398         REG_WR16(bp, addr, flags);
399         DP(NETIF_MSG_HW, "port %x fw_sb_id %d sb_index %d disable %d\n",
400                           port, fw_sb_id, sb_index, disable);
401 }
402
403 /* used only at init
404  * locking is done by mcp
405  */
406 static void bnx2x_reg_wr_ind(struct bnx2x *bp, u32 addr, u32 val)
407 {
408         pci_write_config_dword(bp->pdev, PCICFG_GRC_ADDRESS, addr);
409         pci_write_config_dword(bp->pdev, PCICFG_GRC_DATA, val);
410         pci_write_config_dword(bp->pdev, PCICFG_GRC_ADDRESS,
411                                PCICFG_VENDOR_ID_OFFSET);
412 }
413
414 static u32 bnx2x_reg_rd_ind(struct bnx2x *bp, u32 addr)
415 {
416         u32 val;
417
418         pci_write_config_dword(bp->pdev, PCICFG_GRC_ADDRESS, addr);
419         pci_read_config_dword(bp->pdev, PCICFG_GRC_DATA, &val);
420         pci_write_config_dword(bp->pdev, PCICFG_GRC_ADDRESS,
421                                PCICFG_VENDOR_ID_OFFSET);
422
423         return val;
424 }
425
426 #define DMAE_DP_SRC_GRC         "grc src_addr [%08x]"
427 #define DMAE_DP_SRC_PCI         "pci src_addr [%x:%08x]"
428 #define DMAE_DP_DST_GRC         "grc dst_addr [%08x]"
429 #define DMAE_DP_DST_PCI         "pci dst_addr [%x:%08x]"
430 #define DMAE_DP_DST_NONE        "dst_addr [none]"
431
432 static void bnx2x_dp_dmae(struct bnx2x *bp, struct dmae_command *dmae,
433                           int msglvl)
434 {
435         u32 src_type = dmae->opcode & DMAE_COMMAND_SRC;
436
437         switch (dmae->opcode & DMAE_COMMAND_DST) {
438         case DMAE_CMD_DST_PCI:
439                 if (src_type == DMAE_CMD_SRC_PCI)
440                         DP(msglvl, "DMAE: opcode 0x%08x\n"
441                            "src [%x:%08x], len [%d*4], dst [%x:%08x]\n"
442                            "comp_addr [%x:%08x], comp_val 0x%08x\n",
443                            dmae->opcode, dmae->src_addr_hi, dmae->src_addr_lo,
444                            dmae->len, dmae->dst_addr_hi, dmae->dst_addr_lo,
445                            dmae->comp_addr_hi, dmae->comp_addr_lo,
446                            dmae->comp_val);
447                 else
448                         DP(msglvl, "DMAE: opcode 0x%08x\n"
449                            "src [%08x], len [%d*4], dst [%x:%08x]\n"
450                            "comp_addr [%x:%08x], comp_val 0x%08x\n",
451                            dmae->opcode, dmae->src_addr_lo >> 2,
452                            dmae->len, dmae->dst_addr_hi, dmae->dst_addr_lo,
453                            dmae->comp_addr_hi, dmae->comp_addr_lo,
454                            dmae->comp_val);
455                 break;
456         case DMAE_CMD_DST_GRC:
457                 if (src_type == DMAE_CMD_SRC_PCI)
458                         DP(msglvl, "DMAE: opcode 0x%08x\n"
459                            "src [%x:%08x], len [%d*4], dst_addr [%08x]\n"
460                            "comp_addr [%x:%08x], comp_val 0x%08x\n",
461                            dmae->opcode, dmae->src_addr_hi, dmae->src_addr_lo,
462                            dmae->len, dmae->dst_addr_lo >> 2,
463                            dmae->comp_addr_hi, dmae->comp_addr_lo,
464                            dmae->comp_val);
465                 else
466                         DP(msglvl, "DMAE: opcode 0x%08x\n"
467                            "src [%08x], len [%d*4], dst [%08x]\n"
468                            "comp_addr [%x:%08x], comp_val 0x%08x\n",
469                            dmae->opcode, dmae->src_addr_lo >> 2,
470                            dmae->len, dmae->dst_addr_lo >> 2,
471                            dmae->comp_addr_hi, dmae->comp_addr_lo,
472                            dmae->comp_val);
473                 break;
474         default:
475                 if (src_type == DMAE_CMD_SRC_PCI)
476                         DP(msglvl, "DMAE: opcode 0x%08x\n"
477                            DP_LEVEL "src_addr [%x:%08x]  len [%d * 4]  "
478                                     "dst_addr [none]\n"
479                            DP_LEVEL "comp_addr [%x:%08x]  comp_val 0x%08x\n",
480                            dmae->opcode, dmae->src_addr_hi, dmae->src_addr_lo,
481                            dmae->len, dmae->comp_addr_hi, dmae->comp_addr_lo,
482                            dmae->comp_val);
483                 else
484                         DP(msglvl, "DMAE: opcode 0x%08x\n"
485                            DP_LEVEL "src_addr [%08x]  len [%d * 4]  "
486                                     "dst_addr [none]\n"
487                            DP_LEVEL "comp_addr [%x:%08x]  comp_val 0x%08x\n",
488                            dmae->opcode, dmae->src_addr_lo >> 2,
489                            dmae->len, dmae->comp_addr_hi, dmae->comp_addr_lo,
490                            dmae->comp_val);
491                 break;
492         }
493
494 }
495
496 const u32 dmae_reg_go_c[] = {
497         DMAE_REG_GO_C0, DMAE_REG_GO_C1, DMAE_REG_GO_C2, DMAE_REG_GO_C3,
498         DMAE_REG_GO_C4, DMAE_REG_GO_C5, DMAE_REG_GO_C6, DMAE_REG_GO_C7,
499         DMAE_REG_GO_C8, DMAE_REG_GO_C9, DMAE_REG_GO_C10, DMAE_REG_GO_C11,
500         DMAE_REG_GO_C12, DMAE_REG_GO_C13, DMAE_REG_GO_C14, DMAE_REG_GO_C15
501 };
502
503 /* copy command into DMAE command memory and set DMAE command go */
504 void bnx2x_post_dmae(struct bnx2x *bp, struct dmae_command *dmae, int idx)
505 {
506         u32 cmd_offset;
507         int i;
508
509         cmd_offset = (DMAE_REG_CMD_MEM + sizeof(struct dmae_command) * idx);
510         for (i = 0; i < (sizeof(struct dmae_command)/4); i++) {
511                 REG_WR(bp, cmd_offset + i*4, *(((u32 *)dmae) + i));
512
513                 DP(BNX2X_MSG_OFF, "DMAE cmd[%d].%d (0x%08x) : 0x%08x\n",
514                    idx, i, cmd_offset + i*4, *(((u32 *)dmae) + i));
515         }
516         REG_WR(bp, dmae_reg_go_c[idx], 1);
517 }
518
519 u32 bnx2x_dmae_opcode_add_comp(u32 opcode, u8 comp_type)
520 {
521         return opcode | ((comp_type << DMAE_COMMAND_C_DST_SHIFT) |
522                            DMAE_CMD_C_ENABLE);
523 }
524
525 u32 bnx2x_dmae_opcode_clr_src_reset(u32 opcode)
526 {
527         return opcode & ~DMAE_CMD_SRC_RESET;
528 }
529
530 u32 bnx2x_dmae_opcode(struct bnx2x *bp, u8 src_type, u8 dst_type,
531                              bool with_comp, u8 comp_type)
532 {
533         u32 opcode = 0;
534
535         opcode |= ((src_type << DMAE_COMMAND_SRC_SHIFT) |
536                    (dst_type << DMAE_COMMAND_DST_SHIFT));
537
538         opcode |= (DMAE_CMD_SRC_RESET | DMAE_CMD_DST_RESET);
539
540         opcode |= (BP_PORT(bp) ? DMAE_CMD_PORT_1 : DMAE_CMD_PORT_0);
541         opcode |= ((BP_E1HVN(bp) << DMAE_CMD_E1HVN_SHIFT) |
542                    (BP_E1HVN(bp) << DMAE_COMMAND_DST_VN_SHIFT));
543         opcode |= (DMAE_COM_SET_ERR << DMAE_COMMAND_ERR_POLICY_SHIFT);
544
545 #ifdef __BIG_ENDIAN
546         opcode |= DMAE_CMD_ENDIANITY_B_DW_SWAP;
547 #else
548         opcode |= DMAE_CMD_ENDIANITY_DW_SWAP;
549 #endif
550         if (with_comp)
551                 opcode = bnx2x_dmae_opcode_add_comp(opcode, comp_type);
552         return opcode;
553 }
554
555 static void bnx2x_prep_dmae_with_comp(struct bnx2x *bp,
556                                       struct dmae_command *dmae,
557                                       u8 src_type, u8 dst_type)
558 {
559         memset(dmae, 0, sizeof(struct dmae_command));
560
561         /* set the opcode */
562         dmae->opcode = bnx2x_dmae_opcode(bp, src_type, dst_type,
563                                          true, DMAE_COMP_PCI);
564
565         /* fill in the completion parameters */
566         dmae->comp_addr_lo = U64_LO(bnx2x_sp_mapping(bp, wb_comp));
567         dmae->comp_addr_hi = U64_HI(bnx2x_sp_mapping(bp, wb_comp));
568         dmae->comp_val = DMAE_COMP_VAL;
569 }
570
571 /* issue a dmae command over the init-channel and wailt for completion */
572 static int bnx2x_issue_dmae_with_comp(struct bnx2x *bp,
573                                       struct dmae_command *dmae)
574 {
575         u32 *wb_comp = bnx2x_sp(bp, wb_comp);
576         int cnt = CHIP_REV_IS_SLOW(bp) ? (400000) : 4000;
577         int rc = 0;
578
579         DP(BNX2X_MSG_OFF, "data before [0x%08x 0x%08x 0x%08x 0x%08x]\n",
580            bp->slowpath->wb_data[0], bp->slowpath->wb_data[1],
581            bp->slowpath->wb_data[2], bp->slowpath->wb_data[3]);
582
583         /* lock the dmae channel */
584         spin_lock_bh(&bp->dmae_lock);
585
586         /* reset completion */
587         *wb_comp = 0;
588
589         /* post the command on the channel used for initializations */
590         bnx2x_post_dmae(bp, dmae, INIT_DMAE_C(bp));
591
592         /* wait for completion */
593         udelay(5);
594         while ((*wb_comp & ~DMAE_PCI_ERR_FLAG) != DMAE_COMP_VAL) {
595                 DP(BNX2X_MSG_OFF, "wb_comp 0x%08x\n", *wb_comp);
596
597                 if (!cnt) {
598                         BNX2X_ERR("DMAE timeout!\n");
599                         rc = DMAE_TIMEOUT;
600                         goto unlock;
601                 }
602                 cnt--;
603                 udelay(50);
604         }
605         if (*wb_comp & DMAE_PCI_ERR_FLAG) {
606                 BNX2X_ERR("DMAE PCI error!\n");
607                 rc = DMAE_PCI_ERROR;
608         }
609
610         DP(BNX2X_MSG_OFF, "data after [0x%08x 0x%08x 0x%08x 0x%08x]\n",
611            bp->slowpath->wb_data[0], bp->slowpath->wb_data[1],
612            bp->slowpath->wb_data[2], bp->slowpath->wb_data[3]);
613
614 unlock:
615         spin_unlock_bh(&bp->dmae_lock);
616         return rc;
617 }
618
619 void bnx2x_write_dmae(struct bnx2x *bp, dma_addr_t dma_addr, u32 dst_addr,
620                       u32 len32)
621 {
622         struct dmae_command dmae;
623
624         if (!bp->dmae_ready) {
625                 u32 *data = bnx2x_sp(bp, wb_data[0]);
626
627                 DP(BNX2X_MSG_OFF, "DMAE is not ready (dst_addr %08x  len32 %d)"
628                    "  using indirect\n", dst_addr, len32);
629                 bnx2x_init_ind_wr(bp, dst_addr, data, len32);
630                 return;
631         }
632
633         /* set opcode and fixed command fields */
634         bnx2x_prep_dmae_with_comp(bp, &dmae, DMAE_SRC_PCI, DMAE_DST_GRC);
635
636         /* fill in addresses and len */
637         dmae.src_addr_lo = U64_LO(dma_addr);
638         dmae.src_addr_hi = U64_HI(dma_addr);
639         dmae.dst_addr_lo = dst_addr >> 2;
640         dmae.dst_addr_hi = 0;
641         dmae.len = len32;
642
643         bnx2x_dp_dmae(bp, &dmae, BNX2X_MSG_OFF);
644
645         /* issue the command and wait for completion */
646         bnx2x_issue_dmae_with_comp(bp, &dmae);
647 }
648
649 void bnx2x_read_dmae(struct bnx2x *bp, u32 src_addr, u32 len32)
650 {
651         struct dmae_command dmae;
652
653         if (!bp->dmae_ready) {
654                 u32 *data = bnx2x_sp(bp, wb_data[0]);
655                 int i;
656
657                 DP(BNX2X_MSG_OFF, "DMAE is not ready (src_addr %08x  len32 %d)"
658                    "  using indirect\n", src_addr, len32);
659                 for (i = 0; i < len32; i++)
660                         data[i] = bnx2x_reg_rd_ind(bp, src_addr + i*4);
661                 return;
662         }
663
664         /* set opcode and fixed command fields */
665         bnx2x_prep_dmae_with_comp(bp, &dmae, DMAE_SRC_GRC, DMAE_DST_PCI);
666
667         /* fill in addresses and len */
668         dmae.src_addr_lo = src_addr >> 2;
669         dmae.src_addr_hi = 0;
670         dmae.dst_addr_lo = U64_LO(bnx2x_sp_mapping(bp, wb_data));
671         dmae.dst_addr_hi = U64_HI(bnx2x_sp_mapping(bp, wb_data));
672         dmae.len = len32;
673
674         bnx2x_dp_dmae(bp, &dmae, BNX2X_MSG_OFF);
675
676         /* issue the command and wait for completion */
677         bnx2x_issue_dmae_with_comp(bp, &dmae);
678 }
679
680 static void bnx2x_write_dmae_phys_len(struct bnx2x *bp, dma_addr_t phys_addr,
681                                       u32 addr, u32 len)
682 {
683         int dmae_wr_max = DMAE_LEN32_WR_MAX(bp);
684         int offset = 0;
685
686         while (len > dmae_wr_max) {
687                 bnx2x_write_dmae(bp, phys_addr + offset,
688                                  addr + offset, dmae_wr_max);
689                 offset += dmae_wr_max * 4;
690                 len -= dmae_wr_max;
691         }
692
693         bnx2x_write_dmae(bp, phys_addr + offset, addr + offset, len);
694 }
695
696 /* used only for slowpath so not inlined */
697 static void bnx2x_wb_wr(struct bnx2x *bp, int reg, u32 val_hi, u32 val_lo)
698 {
699         u32 wb_write[2];
700
701         wb_write[0] = val_hi;
702         wb_write[1] = val_lo;
703         REG_WR_DMAE(bp, reg, wb_write, 2);
704 }
705
706 #ifdef USE_WB_RD
707 static u64 bnx2x_wb_rd(struct bnx2x *bp, int reg)
708 {
709         u32 wb_data[2];
710
711         REG_RD_DMAE(bp, reg, wb_data, 2);
712
713         return HILO_U64(wb_data[0], wb_data[1]);
714 }
715 #endif
716
717 static int bnx2x_mc_assert(struct bnx2x *bp)
718 {
719         char last_idx;
720         int i, rc = 0;
721         u32 row0, row1, row2, row3;
722
723         /* XSTORM */
724         last_idx = REG_RD8(bp, BAR_XSTRORM_INTMEM +
725                            XSTORM_ASSERT_LIST_INDEX_OFFSET);
726         if (last_idx)
727                 BNX2X_ERR("XSTORM_ASSERT_LIST_INDEX 0x%x\n", last_idx);
728
729         /* print the asserts */
730         for (i = 0; i < STROM_ASSERT_ARRAY_SIZE; i++) {
731
732                 row0 = REG_RD(bp, BAR_XSTRORM_INTMEM +
733                               XSTORM_ASSERT_LIST_OFFSET(i));
734                 row1 = REG_RD(bp, BAR_XSTRORM_INTMEM +
735                               XSTORM_ASSERT_LIST_OFFSET(i) + 4);
736                 row2 = REG_RD(bp, BAR_XSTRORM_INTMEM +
737                               XSTORM_ASSERT_LIST_OFFSET(i) + 8);
738                 row3 = REG_RD(bp, BAR_XSTRORM_INTMEM +
739                               XSTORM_ASSERT_LIST_OFFSET(i) + 12);
740
741                 if (row0 != COMMON_ASM_INVALID_ASSERT_OPCODE) {
742                         BNX2X_ERR("XSTORM_ASSERT_INDEX 0x%x = 0x%08x"
743                                   " 0x%08x 0x%08x 0x%08x\n",
744                                   i, row3, row2, row1, row0);
745                         rc++;
746                 } else {
747                         break;
748                 }
749         }
750
751         /* TSTORM */
752         last_idx = REG_RD8(bp, BAR_TSTRORM_INTMEM +
753                            TSTORM_ASSERT_LIST_INDEX_OFFSET);
754         if (last_idx)
755                 BNX2X_ERR("TSTORM_ASSERT_LIST_INDEX 0x%x\n", last_idx);
756
757         /* print the asserts */
758         for (i = 0; i < STROM_ASSERT_ARRAY_SIZE; i++) {
759
760                 row0 = REG_RD(bp, BAR_TSTRORM_INTMEM +
761                               TSTORM_ASSERT_LIST_OFFSET(i));
762                 row1 = REG_RD(bp, BAR_TSTRORM_INTMEM +
763                               TSTORM_ASSERT_LIST_OFFSET(i) + 4);
764                 row2 = REG_RD(bp, BAR_TSTRORM_INTMEM +
765                               TSTORM_ASSERT_LIST_OFFSET(i) + 8);
766                 row3 = REG_RD(bp, BAR_TSTRORM_INTMEM +
767                               TSTORM_ASSERT_LIST_OFFSET(i) + 12);
768
769                 if (row0 != COMMON_ASM_INVALID_ASSERT_OPCODE) {
770                         BNX2X_ERR("TSTORM_ASSERT_INDEX 0x%x = 0x%08x"
771                                   " 0x%08x 0x%08x 0x%08x\n",
772                                   i, row3, row2, row1, row0);
773                         rc++;
774                 } else {
775                         break;
776                 }
777         }
778
779         /* CSTORM */
780         last_idx = REG_RD8(bp, BAR_CSTRORM_INTMEM +
781                            CSTORM_ASSERT_LIST_INDEX_OFFSET);
782         if (last_idx)
783                 BNX2X_ERR("CSTORM_ASSERT_LIST_INDEX 0x%x\n", last_idx);
784
785         /* print the asserts */
786         for (i = 0; i < STROM_ASSERT_ARRAY_SIZE; i++) {
787
788                 row0 = REG_RD(bp, BAR_CSTRORM_INTMEM +
789                               CSTORM_ASSERT_LIST_OFFSET(i));
790                 row1 = REG_RD(bp, BAR_CSTRORM_INTMEM +
791                               CSTORM_ASSERT_LIST_OFFSET(i) + 4);
792                 row2 = REG_RD(bp, BAR_CSTRORM_INTMEM +
793                               CSTORM_ASSERT_LIST_OFFSET(i) + 8);
794                 row3 = REG_RD(bp, BAR_CSTRORM_INTMEM +
795                               CSTORM_ASSERT_LIST_OFFSET(i) + 12);
796
797                 if (row0 != COMMON_ASM_INVALID_ASSERT_OPCODE) {
798                         BNX2X_ERR("CSTORM_ASSERT_INDEX 0x%x = 0x%08x"
799                                   " 0x%08x 0x%08x 0x%08x\n",
800                                   i, row3, row2, row1, row0);
801                         rc++;
802                 } else {
803                         break;
804                 }
805         }
806
807         /* USTORM */
808         last_idx = REG_RD8(bp, BAR_USTRORM_INTMEM +
809                            USTORM_ASSERT_LIST_INDEX_OFFSET);
810         if (last_idx)
811                 BNX2X_ERR("USTORM_ASSERT_LIST_INDEX 0x%x\n", last_idx);
812
813         /* print the asserts */
814         for (i = 0; i < STROM_ASSERT_ARRAY_SIZE; i++) {
815
816                 row0 = REG_RD(bp, BAR_USTRORM_INTMEM +
817                               USTORM_ASSERT_LIST_OFFSET(i));
818                 row1 = REG_RD(bp, BAR_USTRORM_INTMEM +
819                               USTORM_ASSERT_LIST_OFFSET(i) + 4);
820                 row2 = REG_RD(bp, BAR_USTRORM_INTMEM +
821                               USTORM_ASSERT_LIST_OFFSET(i) + 8);
822                 row3 = REG_RD(bp, BAR_USTRORM_INTMEM +
823                               USTORM_ASSERT_LIST_OFFSET(i) + 12);
824
825                 if (row0 != COMMON_ASM_INVALID_ASSERT_OPCODE) {
826                         BNX2X_ERR("USTORM_ASSERT_INDEX 0x%x = 0x%08x"
827                                   " 0x%08x 0x%08x 0x%08x\n",
828                                   i, row3, row2, row1, row0);
829                         rc++;
830                 } else {
831                         break;
832                 }
833         }
834
835         return rc;
836 }
837
838 void bnx2x_fw_dump_lvl(struct bnx2x *bp, const char *lvl)
839 {
840         u32 addr, val;
841         u32 mark, offset;
842         __be32 data[9];
843         int word;
844         u32 trace_shmem_base;
845         if (BP_NOMCP(bp)) {
846                 BNX2X_ERR("NO MCP - can not dump\n");
847                 return;
848         }
849         netdev_printk(lvl, bp->dev, "bc %d.%d.%d\n",
850                 (bp->common.bc_ver & 0xff0000) >> 16,
851                 (bp->common.bc_ver & 0xff00) >> 8,
852                 (bp->common.bc_ver & 0xff));
853
854         val = REG_RD(bp, MCP_REG_MCPR_CPU_PROGRAM_COUNTER);
855         if (val == REG_RD(bp, MCP_REG_MCPR_CPU_PROGRAM_COUNTER))
856                 printk("%s" "MCP PC at 0x%x\n", lvl, val);
857
858         if (BP_PATH(bp) == 0)
859                 trace_shmem_base = bp->common.shmem_base;
860         else
861                 trace_shmem_base = SHMEM2_RD(bp, other_shmem_base_addr);
862         addr = trace_shmem_base - 0x0800 + 4;
863         mark = REG_RD(bp, addr);
864         mark = (CHIP_IS_E1x(bp) ? MCP_REG_MCPR_SCRATCH : MCP_A_REG_MCPR_SCRATCH)
865                         + ((mark + 0x3) & ~0x3) - 0x08000000;
866         printk("%s" "begin fw dump (mark 0x%x)\n", lvl, mark);
867
868         printk("%s", lvl);
869         for (offset = mark; offset <= trace_shmem_base; offset += 0x8*4) {
870                 for (word = 0; word < 8; word++)
871                         data[word] = htonl(REG_RD(bp, offset + 4*word));
872                 data[8] = 0x0;
873                 pr_cont("%s", (char *)data);
874         }
875         for (offset = addr + 4; offset <= mark; offset += 0x8*4) {
876                 for (word = 0; word < 8; word++)
877                         data[word] = htonl(REG_RD(bp, offset + 4*word));
878                 data[8] = 0x0;
879                 pr_cont("%s", (char *)data);
880         }
881         printk("%s" "end of fw dump\n", lvl);
882 }
883
884 static inline void bnx2x_fw_dump(struct bnx2x *bp)
885 {
886         bnx2x_fw_dump_lvl(bp, KERN_ERR);
887 }
888
889 void bnx2x_panic_dump(struct bnx2x *bp)
890 {
891         int i;
892         u16 j;
893         struct hc_sp_status_block_data sp_sb_data;
894         int func = BP_FUNC(bp);
895 #ifdef BNX2X_STOP_ON_ERROR
896         u16 start = 0, end = 0;
897 #endif
898
899         bp->stats_state = STATS_STATE_DISABLED;
900         DP(BNX2X_MSG_STATS, "stats_state - DISABLED\n");
901
902         BNX2X_ERR("begin crash dump -----------------\n");
903
904         /* Indices */
905         /* Common */
906         BNX2X_ERR("def_idx(0x%x)  def_att_idx(0x%x)  attn_state(0x%x)"
907                   "  spq_prod_idx(0x%x)\n",
908                   bp->def_idx, bp->def_att_idx,
909                   bp->attn_state, bp->spq_prod_idx);
910         BNX2X_ERR("DSB: attn bits(0x%x)  ack(0x%x)  id(0x%x)  idx(0x%x)\n",
911                   bp->def_status_blk->atten_status_block.attn_bits,
912                   bp->def_status_blk->atten_status_block.attn_bits_ack,
913                   bp->def_status_blk->atten_status_block.status_block_id,
914                   bp->def_status_blk->atten_status_block.attn_bits_index);
915         BNX2X_ERR("     def (");
916         for (i = 0; i < HC_SP_SB_MAX_INDICES; i++)
917                 pr_cont("0x%x%s",
918                        bp->def_status_blk->sp_sb.index_values[i],
919                        (i == HC_SP_SB_MAX_INDICES - 1) ? ")  " : " ");
920
921         for (i = 0; i < sizeof(struct hc_sp_status_block_data)/sizeof(u32); i++)
922                 *((u32 *)&sp_sb_data + i) = REG_RD(bp, BAR_CSTRORM_INTMEM +
923                         CSTORM_SP_STATUS_BLOCK_DATA_OFFSET(func) +
924                         i*sizeof(u32));
925
926         pr_cont("igu_sb_id(0x%x)  igu_seg_id (0x%x) "
927                          "pf_id(0x%x)  vnic_id(0x%x)  "
928                          "vf_id(0x%x)  vf_valid (0x%x)\n",
929                sp_sb_data.igu_sb_id,
930                sp_sb_data.igu_seg_id,
931                sp_sb_data.p_func.pf_id,
932                sp_sb_data.p_func.vnic_id,
933                sp_sb_data.p_func.vf_id,
934                sp_sb_data.p_func.vf_valid);
935
936
937         for_each_eth_queue(bp, i) {
938                 struct bnx2x_fastpath *fp = &bp->fp[i];
939                 int loop;
940                 struct hc_status_block_data_e2 sb_data_e2;
941                 struct hc_status_block_data_e1x sb_data_e1x;
942                 struct hc_status_block_sm  *hc_sm_p =
943                         CHIP_IS_E2(bp) ?
944                         sb_data_e2.common.state_machine :
945                         sb_data_e1x.common.state_machine;
946                 struct hc_index_data *hc_index_p =
947                         CHIP_IS_E2(bp) ?
948                         sb_data_e2.index_data :
949                         sb_data_e1x.index_data;
950                 int data_size;
951                 u32 *sb_data_p;
952
953                 /* Rx */
954                 BNX2X_ERR("fp%d: rx_bd_prod(0x%x)  rx_bd_cons(0x%x)"
955                           "  rx_comp_prod(0x%x)"
956                           "  rx_comp_cons(0x%x)  *rx_cons_sb(0x%x)\n",
957                           i, fp->rx_bd_prod, fp->rx_bd_cons,
958                           fp->rx_comp_prod,
959                           fp->rx_comp_cons, le16_to_cpu(*fp->rx_cons_sb));
960                 BNX2X_ERR("     rx_sge_prod(0x%x)  last_max_sge(0x%x)"
961                           "  fp_hc_idx(0x%x)\n",
962                           fp->rx_sge_prod, fp->last_max_sge,
963                           le16_to_cpu(fp->fp_hc_idx));
964
965                 /* Tx */
966                 BNX2X_ERR("fp%d: tx_pkt_prod(0x%x)  tx_pkt_cons(0x%x)"
967                           "  tx_bd_prod(0x%x)  tx_bd_cons(0x%x)"
968                           "  *tx_cons_sb(0x%x)\n",
969                           i, fp->tx_pkt_prod, fp->tx_pkt_cons, fp->tx_bd_prod,
970                           fp->tx_bd_cons, le16_to_cpu(*fp->tx_cons_sb));
971
972                 loop = CHIP_IS_E2(bp) ?
973                         HC_SB_MAX_INDICES_E2 : HC_SB_MAX_INDICES_E1X;
974
975                 /* host sb data */
976
977 #ifdef BCM_CNIC
978                 if (IS_FCOE_FP(fp))
979                         continue;
980 #endif
981                 BNX2X_ERR("     run indexes (");
982                 for (j = 0; j < HC_SB_MAX_SM; j++)
983                         pr_cont("0x%x%s",
984                                fp->sb_running_index[j],
985                                (j == HC_SB_MAX_SM - 1) ? ")" : " ");
986
987                 BNX2X_ERR("     indexes (");
988                 for (j = 0; j < loop; j++)
989                         pr_cont("0x%x%s",
990                                fp->sb_index_values[j],
991                                (j == loop - 1) ? ")" : " ");
992                 /* fw sb data */
993                 data_size = CHIP_IS_E2(bp) ?
994                         sizeof(struct hc_status_block_data_e2) :
995                         sizeof(struct hc_status_block_data_e1x);
996                 data_size /= sizeof(u32);
997                 sb_data_p = CHIP_IS_E2(bp) ?
998                         (u32 *)&sb_data_e2 :
999                         (u32 *)&sb_data_e1x;
1000                 /* copy sb data in here */
1001                 for (j = 0; j < data_size; j++)
1002                         *(sb_data_p + j) = REG_RD(bp, BAR_CSTRORM_INTMEM +
1003                                 CSTORM_STATUS_BLOCK_DATA_OFFSET(fp->fw_sb_id) +
1004                                 j * sizeof(u32));
1005
1006                 if (CHIP_IS_E2(bp)) {
1007                         pr_cont("pf_id(0x%x)  vf_id (0x%x)  vf_valid(0x%x) "
1008                                 "vnic_id(0x%x)  same_igu_sb_1b(0x%x)\n",
1009                                 sb_data_e2.common.p_func.pf_id,
1010                                 sb_data_e2.common.p_func.vf_id,
1011                                 sb_data_e2.common.p_func.vf_valid,
1012                                 sb_data_e2.common.p_func.vnic_id,
1013                                 sb_data_e2.common.same_igu_sb_1b);
1014                 } else {
1015                         pr_cont("pf_id(0x%x)  vf_id (0x%x)  vf_valid(0x%x) "
1016                                 "vnic_id(0x%x)  same_igu_sb_1b(0x%x)\n",
1017                                 sb_data_e1x.common.p_func.pf_id,
1018                                 sb_data_e1x.common.p_func.vf_id,
1019                                 sb_data_e1x.common.p_func.vf_valid,
1020                                 sb_data_e1x.common.p_func.vnic_id,
1021                                 sb_data_e1x.common.same_igu_sb_1b);
1022                 }
1023
1024                 /* SB_SMs data */
1025                 for (j = 0; j < HC_SB_MAX_SM; j++) {
1026                         pr_cont("SM[%d] __flags (0x%x) "
1027                                "igu_sb_id (0x%x)  igu_seg_id(0x%x) "
1028                                "time_to_expire (0x%x) "
1029                                "timer_value(0x%x)\n", j,
1030                                hc_sm_p[j].__flags,
1031                                hc_sm_p[j].igu_sb_id,
1032                                hc_sm_p[j].igu_seg_id,
1033                                hc_sm_p[j].time_to_expire,
1034                                hc_sm_p[j].timer_value);
1035                 }
1036
1037                 /* Indecies data */
1038                 for (j = 0; j < loop; j++) {
1039                         pr_cont("INDEX[%d] flags (0x%x) "
1040                                          "timeout (0x%x)\n", j,
1041                                hc_index_p[j].flags,
1042                                hc_index_p[j].timeout);
1043                 }
1044         }
1045
1046 #ifdef BNX2X_STOP_ON_ERROR
1047         /* Rings */
1048         /* Rx */
1049         for_each_rx_queue(bp, i) {
1050                 struct bnx2x_fastpath *fp = &bp->fp[i];
1051
1052                 start = RX_BD(le16_to_cpu(*fp->rx_cons_sb) - 10);
1053                 end = RX_BD(le16_to_cpu(*fp->rx_cons_sb) + 503);
1054                 for (j = start; j != end; j = RX_BD(j + 1)) {
1055                         u32 *rx_bd = (u32 *)&fp->rx_desc_ring[j];
1056                         struct sw_rx_bd *sw_bd = &fp->rx_buf_ring[j];
1057
1058                         BNX2X_ERR("fp%d: rx_bd[%x]=[%x:%x]  sw_bd=[%p]\n",
1059                                   i, j, rx_bd[1], rx_bd[0], sw_bd->skb);
1060                 }
1061
1062                 start = RX_SGE(fp->rx_sge_prod);
1063                 end = RX_SGE(fp->last_max_sge);
1064                 for (j = start; j != end; j = RX_SGE(j + 1)) {
1065                         u32 *rx_sge = (u32 *)&fp->rx_sge_ring[j];
1066                         struct sw_rx_page *sw_page = &fp->rx_page_ring[j];
1067
1068                         BNX2X_ERR("fp%d: rx_sge[%x]=[%x:%x]  sw_page=[%p]\n",
1069                                   i, j, rx_sge[1], rx_sge[0], sw_page->page);
1070                 }
1071
1072                 start = RCQ_BD(fp->rx_comp_cons - 10);
1073                 end = RCQ_BD(fp->rx_comp_cons + 503);
1074                 for (j = start; j != end; j = RCQ_BD(j + 1)) {
1075                         u32 *cqe = (u32 *)&fp->rx_comp_ring[j];
1076
1077                         BNX2X_ERR("fp%d: cqe[%x]=[%x:%x:%x:%x]\n",
1078                                   i, j, cqe[0], cqe[1], cqe[2], cqe[3]);
1079                 }
1080         }
1081
1082         /* Tx */
1083         for_each_tx_queue(bp, i) {
1084                 struct bnx2x_fastpath *fp = &bp->fp[i];
1085
1086                 start = TX_BD(le16_to_cpu(*fp->tx_cons_sb) - 10);
1087                 end = TX_BD(le16_to_cpu(*fp->tx_cons_sb) + 245);
1088                 for (j = start; j != end; j = TX_BD(j + 1)) {
1089                         struct sw_tx_bd *sw_bd = &fp->tx_buf_ring[j];
1090
1091                         BNX2X_ERR("fp%d: packet[%x]=[%p,%x]\n",
1092                                   i, j, sw_bd->skb, sw_bd->first_bd);
1093                 }
1094
1095                 start = TX_BD(fp->tx_bd_cons - 10);
1096                 end = TX_BD(fp->tx_bd_cons + 254);
1097                 for (j = start; j != end; j = TX_BD(j + 1)) {
1098                         u32 *tx_bd = (u32 *)&fp->tx_desc_ring[j];
1099
1100                         BNX2X_ERR("fp%d: tx_bd[%x]=[%x:%x:%x:%x]\n",
1101                                   i, j, tx_bd[0], tx_bd[1], tx_bd[2], tx_bd[3]);
1102                 }
1103         }
1104 #endif
1105         bnx2x_fw_dump(bp);
1106         bnx2x_mc_assert(bp);
1107         BNX2X_ERR("end crash dump -----------------\n");
1108 }
1109
1110 static void bnx2x_hc_int_enable(struct bnx2x *bp)
1111 {
1112         int port = BP_PORT(bp);
1113         u32 addr = port ? HC_REG_CONFIG_1 : HC_REG_CONFIG_0;
1114         u32 val = REG_RD(bp, addr);
1115         int msix = (bp->flags & USING_MSIX_FLAG) ? 1 : 0;
1116         int msi = (bp->flags & USING_MSI_FLAG) ? 1 : 0;
1117
1118         if (msix) {
1119                 val &= ~(HC_CONFIG_0_REG_SINGLE_ISR_EN_0 |
1120                          HC_CONFIG_0_REG_INT_LINE_EN_0);
1121                 val |= (HC_CONFIG_0_REG_MSI_MSIX_INT_EN_0 |
1122                         HC_CONFIG_0_REG_ATTN_BIT_EN_0);
1123         } else if (msi) {
1124                 val &= ~HC_CONFIG_0_REG_INT_LINE_EN_0;
1125                 val |= (HC_CONFIG_0_REG_SINGLE_ISR_EN_0 |
1126                         HC_CONFIG_0_REG_MSI_MSIX_INT_EN_0 |
1127                         HC_CONFIG_0_REG_ATTN_BIT_EN_0);
1128         } else {
1129                 val |= (HC_CONFIG_0_REG_SINGLE_ISR_EN_0 |
1130                         HC_CONFIG_0_REG_MSI_MSIX_INT_EN_0 |
1131                         HC_CONFIG_0_REG_INT_LINE_EN_0 |
1132                         HC_CONFIG_0_REG_ATTN_BIT_EN_0);
1133
1134                 if (!CHIP_IS_E1(bp)) {
1135                         DP(NETIF_MSG_INTR, "write %x to HC %d (addr 0x%x)\n",
1136                            val, port, addr);
1137
1138                         REG_WR(bp, addr, val);
1139
1140                         val &= ~HC_CONFIG_0_REG_MSI_MSIX_INT_EN_0;
1141                 }
1142         }
1143
1144         if (CHIP_IS_E1(bp))
1145                 REG_WR(bp, HC_REG_INT_MASK + port*4, 0x1FFFF);
1146
1147         DP(NETIF_MSG_INTR, "write %x to HC %d (addr 0x%x)  mode %s\n",
1148            val, port, addr, (msix ? "MSI-X" : (msi ? "MSI" : "INTx")));
1149
1150         REG_WR(bp, addr, val);
1151         /*
1152          * Ensure that HC_CONFIG is written before leading/trailing edge config
1153          */
1154         mmiowb();
1155         barrier();
1156
1157         if (!CHIP_IS_E1(bp)) {
1158                 /* init leading/trailing edge */
1159                 if (IS_MF(bp)) {
1160                         val = (0xee0f | (1 << (BP_E1HVN(bp) + 4)));
1161                         if (bp->port.pmf)
1162                                 /* enable nig and gpio3 attention */
1163                                 val |= 0x1100;
1164                 } else
1165                         val = 0xffff;
1166
1167                 REG_WR(bp, HC_REG_TRAILING_EDGE_0 + port*8, val);
1168                 REG_WR(bp, HC_REG_LEADING_EDGE_0 + port*8, val);
1169         }
1170
1171         /* Make sure that interrupts are indeed enabled from here on */
1172         mmiowb();
1173 }
1174
1175 static void bnx2x_igu_int_enable(struct bnx2x *bp)
1176 {
1177         u32 val;
1178         int msix = (bp->flags & USING_MSIX_FLAG) ? 1 : 0;
1179         int msi = (bp->flags & USING_MSI_FLAG) ? 1 : 0;
1180
1181         val = REG_RD(bp, IGU_REG_PF_CONFIGURATION);
1182
1183         if (msix) {
1184                 val &= ~(IGU_PF_CONF_INT_LINE_EN |
1185                          IGU_PF_CONF_SINGLE_ISR_EN);
1186                 val |= (IGU_PF_CONF_FUNC_EN |
1187                         IGU_PF_CONF_MSI_MSIX_EN |
1188                         IGU_PF_CONF_ATTN_BIT_EN);
1189         } else if (msi) {
1190                 val &= ~IGU_PF_CONF_INT_LINE_EN;
1191                 val |= (IGU_PF_CONF_FUNC_EN |
1192                         IGU_PF_CONF_MSI_MSIX_EN |
1193                         IGU_PF_CONF_ATTN_BIT_EN |
1194                         IGU_PF_CONF_SINGLE_ISR_EN);
1195         } else {
1196                 val &= ~IGU_PF_CONF_MSI_MSIX_EN;
1197                 val |= (IGU_PF_CONF_FUNC_EN |
1198                         IGU_PF_CONF_INT_LINE_EN |
1199                         IGU_PF_CONF_ATTN_BIT_EN |
1200                         IGU_PF_CONF_SINGLE_ISR_EN);
1201         }
1202
1203         DP(NETIF_MSG_INTR, "write 0x%x to IGU  mode %s\n",
1204            val, (msix ? "MSI-X" : (msi ? "MSI" : "INTx")));
1205
1206         REG_WR(bp, IGU_REG_PF_CONFIGURATION, val);
1207
1208         barrier();
1209
1210         /* init leading/trailing edge */
1211         if (IS_MF(bp)) {
1212                 val = (0xee0f | (1 << (BP_E1HVN(bp) + 4)));
1213                 if (bp->port.pmf)
1214                         /* enable nig and gpio3 attention */
1215                         val |= 0x1100;
1216         } else
1217                 val = 0xffff;
1218
1219         REG_WR(bp, IGU_REG_TRAILING_EDGE_LATCH, val);
1220         REG_WR(bp, IGU_REG_LEADING_EDGE_LATCH, val);
1221
1222         /* Make sure that interrupts are indeed enabled from here on */
1223         mmiowb();
1224 }
1225
1226 void bnx2x_int_enable(struct bnx2x *bp)
1227 {
1228         if (bp->common.int_block == INT_BLOCK_HC)
1229                 bnx2x_hc_int_enable(bp);
1230         else
1231                 bnx2x_igu_int_enable(bp);
1232 }
1233
1234 static void bnx2x_hc_int_disable(struct bnx2x *bp)
1235 {
1236         int port = BP_PORT(bp);
1237         u32 addr = port ? HC_REG_CONFIG_1 : HC_REG_CONFIG_0;
1238         u32 val = REG_RD(bp, addr);
1239
1240         /*
1241          * in E1 we must use only PCI configuration space to disable
1242          * MSI/MSIX capablility
1243          * It's forbitten to disable IGU_PF_CONF_MSI_MSIX_EN in HC block
1244          */
1245         if (CHIP_IS_E1(bp)) {
1246                 /*  Since IGU_PF_CONF_MSI_MSIX_EN still always on
1247                  *  Use mask register to prevent from HC sending interrupts
1248                  *  after we exit the function
1249                  */
1250                 REG_WR(bp, HC_REG_INT_MASK + port*4, 0);
1251
1252                 val &= ~(HC_CONFIG_0_REG_SINGLE_ISR_EN_0 |
1253                          HC_CONFIG_0_REG_INT_LINE_EN_0 |
1254                          HC_CONFIG_0_REG_ATTN_BIT_EN_0);
1255         } else
1256                 val &= ~(HC_CONFIG_0_REG_SINGLE_ISR_EN_0 |
1257                          HC_CONFIG_0_REG_MSI_MSIX_INT_EN_0 |
1258                          HC_CONFIG_0_REG_INT_LINE_EN_0 |
1259                          HC_CONFIG_0_REG_ATTN_BIT_EN_0);
1260
1261         DP(NETIF_MSG_INTR, "write %x to HC %d (addr 0x%x)\n",
1262            val, port, addr);
1263
1264         /* flush all outstanding writes */
1265         mmiowb();
1266
1267         REG_WR(bp, addr, val);
1268         if (REG_RD(bp, addr) != val)
1269                 BNX2X_ERR("BUG! proper val not read from IGU!\n");
1270 }
1271
1272 static void bnx2x_igu_int_disable(struct bnx2x *bp)
1273 {
1274         u32 val = REG_RD(bp, IGU_REG_PF_CONFIGURATION);
1275
1276         val &= ~(IGU_PF_CONF_MSI_MSIX_EN |
1277                  IGU_PF_CONF_INT_LINE_EN |
1278                  IGU_PF_CONF_ATTN_BIT_EN);
1279
1280         DP(NETIF_MSG_INTR, "write %x to IGU\n", val);
1281
1282         /* flush all outstanding writes */
1283         mmiowb();
1284
1285         REG_WR(bp, IGU_REG_PF_CONFIGURATION, val);
1286         if (REG_RD(bp, IGU_REG_PF_CONFIGURATION) != val)
1287                 BNX2X_ERR("BUG! proper val not read from IGU!\n");
1288 }
1289
1290 static void bnx2x_int_disable(struct bnx2x *bp)
1291 {
1292         if (bp->common.int_block == INT_BLOCK_HC)
1293                 bnx2x_hc_int_disable(bp);
1294         else
1295                 bnx2x_igu_int_disable(bp);
1296 }
1297
1298 void bnx2x_int_disable_sync(struct bnx2x *bp, int disable_hw)
1299 {
1300         int msix = (bp->flags & USING_MSIX_FLAG) ? 1 : 0;
1301         int i, offset;
1302
1303         if (disable_hw)
1304                 /* prevent the HW from sending interrupts */
1305                 bnx2x_int_disable(bp);
1306
1307         /* make sure all ISRs are done */
1308         if (msix) {
1309                 synchronize_irq(bp->msix_table[0].vector);
1310                 offset = 1;
1311 #ifdef BCM_CNIC
1312                 offset++;
1313 #endif
1314                 for_each_eth_queue(bp, i)
1315                         synchronize_irq(bp->msix_table[i + offset].vector);
1316         } else
1317                 synchronize_irq(bp->pdev->irq);
1318
1319         /* make sure sp_task is not running */
1320         cancel_delayed_work(&bp->sp_task);
1321         flush_workqueue(bnx2x_wq);
1322 }
1323
1324 /* fast path */
1325
1326 /*
1327  * General service functions
1328  */
1329
1330 /* Return true if succeeded to acquire the lock */
1331 static bool bnx2x_trylock_hw_lock(struct bnx2x *bp, u32 resource)
1332 {
1333         u32 lock_status;
1334         u32 resource_bit = (1 << resource);
1335         int func = BP_FUNC(bp);
1336         u32 hw_lock_control_reg;
1337
1338         DP(NETIF_MSG_HW, "Trying to take a lock on resource %d\n", resource);
1339
1340         /* Validating that the resource is within range */
1341         if (resource > HW_LOCK_MAX_RESOURCE_VALUE) {
1342                 DP(NETIF_MSG_HW,
1343                    "resource(0x%x) > HW_LOCK_MAX_RESOURCE_VALUE(0x%x)\n",
1344                    resource, HW_LOCK_MAX_RESOURCE_VALUE);
1345                 return false;
1346         }
1347
1348         if (func <= 5)
1349                 hw_lock_control_reg = (MISC_REG_DRIVER_CONTROL_1 + func*8);
1350         else
1351                 hw_lock_control_reg =
1352                                 (MISC_REG_DRIVER_CONTROL_7 + (func - 6)*8);
1353
1354         /* Try to acquire the lock */
1355         REG_WR(bp, hw_lock_control_reg + 4, resource_bit);
1356         lock_status = REG_RD(bp, hw_lock_control_reg);
1357         if (lock_status & resource_bit)
1358                 return true;
1359
1360         DP(NETIF_MSG_HW, "Failed to get a lock on resource %d\n", resource);
1361         return false;
1362 }
1363
1364 #ifdef BCM_CNIC
1365 static void bnx2x_cnic_cfc_comp(struct bnx2x *bp, int cid);
1366 #endif
1367
1368 void bnx2x_sp_event(struct bnx2x_fastpath *fp,
1369                            union eth_rx_cqe *rr_cqe)
1370 {
1371         struct bnx2x *bp = fp->bp;
1372         int cid = SW_CID(rr_cqe->ramrod_cqe.conn_and_cmd_data);
1373         int command = CQE_CMD(rr_cqe->ramrod_cqe.conn_and_cmd_data);
1374
1375         DP(BNX2X_MSG_SP,
1376            "fp %d  cid %d  got ramrod #%d  state is %x  type is %d\n",
1377            fp->index, cid, command, bp->state,
1378            rr_cqe->ramrod_cqe.ramrod_type);
1379
1380         switch (command | fp->state) {
1381         case (RAMROD_CMD_ID_ETH_CLIENT_SETUP | BNX2X_FP_STATE_OPENING):
1382                 DP(NETIF_MSG_IFUP, "got MULTI[%d] setup ramrod\n", cid);
1383                 fp->state = BNX2X_FP_STATE_OPEN;
1384                 break;
1385
1386         case (RAMROD_CMD_ID_ETH_HALT | BNX2X_FP_STATE_HALTING):
1387                 DP(NETIF_MSG_IFDOWN, "got MULTI[%d] halt ramrod\n", cid);
1388                 fp->state = BNX2X_FP_STATE_HALTED;
1389                 break;
1390
1391         case (RAMROD_CMD_ID_ETH_TERMINATE | BNX2X_FP_STATE_TERMINATING):
1392                 DP(NETIF_MSG_IFDOWN, "got MULTI[%d] teminate ramrod\n", cid);
1393                 fp->state = BNX2X_FP_STATE_TERMINATED;
1394                 break;
1395
1396         default:
1397                 BNX2X_ERR("unexpected MC reply (%d)  "
1398                           "fp[%d] state is %x\n",
1399                           command, fp->index, fp->state);
1400                 break;
1401         }
1402
1403         smp_mb__before_atomic_inc();
1404         atomic_inc(&bp->cq_spq_left);
1405         /* push the change in fp->state and towards the memory */
1406         smp_wmb();
1407
1408         return;
1409 }
1410
1411 irqreturn_t bnx2x_interrupt(int irq, void *dev_instance)
1412 {
1413         struct bnx2x *bp = netdev_priv(dev_instance);
1414         u16 status = bnx2x_ack_int(bp);
1415         u16 mask;
1416         int i;
1417
1418         /* Return here if interrupt is shared and it's not for us */
1419         if (unlikely(status == 0)) {
1420                 DP(NETIF_MSG_INTR, "not our interrupt!\n");
1421                 return IRQ_NONE;
1422         }
1423         DP(NETIF_MSG_INTR, "got an interrupt  status 0x%x\n", status);
1424
1425 #ifdef BNX2X_STOP_ON_ERROR
1426         if (unlikely(bp->panic))
1427                 return IRQ_HANDLED;
1428 #endif
1429
1430         for_each_eth_queue(bp, i) {
1431                 struct bnx2x_fastpath *fp = &bp->fp[i];
1432
1433                 mask = 0x2 << (fp->index + CNIC_CONTEXT_USE);
1434                 if (status & mask) {
1435                         /* Handle Rx and Tx according to SB id */
1436                         prefetch(fp->rx_cons_sb);
1437                         prefetch(fp->tx_cons_sb);
1438                         prefetch(&fp->sb_running_index[SM_RX_ID]);
1439                         napi_schedule(&bnx2x_fp(bp, fp->index, napi));
1440                         status &= ~mask;
1441                 }
1442         }
1443
1444 #ifdef BCM_CNIC
1445         mask = 0x2;
1446         if (status & (mask | 0x1)) {
1447                 struct cnic_ops *c_ops = NULL;
1448
1449                 rcu_read_lock();
1450                 c_ops = rcu_dereference(bp->cnic_ops);
1451                 if (c_ops)
1452                         c_ops->cnic_handler(bp->cnic_data, NULL);
1453                 rcu_read_unlock();
1454
1455                 status &= ~mask;
1456         }
1457 #endif
1458
1459         if (unlikely(status & 0x1)) {
1460                 queue_delayed_work(bnx2x_wq, &bp->sp_task, 0);
1461
1462                 status &= ~0x1;
1463                 if (!status)
1464                         return IRQ_HANDLED;
1465         }
1466
1467         if (unlikely(status))
1468                 DP(NETIF_MSG_INTR, "got an unknown interrupt! (status 0x%x)\n",
1469                    status);
1470
1471         return IRQ_HANDLED;
1472 }
1473
1474 /* end of fast path */
1475
1476
1477 /* Link */
1478
1479 /*
1480  * General service functions
1481  */
1482
1483 int bnx2x_acquire_hw_lock(struct bnx2x *bp, u32 resource)
1484 {
1485         u32 lock_status;
1486         u32 resource_bit = (1 << resource);
1487         int func = BP_FUNC(bp);
1488         u32 hw_lock_control_reg;
1489         int cnt;
1490
1491         /* Validating that the resource is within range */
1492         if (resource > HW_LOCK_MAX_RESOURCE_VALUE) {
1493                 DP(NETIF_MSG_HW,
1494                    "resource(0x%x) > HW_LOCK_MAX_RESOURCE_VALUE(0x%x)\n",
1495                    resource, HW_LOCK_MAX_RESOURCE_VALUE);
1496                 return -EINVAL;
1497         }
1498
1499         if (func <= 5) {
1500                 hw_lock_control_reg = (MISC_REG_DRIVER_CONTROL_1 + func*8);
1501         } else {
1502                 hw_lock_control_reg =
1503                                 (MISC_REG_DRIVER_CONTROL_7 + (func - 6)*8);
1504         }
1505
1506         /* Validating that the resource is not already taken */
1507         lock_status = REG_RD(bp, hw_lock_control_reg);
1508         if (lock_status & resource_bit) {
1509                 DP(NETIF_MSG_HW, "lock_status 0x%x  resource_bit 0x%x\n",
1510                    lock_status, resource_bit);
1511                 return -EEXIST;
1512         }
1513
1514         /* Try for 5 second every 5ms */
1515         for (cnt = 0; cnt < 1000; cnt++) {
1516                 /* Try to acquire the lock */
1517                 REG_WR(bp, hw_lock_control_reg + 4, resource_bit);
1518                 lock_status = REG_RD(bp, hw_lock_control_reg);
1519                 if (lock_status & resource_bit)
1520                         return 0;
1521
1522                 msleep(5);
1523         }
1524         DP(NETIF_MSG_HW, "Timeout\n");
1525         return -EAGAIN;
1526 }
1527
1528 int bnx2x_release_hw_lock(struct bnx2x *bp, u32 resource)
1529 {
1530         u32 lock_status;
1531         u32 resource_bit = (1 << resource);
1532         int func = BP_FUNC(bp);
1533         u32 hw_lock_control_reg;
1534
1535         DP(NETIF_MSG_HW, "Releasing a lock on resource %d\n", resource);
1536
1537         /* Validating that the resource is within range */
1538         if (resource > HW_LOCK_MAX_RESOURCE_VALUE) {
1539                 DP(NETIF_MSG_HW,
1540                    "resource(0x%x) > HW_LOCK_MAX_RESOURCE_VALUE(0x%x)\n",
1541                    resource, HW_LOCK_MAX_RESOURCE_VALUE);
1542                 return -EINVAL;
1543         }
1544
1545         if (func <= 5) {
1546                 hw_lock_control_reg = (MISC_REG_DRIVER_CONTROL_1 + func*8);
1547         } else {
1548                 hw_lock_control_reg =
1549                                 (MISC_REG_DRIVER_CONTROL_7 + (func - 6)*8);
1550         }
1551
1552         /* Validating that the resource is currently taken */
1553         lock_status = REG_RD(bp, hw_lock_control_reg);
1554         if (!(lock_status & resource_bit)) {
1555                 DP(NETIF_MSG_HW, "lock_status 0x%x  resource_bit 0x%x\n",
1556                    lock_status, resource_bit);
1557                 return -EFAULT;
1558         }
1559
1560         REG_WR(bp, hw_lock_control_reg, resource_bit);
1561         return 0;
1562 }
1563
1564
1565 int bnx2x_get_gpio(struct bnx2x *bp, int gpio_num, u8 port)
1566 {
1567         /* The GPIO should be swapped if swap register is set and active */
1568         int gpio_port = (REG_RD(bp, NIG_REG_PORT_SWAP) &&
1569                          REG_RD(bp, NIG_REG_STRAP_OVERRIDE)) ^ port;
1570         int gpio_shift = gpio_num +
1571                         (gpio_port ? MISC_REGISTERS_GPIO_PORT_SHIFT : 0);
1572         u32 gpio_mask = (1 << gpio_shift);
1573         u32 gpio_reg;
1574         int value;
1575
1576         if (gpio_num > MISC_REGISTERS_GPIO_3) {
1577                 BNX2X_ERR("Invalid GPIO %d\n", gpio_num);
1578                 return -EINVAL;
1579         }
1580
1581         /* read GPIO value */
1582         gpio_reg = REG_RD(bp, MISC_REG_GPIO);
1583
1584         /* get the requested pin value */
1585         if ((gpio_reg & gpio_mask) == gpio_mask)
1586                 value = 1;
1587         else
1588                 value = 0;
1589
1590         DP(NETIF_MSG_LINK, "pin %d  value 0x%x\n", gpio_num, value);
1591
1592         return value;
1593 }
1594
1595 int bnx2x_set_gpio(struct bnx2x *bp, int gpio_num, u32 mode, u8 port)
1596 {
1597         /* The GPIO should be swapped if swap register is set and active */
1598         int gpio_port = (REG_RD(bp, NIG_REG_PORT_SWAP) &&
1599                          REG_RD(bp, NIG_REG_STRAP_OVERRIDE)) ^ port;
1600         int gpio_shift = gpio_num +
1601                         (gpio_port ? MISC_REGISTERS_GPIO_PORT_SHIFT : 0);
1602         u32 gpio_mask = (1 << gpio_shift);
1603         u32 gpio_reg;
1604
1605         if (gpio_num > MISC_REGISTERS_GPIO_3) {
1606                 BNX2X_ERR("Invalid GPIO %d\n", gpio_num);
1607                 return -EINVAL;
1608         }
1609
1610         bnx2x_acquire_hw_lock(bp, HW_LOCK_RESOURCE_GPIO);
1611         /* read GPIO and mask except the float bits */
1612         gpio_reg = (REG_RD(bp, MISC_REG_GPIO) & MISC_REGISTERS_GPIO_FLOAT);
1613
1614         switch (mode) {
1615         case MISC_REGISTERS_GPIO_OUTPUT_LOW:
1616                 DP(NETIF_MSG_LINK, "Set GPIO %d (shift %d) -> output low\n",
1617                    gpio_num, gpio_shift);
1618                 /* clear FLOAT and set CLR */
1619                 gpio_reg &= ~(gpio_mask << MISC_REGISTERS_GPIO_FLOAT_POS);
1620                 gpio_reg |=  (gpio_mask << MISC_REGISTERS_GPIO_CLR_POS);
1621                 break;
1622
1623         case MISC_REGISTERS_GPIO_OUTPUT_HIGH:
1624                 DP(NETIF_MSG_LINK, "Set GPIO %d (shift %d) -> output high\n",
1625                    gpio_num, gpio_shift);
1626                 /* clear FLOAT and set SET */
1627                 gpio_reg &= ~(gpio_mask << MISC_REGISTERS_GPIO_FLOAT_POS);
1628                 gpio_reg |=  (gpio_mask << MISC_REGISTERS_GPIO_SET_POS);
1629                 break;
1630
1631         case MISC_REGISTERS_GPIO_INPUT_HI_Z:
1632                 DP(NETIF_MSG_LINK, "Set GPIO %d (shift %d) -> input\n",
1633                    gpio_num, gpio_shift);
1634                 /* set FLOAT */
1635                 gpio_reg |= (gpio_mask << MISC_REGISTERS_GPIO_FLOAT_POS);
1636                 break;
1637
1638         default:
1639                 break;
1640         }
1641
1642         REG_WR(bp, MISC_REG_GPIO, gpio_reg);
1643         bnx2x_release_hw_lock(bp, HW_LOCK_RESOURCE_GPIO);
1644
1645         return 0;
1646 }
1647
1648 int bnx2x_set_gpio_int(struct bnx2x *bp, int gpio_num, u32 mode, u8 port)
1649 {
1650         /* The GPIO should be swapped if swap register is set and active */
1651         int gpio_port = (REG_RD(bp, NIG_REG_PORT_SWAP) &&
1652                          REG_RD(bp, NIG_REG_STRAP_OVERRIDE)) ^ port;
1653         int gpio_shift = gpio_num +
1654                         (gpio_port ? MISC_REGISTERS_GPIO_PORT_SHIFT : 0);
1655         u32 gpio_mask = (1 << gpio_shift);
1656         u32 gpio_reg;
1657
1658         if (gpio_num > MISC_REGISTERS_GPIO_3) {
1659                 BNX2X_ERR("Invalid GPIO %d\n", gpio_num);
1660                 return -EINVAL;
1661         }
1662
1663         bnx2x_acquire_hw_lock(bp, HW_LOCK_RESOURCE_GPIO);
1664         /* read GPIO int */
1665         gpio_reg = REG_RD(bp, MISC_REG_GPIO_INT);
1666
1667         switch (mode) {
1668         case MISC_REGISTERS_GPIO_INT_OUTPUT_CLR:
1669                 DP(NETIF_MSG_LINK, "Clear GPIO INT %d (shift %d) -> "
1670                                    "output low\n", gpio_num, gpio_shift);
1671                 /* clear SET and set CLR */
1672                 gpio_reg &= ~(gpio_mask << MISC_REGISTERS_GPIO_INT_SET_POS);
1673                 gpio_reg |=  (gpio_mask << MISC_REGISTERS_GPIO_INT_CLR_POS);
1674                 break;
1675
1676         case MISC_REGISTERS_GPIO_INT_OUTPUT_SET:
1677                 DP(NETIF_MSG_LINK, "Set GPIO INT %d (shift %d) -> "
1678                                    "output high\n", gpio_num, gpio_shift);
1679                 /* clear CLR and set SET */
1680                 gpio_reg &= ~(gpio_mask << MISC_REGISTERS_GPIO_INT_CLR_POS);
1681                 gpio_reg |=  (gpio_mask << MISC_REGISTERS_GPIO_INT_SET_POS);
1682                 break;
1683
1684         default:
1685                 break;
1686         }
1687
1688         REG_WR(bp, MISC_REG_GPIO_INT, gpio_reg);
1689         bnx2x_release_hw_lock(bp, HW_LOCK_RESOURCE_GPIO);
1690
1691         return 0;
1692 }
1693
1694 static int bnx2x_set_spio(struct bnx2x *bp, int spio_num, u32 mode)
1695 {
1696         u32 spio_mask = (1 << spio_num);
1697         u32 spio_reg;
1698
1699         if ((spio_num < MISC_REGISTERS_SPIO_4) ||
1700             (spio_num > MISC_REGISTERS_SPIO_7)) {
1701                 BNX2X_ERR("Invalid SPIO %d\n", spio_num);
1702                 return -EINVAL;
1703         }
1704
1705         bnx2x_acquire_hw_lock(bp, HW_LOCK_RESOURCE_SPIO);
1706         /* read SPIO and mask except the float bits */
1707         spio_reg = (REG_RD(bp, MISC_REG_SPIO) & MISC_REGISTERS_SPIO_FLOAT);
1708
1709         switch (mode) {
1710         case MISC_REGISTERS_SPIO_OUTPUT_LOW:
1711                 DP(NETIF_MSG_LINK, "Set SPIO %d -> output low\n", spio_num);
1712                 /* clear FLOAT and set CLR */
1713                 spio_reg &= ~(spio_mask << MISC_REGISTERS_SPIO_FLOAT_POS);
1714                 spio_reg |=  (spio_mask << MISC_REGISTERS_SPIO_CLR_POS);
1715                 break;
1716
1717         case MISC_REGISTERS_SPIO_OUTPUT_HIGH:
1718                 DP(NETIF_MSG_LINK, "Set SPIO %d -> output high\n", spio_num);
1719                 /* clear FLOAT and set SET */
1720                 spio_reg &= ~(spio_mask << MISC_REGISTERS_SPIO_FLOAT_POS);
1721                 spio_reg |=  (spio_mask << MISC_REGISTERS_SPIO_SET_POS);
1722                 break;
1723
1724         case MISC_REGISTERS_SPIO_INPUT_HI_Z:
1725                 DP(NETIF_MSG_LINK, "Set SPIO %d -> input\n", spio_num);
1726                 /* set FLOAT */
1727                 spio_reg |= (spio_mask << MISC_REGISTERS_SPIO_FLOAT_POS);
1728                 break;
1729
1730         default:
1731                 break;
1732         }
1733
1734         REG_WR(bp, MISC_REG_SPIO, spio_reg);
1735         bnx2x_release_hw_lock(bp, HW_LOCK_RESOURCE_SPIO);
1736
1737         return 0;
1738 }
1739
1740 void bnx2x_calc_fc_adv(struct bnx2x *bp)
1741 {
1742         u8 cfg_idx = bnx2x_get_link_cfg_idx(bp);
1743         switch (bp->link_vars.ieee_fc &
1744                 MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_MASK) {
1745         case MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_NONE:
1746                 bp->port.advertising[cfg_idx] &= ~(ADVERTISED_Asym_Pause |
1747                                                    ADVERTISED_Pause);
1748                 break;
1749
1750         case MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_BOTH:
1751                 bp->port.advertising[cfg_idx] |= (ADVERTISED_Asym_Pause |
1752                                                   ADVERTISED_Pause);
1753                 break;
1754
1755         case MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_ASYMMETRIC:
1756                 bp->port.advertising[cfg_idx] |= ADVERTISED_Asym_Pause;
1757                 break;
1758
1759         default:
1760                 bp->port.advertising[cfg_idx] &= ~(ADVERTISED_Asym_Pause |
1761                                                    ADVERTISED_Pause);
1762                 break;
1763         }
1764 }
1765
1766 u8 bnx2x_initial_phy_init(struct bnx2x *bp, int load_mode)
1767 {
1768         if (!BP_NOMCP(bp)) {
1769                 u8 rc;
1770                 int cfx_idx = bnx2x_get_link_cfg_idx(bp);
1771                 u16 req_line_speed = bp->link_params.req_line_speed[cfx_idx];
1772                 /* Initialize link parameters structure variables */
1773                 /* It is recommended to turn off RX FC for jumbo frames
1774                    for better performance */
1775                 if ((CHIP_IS_E1x(bp)) && (bp->dev->mtu > 5000))
1776                         bp->link_params.req_fc_auto_adv = BNX2X_FLOW_CTRL_TX;
1777                 else
1778                         bp->link_params.req_fc_auto_adv = BNX2X_FLOW_CTRL_BOTH;
1779
1780                 bnx2x_acquire_phy_lock(bp);
1781
1782                 if (load_mode == LOAD_DIAG) {
1783                         bp->link_params.loopback_mode = LOOPBACK_XGXS;
1784                         bp->link_params.req_line_speed[cfx_idx] = SPEED_10000;
1785                 }
1786
1787                 rc = bnx2x_phy_init(&bp->link_params, &bp->link_vars);
1788
1789                 bnx2x_release_phy_lock(bp);
1790
1791                 bnx2x_calc_fc_adv(bp);
1792
1793                 if (CHIP_REV_IS_SLOW(bp) && bp->link_vars.link_up) {
1794                         bnx2x_stats_handle(bp, STATS_EVENT_LINK_UP);
1795                         bnx2x_link_report(bp);
1796                 }
1797                 bp->link_params.req_line_speed[cfx_idx] = req_line_speed;
1798                 return rc;
1799         }
1800         BNX2X_ERR("Bootcode is missing - can not initialize link\n");
1801         return -EINVAL;
1802 }
1803
1804 void bnx2x_link_set(struct bnx2x *bp)
1805 {
1806         if (!BP_NOMCP(bp)) {
1807                 bnx2x_acquire_phy_lock(bp);
1808                 bnx2x_link_reset(&bp->link_params, &bp->link_vars, 1);
1809                 bnx2x_phy_init(&bp->link_params, &bp->link_vars);
1810                 bnx2x_release_phy_lock(bp);
1811
1812                 bnx2x_calc_fc_adv(bp);
1813         } else
1814                 BNX2X_ERR("Bootcode is missing - can not set link\n");
1815 }
1816
1817 static void bnx2x__link_reset(struct bnx2x *bp)
1818 {
1819         if (!BP_NOMCP(bp)) {
1820                 bnx2x_acquire_phy_lock(bp);
1821                 bnx2x_link_reset(&bp->link_params, &bp->link_vars, 1);
1822                 bnx2x_release_phy_lock(bp);
1823         } else
1824                 BNX2X_ERR("Bootcode is missing - can not reset link\n");
1825 }
1826
1827 u8 bnx2x_link_test(struct bnx2x *bp, u8 is_serdes)
1828 {
1829         u8 rc = 0;
1830
1831         if (!BP_NOMCP(bp)) {
1832                 bnx2x_acquire_phy_lock(bp);
1833                 rc = bnx2x_test_link(&bp->link_params, &bp->link_vars,
1834                                      is_serdes);
1835                 bnx2x_release_phy_lock(bp);
1836         } else
1837                 BNX2X_ERR("Bootcode is missing - can not test link\n");
1838
1839         return rc;
1840 }
1841
1842 static void bnx2x_init_port_minmax(struct bnx2x *bp)
1843 {
1844         u32 r_param = bp->link_vars.line_speed / 8;
1845         u32 fair_periodic_timeout_usec;
1846         u32 t_fair;
1847
1848         memset(&(bp->cmng.rs_vars), 0,
1849                sizeof(struct rate_shaping_vars_per_port));
1850         memset(&(bp->cmng.fair_vars), 0, sizeof(struct fairness_vars_per_port));
1851
1852         /* 100 usec in SDM ticks = 25 since each tick is 4 usec */
1853         bp->cmng.rs_vars.rs_periodic_timeout = RS_PERIODIC_TIMEOUT_USEC / 4;
1854
1855         /* this is the threshold below which no timer arming will occur
1856            1.25 coefficient is for the threshold to be a little bigger
1857            than the real time, to compensate for timer in-accuracy */
1858         bp->cmng.rs_vars.rs_threshold =
1859                                 (RS_PERIODIC_TIMEOUT_USEC * r_param * 5) / 4;
1860
1861         /* resolution of fairness timer */
1862         fair_periodic_timeout_usec = QM_ARB_BYTES / r_param;
1863         /* for 10G it is 1000usec. for 1G it is 10000usec. */
1864         t_fair = T_FAIR_COEF / bp->link_vars.line_speed;
1865
1866         /* this is the threshold below which we won't arm the timer anymore */
1867         bp->cmng.fair_vars.fair_threshold = QM_ARB_BYTES;
1868
1869         /* we multiply by 1e3/8 to get bytes/msec.
1870            We don't want the credits to pass a credit
1871            of the t_fair*FAIR_MEM (algorithm resolution) */
1872         bp->cmng.fair_vars.upper_bound = r_param * t_fair * FAIR_MEM;
1873         /* since each tick is 4 usec */
1874         bp->cmng.fair_vars.fairness_timeout = fair_periodic_timeout_usec / 4;
1875 }
1876
1877 /* Calculates the sum of vn_min_rates.
1878    It's needed for further normalizing of the min_rates.
1879    Returns:
1880      sum of vn_min_rates.
1881        or
1882      0 - if all the min_rates are 0.
1883      In the later case fainess algorithm should be deactivated.
1884      If not all min_rates are zero then those that are zeroes will be set to 1.
1885  */
1886 static void bnx2x_calc_vn_weight_sum(struct bnx2x *bp)
1887 {
1888         int all_zero = 1;
1889         int vn;
1890
1891         bp->vn_weight_sum = 0;
1892         for (vn = VN_0; vn < E1HVN_MAX; vn++) {
1893                 u32 vn_cfg = bp->mf_config[vn];
1894                 u32 vn_min_rate = ((vn_cfg & FUNC_MF_CFG_MIN_BW_MASK) >>
1895                                    FUNC_MF_CFG_MIN_BW_SHIFT) * 100;
1896
1897                 /* Skip hidden vns */
1898                 if (vn_cfg & FUNC_MF_CFG_FUNC_HIDE)
1899                         continue;
1900
1901                 /* If min rate is zero - set it to 1 */
1902                 if (!vn_min_rate)
1903                         vn_min_rate = DEF_MIN_RATE;
1904                 else
1905                         all_zero = 0;
1906
1907                 bp->vn_weight_sum += vn_min_rate;
1908         }
1909
1910         /* if ETS or all min rates are zeros - disable fairness */
1911         if (BNX2X_IS_ETS_ENABLED(bp)) {
1912                 bp->cmng.flags.cmng_enables &=
1913                                         ~CMNG_FLAGS_PER_PORT_FAIRNESS_VN;
1914                 DP(NETIF_MSG_IFUP, "Fairness will be disabled due to ETS\n");
1915         } else if (all_zero) {
1916                 bp->cmng.flags.cmng_enables &=
1917                                         ~CMNG_FLAGS_PER_PORT_FAIRNESS_VN;
1918                 DP(NETIF_MSG_IFUP, "All MIN values are zeroes"
1919                    "  fairness will be disabled\n");
1920         } else
1921                 bp->cmng.flags.cmng_enables |=
1922                                         CMNG_FLAGS_PER_PORT_FAIRNESS_VN;
1923 }
1924
1925 static void bnx2x_init_vn_minmax(struct bnx2x *bp, int vn)
1926 {
1927         struct rate_shaping_vars_per_vn m_rs_vn;
1928         struct fairness_vars_per_vn m_fair_vn;
1929         u32 vn_cfg = bp->mf_config[vn];
1930         int func = 2*vn + BP_PORT(bp);
1931         u16 vn_min_rate, vn_max_rate;
1932         int i;
1933
1934         /* If function is hidden - set min and max to zeroes */
1935         if (vn_cfg & FUNC_MF_CFG_FUNC_HIDE) {
1936                 vn_min_rate = 0;
1937                 vn_max_rate = 0;
1938
1939         } else {
1940                 u32 maxCfg = bnx2x_extract_max_cfg(bp, vn_cfg);
1941
1942                 vn_min_rate = ((vn_cfg & FUNC_MF_CFG_MIN_BW_MASK) >>
1943                                 FUNC_MF_CFG_MIN_BW_SHIFT) * 100;
1944                 /* If fairness is enabled (not all min rates are zeroes) and
1945                    if current min rate is zero - set it to 1.
1946                    This is a requirement of the algorithm. */
1947                 if (bp->vn_weight_sum && (vn_min_rate == 0))
1948                         vn_min_rate = DEF_MIN_RATE;
1949
1950                 if (IS_MF_SI(bp))
1951                         /* maxCfg in percents of linkspeed */
1952                         vn_max_rate = (bp->link_vars.line_speed * maxCfg) / 100;
1953                 else
1954                         /* maxCfg is absolute in 100Mb units */
1955                         vn_max_rate = maxCfg * 100;
1956         }
1957
1958         DP(NETIF_MSG_IFUP,
1959            "func %d: vn_min_rate %d  vn_max_rate %d  vn_weight_sum %d\n",
1960            func, vn_min_rate, vn_max_rate, bp->vn_weight_sum);
1961
1962         memset(&m_rs_vn, 0, sizeof(struct rate_shaping_vars_per_vn));
1963         memset(&m_fair_vn, 0, sizeof(struct fairness_vars_per_vn));
1964
1965         /* global vn counter - maximal Mbps for this vn */
1966         m_rs_vn.vn_counter.rate = vn_max_rate;
1967
1968         /* quota - number of bytes transmitted in this period */
1969         m_rs_vn.vn_counter.quota =
1970                                 (vn_max_rate * RS_PERIODIC_TIMEOUT_USEC) / 8;
1971
1972         if (bp->vn_weight_sum) {
1973                 /* credit for each period of the fairness algorithm:
1974                    number of bytes in T_FAIR (the vn share the port rate).
1975                    vn_weight_sum should not be larger than 10000, thus
1976                    T_FAIR_COEF / (8 * vn_weight_sum) will always be greater
1977                    than zero */
1978                 m_fair_vn.vn_credit_delta =
1979                         max_t(u32, (vn_min_rate * (T_FAIR_COEF /
1980                                                    (8 * bp->vn_weight_sum))),
1981                               (bp->cmng.fair_vars.fair_threshold +
1982                                                         MIN_ABOVE_THRESH));
1983                 DP(NETIF_MSG_IFUP, "m_fair_vn.vn_credit_delta %d\n",
1984                    m_fair_vn.vn_credit_delta);
1985         }
1986
1987         /* Store it to internal memory */
1988         for (i = 0; i < sizeof(struct rate_shaping_vars_per_vn)/4; i++)
1989                 REG_WR(bp, BAR_XSTRORM_INTMEM +
1990                        XSTORM_RATE_SHAPING_PER_VN_VARS_OFFSET(func) + i * 4,
1991                        ((u32 *)(&m_rs_vn))[i]);
1992
1993         for (i = 0; i < sizeof(struct fairness_vars_per_vn)/4; i++)
1994                 REG_WR(bp, BAR_XSTRORM_INTMEM +
1995                        XSTORM_FAIRNESS_PER_VN_VARS_OFFSET(func) + i * 4,
1996                        ((u32 *)(&m_fair_vn))[i]);
1997 }
1998
1999 static int bnx2x_get_cmng_fns_mode(struct bnx2x *bp)
2000 {
2001         if (CHIP_REV_IS_SLOW(bp))
2002                 return CMNG_FNS_NONE;
2003         if (IS_MF(bp))
2004                 return CMNG_FNS_MINMAX;
2005
2006         return CMNG_FNS_NONE;
2007 }
2008
2009 void bnx2x_read_mf_cfg(struct bnx2x *bp)
2010 {
2011         int vn, n = (CHIP_MODE_IS_4_PORT(bp) ? 2 : 1);
2012
2013         if (BP_NOMCP(bp))
2014                 return; /* what should be the default bvalue in this case */
2015
2016         /* For 2 port configuration the absolute function number formula
2017          * is:
2018          *      abs_func = 2 * vn + BP_PORT + BP_PATH
2019          *
2020          *      and there are 4 functions per port
2021          *
2022          * For 4 port configuration it is
2023          *      abs_func = 4 * vn + 2 * BP_PORT + BP_PATH
2024          *
2025          *      and there are 2 functions per port
2026          */
2027         for (vn = VN_0; vn < E1HVN_MAX; vn++) {
2028                 int /*abs*/func = n * (2 * vn + BP_PORT(bp)) + BP_PATH(bp);
2029
2030                 if (func >= E1H_FUNC_MAX)
2031                         break;
2032
2033                 bp->mf_config[vn] =
2034                         MF_CFG_RD(bp, func_mf_config[func].config);
2035         }
2036 }
2037
2038 static void bnx2x_cmng_fns_init(struct bnx2x *bp, u8 read_cfg, u8 cmng_type)
2039 {
2040
2041         if (cmng_type == CMNG_FNS_MINMAX) {
2042                 int vn;
2043
2044                 /* clear cmng_enables */
2045                 bp->cmng.flags.cmng_enables = 0;
2046
2047                 /* read mf conf from shmem */
2048                 if (read_cfg)
2049                         bnx2x_read_mf_cfg(bp);
2050
2051                 /* Init rate shaping and fairness contexts */
2052                 bnx2x_init_port_minmax(bp);
2053
2054                 /* vn_weight_sum and enable fairness if not 0 */
2055                 bnx2x_calc_vn_weight_sum(bp);
2056
2057                 /* calculate and set min-max rate for each vn */
2058                 if (bp->port.pmf)
2059                         for (vn = VN_0; vn < E1HVN_MAX; vn++)
2060                                 bnx2x_init_vn_minmax(bp, vn);
2061
2062                 /* always enable rate shaping and fairness */
2063                 bp->cmng.flags.cmng_enables |=
2064                                         CMNG_FLAGS_PER_PORT_RATE_SHAPING_VN;
2065                 if (!bp->vn_weight_sum)
2066                         DP(NETIF_MSG_IFUP, "All MIN values are zeroes"
2067                                    "  fairness will be disabled\n");
2068                 return;
2069         }
2070
2071         /* rate shaping and fairness are disabled */
2072         DP(NETIF_MSG_IFUP,
2073            "rate shaping and fairness are disabled\n");
2074 }
2075
2076 static inline void bnx2x_link_sync_notify(struct bnx2x *bp)
2077 {
2078         int port = BP_PORT(bp);
2079         int func;
2080         int vn;
2081
2082         /* Set the attention towards other drivers on the same port */
2083         for (vn = VN_0; vn < E1HVN_MAX; vn++) {
2084                 if (vn == BP_E1HVN(bp))
2085                         continue;
2086
2087                 func = ((vn << 1) | port);
2088                 REG_WR(bp, MISC_REG_AEU_GENERAL_ATTN_0 +
2089                        (LINK_SYNC_ATTENTION_BIT_FUNC_0 + func)*4, 1);
2090         }
2091 }
2092
2093 /* This function is called upon link interrupt */
2094 static void bnx2x_link_attn(struct bnx2x *bp)
2095 {
2096         /* Make sure that we are synced with the current statistics */
2097         bnx2x_stats_handle(bp, STATS_EVENT_STOP);
2098
2099         bnx2x_link_update(&bp->link_params, &bp->link_vars);
2100
2101         if (bp->link_vars.link_up) {
2102
2103                 /* dropless flow control */
2104                 if (!CHIP_IS_E1(bp) && bp->dropless_fc) {
2105                         int port = BP_PORT(bp);
2106                         u32 pause_enabled = 0;
2107
2108                         if (bp->link_vars.flow_ctrl & BNX2X_FLOW_CTRL_TX)
2109                                 pause_enabled = 1;
2110
2111                         REG_WR(bp, BAR_USTRORM_INTMEM +
2112                                USTORM_ETH_PAUSE_ENABLED_OFFSET(port),
2113                                pause_enabled);
2114                 }
2115
2116                 if (bp->link_vars.mac_type == MAC_TYPE_BMAC) {
2117                         struct host_port_stats *pstats;
2118
2119                         pstats = bnx2x_sp(bp, port_stats);
2120                         /* reset old bmac stats */
2121                         memset(&(pstats->mac_stx[0]), 0,
2122                                sizeof(struct mac_stx));
2123                 }
2124                 if (bp->state == BNX2X_STATE_OPEN)
2125                         bnx2x_stats_handle(bp, STATS_EVENT_LINK_UP);
2126         }
2127
2128         if (bp->link_vars.link_up && bp->link_vars.line_speed) {
2129                 int cmng_fns = bnx2x_get_cmng_fns_mode(bp);
2130
2131                 if (cmng_fns != CMNG_FNS_NONE) {
2132                         bnx2x_cmng_fns_init(bp, false, cmng_fns);
2133                         storm_memset_cmng(bp, &bp->cmng, BP_PORT(bp));
2134                 } else
2135                         /* rate shaping and fairness are disabled */
2136                         DP(NETIF_MSG_IFUP,
2137                            "single function mode without fairness\n");
2138         }
2139
2140         __bnx2x_link_report(bp);
2141
2142         if (IS_MF(bp))
2143                 bnx2x_link_sync_notify(bp);
2144 }
2145
2146 void bnx2x__link_status_update(struct bnx2x *bp)
2147 {
2148         if (bp->state != BNX2X_STATE_OPEN)
2149                 return;
2150
2151         bnx2x_link_status_update(&bp->link_params, &bp->link_vars);
2152
2153         if (bp->link_vars.link_up)
2154                 bnx2x_stats_handle(bp, STATS_EVENT_LINK_UP);
2155         else
2156                 bnx2x_stats_handle(bp, STATS_EVENT_STOP);
2157
2158         /* indicate link status */
2159         bnx2x_link_report(bp);
2160 }
2161
2162 static void bnx2x_pmf_update(struct bnx2x *bp)
2163 {
2164         int port = BP_PORT(bp);
2165         u32 val;
2166
2167         bp->port.pmf = 1;
2168         DP(NETIF_MSG_LINK, "pmf %d\n", bp->port.pmf);
2169
2170         /* enable nig attention */
2171         val = (0xff0f | (1 << (BP_E1HVN(bp) + 4)));
2172         if (bp->common.int_block == INT_BLOCK_HC) {
2173                 REG_WR(bp, HC_REG_TRAILING_EDGE_0 + port*8, val);
2174                 REG_WR(bp, HC_REG_LEADING_EDGE_0 + port*8, val);
2175         } else if (CHIP_IS_E2(bp)) {
2176                 REG_WR(bp, IGU_REG_TRAILING_EDGE_LATCH, val);
2177                 REG_WR(bp, IGU_REG_LEADING_EDGE_LATCH, val);
2178         }
2179
2180         bnx2x_stats_handle(bp, STATS_EVENT_PMF);
2181 }
2182
2183 /* end of Link */
2184
2185 /* slow path */
2186
2187 /*
2188  * General service functions
2189  */
2190
2191 /* send the MCP a request, block until there is a reply */
2192 u32 bnx2x_fw_command(struct bnx2x *bp, u32 command, u32 param)
2193 {
2194         int mb_idx = BP_FW_MB_IDX(bp);
2195         u32 seq;
2196         u32 rc = 0;
2197         u32 cnt = 1;
2198         u8 delay = CHIP_REV_IS_SLOW(bp) ? 100 : 10;
2199
2200         mutex_lock(&bp->fw_mb_mutex);
2201         seq = ++bp->fw_seq;
2202         SHMEM_WR(bp, func_mb[mb_idx].drv_mb_param, param);
2203         SHMEM_WR(bp, func_mb[mb_idx].drv_mb_header, (command | seq));
2204
2205         DP(BNX2X_MSG_MCP, "wrote command (%x) to FW MB\n", (command | seq));
2206
2207         do {
2208                 /* let the FW do it's magic ... */
2209                 msleep(delay);
2210
2211                 rc = SHMEM_RD(bp, func_mb[mb_idx].fw_mb_header);
2212
2213                 /* Give the FW up to 5 second (500*10ms) */
2214         } while ((seq != (rc & FW_MSG_SEQ_NUMBER_MASK)) && (cnt++ < 500));
2215
2216         DP(BNX2X_MSG_MCP, "[after %d ms] read (%x) seq is (%x) from FW MB\n",
2217            cnt*delay, rc, seq);
2218
2219         /* is this a reply to our command? */
2220         if (seq == (rc & FW_MSG_SEQ_NUMBER_MASK))
2221                 rc &= FW_MSG_CODE_MASK;
2222         else {
2223                 /* FW BUG! */
2224                 BNX2X_ERR("FW failed to respond!\n");
2225                 bnx2x_fw_dump(bp);
2226                 rc = 0;
2227         }
2228         mutex_unlock(&bp->fw_mb_mutex);
2229
2230         return rc;
2231 }
2232
2233 static u8 stat_counter_valid(struct bnx2x *bp, struct bnx2x_fastpath *fp)
2234 {
2235 #ifdef BCM_CNIC
2236         if (IS_FCOE_FP(fp) && IS_MF(bp))
2237                 return false;
2238 #endif
2239         return true;
2240 }
2241
2242 /* must be called under rtnl_lock */
2243 static void bnx2x_rxq_set_mac_filters(struct bnx2x *bp, u16 cl_id, u32 filters)
2244 {
2245         u32 mask = (1 << cl_id);
2246
2247         /* initial seeting is BNX2X_ACCEPT_NONE */
2248         u8 drop_all_ucast = 1, drop_all_bcast = 1, drop_all_mcast = 1;
2249         u8 accp_all_ucast = 0, accp_all_bcast = 0, accp_all_mcast = 0;
2250         u8 unmatched_unicast = 0;
2251
2252         if (filters & BNX2X_ACCEPT_UNMATCHED_UCAST)
2253                 unmatched_unicast = 1;
2254
2255         if (filters & BNX2X_PROMISCUOUS_MODE) {
2256                 /* promiscious - accept all, drop none */
2257                 drop_all_ucast = drop_all_bcast = drop_all_mcast = 0;
2258                 accp_all_ucast = accp_all_bcast = accp_all_mcast = 1;
2259                 if (IS_MF_SI(bp)) {
2260                         /*
2261                          * SI mode defines to accept in promiscuos mode
2262                          * only unmatched packets
2263                          */
2264                         unmatched_unicast = 1;
2265                         accp_all_ucast = 0;
2266                 }
2267         }
2268         if (filters & BNX2X_ACCEPT_UNICAST) {
2269                 /* accept matched ucast */
2270                 drop_all_ucast = 0;
2271         }
2272         if (filters & BNX2X_ACCEPT_MULTICAST)
2273                 /* accept matched mcast */
2274                 drop_all_mcast = 0;
2275
2276         if (filters & BNX2X_ACCEPT_ALL_UNICAST) {
2277                 /* accept all mcast */
2278                 drop_all_ucast = 0;
2279                 accp_all_ucast = 1;
2280         }
2281         if (filters & BNX2X_ACCEPT_ALL_MULTICAST) {
2282                 /* accept all mcast */
2283                 drop_all_mcast = 0;
2284                 accp_all_mcast = 1;
2285         }
2286         if (filters & BNX2X_ACCEPT_BROADCAST) {
2287                 /* accept (all) bcast */
2288                 drop_all_bcast = 0;
2289                 accp_all_bcast = 1;
2290         }
2291
2292         bp->mac_filters.ucast_drop_all = drop_all_ucast ?
2293                 bp->mac_filters.ucast_drop_all | mask :
2294                 bp->mac_filters.ucast_drop_all & ~mask;
2295
2296         bp->mac_filters.mcast_drop_all = drop_all_mcast ?
2297                 bp->mac_filters.mcast_drop_all | mask :
2298                 bp->mac_filters.mcast_drop_all & ~mask;
2299
2300         bp->mac_filters.bcast_drop_all = drop_all_bcast ?
2301                 bp->mac_filters.bcast_drop_all | mask :
2302                 bp->mac_filters.bcast_drop_all & ~mask;
2303
2304         bp->mac_filters.ucast_accept_all = accp_all_ucast ?
2305                 bp->mac_filters.ucast_accept_all | mask :
2306                 bp->mac_filters.ucast_accept_all & ~mask;
2307
2308         bp->mac_filters.mcast_accept_all = accp_all_mcast ?
2309                 bp->mac_filters.mcast_accept_all | mask :
2310                 bp->mac_filters.mcast_accept_all & ~mask;
2311
2312         bp->mac_filters.bcast_accept_all = accp_all_bcast ?
2313                 bp->mac_filters.bcast_accept_all | mask :
2314                 bp->mac_filters.bcast_accept_all & ~mask;
2315
2316         bp->mac_filters.unmatched_unicast = unmatched_unicast ?
2317                 bp->mac_filters.unmatched_unicast | mask :
2318                 bp->mac_filters.unmatched_unicast & ~mask;
2319 }
2320
2321 static void bnx2x_func_init(struct bnx2x *bp, struct bnx2x_func_init_params *p)
2322 {
2323         struct tstorm_eth_function_common_config tcfg = {0};
2324         u16 rss_flgs;
2325
2326         /* tpa */
2327         if (p->func_flgs & FUNC_FLG_TPA)
2328                 tcfg.config_flags |=
2329                 TSTORM_ETH_FUNCTION_COMMON_CONFIG_ENABLE_TPA;
2330
2331         /* set rss flags */
2332         rss_flgs = (p->rss->mode <<
2333                 TSTORM_ETH_FUNCTION_COMMON_CONFIG_RSS_MODE_SHIFT);
2334
2335         if (p->rss->cap & RSS_IPV4_CAP)
2336                 rss_flgs |= RSS_IPV4_CAP_MASK;
2337         if (p->rss->cap & RSS_IPV4_TCP_CAP)
2338                 rss_flgs |= RSS_IPV4_TCP_CAP_MASK;
2339         if (p->rss->cap & RSS_IPV6_CAP)
2340                 rss_flgs |= RSS_IPV6_CAP_MASK;
2341         if (p->rss->cap & RSS_IPV6_TCP_CAP)
2342                 rss_flgs |= RSS_IPV6_TCP_CAP_MASK;
2343
2344         tcfg.config_flags |= rss_flgs;
2345         tcfg.rss_result_mask = p->rss->result_mask;
2346
2347         storm_memset_func_cfg(bp, &tcfg, p->func_id);
2348
2349         /* Enable the function in the FW */
2350         storm_memset_vf_to_pf(bp, p->func_id, p->pf_id);
2351         storm_memset_func_en(bp, p->func_id, 1);
2352
2353         /* statistics */
2354         if (p->func_flgs & FUNC_FLG_STATS) {
2355                 struct stats_indication_flags stats_flags = {0};
2356                 stats_flags.collect_eth = 1;
2357
2358                 storm_memset_xstats_flags(bp, &stats_flags, p->func_id);
2359                 storm_memset_xstats_addr(bp, p->fw_stat_map, p->func_id);
2360
2361                 storm_memset_tstats_flags(bp, &stats_flags, p->func_id);
2362                 storm_memset_tstats_addr(bp, p->fw_stat_map, p->func_id);
2363
2364                 storm_memset_ustats_flags(bp, &stats_flags, p->func_id);
2365                 storm_memset_ustats_addr(bp, p->fw_stat_map, p->func_id);
2366
2367                 storm_memset_cstats_flags(bp, &stats_flags, p->func_id);
2368                 storm_memset_cstats_addr(bp, p->fw_stat_map, p->func_id);
2369         }
2370
2371         /* spq */
2372         if (p->func_flgs & FUNC_FLG_SPQ) {
2373                 storm_memset_spq_addr(bp, p->spq_map, p->func_id);
2374                 REG_WR(bp, XSEM_REG_FAST_MEMORY +
2375                        XSTORM_SPQ_PROD_OFFSET(p->func_id), p->spq_prod);
2376         }
2377 }
2378
2379 static inline u16 bnx2x_get_cl_flags(struct bnx2x *bp,
2380                                      struct bnx2x_fastpath *fp)
2381 {
2382         u16 flags = 0;
2383
2384         /* calculate queue flags */
2385         flags |= QUEUE_FLG_CACHE_ALIGN;
2386         flags |= QUEUE_FLG_HC;
2387         flags |= IS_MF_SD(bp) ? QUEUE_FLG_OV : 0;
2388
2389         flags |= QUEUE_FLG_VLAN;
2390         DP(NETIF_MSG_IFUP, "vlan removal enabled\n");
2391
2392         if (!fp->disable_tpa)
2393                 flags |= QUEUE_FLG_TPA;
2394
2395         flags = stat_counter_valid(bp, fp) ?
2396                         (flags | QUEUE_FLG_STATS) : (flags & ~QUEUE_FLG_STATS);
2397
2398         return flags;
2399 }
2400
2401 static void bnx2x_pf_rx_cl_prep(struct bnx2x *bp,
2402         struct bnx2x_fastpath *fp, struct rxq_pause_params *pause,
2403         struct bnx2x_rxq_init_params *rxq_init)
2404 {
2405         u16 max_sge = 0;
2406         u16 sge_sz = 0;
2407         u16 tpa_agg_size = 0;
2408
2409         /* calculate queue flags */
2410         u16 flags = bnx2x_get_cl_flags(bp, fp);
2411
2412         if (!fp->disable_tpa) {
2413                 pause->sge_th_hi = 250;
2414                 pause->sge_th_lo = 150;
2415                 tpa_agg_size = min_t(u32,
2416                         (min_t(u32, 8, MAX_SKB_FRAGS) *
2417                         SGE_PAGE_SIZE * PAGES_PER_SGE), 0xffff);
2418                 max_sge = SGE_PAGE_ALIGN(bp->dev->mtu) >>
2419                         SGE_PAGE_SHIFT;
2420                 max_sge = ((max_sge + PAGES_PER_SGE - 1) &
2421                           (~(PAGES_PER_SGE-1))) >> PAGES_PER_SGE_SHIFT;
2422                 sge_sz = (u16)min_t(u32, SGE_PAGE_SIZE * PAGES_PER_SGE,
2423                                     0xffff);
2424         }
2425
2426         /* pause - not for e1 */
2427         if (!CHIP_IS_E1(bp)) {
2428                 pause->bd_th_hi = 350;
2429                 pause->bd_th_lo = 250;
2430                 pause->rcq_th_hi = 350;
2431                 pause->rcq_th_lo = 250;
2432                 pause->sge_th_hi = 0;
2433                 pause->sge_th_lo = 0;
2434                 pause->pri_map = 1;
2435         }
2436
2437         /* rxq setup */
2438         rxq_init->flags = flags;
2439         rxq_init->cxt = &bp->context.vcxt[fp->cid].eth;
2440         rxq_init->dscr_map = fp->rx_desc_mapping;
2441         rxq_init->sge_map = fp->rx_sge_mapping;
2442         rxq_init->rcq_map = fp->rx_comp_mapping;
2443         rxq_init->rcq_np_map = fp->rx_comp_mapping + BCM_PAGE_SIZE;
2444
2445         /* Always use mini-jumbo MTU for FCoE L2 ring */
2446         if (IS_FCOE_FP(fp))
2447                 rxq_init->mtu = BNX2X_FCOE_MINI_JUMBO_MTU;
2448         else
2449                 rxq_init->mtu = bp->dev->mtu;
2450
2451         rxq_init->buf_sz = fp->rx_buf_size;
2452         rxq_init->cl_qzone_id = fp->cl_qzone_id;
2453         rxq_init->cl_id = fp->cl_id;
2454         rxq_init->spcl_id = fp->cl_id;
2455         rxq_init->stat_id = fp->cl_id;
2456         rxq_init->tpa_agg_sz = tpa_agg_size;
2457         rxq_init->sge_buf_sz = sge_sz;
2458         rxq_init->max_sges_pkt = max_sge;
2459         rxq_init->cache_line_log = BNX2X_RX_ALIGN_SHIFT;
2460         rxq_init->fw_sb_id = fp->fw_sb_id;
2461
2462         if (IS_FCOE_FP(fp))
2463                 rxq_init->sb_cq_index = HC_SP_INDEX_ETH_FCOE_RX_CQ_CONS;
2464         else
2465                 rxq_init->sb_cq_index = U_SB_ETH_RX_CQ_INDEX;
2466
2467         rxq_init->cid = HW_CID(bp, fp->cid);
2468
2469         rxq_init->hc_rate = bp->rx_ticks ? (1000000 / bp->rx_ticks) : 0;
2470 }
2471
2472 static void bnx2x_pf_tx_cl_prep(struct bnx2x *bp,
2473         struct bnx2x_fastpath *fp, struct bnx2x_txq_init_params *txq_init)
2474 {
2475         u16 flags = bnx2x_get_cl_flags(bp, fp);
2476
2477         txq_init->flags = flags;
2478         txq_init->cxt = &bp->context.vcxt[fp->cid].eth;
2479         txq_init->dscr_map = fp->tx_desc_mapping;
2480         txq_init->stat_id = fp->cl_id;
2481         txq_init->cid = HW_CID(bp, fp->cid);
2482         txq_init->sb_cq_index = C_SB_ETH_TX_CQ_INDEX;
2483         txq_init->traffic_type = LLFC_TRAFFIC_TYPE_NW;
2484         txq_init->fw_sb_id = fp->fw_sb_id;
2485
2486         if (IS_FCOE_FP(fp)) {
2487                 txq_init->sb_cq_index = HC_SP_INDEX_ETH_FCOE_TX_CQ_CONS;
2488                 txq_init->traffic_type = LLFC_TRAFFIC_TYPE_FCOE;
2489         }
2490
2491         txq_init->hc_rate = bp->tx_ticks ? (1000000 / bp->tx_ticks) : 0;
2492 }
2493
2494 static void bnx2x_pf_init(struct bnx2x *bp)
2495 {
2496         struct bnx2x_func_init_params func_init = {0};
2497         struct bnx2x_rss_params rss = {0};
2498         struct event_ring_data eq_data = { {0} };
2499         u16 flags;
2500
2501         /* pf specific setups */
2502         if (!CHIP_IS_E1(bp))
2503                 storm_memset_ov(bp, bp->mf_ov, BP_FUNC(bp));
2504
2505         if (CHIP_IS_E2(bp)) {
2506                 /* reset IGU PF statistics: MSIX + ATTN */
2507                 /* PF */
2508                 REG_WR(bp, IGU_REG_STATISTIC_NUM_MESSAGE_SENT +
2509                            BNX2X_IGU_STAS_MSG_VF_CNT*4 +
2510                            (CHIP_MODE_IS_4_PORT(bp) ?
2511                                 BP_FUNC(bp) : BP_VN(bp))*4, 0);
2512                 /* ATTN */
2513                 REG_WR(bp, IGU_REG_STATISTIC_NUM_MESSAGE_SENT +
2514                            BNX2X_IGU_STAS_MSG_VF_CNT*4 +
2515                            BNX2X_IGU_STAS_MSG_PF_CNT*4 +
2516                            (CHIP_MODE_IS_4_PORT(bp) ?
2517                                 BP_FUNC(bp) : BP_VN(bp))*4, 0);
2518         }
2519
2520         /* function setup flags */
2521         flags = (FUNC_FLG_STATS | FUNC_FLG_LEADING | FUNC_FLG_SPQ);
2522
2523         if (CHIP_IS_E1x(bp))
2524                 flags |= (bp->flags & TPA_ENABLE_FLAG) ? FUNC_FLG_TPA : 0;
2525         else
2526                 flags |= FUNC_FLG_TPA;
2527
2528         /* function setup */
2529
2530         /**
2531          * Although RSS is meaningless when there is a single HW queue we
2532          * still need it enabled in order to have HW Rx hash generated.
2533          */
2534         rss.cap = (RSS_IPV4_CAP | RSS_IPV4_TCP_CAP |
2535                    RSS_IPV6_CAP | RSS_IPV6_TCP_CAP);
2536         rss.mode = bp->multi_mode;
2537         rss.result_mask = MULTI_MASK;
2538         func_init.rss = &rss;
2539
2540         func_init.func_flgs = flags;
2541         func_init.pf_id = BP_FUNC(bp);
2542         func_init.func_id = BP_FUNC(bp);
2543         func_init.fw_stat_map = bnx2x_sp_mapping(bp, fw_stats);
2544         func_init.spq_map = bp->spq_mapping;
2545         func_init.spq_prod = bp->spq_prod_idx;
2546
2547         bnx2x_func_init(bp, &func_init);
2548
2549         memset(&(bp->cmng), 0, sizeof(struct cmng_struct_per_port));
2550
2551         /*
2552         Congestion management values depend on the link rate
2553         There is no active link so initial link rate is set to 10 Gbps.
2554         When the link comes up The congestion management values are
2555         re-calculated according to the actual link rate.
2556         */
2557         bp->link_vars.line_speed = SPEED_10000;
2558         bnx2x_cmng_fns_init(bp, true, bnx2x_get_cmng_fns_mode(bp));
2559
2560         /* Only the PMF sets the HW */
2561         if (bp->port.pmf)
2562                 storm_memset_cmng(bp, &bp->cmng, BP_PORT(bp));
2563
2564         /* no rx until link is up */
2565         bp->rx_mode = BNX2X_RX_MODE_NONE;
2566         bnx2x_set_storm_rx_mode(bp);
2567
2568         /* init Event Queue */
2569         eq_data.base_addr.hi = U64_HI(bp->eq_mapping);
2570         eq_data.base_addr.lo = U64_LO(bp->eq_mapping);
2571         eq_data.producer = bp->eq_prod;
2572         eq_data.index_id = HC_SP_INDEX_EQ_CONS;
2573         eq_data.sb_id = DEF_SB_ID;
2574         storm_memset_eq_data(bp, &eq_data, BP_FUNC(bp));
2575 }
2576
2577
2578 static void bnx2x_e1h_disable(struct bnx2x *bp)
2579 {
2580         int port = BP_PORT(bp);
2581
2582         netif_tx_disable(bp->dev);
2583
2584         REG_WR(bp, NIG_REG_LLH0_FUNC_EN + port*8, 0);
2585
2586         netif_carrier_off(bp->dev);
2587 }
2588
2589 static void bnx2x_e1h_enable(struct bnx2x *bp)
2590 {
2591         int port = BP_PORT(bp);
2592
2593         REG_WR(bp, NIG_REG_LLH0_FUNC_EN + port*8, 1);
2594
2595         /* Tx queue should be only reenabled */
2596         netif_tx_wake_all_queues(bp->dev);
2597
2598         /*
2599          * Should not call netif_carrier_on since it will be called if the link
2600          * is up when checking for link state
2601          */
2602 }
2603
2604 /* called due to MCP event (on pmf):
2605  *      reread new bandwidth configuration
2606  *      configure FW
2607  *      notify others function about the change
2608  */
2609 static inline void bnx2x_config_mf_bw(struct bnx2x *bp)
2610 {
2611         if (bp->link_vars.link_up) {
2612                 bnx2x_cmng_fns_init(bp, true, CMNG_FNS_MINMAX);
2613                 bnx2x_link_sync_notify(bp);
2614         }
2615         storm_memset_cmng(bp, &bp->cmng, BP_PORT(bp));
2616 }
2617
2618 static inline void bnx2x_set_mf_bw(struct bnx2x *bp)
2619 {
2620         bnx2x_config_mf_bw(bp);
2621         bnx2x_fw_command(bp, DRV_MSG_CODE_SET_MF_BW_ACK, 0);
2622 }
2623
2624 static void bnx2x_dcc_event(struct bnx2x *bp, u32 dcc_event)
2625 {
2626         DP(BNX2X_MSG_MCP, "dcc_event 0x%x\n", dcc_event);
2627
2628         if (dcc_event & DRV_STATUS_DCC_DISABLE_ENABLE_PF) {
2629
2630                 /*
2631                  * This is the only place besides the function initialization
2632                  * where the bp->flags can change so it is done without any
2633                  * locks
2634                  */
2635                 if (bp->mf_config[BP_VN(bp)] & FUNC_MF_CFG_FUNC_DISABLED) {
2636                         DP(NETIF_MSG_IFDOWN, "mf_cfg function disabled\n");
2637                         bp->flags |= MF_FUNC_DIS;
2638
2639                         bnx2x_e1h_disable(bp);
2640                 } else {
2641                         DP(NETIF_MSG_IFUP, "mf_cfg function enabled\n");
2642                         bp->flags &= ~MF_FUNC_DIS;
2643
2644                         bnx2x_e1h_enable(bp);
2645                 }
2646                 dcc_event &= ~DRV_STATUS_DCC_DISABLE_ENABLE_PF;
2647         }
2648         if (dcc_event & DRV_STATUS_DCC_BANDWIDTH_ALLOCATION) {
2649                 bnx2x_config_mf_bw(bp);
2650                 dcc_event &= ~DRV_STATUS_DCC_BANDWIDTH_ALLOCATION;
2651         }
2652
2653         /* Report results to MCP */
2654         if (dcc_event)
2655                 bnx2x_fw_command(bp, DRV_MSG_CODE_DCC_FAILURE, 0);
2656         else
2657                 bnx2x_fw_command(bp, DRV_MSG_CODE_DCC_OK, 0);
2658 }
2659
2660 /* must be called under the spq lock */
2661 static inline struct eth_spe *bnx2x_sp_get_next(struct bnx2x *bp)
2662 {
2663         struct eth_spe *next_spe = bp->spq_prod_bd;
2664
2665         if (bp->spq_prod_bd == bp->spq_last_bd) {
2666                 bp->spq_prod_bd = bp->spq;
2667                 bp->spq_prod_idx = 0;
2668                 DP(NETIF_MSG_TIMER, "end of spq\n");
2669         } else {
2670                 bp->spq_prod_bd++;
2671                 bp->spq_prod_idx++;
2672         }
2673         return next_spe;
2674 }
2675
2676 /* must be called under the spq lock */
2677 static inline void bnx2x_sp_prod_update(struct bnx2x *bp)
2678 {
2679         int func = BP_FUNC(bp);
2680
2681         /* Make sure that BD data is updated before writing the producer */
2682         wmb();
2683
2684         REG_WR16(bp, BAR_XSTRORM_INTMEM + XSTORM_SPQ_PROD_OFFSET(func),
2685                  bp->spq_prod_idx);
2686         mmiowb();
2687 }
2688
2689 /* the slow path queue is odd since completions arrive on the fastpath ring */
2690 int bnx2x_sp_post(struct bnx2x *bp, int command, int cid,
2691                   u32 data_hi, u32 data_lo, int common)
2692 {
2693         struct eth_spe *spe;
2694         u16 type;
2695
2696 #ifdef BNX2X_STOP_ON_ERROR
2697         if (unlikely(bp->panic))
2698                 return -EIO;
2699 #endif
2700
2701         spin_lock_bh(&bp->spq_lock);
2702
2703         if (common) {
2704                 if (!atomic_read(&bp->eq_spq_left)) {
2705                         BNX2X_ERR("BUG! EQ ring full!\n");
2706                         spin_unlock_bh(&bp->spq_lock);
2707                         bnx2x_panic();
2708                         return -EBUSY;
2709                 }
2710         } else if (!atomic_read(&bp->cq_spq_left)) {
2711                         BNX2X_ERR("BUG! SPQ ring full!\n");
2712                         spin_unlock_bh(&bp->spq_lock);
2713                         bnx2x_panic();
2714                         return -EBUSY;
2715         }
2716
2717         spe = bnx2x_sp_get_next(bp);
2718
2719         /* CID needs port number to be encoded int it */
2720         spe->hdr.conn_and_cmd_data =
2721                         cpu_to_le32((command << SPE_HDR_CMD_ID_SHIFT) |
2722                                     HW_CID(bp, cid));
2723
2724         if (common)
2725                 /* Common ramrods:
2726                  *      FUNC_START, FUNC_STOP, CFC_DEL, STATS, SET_MAC
2727                  *      TRAFFIC_STOP, TRAFFIC_START
2728                  */
2729                 type = (NONE_CONNECTION_TYPE << SPE_HDR_CONN_TYPE_SHIFT)
2730                         & SPE_HDR_CONN_TYPE;
2731         else
2732                 /* ETH ramrods: SETUP, HALT */
2733                 type = (ETH_CONNECTION_TYPE << SPE_HDR_CONN_TYPE_SHIFT)
2734                         & SPE_HDR_CONN_TYPE;
2735
2736         type |= ((BP_FUNC(bp) << SPE_HDR_FUNCTION_ID_SHIFT) &
2737                  SPE_HDR_FUNCTION_ID);
2738
2739         spe->hdr.type = cpu_to_le16(type);
2740
2741         spe->data.update_data_addr.hi = cpu_to_le32(data_hi);
2742         spe->data.update_data_addr.lo = cpu_to_le32(data_lo);
2743
2744         /* stats ramrod has it's own slot on the spq */
2745         if (command != RAMROD_CMD_ID_COMMON_STAT_QUERY) {
2746                 /* It's ok if the actual decrement is issued towards the memory
2747                  * somewhere between the spin_lock and spin_unlock. Thus no
2748                  * more explict memory barrier is needed.
2749                  */
2750                 if (common)
2751                         atomic_dec(&bp->eq_spq_left);
2752                 else
2753                         atomic_dec(&bp->cq_spq_left);
2754         }
2755
2756
2757         DP(BNX2X_MSG_SP/*NETIF_MSG_TIMER*/,
2758            "SPQE[%x] (%x:%x)  command %d  hw_cid %x  data (%x:%x) "
2759            "type(0x%x) left (ETH, COMMON) (%x,%x)\n",
2760            bp->spq_prod_idx, (u32)U64_HI(bp->spq_mapping),
2761            (u32)(U64_LO(bp->spq_mapping) +
2762            (void *)bp->spq_prod_bd - (void *)bp->spq), command,
2763            HW_CID(bp, cid), data_hi, data_lo, type,
2764            atomic_read(&bp->cq_spq_left), atomic_read(&bp->eq_spq_left));
2765
2766         bnx2x_sp_prod_update(bp);
2767         spin_unlock_bh(&bp->spq_lock);
2768         return 0;
2769 }
2770
2771 /* acquire split MCP access lock register */
2772 static int bnx2x_acquire_alr(struct bnx2x *bp)
2773 {
2774         u32 j, val;
2775         int rc = 0;
2776
2777         might_sleep();
2778         for (j = 0; j < 1000; j++) {
2779                 val = (1UL << 31);
2780                 REG_WR(bp, GRCBASE_MCP + 0x9c, val);
2781                 val = REG_RD(bp, GRCBASE_MCP + 0x9c);
2782                 if (val & (1L << 31))
2783                         break;
2784
2785                 msleep(5);
2786         }
2787         if (!(val & (1L << 31))) {
2788                 BNX2X_ERR("Cannot acquire MCP access lock register\n");
2789                 rc = -EBUSY;
2790         }
2791
2792         return rc;
2793 }
2794
2795 /* release split MCP access lock register */
2796 static void bnx2x_release_alr(struct bnx2x *bp)
2797 {
2798         REG_WR(bp, GRCBASE_MCP + 0x9c, 0);
2799 }
2800
2801 #define BNX2X_DEF_SB_ATT_IDX    0x0001
2802 #define BNX2X_DEF_SB_IDX        0x0002
2803
2804 static inline u16 bnx2x_update_dsb_idx(struct bnx2x *bp)
2805 {
2806         struct host_sp_status_block *def_sb = bp->def_status_blk;
2807         u16 rc = 0;
2808
2809         barrier(); /* status block is written to by the chip */
2810         if (bp->def_att_idx != def_sb->atten_status_block.attn_bits_index) {
2811                 bp->def_att_idx = def_sb->atten_status_block.attn_bits_index;
2812                 rc |= BNX2X_DEF_SB_ATT_IDX;
2813         }
2814
2815         if (bp->def_idx != def_sb->sp_sb.running_index) {
2816                 bp->def_idx = def_sb->sp_sb.running_index;
2817                 rc |= BNX2X_DEF_SB_IDX;
2818         }
2819
2820         /* Do not reorder: indecies reading should complete before handling */
2821         barrier();
2822         return rc;
2823 }
2824
2825 /*
2826  * slow path service functions
2827  */
2828
2829 static void bnx2x_attn_int_asserted(struct bnx2x *bp, u32 asserted)
2830 {
2831         int port = BP_PORT(bp);
2832         u32 aeu_addr = port ? MISC_REG_AEU_MASK_ATTN_FUNC_1 :
2833                               MISC_REG_AEU_MASK_ATTN_FUNC_0;
2834         u32 nig_int_mask_addr = port ? NIG_REG_MASK_INTERRUPT_PORT1 :
2835                                        NIG_REG_MASK_INTERRUPT_PORT0;
2836         u32 aeu_mask;
2837         u32 nig_mask = 0;
2838         u32 reg_addr;
2839
2840         if (bp->attn_state & asserted)
2841                 BNX2X_ERR("IGU ERROR\n");
2842
2843         bnx2x_acquire_hw_lock(bp, HW_LOCK_RESOURCE_PORT0_ATT_MASK + port);
2844         aeu_mask = REG_RD(bp, aeu_addr);
2845
2846         DP(NETIF_MSG_HW, "aeu_mask %x  newly asserted %x\n",
2847            aeu_mask, asserted);
2848         aeu_mask &= ~(asserted & 0x3ff);
2849         DP(NETIF_MSG_HW, "new mask %x\n", aeu_mask);
2850
2851         REG_WR(bp, aeu_addr, aeu_mask);
2852         bnx2x_release_hw_lock(bp, HW_LOCK_RESOURCE_PORT0_ATT_MASK + port);
2853
2854         DP(NETIF_MSG_HW, "attn_state %x\n", bp->attn_state);
2855         bp->attn_state |= asserted;
2856         DP(NETIF_MSG_HW, "new state %x\n", bp->attn_state);
2857
2858         if (asserted & ATTN_HARD_WIRED_MASK) {
2859                 if (asserted & ATTN_NIG_FOR_FUNC) {
2860
2861                         bnx2x_acquire_phy_lock(bp);
2862
2863                         /* save nig interrupt mask */
2864                         nig_mask = REG_RD(bp, nig_int_mask_addr);
2865
2866                         /* If nig_mask is not set, no need to call the update
2867                          * function.
2868                          */
2869                         if (nig_mask) {
2870                                 REG_WR(bp, nig_int_mask_addr, 0);
2871
2872                                 bnx2x_link_attn(bp);
2873                         }
2874
2875                         /* handle unicore attn? */
2876                 }
2877                 if (asserted & ATTN_SW_TIMER_4_FUNC)
2878                         DP(NETIF_MSG_HW, "ATTN_SW_TIMER_4_FUNC!\n");
2879
2880                 if (asserted & GPIO_2_FUNC)
2881                         DP(NETIF_MSG_HW, "GPIO_2_FUNC!\n");
2882
2883                 if (asserted & GPIO_3_FUNC)
2884                         DP(NETIF_MSG_HW, "GPIO_3_FUNC!\n");
2885
2886                 if (asserted & GPIO_4_FUNC)
2887                         DP(NETIF_MSG_HW, "GPIO_4_FUNC!\n");
2888
2889                 if (port == 0) {
2890                         if (asserted & ATTN_GENERAL_ATTN_1) {
2891                                 DP(NETIF_MSG_HW, "ATTN_GENERAL_ATTN_1!\n");
2892                                 REG_WR(bp, MISC_REG_AEU_GENERAL_ATTN_1, 0x0);
2893                         }
2894                         if (asserted & ATTN_GENERAL_ATTN_2) {
2895                                 DP(NETIF_MSG_HW, "ATTN_GENERAL_ATTN_2!\n");
2896                                 REG_WR(bp, MISC_REG_AEU_GENERAL_ATTN_2, 0x0);
2897                         }
2898                         if (asserted & ATTN_GENERAL_ATTN_3) {
2899                                 DP(NETIF_MSG_HW, "ATTN_GENERAL_ATTN_3!\n");
2900                                 REG_WR(bp, MISC_REG_AEU_GENERAL_ATTN_3, 0x0);
2901                         }
2902                 } else {
2903                         if (asserted & ATTN_GENERAL_ATTN_4) {
2904                                 DP(NETIF_MSG_HW, "ATTN_GENERAL_ATTN_4!\n");
2905                                 REG_WR(bp, MISC_REG_AEU_GENERAL_ATTN_4, 0x0);
2906                         }
2907                         if (asserted & ATTN_GENERAL_ATTN_5) {
2908                                 DP(NETIF_MSG_HW, "ATTN_GENERAL_ATTN_5!\n");
2909                                 REG_WR(bp, MISC_REG_AEU_GENERAL_ATTN_5, 0x0);
2910                         }
2911                         if (asserted & ATTN_GENERAL_ATTN_6) {
2912                                 DP(NETIF_MSG_HW, "ATTN_GENERAL_ATTN_6!\n");
2913                                 REG_WR(bp, MISC_REG_AEU_GENERAL_ATTN_6, 0x0);
2914                         }
2915                 }
2916
2917         } /* if hardwired */
2918
2919         if (bp->common.int_block == INT_BLOCK_HC)
2920                 reg_addr = (HC_REG_COMMAND_REG + port*32 +
2921                             COMMAND_REG_ATTN_BITS_SET);
2922         else
2923                 reg_addr = (BAR_IGU_INTMEM + IGU_CMD_ATTN_BIT_SET_UPPER*8);
2924
2925         DP(NETIF_MSG_HW, "about to mask 0x%08x at %s addr 0x%x\n", asserted,
2926            (bp->common.int_block == INT_BLOCK_HC) ? "HC" : "IGU", reg_addr);
2927         REG_WR(bp, reg_addr, asserted);
2928
2929         /* now set back the mask */
2930         if (asserted & ATTN_NIG_FOR_FUNC) {
2931                 REG_WR(bp, nig_int_mask_addr, nig_mask);
2932                 bnx2x_release_phy_lock(bp);
2933         }
2934 }
2935
2936 static inline void bnx2x_fan_failure(struct bnx2x *bp)
2937 {
2938         int port = BP_PORT(bp);
2939         u32 ext_phy_config;
2940         /* mark the failure */
2941         ext_phy_config =
2942                 SHMEM_RD(bp,
2943                          dev_info.port_hw_config[port].external_phy_config);
2944
2945         ext_phy_config &= ~PORT_HW_CFG_XGXS_EXT_PHY_TYPE_MASK;
2946         ext_phy_config |= PORT_HW_CFG_XGXS_EXT_PHY_TYPE_FAILURE;
2947         SHMEM_WR(bp, dev_info.port_hw_config[port].external_phy_config,
2948                  ext_phy_config);
2949
2950         /* log the failure */
2951         netdev_err(bp->dev, "Fan Failure on Network Controller has caused"
2952                " the driver to shutdown the card to prevent permanent"
2953                " damage.  Please contact OEM Support for assistance\n");
2954 }
2955
2956 static inline void bnx2x_attn_int_deasserted0(struct bnx2x *bp, u32 attn)
2957 {
2958         int port = BP_PORT(bp);
2959         int reg_offset;
2960         u32 val;
2961
2962         reg_offset = (port ? MISC_REG_AEU_ENABLE1_FUNC_1_OUT_0 :
2963                              MISC_REG_AEU_ENABLE1_FUNC_0_OUT_0);
2964
2965         if (attn & AEU_INPUTS_ATTN_BITS_SPIO5) {
2966
2967                 val = REG_RD(bp, reg_offset);
2968                 val &= ~AEU_INPUTS_ATTN_BITS_SPIO5;
2969                 REG_WR(bp, reg_offset, val);
2970
2971                 BNX2X_ERR("SPIO5 hw attention\n");
2972
2973                 /* Fan failure attention */
2974                 bnx2x_hw_reset_phy(&bp->link_params);
2975                 bnx2x_fan_failure(bp);
2976         }
2977
2978         if (attn & (AEU_INPUTS_ATTN_BITS_GPIO3_FUNCTION_0 |
2979                     AEU_INPUTS_ATTN_BITS_GPIO3_FUNCTION_1)) {
2980                 bnx2x_acquire_phy_lock(bp);
2981                 bnx2x_handle_module_detect_int(&bp->link_params);
2982                 bnx2x_release_phy_lock(bp);
2983         }
2984
2985         if (attn & HW_INTERRUT_ASSERT_SET_0) {
2986
2987                 val = REG_RD(bp, reg_offset);
2988                 val &= ~(attn & HW_INTERRUT_ASSERT_SET_0);
2989                 REG_WR(bp, reg_offset, val);
2990
2991                 BNX2X_ERR("FATAL HW block attention set0 0x%x\n",
2992                           (u32)(attn & HW_INTERRUT_ASSERT_SET_0));
2993                 bnx2x_panic();
2994         }
2995 }
2996
2997 static inline void bnx2x_attn_int_deasserted1(struct bnx2x *bp, u32 attn)
2998 {
2999         u32 val;
3000
3001         if (attn & AEU_INPUTS_ATTN_BITS_DOORBELLQ_HW_INTERRUPT) {
3002
3003                 val = REG_RD(bp, DORQ_REG_DORQ_INT_STS_CLR);
3004                 BNX2X_ERR("DB hw attention 0x%x\n", val);
3005                 /* DORQ discard attention */
3006                 if (val & 0x2)
3007                         BNX2X_ERR("FATAL error from DORQ\n");
3008         }
3009
3010         if (attn & HW_INTERRUT_ASSERT_SET_1) {
3011
3012                 int port = BP_PORT(bp);
3013                 int reg_offset;
3014
3015                 reg_offset = (port ? MISC_REG_AEU_ENABLE1_FUNC_1_OUT_1 :
3016                                      MISC_REG_AEU_ENABLE1_FUNC_0_OUT_1);
3017
3018                 val = REG_RD(bp, reg_offset);
3019                 val &= ~(attn & HW_INTERRUT_ASSERT_SET_1);
3020                 REG_WR(bp, reg_offset, val);
3021
3022                 BNX2X_ERR("FATAL HW block attention set1 0x%x\n",
3023                           (u32)(attn & HW_INTERRUT_ASSERT_SET_1));
3024                 bnx2x_panic();
3025         }
3026 }
3027
3028 static inline void bnx2x_attn_int_deasserted2(struct bnx2x *bp, u32 attn)
3029 {
3030         u32 val;
3031
3032         if (attn & AEU_INPUTS_ATTN_BITS_CFC_HW_INTERRUPT) {
3033
3034                 val = REG_RD(bp, CFC_REG_CFC_INT_STS_CLR);
3035                 BNX2X_ERR("CFC hw attention 0x%x\n", val);
3036                 /* CFC error attention */
3037                 if (val & 0x2)
3038                         BNX2X_ERR("FATAL error from CFC\n");
3039         }
3040
3041         if (attn & AEU_INPUTS_ATTN_BITS_PXP_HW_INTERRUPT) {
3042
3043                 val = REG_RD(bp, PXP_REG_PXP_INT_STS_CLR_0);
3044                 BNX2X_ERR("PXP hw attention 0x%x\n", val);
3045                 /* RQ_USDMDP_FIFO_OVERFLOW */
3046                 if (val & 0x18000)
3047                         BNX2X_ERR("FATAL error from PXP\n");
3048                 if (CHIP_IS_E2(bp)) {
3049                         val = REG_RD(bp, PXP_REG_PXP_INT_STS_CLR_1);
3050                         BNX2X_ERR("PXP hw attention-1 0x%x\n", val);
3051                 }
3052         }
3053
3054         if (attn & HW_INTERRUT_ASSERT_SET_2) {
3055
3056                 int port = BP_PORT(bp);
3057                 int reg_offset;
3058
3059                 reg_offset = (port ? MISC_REG_AEU_ENABLE1_FUNC_1_OUT_2 :
3060                                      MISC_REG_AEU_ENABLE1_FUNC_0_OUT_2);
3061
3062                 val = REG_RD(bp, reg_offset);
3063                 val &= ~(attn & HW_INTERRUT_ASSERT_SET_2);
3064                 REG_WR(bp, reg_offset, val);
3065
3066                 BNX2X_ERR("FATAL HW block attention set2 0x%x\n",
3067                           (u32)(attn & HW_INTERRUT_ASSERT_SET_2));
3068                 bnx2x_panic();
3069         }
3070 }
3071
3072 static inline void bnx2x_attn_int_deasserted3(struct bnx2x *bp, u32 attn)
3073 {
3074         u32 val;
3075
3076         if (attn & EVEREST_GEN_ATTN_IN_USE_MASK) {
3077
3078                 if (attn & BNX2X_PMF_LINK_ASSERT) {
3079                         int func = BP_FUNC(bp);
3080
3081                         REG_WR(bp, MISC_REG_AEU_GENERAL_ATTN_12 + func*4, 0);
3082                         bp->mf_config[BP_VN(bp)] = MF_CFG_RD(bp,
3083                                         func_mf_config[BP_ABS_FUNC(bp)].config);
3084                         val = SHMEM_RD(bp,
3085                                        func_mb[BP_FW_MB_IDX(bp)].drv_status);
3086                         if (val & DRV_STATUS_DCC_EVENT_MASK)
3087                                 bnx2x_dcc_event(bp,
3088                                             (val & DRV_STATUS_DCC_EVENT_MASK));
3089
3090                         if (val & DRV_STATUS_SET_MF_BW)
3091                                 bnx2x_set_mf_bw(bp);
3092
3093                         if ((bp->port.pmf == 0) && (val & DRV_STATUS_PMF))
3094                                 bnx2x_pmf_update(bp);
3095
3096                         /* Always call it here: bnx2x_link_report() will
3097                          * prevent the link indication duplication.
3098                          */
3099                         bnx2x__link_status_update(bp);
3100
3101                         if (bp->port.pmf &&
3102                             (val & DRV_STATUS_DCBX_NEGOTIATION_RESULTS) &&
3103                                 bp->dcbx_enabled > 0)
3104                                 /* start dcbx state machine */
3105                                 bnx2x_dcbx_set_params(bp,
3106                                         BNX2X_DCBX_STATE_NEG_RECEIVED);
3107                 } else if (attn & BNX2X_MC_ASSERT_BITS) {
3108
3109                         BNX2X_ERR("MC assert!\n");
3110                         REG_WR(bp, MISC_REG_AEU_GENERAL_ATTN_10, 0);
3111                         REG_WR(bp, MISC_REG_AEU_GENERAL_ATTN_9, 0);
3112                         REG_WR(bp, MISC_REG_AEU_GENERAL_ATTN_8, 0);
3113                         REG_WR(bp, MISC_REG_AEU_GENERAL_ATTN_7, 0);
3114                         bnx2x_panic();
3115
3116                 } else if (attn & BNX2X_MCP_ASSERT) {
3117
3118                         BNX2X_ERR("MCP assert!\n");
3119                         REG_WR(bp, MISC_REG_AEU_GENERAL_ATTN_11, 0);
3120                         bnx2x_fw_dump(bp);
3121
3122                 } else
3123                         BNX2X_ERR("Unknown HW assert! (attn 0x%x)\n", attn);
3124         }
3125
3126         if (attn & EVEREST_LATCHED_ATTN_IN_USE_MASK) {
3127                 BNX2X_ERR("LATCHED attention 0x%08x (masked)\n", attn);
3128                 if (attn & BNX2X_GRC_TIMEOUT) {
3129                         val = CHIP_IS_E1(bp) ? 0 :
3130                                         REG_RD(bp, MISC_REG_GRC_TIMEOUT_ATTN);
3131                         BNX2X_ERR("GRC time-out 0x%08x\n", val);
3132                 }
3133                 if (attn & BNX2X_GRC_RSV) {
3134                         val = CHIP_IS_E1(bp) ? 0 :
3135                                         REG_RD(bp, MISC_REG_GRC_RSV_ATTN);
3136                         BNX2X_ERR("GRC reserved 0x%08x\n", val);
3137                 }
3138                 REG_WR(bp, MISC_REG_AEU_CLR_LATCH_SIGNAL, 0x7ff);
3139         }
3140 }
3141
3142 #define BNX2X_MISC_GEN_REG      MISC_REG_GENERIC_POR_1
3143 #define LOAD_COUNTER_BITS       16 /* Number of bits for load counter */
3144 #define LOAD_COUNTER_MASK       (((u32)0x1 << LOAD_COUNTER_BITS) - 1)
3145 #define RESET_DONE_FLAG_MASK    (~LOAD_COUNTER_MASK)
3146 #define RESET_DONE_FLAG_SHIFT   LOAD_COUNTER_BITS
3147
3148 /*
3149  * should be run under rtnl lock
3150  */
3151 static inline void bnx2x_set_reset_done(struct bnx2x *bp)
3152 {
3153         u32 val = REG_RD(bp, BNX2X_MISC_GEN_REG);
3154         val &= ~(1 << RESET_DONE_FLAG_SHIFT);
3155         REG_WR(bp, BNX2X_MISC_GEN_REG, val);
3156         barrier();
3157         mmiowb();
3158 }
3159
3160 /*
3161  * should be run under rtnl lock
3162  */
3163 static inline void bnx2x_set_reset_in_progress(struct bnx2x *bp)
3164 {
3165         u32 val = REG_RD(bp, BNX2X_MISC_GEN_REG);
3166         val |= (1 << 16);
3167         REG_WR(bp, BNX2X_MISC_GEN_REG, val);
3168         barrier();
3169         mmiowb();
3170 }
3171
3172 /*
3173  * should be run under rtnl lock
3174  */
3175 bool bnx2x_reset_is_done(struct bnx2x *bp)
3176 {
3177         u32 val = REG_RD(bp, BNX2X_MISC_GEN_REG);
3178         DP(NETIF_MSG_HW, "GEN_REG_VAL=0x%08x\n", val);
3179         return (val & RESET_DONE_FLAG_MASK) ? false : true;
3180 }
3181
3182 /*
3183  * should be run under rtnl lock
3184  */
3185 inline void bnx2x_inc_load_cnt(struct bnx2x *bp)
3186 {
3187         u32 val1, val = REG_RD(bp, BNX2X_MISC_GEN_REG);
3188
3189         DP(NETIF_MSG_HW, "Old GEN_REG_VAL=0x%08x\n", val);
3190
3191         val1 = ((val & LOAD_COUNTER_MASK) + 1) & LOAD_COUNTER_MASK;
3192         REG_WR(bp, BNX2X_MISC_GEN_REG, (val & RESET_DONE_FLAG_MASK) | val1);
3193         barrier();
3194         mmiowb();
3195 }
3196
3197 /*
3198  * should be run under rtnl lock
3199  */
3200 u32 bnx2x_dec_load_cnt(struct bnx2x *bp)
3201 {
3202         u32 val1, val = REG_RD(bp, BNX2X_MISC_GEN_REG);
3203
3204         DP(NETIF_MSG_HW, "Old GEN_REG_VAL=0x%08x\n", val);
3205
3206         val1 = ((val & LOAD_COUNTER_MASK) - 1) & LOAD_COUNTER_MASK;
3207         REG_WR(bp, BNX2X_MISC_GEN_REG, (val & RESET_DONE_FLAG_MASK) | val1);
3208         barrier();
3209         mmiowb();
3210
3211         return val1;
3212 }
3213
3214 /*
3215  * should be run under rtnl lock
3216  */
3217 static inline u32 bnx2x_get_load_cnt(struct bnx2x *bp)
3218 {
3219         return REG_RD(bp, BNX2X_MISC_GEN_REG) & LOAD_COUNTER_MASK;
3220 }
3221
3222 static inline void bnx2x_clear_load_cnt(struct bnx2x *bp)
3223 {
3224         u32 val = REG_RD(bp, BNX2X_MISC_GEN_REG);
3225         REG_WR(bp, BNX2X_MISC_GEN_REG, val & (~LOAD_COUNTER_MASK));
3226 }
3227
3228 static inline void _print_next_block(int idx, const char *blk)
3229 {
3230         if (idx)
3231                 pr_cont(", ");
3232         pr_cont("%s", blk);
3233 }
3234
3235 static inline int bnx2x_print_blocks_with_parity0(u32 sig, int par_num)
3236 {
3237         int i = 0;
3238         u32 cur_bit = 0;
3239         for (i = 0; sig; i++) {
3240                 cur_bit = ((u32)0x1 << i);
3241                 if (sig & cur_bit) {
3242                         switch (cur_bit) {
3243                         case AEU_INPUTS_ATTN_BITS_BRB_PARITY_ERROR:
3244                                 _print_next_block(par_num++, "BRB");
3245                                 break;
3246                         case AEU_INPUTS_ATTN_BITS_PARSER_PARITY_ERROR:
3247                                 _print_next_block(par_num++, "PARSER");
3248                                 break;
3249                         case AEU_INPUTS_ATTN_BITS_TSDM_PARITY_ERROR:
3250                                 _print_next_block(par_num++, "TSDM");
3251                                 break;
3252                         case AEU_INPUTS_ATTN_BITS_SEARCHER_PARITY_ERROR:
3253                                 _print_next_block(par_num++, "SEARCHER");
3254                                 break;
3255                         case AEU_INPUTS_ATTN_BITS_TSEMI_PARITY_ERROR:
3256                                 _print_next_block(par_num++, "TSEMI");
3257                                 break;
3258                         }
3259
3260                         /* Clear the bit */
3261                         sig &= ~cur_bit;
3262                 }
3263         }
3264
3265         return par_num;
3266 }
3267
3268 static inline int bnx2x_print_blocks_with_parity1(u32 sig, int par_num)
3269 {
3270         int i = 0;
3271         u32 cur_bit = 0;
3272         for (i = 0; sig; i++) {
3273                 cur_bit = ((u32)0x1 << i);
3274                 if (sig & cur_bit) {
3275                         switch (cur_bit) {
3276                         case AEU_INPUTS_ATTN_BITS_PBCLIENT_PARITY_ERROR:
3277                                 _print_next_block(par_num++, "PBCLIENT");
3278                                 break;
3279                         case AEU_INPUTS_ATTN_BITS_QM_PARITY_ERROR:
3280                                 _print_next_block(par_num++, "QM");
3281                                 break;
3282                         case AEU_INPUTS_ATTN_BITS_XSDM_PARITY_ERROR:
3283                                 _print_next_block(par_num++, "XSDM");
3284                                 break;
3285                         case AEU_INPUTS_ATTN_BITS_XSEMI_PARITY_ERROR:
3286                                 _print_next_block(par_num++, "XSEMI");
3287                                 break;
3288                         case AEU_INPUTS_ATTN_BITS_DOORBELLQ_PARITY_ERROR:
3289                                 _print_next_block(par_num++, "DOORBELLQ");
3290                                 break;
3291                         case AEU_INPUTS_ATTN_BITS_VAUX_PCI_CORE_PARITY_ERROR:
3292                                 _print_next_block(par_num++, "VAUX PCI CORE");
3293                                 break;
3294                         case AEU_INPUTS_ATTN_BITS_DEBUG_PARITY_ERROR:
3295                                 _print_next_block(par_num++, "DEBUG");
3296                                 break;
3297                         case AEU_INPUTS_ATTN_BITS_USDM_PARITY_ERROR:
3298                                 _print_next_block(par_num++, "USDM");
3299                                 break;
3300                         case AEU_INPUTS_ATTN_BITS_USEMI_PARITY_ERROR:
3301                                 _print_next_block(par_num++, "USEMI");
3302                                 break;
3303                         case AEU_INPUTS_ATTN_BITS_UPB_PARITY_ERROR:
3304                                 _print_next_block(par_num++, "UPB");
3305                                 break;
3306                         case AEU_INPUTS_ATTN_BITS_CSDM_PARITY_ERROR:
3307                                 _print_next_block(par_num++, "CSDM");
3308                                 break;
3309                         }
3310
3311                         /* Clear the bit */
3312                         sig &= ~cur_bit;
3313                 }
3314         }
3315
3316         return par_num;
3317 }
3318
3319 static inline int bnx2x_print_blocks_with_parity2(u32 sig, int par_num)
3320 {
3321         int i = 0;
3322         u32 cur_bit = 0;
3323         for (i = 0; sig; i++) {
3324                 cur_bit = ((u32)0x1 << i);
3325                 if (sig & cur_bit) {
3326                         switch (cur_bit) {
3327                         case AEU_INPUTS_ATTN_BITS_CSEMI_PARITY_ERROR:
3328                                 _print_next_block(par_num++, "CSEMI");
3329                                 break;
3330                         case AEU_INPUTS_ATTN_BITS_PXP_PARITY_ERROR:
3331                                 _print_next_block(par_num++, "PXP");
3332                                 break;
3333                         case AEU_IN_ATTN_BITS_PXPPCICLOCKCLIENT_PARITY_ERROR:
3334                                 _print_next_block(par_num++,
3335                                         "PXPPCICLOCKCLIENT");
3336                                 break;
3337                         case AEU_INPUTS_ATTN_BITS_CFC_PARITY_ERROR:
3338                                 _print_next_block(par_num++, "CFC");
3339                                 break;
3340                         case AEU_INPUTS_ATTN_BITS_CDU_PARITY_ERROR:
3341                                 _print_next_block(par_num++, "CDU");
3342                                 break;
3343                         case AEU_INPUTS_ATTN_BITS_IGU_PARITY_ERROR:
3344                                 _print_next_block(par_num++, "IGU");
3345                                 break;
3346                         case AEU_INPUTS_ATTN_BITS_MISC_PARITY_ERROR:
3347                                 _print_next_block(par_num++, "MISC");
3348                                 break;
3349                         }
3350
3351                         /* Clear the bit */
3352                         sig &= ~cur_bit;
3353                 }
3354         }
3355
3356         return par_num;
3357 }
3358
3359 static inline int bnx2x_print_blocks_with_parity3(u32 sig, int par_num)
3360 {
3361         int i = 0;
3362         u32 cur_bit = 0;
3363         for (i = 0; sig; i++) {
3364                 cur_bit = ((u32)0x1 << i);
3365                 if (sig & cur_bit) {
3366                         switch (cur_bit) {
3367                         case AEU_INPUTS_ATTN_BITS_MCP_LATCHED_ROM_PARITY:
3368                                 _print_next_block(par_num++, "MCP ROM");
3369                                 break;
3370                         case AEU_INPUTS_ATTN_BITS_MCP_LATCHED_UMP_RX_PARITY:
3371                                 _print_next_block(par_num++, "MCP UMP RX");
3372                                 break;
3373                         case AEU_INPUTS_ATTN_BITS_MCP_LATCHED_UMP_TX_PARITY:
3374                                 _print_next_block(par_num++, "MCP UMP TX");
3375                                 break;
3376                         case AEU_INPUTS_ATTN_BITS_MCP_LATCHED_SCPAD_PARITY:
3377                                 _print_next_block(par_num++, "MCP SCPAD");
3378                                 break;
3379                         }
3380
3381                         /* Clear the bit */
3382                         sig &= ~cur_bit;
3383                 }
3384         }
3385
3386         return par_num;
3387 }
3388
3389 static inline bool bnx2x_parity_attn(struct bnx2x *bp, u32 sig0, u32 sig1,
3390                                      u32 sig2, u32 sig3)
3391 {
3392         if ((sig0 & HW_PRTY_ASSERT_SET_0) || (sig1 & HW_PRTY_ASSERT_SET_1) ||
3393             (sig2 & HW_PRTY_ASSERT_SET_2) || (sig3 & HW_PRTY_ASSERT_SET_3)) {
3394                 int par_num = 0;
3395                 DP(NETIF_MSG_HW, "Was parity error: HW block parity attention: "
3396                         "[0]:0x%08x [1]:0x%08x "
3397                         "[2]:0x%08x [3]:0x%08x\n",
3398                           sig0 & HW_PRTY_ASSERT_SET_0,
3399                           sig1 & HW_PRTY_ASSERT_SET_1,
3400                           sig2 & HW_PRTY_ASSERT_SET_2,
3401                           sig3 & HW_PRTY_ASSERT_SET_3);
3402                 printk(KERN_ERR"%s: Parity errors detected in blocks: ",
3403                        bp->dev->name);
3404                 par_num = bnx2x_print_blocks_with_parity0(
3405                         sig0 & HW_PRTY_ASSERT_SET_0, par_num);
3406                 par_num = bnx2x_print_blocks_with_parity1(
3407                         sig1 & HW_PRTY_ASSERT_SET_1, par_num);
3408                 par_num = bnx2x_print_blocks_with_parity2(
3409                         sig2 & HW_PRTY_ASSERT_SET_2, par_num);
3410                 par_num = bnx2x_print_blocks_with_parity3(
3411                         sig3 & HW_PRTY_ASSERT_SET_3, par_num);
3412                 printk("\n");
3413                 return true;
3414         } else
3415                 return false;
3416 }
3417
3418 bool bnx2x_chk_parity_attn(struct bnx2x *bp)
3419 {
3420         struct attn_route attn;
3421         int port = BP_PORT(bp);
3422
3423         attn.sig[0] = REG_RD(bp,
3424                 MISC_REG_AEU_AFTER_INVERT_1_FUNC_0 +
3425                              port*4);
3426         attn.sig[1] = REG_RD(bp,
3427                 MISC_REG_AEU_AFTER_INVERT_2_FUNC_0 +
3428                              port*4);
3429         attn.sig[2] = REG_RD(bp,
3430                 MISC_REG_AEU_AFTER_INVERT_3_FUNC_0 +
3431                              port*4);
3432         attn.sig[3] = REG_RD(bp,
3433                 MISC_REG_AEU_AFTER_INVERT_4_FUNC_0 +
3434                              port*4);
3435
3436         return bnx2x_parity_attn(bp, attn.sig[0], attn.sig[1], attn.sig[2],
3437                                         attn.sig[3]);
3438 }
3439
3440
3441 static inline void bnx2x_attn_int_deasserted4(struct bnx2x *bp, u32 attn)
3442 {
3443         u32 val;
3444         if (attn & AEU_INPUTS_ATTN_BITS_PGLUE_HW_INTERRUPT) {
3445
3446                 val = REG_RD(bp, PGLUE_B_REG_PGLUE_B_INT_STS_CLR);
3447                 BNX2X_ERR("PGLUE hw attention 0x%x\n", val);
3448                 if (val & PGLUE_B_PGLUE_B_INT_STS_REG_ADDRESS_ERROR)
3449                         BNX2X_ERR("PGLUE_B_PGLUE_B_INT_STS_REG_"
3450                                   "ADDRESS_ERROR\n");
3451                 if (val & PGLUE_B_PGLUE_B_INT_STS_REG_INCORRECT_RCV_BEHAVIOR)
3452                         BNX2X_ERR("PGLUE_B_PGLUE_B_INT_STS_REG_"
3453                                   "INCORRECT_RCV_BEHAVIOR\n");
3454                 if (val & PGLUE_B_PGLUE_B_INT_STS_REG_WAS_ERROR_ATTN)
3455                         BNX2X_ERR("PGLUE_B_PGLUE_B_INT_STS_REG_"
3456                                   "WAS_ERROR_ATTN\n");
3457                 if (val & PGLUE_B_PGLUE_B_INT_STS_REG_VF_LENGTH_VIOLATION_ATTN)
3458                         BNX2X_ERR("PGLUE_B_PGLUE_B_INT_STS_REG_"
3459                                   "VF_LENGTH_VIOLATION_ATTN\n");
3460                 if (val &
3461                     PGLUE_B_PGLUE_B_INT_STS_REG_VF_GRC_SPACE_VIOLATION_ATTN)
3462                         BNX2X_ERR("PGLUE_B_PGLUE_B_INT_STS_REG_"
3463                                   "VF_GRC_SPACE_VIOLATION_ATTN\n");
3464                 if (val &
3465                     PGLUE_B_PGLUE_B_INT_STS_REG_VF_MSIX_BAR_VIOLATION_ATTN)
3466                         BNX2X_ERR("PGLUE_B_PGLUE_B_INT_STS_REG_"
3467                                   "VF_MSIX_BAR_VIOLATION_ATTN\n");
3468                 if (val & PGLUE_B_PGLUE_B_INT_STS_REG_TCPL_ERROR_ATTN)
3469                         BNX2X_ERR("PGLUE_B_PGLUE_B_INT_STS_REG_"
3470                                   "TCPL_ERROR_ATTN\n");
3471                 if (val & PGLUE_B_PGLUE_B_INT_STS_REG_TCPL_IN_TWO_RCBS_ATTN)
3472                         BNX2X_ERR("PGLUE_B_PGLUE_B_INT_STS_REG_"
3473                                   "TCPL_IN_TWO_RCBS_ATTN\n");
3474                 if (val & PGLUE_B_PGLUE_B_INT_STS_REG_CSSNOOP_FIFO_OVERFLOW)
3475                         BNX2X_ERR("PGLUE_B_PGLUE_B_INT_STS_REG_"
3476                                   "CSSNOOP_FIFO_OVERFLOW\n");
3477         }
3478         if (attn & AEU_INPUTS_ATTN_BITS_ATC_HW_INTERRUPT) {
3479                 val = REG_RD(bp, ATC_REG_ATC_INT_STS_CLR);
3480                 BNX2X_ERR("ATC hw attention 0x%x\n", val);
3481                 if (val & ATC_ATC_INT_STS_REG_ADDRESS_ERROR)
3482                         BNX2X_ERR("ATC_ATC_INT_STS_REG_ADDRESS_ERROR\n");
3483                 if (val & ATC_ATC_INT_STS_REG_ATC_TCPL_TO_NOT_PEND)
3484                         BNX2X_ERR("ATC_ATC_INT_STS_REG"
3485                                   "_ATC_TCPL_TO_NOT_PEND\n");
3486                 if (val & ATC_ATC_INT_STS_REG_ATC_GPA_MULTIPLE_HITS)
3487                         BNX2X_ERR("ATC_ATC_INT_STS_REG_"
3488                                   "ATC_GPA_MULTIPLE_HITS\n");
3489                 if (val & ATC_ATC_INT_STS_REG_ATC_RCPL_TO_EMPTY_CNT)
3490                         BNX2X_ERR("ATC_ATC_INT_STS_REG_"
3491                                   "ATC_RCPL_TO_EMPTY_CNT\n");
3492                 if (val & ATC_ATC_INT_STS_REG_ATC_TCPL_ERROR)
3493                         BNX2X_ERR("ATC_ATC_INT_STS_REG_ATC_TCPL_ERROR\n");
3494                 if (val & ATC_ATC_INT_STS_REG_ATC_IREQ_LESS_THAN_STU)
3495                         BNX2X_ERR("ATC_ATC_INT_STS_REG_"
3496                                   "ATC_IREQ_LESS_THAN_STU\n");
3497         }
3498
3499         if (attn & (AEU_INPUTS_ATTN_BITS_PGLUE_PARITY_ERROR |
3500                     AEU_INPUTS_ATTN_BITS_ATC_PARITY_ERROR)) {
3501                 BNX2X_ERR("FATAL parity attention set4 0x%x\n",
3502                 (u32)(attn & (AEU_INPUTS_ATTN_BITS_PGLUE_PARITY_ERROR |
3503                     AEU_INPUTS_ATTN_BITS_ATC_PARITY_ERROR)));
3504         }
3505
3506 }
3507
3508 static void bnx2x_attn_int_deasserted(struct bnx2x *bp, u32 deasserted)
3509 {
3510         struct attn_route attn, *group_mask;
3511         int port = BP_PORT(bp);
3512         int index;
3513         u32 reg_addr;
3514         u32 val;
3515         u32 aeu_mask;
3516
3517         /* need to take HW lock because MCP or other port might also
3518            try to handle this event */
3519         bnx2x_acquire_alr(bp);
3520
3521         if (CHIP_PARITY_ENABLED(bp) && bnx2x_chk_parity_attn(bp)) {
3522                 bp->recovery_state = BNX2X_RECOVERY_INIT;
3523                 bnx2x_set_reset_in_progress(bp);
3524                 schedule_delayed_work(&bp->reset_task, 0);
3525                 /* Disable HW interrupts */
3526                 bnx2x_int_disable(bp);
3527                 bnx2x_release_alr(bp);
3528                 /* In case of parity errors don't handle attentions so that
3529                  * other function would "see" parity errors.
3530                  */
3531                 return;
3532         }
3533
3534         attn.sig[0] = REG_RD(bp, MISC_REG_AEU_AFTER_INVERT_1_FUNC_0 + port*4);
3535         attn.sig[1] = REG_RD(bp, MISC_REG_AEU_AFTER_INVERT_2_FUNC_0 + port*4);
3536         attn.sig[2] = REG_RD(bp, MISC_REG_AEU_AFTER_INVERT_3_FUNC_0 + port*4);
3537         attn.sig[3] = REG_RD(bp, MISC_REG_AEU_AFTER_INVERT_4_FUNC_0 + port*4);
3538         if (CHIP_IS_E2(bp))
3539                 attn.sig[4] =
3540                       REG_RD(bp, MISC_REG_AEU_AFTER_INVERT_5_FUNC_0 + port*4);
3541         else
3542                 attn.sig[4] = 0;
3543
3544         DP(NETIF_MSG_HW, "attn: %08x %08x %08x %08x %08x\n",
3545            attn.sig[0], attn.sig[1], attn.sig[2], attn.sig[3], attn.sig[4]);
3546
3547         for (index = 0; index < MAX_DYNAMIC_ATTN_GRPS; index++) {
3548                 if (deasserted & (1 << index)) {
3549                         group_mask = &bp->attn_group[index];
3550
3551                         DP(NETIF_MSG_HW, "group[%d]: %08x %08x "
3552                                          "%08x %08x %08x\n",
3553                            index,
3554                            group_mask->sig[0], group_mask->sig[1],
3555                            group_mask->sig[2], group_mask->sig[3],
3556                            group_mask->sig[4]);
3557
3558                         bnx2x_attn_int_deasserted4(bp,
3559                                         attn.sig[4] & group_mask->sig[4]);
3560                         bnx2x_attn_int_deasserted3(bp,
3561                                         attn.sig[3] & group_mask->sig[3]);
3562                         bnx2x_attn_int_deasserted1(bp,
3563                                         attn.sig[1] & group_mask->sig[1]);
3564                         bnx2x_attn_int_deasserted2(bp,
3565                                         attn.sig[2] & group_mask->sig[2]);
3566                         bnx2x_attn_int_deasserted0(bp,
3567                                         attn.sig[0] & group_mask->sig[0]);
3568                 }
3569         }
3570
3571         bnx2x_release_alr(bp);
3572
3573         if (bp->common.int_block == INT_BLOCK_HC)
3574                 reg_addr = (HC_REG_COMMAND_REG + port*32 +
3575                             COMMAND_REG_ATTN_BITS_CLR);
3576         else
3577                 reg_addr = (BAR_IGU_INTMEM + IGU_CMD_ATTN_BIT_CLR_UPPER*8);
3578
3579         val = ~deasserted;
3580         DP(NETIF_MSG_HW, "about to mask 0x%08x at %s addr 0x%x\n", val,
3581            (bp->common.int_block == INT_BLOCK_HC) ? "HC" : "IGU", reg_addr);
3582         REG_WR(bp, reg_addr, val);
3583
3584         if (~bp->attn_state & deasserted)
3585                 BNX2X_ERR("IGU ERROR\n");
3586
3587         reg_addr = port ? MISC_REG_AEU_MASK_ATTN_FUNC_1 :
3588                           MISC_REG_AEU_MASK_ATTN_FUNC_0;
3589
3590         bnx2x_acquire_hw_lock(bp, HW_LOCK_RESOURCE_PORT0_ATT_MASK + port);
3591         aeu_mask = REG_RD(bp, reg_addr);
3592
3593         DP(NETIF_MSG_HW, "aeu_mask %x  newly deasserted %x\n",
3594            aeu_mask, deasserted);
3595         aeu_mask |= (deasserted & 0x3ff);
3596         DP(NETIF_MSG_HW, "new mask %x\n", aeu_mask);
3597
3598         REG_WR(bp, reg_addr, aeu_mask);
3599         bnx2x_release_hw_lock(bp, HW_LOCK_RESOURCE_PORT0_ATT_MASK + port);
3600
3601         DP(NETIF_MSG_HW, "attn_state %x\n", bp->attn_state);
3602         bp->attn_state &= ~deasserted;
3603         DP(NETIF_MSG_HW, "new state %x\n", bp->attn_state);
3604 }
3605
3606 static void bnx2x_attn_int(struct bnx2x *bp)
3607 {
3608         /* read local copy of bits */
3609         u32 attn_bits = le32_to_cpu(bp->def_status_blk->atten_status_block.
3610                                                                 attn_bits);
3611         u32 attn_ack = le32_to_cpu(bp->def_status_blk->atten_status_block.
3612                                                                 attn_bits_ack);
3613         u32 attn_state = bp->attn_state;
3614
3615         /* look for changed bits */
3616         u32 asserted   =  attn_bits & ~attn_ack & ~attn_state;
3617         u32 deasserted = ~attn_bits &  attn_ack &  attn_state;
3618
3619         DP(NETIF_MSG_HW,
3620            "attn_bits %x  attn_ack %x  asserted %x  deasserted %x\n",
3621            attn_bits, attn_ack, asserted, deasserted);
3622
3623         if (~(attn_bits ^ attn_ack) & (attn_bits ^ attn_state))
3624                 BNX2X_ERR("BAD attention state\n");
3625
3626         /* handle bits that were raised */
3627         if (asserted)
3628                 bnx2x_attn_int_asserted(bp, asserted);
3629
3630         if (deasserted)
3631                 bnx2x_attn_int_deasserted(bp, deasserted);
3632 }
3633
3634 static inline void bnx2x_update_eq_prod(struct bnx2x *bp, u16 prod)
3635 {
3636         /* No memory barriers */
3637         storm_memset_eq_prod(bp, prod, BP_FUNC(bp));
3638         mmiowb(); /* keep prod updates ordered */
3639 }
3640
3641 #ifdef BCM_CNIC
3642 static int  bnx2x_cnic_handle_cfc_del(struct bnx2x *bp, u32 cid,
3643                                       union event_ring_elem *elem)
3644 {
3645         if (!bp->cnic_eth_dev.starting_cid  ||
3646             (cid < bp->cnic_eth_dev.starting_cid &&
3647             cid != bp->cnic_eth_dev.iscsi_l2_cid))
3648                 return 1;
3649
3650         DP(BNX2X_MSG_SP, "got delete ramrod for CNIC CID %d\n", cid);
3651
3652         if (unlikely(elem->message.data.cfc_del_event.error)) {
3653                 BNX2X_ERR("got delete ramrod for CNIC CID %d with error!\n",
3654                           cid);
3655                 bnx2x_panic_dump(bp);
3656         }
3657         bnx2x_cnic_cfc_comp(bp, cid);
3658         return 0;
3659 }
3660 #endif
3661
3662 static void bnx2x_eq_int(struct bnx2x *bp)
3663 {
3664         u16 hw_cons, sw_cons, sw_prod;
3665         union event_ring_elem *elem;
3666         u32 cid;
3667         u8 opcode;
3668         int spqe_cnt = 0;
3669
3670         hw_cons = le16_to_cpu(*bp->eq_cons_sb);
3671
3672         /* The hw_cos range is 1-255, 257 - the sw_cons range is 0-254, 256.
3673          * when we get the the next-page we nned to adjust so the loop
3674          * condition below will be met. The next element is the size of a
3675          * regular element and hence incrementing by 1
3676          */
3677         if ((hw_cons & EQ_DESC_MAX_PAGE) == EQ_DESC_MAX_PAGE)
3678                 hw_cons++;
3679
3680         /* This function may never run in parallel with itself for a
3681          * specific bp, thus there is no need in "paired" read memory
3682          * barrier here.
3683          */
3684         sw_cons = bp->eq_cons;
3685         sw_prod = bp->eq_prod;
3686
3687         DP(BNX2X_MSG_SP, "EQ:  hw_cons %u  sw_cons %u bp->cq_spq_left %u\n",
3688                         hw_cons, sw_cons, atomic_read(&bp->eq_spq_left));
3689
3690         for (; sw_cons != hw_cons;
3691               sw_prod = NEXT_EQ_IDX(sw_prod), sw_cons = NEXT_EQ_IDX(sw_cons)) {
3692
3693
3694                 elem = &bp->eq_ring[EQ_DESC(sw_cons)];
3695
3696                 cid = SW_CID(elem->message.data.cfc_del_event.cid);
3697                 opcode = elem->message.opcode;
3698
3699
3700                 /* handle eq element */
3701                 switch (opcode) {
3702                 case EVENT_RING_OPCODE_STAT_QUERY:
3703                         DP(NETIF_MSG_TIMER, "got statistics comp event\n");
3704                         /* nothing to do with stats comp */
3705                         continue;
3706
3707                 case EVENT_RING_OPCODE_CFC_DEL:
3708                         /* handle according to cid range */
3709                         /*
3710                          * we may want to verify here that the bp state is
3711                          * HALTING
3712                          */
3713                         DP(NETIF_MSG_IFDOWN,
3714                            "got delete ramrod for MULTI[%d]\n", cid);
3715 #ifdef BCM_CNIC
3716                         if (!bnx2x_cnic_handle_cfc_del(bp, cid, elem))
3717                                 goto next_spqe;
3718                         if (cid == BNX2X_FCOE_ETH_CID)
3719                                 bnx2x_fcoe(bp, state) = BNX2X_FP_STATE_CLOSED;
3720                         else
3721 #endif
3722                                 bnx2x_fp(bp, cid, state) =
3723                                                 BNX2X_FP_STATE_CLOSED;
3724
3725                         goto next_spqe;
3726
3727                 case EVENT_RING_OPCODE_STOP_TRAFFIC:
3728                         DP(NETIF_MSG_IFUP, "got STOP TRAFFIC\n");
3729                         bnx2x_dcbx_set_params(bp, BNX2X_DCBX_STATE_TX_PAUSED);
3730                         goto next_spqe;
3731                 case EVENT_RING_OPCODE_START_TRAFFIC:
3732                         DP(NETIF_MSG_IFUP, "got START TRAFFIC\n");
3733                         bnx2x_dcbx_set_params(bp, BNX2X_DCBX_STATE_TX_RELEASED);
3734                         goto next_spqe;
3735                 }
3736
3737                 switch (opcode | bp->state) {
3738                 case (EVENT_RING_OPCODE_FUNCTION_START |
3739                       BNX2X_STATE_OPENING_WAIT4_PORT):
3740                         DP(NETIF_MSG_IFUP, "got setup ramrod\n");
3741                         bp->state = BNX2X_STATE_FUNC_STARTED;
3742                         break;
3743
3744                 case (EVENT_RING_OPCODE_FUNCTION_STOP |
3745                       BNX2X_STATE_CLOSING_WAIT4_HALT):
3746                         DP(NETIF_MSG_IFDOWN, "got halt ramrod\n");
3747                         bp->state = BNX2X_STATE_CLOSING_WAIT4_UNLOAD;
3748                         break;
3749
3750                 case (EVENT_RING_OPCODE_SET_MAC | BNX2X_STATE_OPEN):
3751                 case (EVENT_RING_OPCODE_SET_MAC | BNX2X_STATE_DIAG):
3752                         DP(NETIF_MSG_IFUP, "got set mac ramrod\n");
3753                         if (elem->message.data.set_mac_event.echo)
3754                                 bp->set_mac_pending = 0;
3755                         break;
3756
3757                 case (EVENT_RING_OPCODE_SET_MAC |
3758                       BNX2X_STATE_CLOSING_WAIT4_HALT):
3759                         DP(NETIF_MSG_IFDOWN, "got (un)set mac ramrod\n");
3760                         if (elem->message.data.set_mac_event.echo)
3761                                 bp->set_mac_pending = 0;
3762                         break;
3763                 default:
3764                         /* unknown event log error and continue */
3765                         BNX2X_ERR("Unknown EQ event %d\n",
3766                                   elem->message.opcode);
3767                 }
3768 next_spqe:
3769                 spqe_cnt++;
3770         } /* for */
3771
3772         smp_mb__before_atomic_inc();
3773         atomic_add(spqe_cnt, &bp->eq_spq_left);
3774
3775         bp->eq_cons = sw_cons;
3776         bp->eq_prod = sw_prod;
3777         /* Make sure that above mem writes were issued towards the memory */
3778         smp_wmb();
3779
3780         /* update producer */
3781         bnx2x_update_eq_prod(bp, bp->eq_prod);
3782 }
3783
3784 static void bnx2x_sp_task(struct work_struct *work)
3785 {
3786         struct bnx2x *bp = container_of(work, struct bnx2x, sp_task.work);
3787         u16 status;
3788
3789         status = bnx2x_update_dsb_idx(bp);
3790 /*      if (status == 0)                                     */
3791 /*              BNX2X_ERR("spurious slowpath interrupt!\n"); */
3792
3793         DP(NETIF_MSG_INTR, "got a slowpath interrupt (status 0x%x)\n", status);
3794
3795         /* HW attentions */
3796         if (status & BNX2X_DEF_SB_ATT_IDX) {
3797                 bnx2x_attn_int(bp);
3798                 status &= ~BNX2X_DEF_SB_ATT_IDX;
3799         }
3800
3801         /* SP events: STAT_QUERY and others */
3802         if (status & BNX2X_DEF_SB_IDX) {
3803 #ifdef BCM_CNIC
3804                 struct bnx2x_fastpath *fp = bnx2x_fcoe_fp(bp);
3805
3806                 if ((!NO_FCOE(bp)) &&
3807                         (bnx2x_has_rx_work(fp) || bnx2x_has_tx_work(fp)))
3808                         napi_schedule(&bnx2x_fcoe(bp, napi));
3809 #endif
3810                 /* Handle EQ completions */
3811                 bnx2x_eq_int(bp);
3812
3813                 bnx2x_ack_sb(bp, bp->igu_dsb_id, USTORM_ID,
3814                         le16_to_cpu(bp->def_idx), IGU_INT_NOP, 1);
3815
3816                 status &= ~BNX2X_DEF_SB_IDX;
3817         }
3818
3819         if (unlikely(status))
3820                 DP(NETIF_MSG_INTR, "got an unknown interrupt! (status 0x%x)\n",
3821                    status);
3822
3823         bnx2x_ack_sb(bp, bp->igu_dsb_id, ATTENTION_ID,
3824              le16_to_cpu(bp->def_att_idx), IGU_INT_ENABLE, 1);
3825 }
3826
3827 irqreturn_t bnx2x_msix_sp_int(int irq, void *dev_instance)
3828 {
3829         struct net_device *dev = dev_instance;
3830         struct bnx2x *bp = netdev_priv(dev);
3831
3832         bnx2x_ack_sb(bp, bp->igu_dsb_id, USTORM_ID, 0,
3833                      IGU_INT_DISABLE, 0);
3834
3835 #ifdef BNX2X_STOP_ON_ERROR
3836         if (unlikely(bp->panic))
3837                 return IRQ_HANDLED;
3838 #endif
3839
3840 #ifdef BCM_CNIC
3841         {
3842                 struct cnic_ops *c_ops;
3843
3844                 rcu_read_lock();
3845                 c_ops = rcu_dereference(bp->cnic_ops);
3846                 if (c_ops)
3847                         c_ops->cnic_handler(bp->cnic_data, NULL);
3848                 rcu_read_unlock();
3849         }
3850 #endif
3851         queue_delayed_work(bnx2x_wq, &bp->sp_task, 0);
3852
3853         return IRQ_HANDLED;
3854 }
3855
3856 /* end of slow path */
3857
3858 static void bnx2x_timer(unsigned long data)
3859 {
3860         struct bnx2x *bp = (struct bnx2x *) data;
3861
3862         if (!netif_running(bp->dev))
3863                 return;
3864
3865         if (poll) {
3866                 struct bnx2x_fastpath *fp = &bp->fp[0];
3867
3868                 bnx2x_tx_int(fp);
3869                 bnx2x_rx_int(fp, 1000);
3870         }
3871
3872         if (!BP_NOMCP(bp)) {
3873                 int mb_idx = BP_FW_MB_IDX(bp);
3874                 u32 drv_pulse;
3875                 u32 mcp_pulse;
3876
3877                 ++bp->fw_drv_pulse_wr_seq;
3878                 bp->fw_drv_pulse_wr_seq &= DRV_PULSE_SEQ_MASK;
3879                 /* TBD - add SYSTEM_TIME */
3880                 drv_pulse = bp->fw_drv_pulse_wr_seq;
3881                 SHMEM_WR(bp, func_mb[mb_idx].drv_pulse_mb, drv_pulse);
3882
3883                 mcp_pulse = (SHMEM_RD(bp, func_mb[mb_idx].mcp_pulse_mb) &
3884                              MCP_PULSE_SEQ_MASK);
3885                 /* The delta between driver pulse and mcp response
3886                  * should be 1 (before mcp response) or 0 (after mcp response)
3887                  */
3888                 if ((drv_pulse != mcp_pulse) &&
3889                     (drv_pulse != ((mcp_pulse + 1) & MCP_PULSE_SEQ_MASK))) {
3890                         /* someone lost a heartbeat... */
3891                         BNX2X_ERR("drv_pulse (0x%x) != mcp_pulse (0x%x)\n",
3892                                   drv_pulse, mcp_pulse);
3893                 }
3894         }
3895
3896         if (bp->state == BNX2X_STATE_OPEN)
3897                 bnx2x_stats_handle(bp, STATS_EVENT_UPDATE);
3898
3899         mod_timer(&bp->timer, jiffies + bp->current_interval);
3900 }
3901
3902 /* end of Statistics */
3903
3904 /* nic init */
3905
3906 /*
3907  * nic init service functions
3908  */
3909
3910 static inline void bnx2x_fill(struct bnx2x *bp, u32 addr, int fill, u32 len)
3911 {
3912         u32 i;
3913         if (!(len%4) && !(addr%4))
3914                 for (i = 0; i < len; i += 4)
3915                         REG_WR(bp, addr + i, fill);
3916         else
3917                 for (i = 0; i < len; i++)
3918                         REG_WR8(bp, addr + i, fill);
3919
3920 }
3921
3922 /* helper: writes FP SP data to FW - data_size in dwords */
3923 static inline void bnx2x_wr_fp_sb_data(struct bnx2x *bp,
3924                                        int fw_sb_id,
3925                                        u32 *sb_data_p,
3926                                        u32 data_size)
3927 {
3928         int index;
3929         for (index = 0; index < data_size; index++)
3930                 REG_WR(bp, BAR_CSTRORM_INTMEM +
3931                         CSTORM_STATUS_BLOCK_DATA_OFFSET(fw_sb_id) +
3932                         sizeof(u32)*index,
3933                         *(sb_data_p + index));
3934 }
3935
3936 static inline void bnx2x_zero_fp_sb(struct bnx2x *bp, int fw_sb_id)
3937 {
3938         u32 *sb_data_p;
3939         u32 data_size = 0;
3940         struct hc_status_block_data_e2 sb_data_e2;
3941         struct hc_status_block_data_e1x sb_data_e1x;
3942
3943         /* disable the function first */
3944         if (CHIP_IS_E2(bp)) {
3945                 memset(&sb_data_e2, 0, sizeof(struct hc_status_block_data_e2));
3946                 sb_data_e2.common.p_func.pf_id = HC_FUNCTION_DISABLED;
3947                 sb_data_e2.common.p_func.vf_id = HC_FUNCTION_DISABLED;
3948                 sb_data_e2.common.p_func.vf_valid = false;
3949                 sb_data_p = (u32 *)&sb_data_e2;
3950                 data_size = sizeof(struct hc_status_block_data_e2)/sizeof(u32);
3951         } else {
3952                 memset(&sb_data_e1x, 0,
3953                        sizeof(struct hc_status_block_data_e1x));
3954                 sb_data_e1x.common.p_func.pf_id = HC_FUNCTION_DISABLED;
3955                 sb_data_e1x.common.p_func.vf_id = HC_FUNCTION_DISABLED;
3956                 sb_data_e1x.common.p_func.vf_valid = false;
3957                 sb_data_p = (u32 *)&sb_data_e1x;
3958                 data_size = sizeof(struct hc_status_block_data_e1x)/sizeof(u32);
3959         }
3960         bnx2x_wr_fp_sb_data(bp, fw_sb_id, sb_data_p, data_size);
3961
3962         bnx2x_fill(bp, BAR_CSTRORM_INTMEM +
3963                         CSTORM_STATUS_BLOCK_OFFSET(fw_sb_id), 0,
3964                         CSTORM_STATUS_BLOCK_SIZE);
3965         bnx2x_fill(bp, BAR_CSTRORM_INTMEM +
3966                         CSTORM_SYNC_BLOCK_OFFSET(fw_sb_id), 0,
3967                         CSTORM_SYNC_BLOCK_SIZE);
3968 }
3969
3970 /* helper:  writes SP SB data to FW */
3971 static inline void bnx2x_wr_sp_sb_data(struct bnx2x *bp,
3972                 struct hc_sp_status_block_data *sp_sb_data)
3973 {
3974         int func = BP_FUNC(bp);
3975         int i;
3976         for (i = 0; i < sizeof(struct hc_sp_status_block_data)/sizeof(u32); i++)
3977                 REG_WR(bp, BAR_CSTRORM_INTMEM +
3978                         CSTORM_SP_STATUS_BLOCK_DATA_OFFSET(func) +
3979                         i*sizeof(u32),
3980                         *((u32 *)sp_sb_data + i));
3981 }
3982
3983 static inline void bnx2x_zero_sp_sb(struct bnx2x *bp)
3984 {
3985         int func = BP_FUNC(bp);
3986         struct hc_sp_status_block_data sp_sb_data;
3987         memset(&sp_sb_data, 0, sizeof(struct hc_sp_status_block_data));
3988
3989         sp_sb_data.p_func.pf_id = HC_FUNCTION_DISABLED;
3990         sp_sb_data.p_func.vf_id = HC_FUNCTION_DISABLED;
3991         sp_sb_data.p_func.vf_valid = false;
3992
3993         bnx2x_wr_sp_sb_data(bp, &sp_sb_data);
3994
3995         bnx2x_fill(bp, BAR_CSTRORM_INTMEM +
3996                         CSTORM_SP_STATUS_BLOCK_OFFSET(func), 0,
3997                         CSTORM_SP_STATUS_BLOCK_SIZE);
3998         bnx2x_fill(bp, BAR_CSTRORM_INTMEM +
3999                         CSTORM_SP_SYNC_BLOCK_OFFSET(func), 0,
4000                         CSTORM_SP_SYNC_BLOCK_SIZE);
4001
4002 }
4003
4004
4005 static inline
4006 void bnx2x_setup_ndsb_state_machine(struct hc_status_block_sm *hc_sm,
4007                                            int igu_sb_id, int igu_seg_id)
4008 {
4009         hc_sm->igu_sb_id = igu_sb_id;
4010         hc_sm->igu_seg_id = igu_seg_id;
4011         hc_sm->timer_value = 0xFF;
4012         hc_sm->time_to_expire = 0xFFFFFFFF;
4013 }
4014
4015 static void bnx2x_init_sb(struct bnx2x *bp, dma_addr_t mapping, int vfid,
4016                           u8 vf_valid, int fw_sb_id, int igu_sb_id)
4017 {
4018         int igu_seg_id;
4019
4020         struct hc_status_block_data_e2 sb_data_e2;
4021         struct hc_status_block_data_e1x sb_data_e1x;
4022         struct hc_status_block_sm  *hc_sm_p;
4023         int data_size;
4024         u32 *sb_data_p;
4025
4026         if (CHIP_INT_MODE_IS_BC(bp))
4027                 igu_seg_id = HC_SEG_ACCESS_NORM;
4028         else
4029                 igu_seg_id = IGU_SEG_ACCESS_NORM;
4030
4031         bnx2x_zero_fp_sb(bp, fw_sb_id);
4032
4033         if (CHIP_IS_E2(bp)) {
4034                 memset(&sb_data_e2, 0, sizeof(struct hc_status_block_data_e2));
4035                 sb_data_e2.common.p_func.pf_id = BP_FUNC(bp);
4036                 sb_data_e2.common.p_func.vf_id = vfid;
4037                 sb_data_e2.common.p_func.vf_valid = vf_valid;
4038                 sb_data_e2.common.p_func.vnic_id = BP_VN(bp);
4039                 sb_data_e2.common.same_igu_sb_1b = true;
4040                 sb_data_e2.common.host_sb_addr.hi = U64_HI(mapping);
4041                 sb_data_e2.common.host_sb_addr.lo = U64_LO(mapping);
4042                 hc_sm_p = sb_data_e2.common.state_machine;
4043                 sb_data_p = (u32 *)&sb_data_e2;
4044                 data_size = sizeof(struct hc_status_block_data_e2)/sizeof(u32);
4045         } else {
4046                 memset(&sb_data_e1x, 0,
4047                        sizeof(struct hc_status_block_data_e1x));
4048                 sb_data_e1x.common.p_func.pf_id = BP_FUNC(bp);
4049                 sb_data_e1x.common.p_func.vf_id = 0xff;
4050                 sb_data_e1x.common.p_func.vf_valid = false;
4051                 sb_data_e1x.common.p_func.vnic_id = BP_VN(bp);
4052                 sb_data_e1x.common.same_igu_sb_1b = true;
4053                 sb_data_e1x.common.host_sb_addr.hi = U64_HI(mapping);
4054                 sb_data_e1x.common.host_sb_addr.lo = U64_LO(mapping);
4055                 hc_sm_p = sb_data_e1x.common.state_machine;
4056                 sb_data_p = (u32 *)&sb_data_e1x;
4057                 data_size = sizeof(struct hc_status_block_data_e1x)/sizeof(u32);
4058         }
4059
4060         bnx2x_setup_ndsb_state_machine(&hc_sm_p[SM_RX_ID],
4061                                        igu_sb_id, igu_seg_id);
4062         bnx2x_setup_ndsb_state_machine(&hc_sm_p[SM_TX_ID],
4063                                        igu_sb_id, igu_seg_id);
4064
4065         DP(NETIF_MSG_HW, "Init FW SB %d\n", fw_sb_id);
4066
4067         /* write indecies to HW */
4068         bnx2x_wr_fp_sb_data(bp, fw_sb_id, sb_data_p, data_size);
4069 }
4070
4071 static void bnx2x_update_coalesce_sb_index(struct bnx2x *bp, u16 fw_sb_id,
4072                                         u8 sb_index, u8 disable, u16 usec)
4073 {
4074         int port = BP_PORT(bp);
4075         u8 ticks = usec / BNX2X_BTR;
4076
4077         storm_memset_hc_timeout(bp, port, fw_sb_id, sb_index, ticks);
4078
4079         disable = disable ? 1 : (usec ? 0 : 1);
4080         storm_memset_hc_disable(bp, port, fw_sb_id, sb_index, disable);
4081 }
4082
4083 static void bnx2x_update_coalesce_sb(struct bnx2x *bp, u16 fw_sb_id,
4084                                      u16 tx_usec, u16 rx_usec)
4085 {
4086         bnx2x_update_coalesce_sb_index(bp, fw_sb_id, U_SB_ETH_RX_CQ_INDEX,
4087                                     false, rx_usec);
4088         bnx2x_update_coalesce_sb_index(bp, fw_sb_id, C_SB_ETH_TX_CQ_INDEX,
4089                                     false, tx_usec);
4090 }
4091
4092 static void bnx2x_init_def_sb(struct bnx2x *bp)
4093 {
4094         struct host_sp_status_block *def_sb = bp->def_status_blk;
4095         dma_addr_t mapping = bp->def_status_blk_mapping;
4096         int igu_sp_sb_index;
4097         int igu_seg_id;
4098         int port = BP_PORT(bp);
4099         int func = BP_FUNC(bp);
4100         int reg_offset;
4101         u64 section;
4102         int index;
4103         struct hc_sp_status_block_data sp_sb_data;
4104         memset(&sp_sb_data, 0, sizeof(struct hc_sp_status_block_data));
4105
4106         if (CHIP_INT_MODE_IS_BC(bp)) {
4107                 igu_sp_sb_index = DEF_SB_IGU_ID;
4108                 igu_seg_id = HC_SEG_ACCESS_DEF;
4109         } else {
4110                 igu_sp_sb_index = bp->igu_dsb_id;
4111                 igu_seg_id = IGU_SEG_ACCESS_DEF;
4112         }
4113
4114         /* ATTN */
4115         section = ((u64)mapping) + offsetof(struct host_sp_status_block,
4116                                             atten_status_block);
4117         def_sb->atten_status_block.status_block_id = igu_sp_sb_index;
4118
4119         bp->attn_state = 0;
4120
4121         reg_offset = (port ? MISC_REG_AEU_ENABLE1_FUNC_1_OUT_0 :
4122                              MISC_REG_AEU_ENABLE1_FUNC_0_OUT_0);
4123         for (index = 0; index < MAX_DYNAMIC_ATTN_GRPS; index++) {
4124                 int sindex;
4125                 /* take care of sig[0]..sig[4] */
4126                 for (sindex = 0; sindex < 4; sindex++)
4127                         bp->attn_group[index].sig[sindex] =
4128                            REG_RD(bp, reg_offset + sindex*0x4 + 0x10*index);
4129
4130                 if (CHIP_IS_E2(bp))
4131                         /*
4132                          * enable5 is separate from the rest of the registers,
4133                          * and therefore the address skip is 4
4134                          * and not 16 between the different groups
4135                          */
4136                         bp->attn_group[index].sig[4] = REG_RD(bp,
4137                                         reg_offset + 0x10 + 0x4*index);
4138                 else
4139                         bp->attn_group[index].sig[4] = 0;
4140         }
4141
4142         if (bp->common.int_block == INT_BLOCK_HC) {
4143                 reg_offset = (port ? HC_REG_ATTN_MSG1_ADDR_L :
4144                                      HC_REG_ATTN_MSG0_ADDR_L);
4145
4146                 REG_WR(bp, reg_offset, U64_LO(section));
4147                 REG_WR(bp, reg_offset + 4, U64_HI(section));
4148         } else if (CHIP_IS_E2(bp)) {
4149                 REG_WR(bp, IGU_REG_ATTN_MSG_ADDR_L, U64_LO(section));
4150                 REG_WR(bp, IGU_REG_ATTN_MSG_ADDR_H, U64_HI(section));
4151         }
4152
4153         section = ((u64)mapping) + offsetof(struct host_sp_status_block,
4154                                             sp_sb);
4155
4156         bnx2x_zero_sp_sb(bp);
4157
4158         sp_sb_data.host_sb_addr.lo      = U64_LO(section);
4159         sp_sb_data.host_sb_addr.hi      = U64_HI(section);
4160         sp_sb_data.igu_sb_id            = igu_sp_sb_index;
4161         sp_sb_data.igu_seg_id           = igu_seg_id;
4162         sp_sb_data.p_func.pf_id         = func;
4163         sp_sb_data.p_func.vnic_id       = BP_VN(bp);
4164         sp_sb_data.p_func.vf_id         = 0xff;
4165
4166         bnx2x_wr_sp_sb_data(bp, &sp_sb_data);
4167
4168         bp->stats_pending = 0;
4169         bp->set_mac_pending = 0;
4170
4171         bnx2x_ack_sb(bp, bp->igu_dsb_id, USTORM_ID, 0, IGU_INT_ENABLE, 0);
4172 }
4173
4174 void bnx2x_update_coalesce(struct bnx2x *bp)
4175 {
4176         int i;
4177
4178         for_each_eth_queue(bp, i)
4179                 bnx2x_update_coalesce_sb(bp, bp->fp[i].fw_sb_id,
4180                                          bp->tx_ticks, bp->rx_ticks);
4181 }
4182
4183 static void bnx2x_init_sp_ring(struct bnx2x *bp)
4184 {
4185         spin_lock_init(&bp->spq_lock);
4186         atomic_set(&bp->cq_spq_left, MAX_SPQ_PENDING);
4187
4188         bp->spq_prod_idx = 0;
4189         bp->dsb_sp_prod = BNX2X_SP_DSB_INDEX;
4190         bp->spq_prod_bd = bp->spq;
4191         bp->spq_last_bd = bp->spq_prod_bd + MAX_SP_DESC_CNT;
4192 }
4193
4194 static void bnx2x_init_eq_ring(struct bnx2x *bp)
4195 {
4196         int i;
4197         for (i = 1; i <= NUM_EQ_PAGES; i++) {
4198                 union event_ring_elem *elem =
4199                         &bp->eq_ring[EQ_DESC_CNT_PAGE * i - 1];
4200
4201                 elem->next_page.addr.hi =
4202                         cpu_to_le32(U64_HI(bp->eq_mapping +
4203                                    BCM_PAGE_SIZE * (i % NUM_EQ_PAGES)));
4204                 elem->next_page.addr.lo =
4205                         cpu_to_le32(U64_LO(bp->eq_mapping +
4206                                    BCM_PAGE_SIZE*(i % NUM_EQ_PAGES)));
4207         }
4208         bp->eq_cons = 0;
4209         bp->eq_prod = NUM_EQ_DESC;
4210         bp->eq_cons_sb = BNX2X_EQ_INDEX;
4211         /* we want a warning message before it gets rought... */
4212         atomic_set(&bp->eq_spq_left,
4213                 min_t(int, MAX_SP_DESC_CNT - MAX_SPQ_PENDING, NUM_EQ_DESC) - 1);
4214 }
4215
4216 void bnx2x_push_indir_table(struct bnx2x *bp)
4217 {
4218         int func = BP_FUNC(bp);
4219         int i;
4220
4221         if (bp->multi_mode == ETH_RSS_MODE_DISABLED)
4222                 return;
4223
4224         for (i = 0; i < TSTORM_INDIRECTION_TABLE_SIZE; i++)
4225                 REG_WR8(bp, BAR_TSTRORM_INTMEM +
4226                         TSTORM_INDIRECTION_TABLE_OFFSET(func) + i,
4227                         bp->fp->cl_id + bp->rx_indir_table[i]);
4228 }
4229
4230 static void bnx2x_init_ind_table(struct bnx2x *bp)
4231 {
4232         int i;
4233
4234         for (i = 0; i < TSTORM_INDIRECTION_TABLE_SIZE; i++)
4235                 bp->rx_indir_table[i] = i % BNX2X_NUM_ETH_QUEUES(bp);
4236
4237         bnx2x_push_indir_table(bp);
4238 }
4239
4240 void bnx2x_set_storm_rx_mode(struct bnx2x *bp)
4241 {
4242         int mode = bp->rx_mode;
4243         int port = BP_PORT(bp);
4244         u16 cl_id;
4245         u32 def_q_filters = 0;
4246
4247         /* All but management unicast packets should pass to the host as well */
4248         u32 llh_mask =
4249                 NIG_LLH0_BRB1_DRV_MASK_REG_LLH0_BRB1_DRV_MASK_BRCST |
4250                 NIG_LLH0_BRB1_DRV_MASK_REG_LLH0_BRB1_DRV_MASK_MLCST |
4251                 NIG_LLH0_BRB1_DRV_MASK_REG_LLH0_BRB1_DRV_MASK_VLAN |
4252                 NIG_LLH0_BRB1_DRV_MASK_REG_LLH0_BRB1_DRV_MASK_NO_VLAN;
4253
4254         switch (mode) {
4255         case BNX2X_RX_MODE_NONE: /* no Rx */
4256                 def_q_filters = BNX2X_ACCEPT_NONE;
4257 #ifdef BCM_CNIC
4258                 if (!NO_FCOE(bp)) {
4259                         cl_id = bnx2x_fcoe(bp, cl_id);
4260                         bnx2x_rxq_set_mac_filters(bp, cl_id, BNX2X_ACCEPT_NONE);
4261                 }
4262 #endif
4263                 break;
4264
4265         case BNX2X_RX_MODE_NORMAL:
4266                 def_q_filters |= BNX2X_ACCEPT_UNICAST | BNX2X_ACCEPT_BROADCAST |
4267                                 BNX2X_ACCEPT_MULTICAST;
4268 #ifdef BCM_CNIC
4269                 if (!NO_FCOE(bp)) {
4270                         cl_id = bnx2x_fcoe(bp, cl_id);
4271                         bnx2x_rxq_set_mac_filters(bp, cl_id,
4272                                                   BNX2X_ACCEPT_UNICAST |
4273                                                   BNX2X_ACCEPT_MULTICAST);
4274                 }
4275 #endif
4276                 break;
4277
4278         case BNX2X_RX_MODE_ALLMULTI:
4279                 def_q_filters |= BNX2X_ACCEPT_UNICAST | BNX2X_ACCEPT_BROADCAST |
4280                                 BNX2X_ACCEPT_ALL_MULTICAST;
4281 #ifdef BCM_CNIC
4282                 /*
4283                  *  Prevent duplication of multicast packets by configuring FCoE
4284                  *  L2 Client to receive only matched unicast frames.
4285                  */
4286                 if (!NO_FCOE(bp)) {
4287                         cl_id = bnx2x_fcoe(bp, cl_id);
4288                         bnx2x_rxq_set_mac_filters(bp, cl_id,
4289                                                   BNX2X_ACCEPT_UNICAST);
4290                 }
4291 #endif
4292                 break;
4293
4294         case BNX2X_RX_MODE_PROMISC:
4295                 def_q_filters |= BNX2X_PROMISCUOUS_MODE;
4296 #ifdef BCM_CNIC
4297                 /*
4298                  *  Prevent packets duplication by configuring DROP_ALL for FCoE
4299                  *  L2 Client.
4300                  */
4301                 if (!NO_FCOE(bp)) {
4302                         cl_id = bnx2x_fcoe(bp, cl_id);
4303                         bnx2x_rxq_set_mac_filters(bp, cl_id, BNX2X_ACCEPT_NONE);
4304                 }
4305 #endif
4306                 /* pass management unicast packets as well */
4307                 llh_mask |= NIG_LLH0_BRB1_DRV_MASK_REG_LLH0_BRB1_DRV_MASK_UNCST;
4308                 break;
4309
4310         default:
4311                 BNX2X_ERR("BAD rx mode (%d)\n", mode);
4312                 break;
4313         }
4314
4315         cl_id = BP_L_ID(bp);
4316         bnx2x_rxq_set_mac_filters(bp, cl_id, def_q_filters);
4317
4318         REG_WR(bp,
4319                (port ? NIG_REG_LLH1_BRB1_DRV_MASK :
4320                        NIG_REG_LLH0_BRB1_DRV_MASK), llh_mask);
4321
4322         DP(NETIF_MSG_IFUP, "rx mode %d\n"
4323                 "drop_ucast 0x%x\ndrop_mcast 0x%x\ndrop_bcast 0x%x\n"
4324                 "accp_ucast 0x%x\naccp_mcast 0x%x\naccp_bcast 0x%x\n"
4325                 "unmatched_ucast 0x%x\n", mode,
4326                 bp->mac_filters.ucast_drop_all,
4327                 bp->mac_filters.mcast_drop_all,
4328                 bp->mac_filters.bcast_drop_all,
4329                 bp->mac_filters.ucast_accept_all,
4330                 bp->mac_filters.mcast_accept_all,
4331                 bp->mac_filters.bcast_accept_all,
4332                 bp->mac_filters.unmatched_unicast
4333         );
4334
4335         storm_memset_mac_filters(bp, &bp->mac_filters, BP_FUNC(bp));
4336 }
4337
4338 static void bnx2x_init_internal_common(struct bnx2x *bp)
4339 {
4340         int i;
4341
4342         if (!CHIP_IS_E1(bp)) {
4343
4344                 /* xstorm needs to know whether to add  ovlan to packets or not,
4345                  * in switch-independent we'll write 0 to here... */
4346                 REG_WR8(bp, BAR_XSTRORM_INTMEM + XSTORM_FUNCTION_MODE_OFFSET,
4347                         bp->mf_mode);
4348                 REG_WR8(bp, BAR_TSTRORM_INTMEM + TSTORM_FUNCTION_MODE_OFFSET,
4349                         bp->mf_mode);
4350                 REG_WR8(bp, BAR_CSTRORM_INTMEM + CSTORM_FUNCTION_MODE_OFFSET,
4351                         bp->mf_mode);
4352                 REG_WR8(bp, BAR_USTRORM_INTMEM + USTORM_FUNCTION_MODE_OFFSET,
4353                         bp->mf_mode);
4354         }
4355
4356         if (IS_MF_SI(bp))
4357                 /*
4358                  * In switch independent mode, the TSTORM needs to accept
4359                  * packets that failed classification, since approximate match
4360                  * mac addresses aren't written to NIG LLH
4361                  */
4362                 REG_WR8(bp, BAR_TSTRORM_INTMEM +
4363                             TSTORM_ACCEPT_CLASSIFY_FAILED_OFFSET, 2);
4364
4365         /* Zero this manually as its initialization is
4366            currently missing in the initTool */
4367         for (i = 0; i < (USTORM_AGG_DATA_SIZE >> 2); i++)
4368                 REG_WR(bp, BAR_USTRORM_INTMEM +
4369                        USTORM_AGG_DATA_OFFSET + i * 4, 0);
4370         if (CHIP_IS_E2(bp)) {
4371                 REG_WR8(bp, BAR_CSTRORM_INTMEM + CSTORM_IGU_MODE_OFFSET,
4372                         CHIP_INT_MODE_IS_BC(bp) ?
4373                         HC_IGU_BC_MODE : HC_IGU_NBC_MODE);
4374         }
4375 }
4376
4377 static void bnx2x_init_internal_port(struct bnx2x *bp)
4378 {
4379         /* port */
4380         bnx2x_dcb_init_intmem_pfc(bp);
4381 }
4382
4383 static void bnx2x_init_internal(struct bnx2x *bp, u32 load_code)
4384 {
4385         switch (load_code) {
4386         case FW_MSG_CODE_DRV_LOAD_COMMON:
4387         case FW_MSG_CODE_DRV_LOAD_COMMON_CHIP:
4388                 bnx2x_init_internal_common(bp);
4389                 /* no break */
4390
4391         case FW_MSG_CODE_DRV_LOAD_PORT:
4392                 bnx2x_init_internal_port(bp);
4393                 /* no break */
4394
4395         case FW_MSG_CODE_DRV_LOAD_FUNCTION:
4396                 /* internal memory per function is
4397                    initialized inside bnx2x_pf_init */
4398                 break;
4399
4400         default:
4401                 BNX2X_ERR("Unknown load_code (0x%x) from MCP\n", load_code);
4402                 break;
4403         }
4404 }
4405
4406 static void bnx2x_init_fp_sb(struct bnx2x *bp, int fp_idx)
4407 {
4408         struct bnx2x_fastpath *fp = &bp->fp[fp_idx];
4409
4410         fp->state = BNX2X_FP_STATE_CLOSED;
4411
4412         fp->cid = fp_idx;
4413         fp->cl_id = BP_L_ID(bp) + fp_idx;
4414         fp->fw_sb_id = bp->base_fw_ndsb + fp->cl_id + CNIC_CONTEXT_USE;
4415         fp->igu_sb_id = bp->igu_base_sb + fp_idx + CNIC_CONTEXT_USE;
4416         /* qZone id equals to FW (per path) client id */
4417         fp->cl_qzone_id  = fp->cl_id +
4418                            BP_PORT(bp)*(CHIP_IS_E2(bp) ? ETH_MAX_RX_CLIENTS_E2 :
4419                                 ETH_MAX_RX_CLIENTS_E1H);
4420         /* init shortcut */
4421         fp->ustorm_rx_prods_offset = CHIP_IS_E2(bp) ?
4422                             USTORM_RX_PRODS_E2_OFFSET(fp->cl_qzone_id) :
4423                             USTORM_RX_PRODS_E1X_OFFSET(BP_PORT(bp), fp->cl_id);
4424         /* Setup SB indicies */
4425         fp->rx_cons_sb = BNX2X_RX_SB_INDEX;
4426         fp->tx_cons_sb = BNX2X_TX_SB_INDEX;
4427
4428         DP(NETIF_MSG_IFUP, "queue[%d]:  bnx2x_init_sb(%p,%p)  "
4429                                    "cl_id %d  fw_sb %d  igu_sb %d\n",
4430                    fp_idx, bp, fp->status_blk.e1x_sb, fp->cl_id, fp->fw_sb_id,
4431                    fp->igu_sb_id);
4432         bnx2x_init_sb(bp, fp->status_blk_mapping, BNX2X_VF_ID_INVALID, false,
4433                       fp->fw_sb_id, fp->igu_sb_id);
4434
4435         bnx2x_update_fpsb_idx(fp);
4436 }
4437
4438 void bnx2x_nic_init(struct bnx2x *bp, u32 load_code)
4439 {
4440         int i;
4441
4442         for_each_eth_queue(bp, i)
4443                 bnx2x_init_fp_sb(bp, i);
4444 #ifdef BCM_CNIC
4445         if (!NO_FCOE(bp))
4446                 bnx2x_init_fcoe_fp(bp);
4447
4448         bnx2x_init_sb(bp, bp->cnic_sb_mapping,
4449                       BNX2X_VF_ID_INVALID, false,
4450                       CNIC_SB_ID(bp), CNIC_IGU_SB_ID(bp));
4451
4452 #endif
4453
4454         /* Initialize MOD_ABS interrupts */
4455         bnx2x_init_mod_abs_int(bp, &bp->link_vars, bp->common.chip_id,
4456                                bp->common.shmem_base, bp->common.shmem2_base,
4457                                BP_PORT(bp));
4458         /* ensure status block indices were read */
4459         rmb();
4460
4461         bnx2x_init_def_sb(bp);
4462         bnx2x_update_dsb_idx(bp);
4463         bnx2x_init_rx_rings(bp);
4464         bnx2x_init_tx_rings(bp);
4465         bnx2x_init_sp_ring(bp);
4466         bnx2x_init_eq_ring(bp);
4467         bnx2x_init_internal(bp, load_code);
4468         bnx2x_pf_init(bp);
4469         bnx2x_init_ind_table(bp);
4470         bnx2x_stats_init(bp);
4471
4472         /* flush all before enabling interrupts */
4473         mb();
4474         mmiowb();
4475
4476         bnx2x_int_enable(bp);
4477
4478         /* Check for SPIO5 */
4479         bnx2x_attn_int_deasserted0(bp,
4480                 REG_RD(bp, MISC_REG_AEU_AFTER_INVERT_1_FUNC_0 + BP_PORT(bp)*4) &
4481                                    AEU_INPUTS_ATTN_BITS_SPIO5);
4482 }
4483
4484 /* end of nic init */
4485
4486 /*
4487  * gzip service functions
4488  */
4489
4490 static int bnx2x_gunzip_init(struct bnx2x *bp)
4491 {
4492         bp->gunzip_buf = dma_alloc_coherent(&bp->pdev->dev, FW_BUF_SIZE,
4493                                             &bp->gunzip_mapping, GFP_KERNEL);
4494         if (bp->gunzip_buf  == NULL)
4495                 goto gunzip_nomem1;
4496
4497         bp->strm = kmalloc(sizeof(*bp->strm), GFP_KERNEL);
4498         if (bp->strm  == NULL)
4499                 goto gunzip_nomem2;
4500
4501         bp->strm->workspace = kmalloc(zlib_inflate_workspacesize(),
4502                                       GFP_KERNEL);
4503         if (bp->strm->workspace == NULL)
4504                 goto gunzip_nomem3;
4505
4506         return 0;
4507
4508 gunzip_nomem3:
4509         kfree(bp->strm);
4510         bp->strm = NULL;
4511
4512 gunzip_nomem2:
4513         dma_free_coherent(&bp->pdev->dev, FW_BUF_SIZE, bp->gunzip_buf,
4514                           bp->gunzip_mapping);
4515         bp->gunzip_buf = NULL;
4516
4517 gunzip_nomem1:
4518         netdev_err(bp->dev, "Cannot allocate firmware buffer for"
4519                " un-compression\n");
4520         return -ENOMEM;
4521 }
4522
4523 static void bnx2x_gunzip_end(struct bnx2x *bp)
4524 {
4525         if (bp->strm) {
4526                 kfree(bp->strm->workspace);
4527                 kfree(bp->strm);
4528                 bp->strm = NULL;
4529         }
4530
4531         if (bp->gunzip_buf) {
4532                 dma_free_coherent(&bp->pdev->dev, FW_BUF_SIZE, bp->gunzip_buf,
4533                                   bp->gunzip_mapping);
4534                 bp->gunzip_buf = NULL;
4535         }
4536 }
4537
4538 static int bnx2x_gunzip(struct bnx2x *bp, const u8 *zbuf, int len)
4539 {
4540         int n, rc;
4541
4542         /* check gzip header */
4543         if ((zbuf[0] != 0x1f) || (zbuf[1] != 0x8b) || (zbuf[2] != Z_DEFLATED)) {
4544                 BNX2X_ERR("Bad gzip header\n");
4545                 return -EINVAL;
4546         }
4547
4548         n = 10;
4549
4550 #define FNAME                           0x8
4551
4552         if (zbuf[3] & FNAME)
4553                 while ((zbuf[n++] != 0) && (n < len));
4554
4555         bp->strm->next_in = (typeof(bp->strm->next_in))zbuf + n;
4556         bp->strm->avail_in = len - n;
4557         bp->strm->next_out = bp->gunzip_buf;
4558         bp->strm->avail_out = FW_BUF_SIZE;
4559
4560         rc = zlib_inflateInit2(bp->strm, -MAX_WBITS);
4561         if (rc != Z_OK)
4562                 return rc;
4563
4564         rc = zlib_inflate(bp->strm, Z_FINISH);
4565         if ((rc != Z_OK) && (rc != Z_STREAM_END))
4566                 netdev_err(bp->dev, "Firmware decompression error: %s\n",
4567                            bp->strm->msg);
4568
4569         bp->gunzip_outlen = (FW_BUF_SIZE - bp->strm->avail_out);
4570         if (bp->gunzip_outlen & 0x3)
4571                 netdev_err(bp->dev, "Firmware decompression error:"
4572                                     " gunzip_outlen (%d) not aligned\n",
4573                                 bp->gunzip_outlen);
4574         bp->gunzip_outlen >>= 2;
4575
4576         zlib_inflateEnd(bp->strm);
4577
4578         if (rc == Z_STREAM_END)
4579                 return 0;
4580
4581         return rc;
4582 }
4583
4584 /* nic load/unload */
4585
4586 /*
4587  * General service functions
4588  */
4589
4590 /* send a NIG loopback debug packet */
4591 static void bnx2x_lb_pckt(struct bnx2x *bp)
4592 {
4593         u32 wb_write[3];
4594
4595         /* Ethernet source and destination addresses */
4596         wb_write[0] = 0x55555555;
4597         wb_write[1] = 0x55555555;
4598         wb_write[2] = 0x20;             /* SOP */
4599         REG_WR_DMAE(bp, NIG_REG_DEBUG_PACKET_LB, wb_write, 3);
4600
4601         /* NON-IP protocol */
4602         wb_write[0] = 0x09000000;
4603         wb_write[1] = 0x55555555;
4604         wb_write[2] = 0x10;             /* EOP, eop_bvalid = 0 */
4605         REG_WR_DMAE(bp, NIG_REG_DEBUG_PACKET_LB, wb_write, 3);
4606 }
4607
4608 /* some of the internal memories
4609  * are not directly readable from the driver
4610  * to test them we send debug packets
4611  */
4612 static int bnx2x_int_mem_test(struct bnx2x *bp)
4613 {
4614         int factor;
4615         int count, i;
4616         u32 val = 0;
4617
4618         if (CHIP_REV_IS_FPGA(bp))
4619                 factor = 120;
4620         else if (CHIP_REV_IS_EMUL(bp))
4621                 factor = 200;
4622         else
4623                 factor = 1;
4624
4625         /* Disable inputs of parser neighbor blocks */
4626         REG_WR(bp, TSDM_REG_ENABLE_IN1, 0x0);
4627         REG_WR(bp, TCM_REG_PRS_IFEN, 0x0);
4628         REG_WR(bp, CFC_REG_DEBUG0, 0x1);
4629         REG_WR(bp, NIG_REG_PRS_REQ_IN_EN, 0x0);
4630
4631         /*  Write 0 to parser credits for CFC search request */
4632         REG_WR(bp, PRS_REG_CFC_SEARCH_INITIAL_CREDIT, 0x0);
4633
4634         /* send Ethernet packet */
4635         bnx2x_lb_pckt(bp);
4636
4637         /* TODO do i reset NIG statistic? */
4638         /* Wait until NIG register shows 1 packet of size 0x10 */
4639         count = 1000 * factor;
4640         while (count) {
4641
4642                 bnx2x_read_dmae(bp, NIG_REG_STAT2_BRB_OCTET, 2);
4643                 val = *bnx2x_sp(bp, wb_data[0]);
4644                 if (val == 0x10)
4645                         break;
4646
4647                 msleep(10);
4648                 count--;
4649         }
4650         if (val != 0x10) {
4651                 BNX2X_ERR("NIG timeout  val = 0x%x\n", val);
4652                 return -1;
4653         }
4654
4655         /* Wait until PRS register shows 1 packet */
4656         count = 1000 * factor;
4657         while (count) {
4658                 val = REG_RD(bp, PRS_REG_NUM_OF_PACKETS);
4659                 if (val == 1)
4660                         break;
4661
4662                 msleep(10);
4663                 count--;
4664         }
4665         if (val != 0x1) {
4666                 BNX2X_ERR("PRS timeout val = 0x%x\n", val);
4667                 return -2;
4668         }
4669
4670         /* Reset and init BRB, PRS */
4671         REG_WR(bp, GRCBASE_MISC + MISC_REGISTERS_RESET_REG_1_CLEAR, 0x03);
4672         msleep(50);
4673         REG_WR(bp, GRCBASE_MISC + MISC_REGISTERS_RESET_REG_1_SET, 0x03);
4674         msleep(50);
4675         bnx2x_init_block(bp, BRB1_BLOCK, COMMON_STAGE);
4676         bnx2x_init_block(bp, PRS_BLOCK, COMMON_STAGE);
4677
4678         DP(NETIF_MSG_HW, "part2\n");
4679
4680         /* Disable inputs of parser neighbor blocks */
4681         REG_WR(bp, TSDM_REG_ENABLE_IN1, 0x0);
4682         REG_WR(bp, TCM_REG_PRS_IFEN, 0x0);
4683         REG_WR(bp, CFC_REG_DEBUG0, 0x1);
4684         REG_WR(bp, NIG_REG_PRS_REQ_IN_EN, 0x0);
4685
4686         /* Write 0 to parser credits for CFC search request */
4687         REG_WR(bp, PRS_REG_CFC_SEARCH_INITIAL_CREDIT, 0x0);
4688
4689         /* send 10 Ethernet packets */
4690         for (i = 0; i < 10; i++)
4691                 bnx2x_lb_pckt(bp);
4692
4693         /* Wait until NIG register shows 10 + 1
4694            packets of size 11*0x10 = 0xb0 */
4695         count = 1000 * factor;
4696         while (count) {
4697
4698                 bnx2x_read_dmae(bp, NIG_REG_STAT2_BRB_OCTET, 2);
4699                 val = *bnx2x_sp(bp, wb_data[0]);
4700                 if (val == 0xb0)
4701                         break;
4702
4703                 msleep(10);
4704                 count--;
4705         }
4706         if (val != 0xb0) {
4707                 BNX2X_ERR("NIG timeout  val = 0x%x\n", val);
4708                 return -3;
4709         }
4710
4711         /* Wait until PRS register shows 2 packets */
4712         val = REG_RD(bp, PRS_REG_NUM_OF_PACKETS);
4713         if (val != 2)
4714                 BNX2X_ERR("PRS timeout  val = 0x%x\n", val);
4715
4716         /* Write 1 to parser credits for CFC search request */
4717         REG_WR(bp, PRS_REG_CFC_SEARCH_INITIAL_CREDIT, 0x1);
4718
4719         /* Wait until PRS register shows 3 packets */
4720         msleep(10 * factor);
4721         /* Wait until NIG register shows 1 packet of size 0x10 */
4722         val = REG_RD(bp, PRS_REG_NUM_OF_PACKETS);
4723         if (val != 3)
4724                 BNX2X_ERR("PRS timeout  val = 0x%x\n", val);
4725
4726         /* clear NIG EOP FIFO */
4727         for (i = 0; i < 11; i++)
4728                 REG_RD(bp, NIG_REG_INGRESS_EOP_LB_FIFO);
4729         val = REG_RD(bp, NIG_REG_INGRESS_EOP_LB_EMPTY);
4730         if (val != 1) {
4731                 BNX2X_ERR("clear of NIG failed\n");
4732                 return -4;
4733         }
4734
4735         /* Reset and init BRB, PRS, NIG */
4736         REG_WR(bp, GRCBASE_MISC + MISC_REGISTERS_RESET_REG_1_CLEAR, 0x03);
4737         msleep(50);
4738         REG_WR(bp, GRCBASE_MISC + MISC_REGISTERS_RESET_REG_1_SET, 0x03);
4739         msleep(50);
4740         bnx2x_init_block(bp, BRB1_BLOCK, COMMON_STAGE);
4741         bnx2x_init_block(bp, PRS_BLOCK, COMMON_STAGE);
4742 #ifndef BCM_CNIC
4743         /* set NIC mode */
4744         REG_WR(bp, PRS_REG_NIC_MODE, 1);
4745 #endif
4746
4747         /* Enable inputs of parser neighbor blocks */
4748         REG_WR(bp, TSDM_REG_ENABLE_IN1, 0x7fffffff);
4749         REG_WR(bp, TCM_REG_PRS_IFEN, 0x1);
4750         REG_WR(bp, CFC_REG_DEBUG0, 0x0);
4751         REG_WR(bp, NIG_REG_PRS_REQ_IN_EN, 0x1);
4752
4753         DP(NETIF_MSG_HW, "done\n");
4754
4755         return 0; /* OK */
4756 }
4757
4758 static void bnx2x_enable_blocks_attention(struct bnx2x *bp)
4759 {
4760         REG_WR(bp, PXP_REG_PXP_INT_MASK_0, 0);
4761         if (CHIP_IS_E2(bp))
4762                 REG_WR(bp, PXP_REG_PXP_INT_MASK_1, 0x40);
4763         else
4764                 REG_WR(bp, PXP_REG_PXP_INT_MASK_1, 0);
4765         REG_WR(bp, DORQ_REG_DORQ_INT_MASK, 0);
4766         REG_WR(bp, CFC_REG_CFC_INT_MASK, 0);
4767         /*
4768          * mask read length error interrupts in brb for parser
4769          * (parsing unit and 'checksum and crc' unit)
4770          * these errors are legal (PU reads fixed length and CAC can cause
4771          * read length error on truncated packets)
4772          */
4773         REG_WR(bp, BRB1_REG_BRB1_INT_MASK, 0xFC00);
4774         REG_WR(bp, QM_REG_QM_INT_MASK, 0);
4775         REG_WR(bp, TM_REG_TM_INT_MASK, 0);
4776         REG_WR(bp, XSDM_REG_XSDM_INT_MASK_0, 0);
4777         REG_WR(bp, XSDM_REG_XSDM_INT_MASK_1, 0);
4778         REG_WR(bp, XCM_REG_XCM_INT_MASK, 0);
4779 /*      REG_WR(bp, XSEM_REG_XSEM_INT_MASK_0, 0); */
4780 /*      REG_WR(bp, XSEM_REG_XSEM_INT_MASK_1, 0); */
4781         REG_WR(bp, USDM_REG_USDM_INT_MASK_0, 0);
4782         REG_WR(bp, USDM_REG_USDM_INT_MASK_1, 0);
4783         REG_WR(bp, UCM_REG_UCM_INT_MASK, 0);
4784 /*      REG_WR(bp, USEM_REG_USEM_INT_MASK_0, 0); */
4785 /*      REG_WR(bp, USEM_REG_USEM_INT_MASK_1, 0); */
4786         REG_WR(bp, GRCBASE_UPB + PB_REG_PB_INT_MASK, 0);
4787         REG_WR(bp, CSDM_REG_CSDM_INT_MASK_0, 0);
4788         REG_WR(bp, CSDM_REG_CSDM_INT_MASK_1, 0);
4789         REG_WR(bp, CCM_REG_CCM_INT_MASK, 0);
4790 /*      REG_WR(bp, CSEM_REG_CSEM_INT_MASK_0, 0); */
4791 /*      REG_WR(bp, CSEM_REG_CSEM_INT_MASK_1, 0); */
4792
4793         if (CHIP_REV_IS_FPGA(bp))
4794                 REG_WR(bp, PXP2_REG_PXP2_INT_MASK_0, 0x580000);
4795         else if (CHIP_IS_E2(bp))
4796                 REG_WR(bp, PXP2_REG_PXP2_INT_MASK_0,
4797                            (PXP2_PXP2_INT_MASK_0_REG_PGL_CPL_OF
4798                                 | PXP2_PXP2_INT_MASK_0_REG_PGL_CPL_AFT
4799                                 | PXP2_PXP2_INT_MASK_0_REG_PGL_PCIE_ATTN
4800                                 | PXP2_PXP2_INT_MASK_0_REG_PGL_READ_BLOCKED
4801                                 | PXP2_PXP2_INT_MASK_0_REG_PGL_WRITE_BLOCKED));
4802         else
4803                 REG_WR(bp, PXP2_REG_PXP2_INT_MASK_0, 0x480000);
4804         REG_WR(bp, TSDM_REG_TSDM_INT_MASK_0, 0);
4805         REG_WR(bp, TSDM_REG_TSDM_INT_MASK_1, 0);
4806         REG_WR(bp, TCM_REG_TCM_INT_MASK, 0);
4807 /*      REG_WR(bp, TSEM_REG_TSEM_INT_MASK_0, 0); */
4808 /*      REG_WR(bp, TSEM_REG_TSEM_INT_MASK_1, 0); */
4809         REG_WR(bp, CDU_REG_CDU_INT_MASK, 0);
4810         REG_WR(bp, DMAE_REG_DMAE_INT_MASK, 0);
4811 /*      REG_WR(bp, MISC_REG_MISC_INT_MASK, 0); */
4812         REG_WR(bp, PBF_REG_PBF_INT_MASK, 0x18);         /* bit 3,4 masked */
4813 }
4814
4815 static void bnx2x_reset_common(struct bnx2x *bp)
4816 {
4817         /* reset_common */
4818         REG_WR(bp, GRCBASE_MISC + MISC_REGISTERS_RESET_REG_1_CLEAR,
4819                0xd3ffff7f);
4820         REG_WR(bp, GRCBASE_MISC + MISC_REGISTERS_RESET_REG_2_CLEAR, 0x1403);
4821 }
4822
4823 static void bnx2x_init_pxp(struct bnx2x *bp)
4824 {
4825         u16 devctl;
4826         int r_order, w_order;
4827
4828         pci_read_config_word(bp->pdev,
4829                              bp->pcie_cap + PCI_EXP_DEVCTL, &devctl);
4830         DP(NETIF_MSG_HW, "read 0x%x from devctl\n", devctl);
4831         w_order = ((devctl & PCI_EXP_DEVCTL_PAYLOAD) >> 5);
4832         if (bp->mrrs == -1)
4833                 r_order = ((devctl & PCI_EXP_DEVCTL_READRQ) >> 12);
4834         else {
4835                 DP(NETIF_MSG_HW, "force read order to %d\n", bp->mrrs);
4836                 r_order = bp->mrrs;
4837         }
4838
4839         bnx2x_init_pxp_arb(bp, r_order, w_order);
4840 }
4841
4842 static void bnx2x_setup_fan_failure_detection(struct bnx2x *bp)
4843 {
4844         int is_required;
4845         u32 val;
4846         int port;
4847
4848         if (BP_NOMCP(bp))
4849                 return;
4850
4851         is_required = 0;
4852         val = SHMEM_RD(bp, dev_info.shared_hw_config.config2) &
4853               SHARED_HW_CFG_FAN_FAILURE_MASK;
4854
4855         if (val == SHARED_HW_CFG_FAN_FAILURE_ENABLED)
4856                 is_required = 1;
4857
4858         /*
4859          * The fan failure mechanism is usually related to the PHY type since
4860          * the power consumption of the board is affected by the PHY. Currently,
4861          * fan is required for most designs with SFX7101, BCM8727 and BCM8481.
4862          */
4863         else if (val == SHARED_HW_CFG_FAN_FAILURE_PHY_TYPE)
4864                 for (port = PORT_0; port < PORT_MAX; port++) {
4865                         is_required |=
4866                                 bnx2x_fan_failure_det_req(
4867                                         bp,
4868                                         bp->common.shmem_base,
4869                                         bp->common.shmem2_base,
4870                                         port);
4871                 }
4872
4873         DP(NETIF_MSG_HW, "fan detection setting: %d\n", is_required);
4874
4875         if (is_required == 0)
4876                 return;
4877
4878         /* Fan failure is indicated by SPIO 5 */
4879         bnx2x_set_spio(bp, MISC_REGISTERS_SPIO_5,
4880                        MISC_REGISTERS_SPIO_INPUT_HI_Z);
4881
4882         /* set to active low mode */
4883         val = REG_RD(bp, MISC_REG_SPIO_INT);
4884         val |= ((1 << MISC_REGISTERS_SPIO_5) <<
4885                                         MISC_REGISTERS_SPIO_INT_OLD_SET_POS);
4886         REG_WR(bp, MISC_REG_SPIO_INT, val);
4887
4888         /* enable interrupt to signal the IGU */
4889         val = REG_RD(bp, MISC_REG_SPIO_EVENT_EN);
4890         val |= (1 << MISC_REGISTERS_SPIO_5);
4891         REG_WR(bp, MISC_REG_SPIO_EVENT_EN, val);
4892 }
4893
4894 static void bnx2x_pretend_func(struct bnx2x *bp, u8 pretend_func_num)
4895 {
4896         u32 offset = 0;
4897
4898         if (CHIP_IS_E1(bp))
4899                 return;
4900         if (CHIP_IS_E1H(bp) && (pretend_func_num >= E1H_FUNC_MAX))
4901                 return;
4902
4903         switch (BP_ABS_FUNC(bp)) {
4904         case 0:
4905                 offset = PXP2_REG_PGL_PRETEND_FUNC_F0;
4906                 break;
4907         case 1:
4908                 offset = PXP2_REG_PGL_PRETEND_FUNC_F1;
4909                 break;
4910         case 2:
4911                 offset = PXP2_REG_PGL_PRETEND_FUNC_F2;
4912                 break;
4913         case 3:
4914                 offset = PXP2_REG_PGL_PRETEND_FUNC_F3;
4915                 break;
4916         case 4:
4917                 offset = PXP2_REG_PGL_PRETEND_FUNC_F4;
4918                 break;
4919         case 5:
4920                 offset = PXP2_REG_PGL_PRETEND_FUNC_F5;
4921                 break;
4922         case 6:
4923                 offset = PXP2_REG_PGL_PRETEND_FUNC_F6;
4924                 break;
4925         case 7:
4926                 offset = PXP2_REG_PGL_PRETEND_FUNC_F7;
4927                 break;
4928         default:
4929                 return;
4930         }
4931
4932         REG_WR(bp, offset, pretend_func_num);
4933         REG_RD(bp, offset);
4934         DP(NETIF_MSG_HW, "Pretending to func %d\n", pretend_func_num);
4935 }
4936
4937 static void bnx2x_pf_disable(struct bnx2x *bp)
4938 {
4939         u32 val = REG_RD(bp, IGU_REG_PF_CONFIGURATION);
4940         val &= ~IGU_PF_CONF_FUNC_EN;
4941
4942         REG_WR(bp, IGU_REG_PF_CONFIGURATION, val);
4943         REG_WR(bp, PGLUE_B_REG_INTERNAL_PFID_ENABLE_MASTER, 0);
4944         REG_WR(bp, CFC_REG_WEAK_ENABLE_PF, 0);
4945 }
4946
4947 static int bnx2x_init_hw_common(struct bnx2x *bp, u32 load_code)
4948 {
4949         u32 val, i;
4950
4951         DP(BNX2X_MSG_MCP, "starting common init  func %d\n", BP_ABS_FUNC(bp));
4952
4953         bnx2x_reset_common(bp);
4954         REG_WR(bp, GRCBASE_MISC + MISC_REGISTERS_RESET_REG_1_SET, 0xffffffff);
4955         REG_WR(bp, GRCBASE_MISC + MISC_REGISTERS_RESET_REG_2_SET, 0xfffc);
4956
4957         bnx2x_init_block(bp, MISC_BLOCK, COMMON_STAGE);
4958         if (!CHIP_IS_E1(bp))
4959                 REG_WR(bp, MISC_REG_E1HMF_MODE, IS_MF(bp));
4960
4961         if (CHIP_IS_E2(bp)) {
4962                 u8 fid;
4963
4964                 /**
4965                  * 4-port mode or 2-port mode we need to turn of master-enable
4966                  * for everyone, after that, turn it back on for self.
4967                  * so, we disregard multi-function or not, and always disable
4968                  * for all functions on the given path, this means 0,2,4,6 for
4969                  * path 0 and 1,3,5,7 for path 1
4970                  */
4971                 for (fid = BP_PATH(bp); fid  < E2_FUNC_MAX*2; fid += 2) {
4972                         if (fid == BP_ABS_FUNC(bp)) {
4973                                 REG_WR(bp,
4974                                     PGLUE_B_REG_INTERNAL_PFID_ENABLE_MASTER,
4975                                     1);
4976                                 continue;
4977                         }
4978
4979                         bnx2x_pretend_func(bp, fid);
4980                         /* clear pf enable */
4981                         bnx2x_pf_disable(bp);
4982                         bnx2x_pretend_func(bp, BP_ABS_FUNC(bp));
4983                 }
4984         }
4985
4986         bnx2x_init_block(bp, PXP_BLOCK, COMMON_STAGE);
4987         if (CHIP_IS_E1(bp)) {
4988                 /* enable HW interrupt from PXP on USDM overflow
4989                    bit 16 on INT_MASK_0 */
4990                 REG_WR(bp, PXP_REG_PXP_INT_MASK_0, 0);
4991         }
4992
4993         bnx2x_init_block(bp, PXP2_BLOCK, COMMON_STAGE);
4994         bnx2x_init_pxp(bp);
4995
4996 #ifdef __BIG_ENDIAN
4997         REG_WR(bp, PXP2_REG_RQ_QM_ENDIAN_M, 1);
4998         REG_WR(bp, PXP2_REG_RQ_TM_ENDIAN_M, 1);
4999         REG_WR(bp, PXP2_REG_RQ_SRC_ENDIAN_M, 1);
5000         REG_WR(bp, PXP2_REG_RQ_CDU_ENDIAN_M, 1);
5001         REG_WR(bp, PXP2_REG_RQ_DBG_ENDIAN_M, 1);
5002         /* make sure this value is 0 */
5003         REG_WR(bp, PXP2_REG_RQ_HC_ENDIAN_M, 0);
5004
5005 /*      REG_WR(bp, PXP2_REG_RD_PBF_SWAP_MODE, 1); */
5006         REG_WR(bp, PXP2_REG_RD_QM_SWAP_MODE, 1);
5007         REG_WR(bp, PXP2_REG_RD_TM_SWAP_MODE, 1);
5008         REG_WR(bp, PXP2_REG_RD_SRC_SWAP_MODE, 1);
5009         REG_WR(bp, PXP2_REG_RD_CDURD_SWAP_MODE, 1);
5010 #endif
5011
5012         bnx2x_ilt_init_page_size(bp, INITOP_SET);
5013
5014         if (CHIP_REV_IS_FPGA(bp) && CHIP_IS_E1H(bp))
5015                 REG_WR(bp, PXP2_REG_PGL_TAGS_LIMIT, 0x1);
5016
5017         /* let the HW do it's magic ... */
5018         msleep(100);
5019         /* finish PXP init */
5020         val = REG_RD(bp, PXP2_REG_RQ_CFG_DONE);
5021         if (val != 1) {
5022                 BNX2X_ERR("PXP2 CFG failed\n");
5023                 return -EBUSY;
5024         }
5025         val = REG_RD(bp, PXP2_REG_RD_INIT_DONE);
5026         if (val != 1) {
5027                 BNX2X_ERR("PXP2 RD_INIT failed\n");
5028                 return -EBUSY;
5029         }
5030
5031         /* Timers bug workaround E2 only. We need to set the entire ILT to
5032          * have entries with value "0" and valid bit on.
5033          * This needs to be done by the first PF that is loaded in a path
5034          * (i.e. common phase)
5035          */
5036         if (CHIP_IS_E2(bp)) {
5037                 struct ilt_client_info ilt_cli;
5038                 struct bnx2x_ilt ilt;
5039                 memset(&ilt_cli, 0, sizeof(struct ilt_client_info));
5040                 memset(&ilt, 0, sizeof(struct bnx2x_ilt));
5041
5042                 /* initialize dummy TM client */
5043                 ilt_cli.start = 0;
5044                 ilt_cli.end = ILT_NUM_PAGE_ENTRIES - 1;
5045                 ilt_cli.client_num = ILT_CLIENT_TM;
5046
5047                 /* Step 1: set zeroes to all ilt page entries with valid bit on
5048                  * Step 2: set the timers first/last ilt entry to point
5049                  * to the entire range to prevent ILT range error for 3rd/4th
5050                  * vnic (this code assumes existence of the vnic)
5051                  *
5052                  * both steps performed by call to bnx2x_ilt_client_init_op()
5053                  * with dummy TM client
5054                  *
5055                  * we must use pretend since PXP2_REG_RQ_##blk##_FIRST_ILT
5056                  * and his brother are split registers
5057                  */
5058                 bnx2x_pretend_func(bp, (BP_PATH(bp) + 6));
5059                 bnx2x_ilt_client_init_op_ilt(bp, &ilt, &ilt_cli, INITOP_CLEAR);
5060                 bnx2x_pretend_func(bp, BP_ABS_FUNC(bp));
5061
5062                 REG_WR(bp, PXP2_REG_RQ_DRAM_ALIGN, BNX2X_PXP_DRAM_ALIGN);
5063                 REG_WR(bp, PXP2_REG_RQ_DRAM_ALIGN_RD, BNX2X_PXP_DRAM_ALIGN);
5064                 REG_WR(bp, PXP2_REG_RQ_DRAM_ALIGN_SEL, 1);
5065         }
5066
5067
5068         REG_WR(bp, PXP2_REG_RQ_DISABLE_INPUTS, 0);
5069         REG_WR(bp, PXP2_REG_RD_DISABLE_INPUTS, 0);
5070
5071         if (CHIP_IS_E2(bp)) {
5072                 int factor = CHIP_REV_IS_EMUL(bp) ? 1000 :
5073                                 (CHIP_REV_IS_FPGA(bp) ? 400 : 0);
5074                 bnx2x_init_block(bp, PGLUE_B_BLOCK, COMMON_STAGE);
5075
5076                 bnx2x_init_block(bp, ATC_BLOCK, COMMON_STAGE);
5077
5078                 /* let the HW do it's magic ... */
5079                 do {
5080                         msleep(200);
5081                         val = REG_RD(bp, ATC_REG_ATC_INIT_DONE);
5082                 } while (factor-- && (val != 1));
5083
5084                 if (val != 1) {
5085                         BNX2X_ERR("ATC_INIT failed\n");
5086                         return -EBUSY;
5087                 }
5088         }
5089
5090         bnx2x_init_block(bp, DMAE_BLOCK, COMMON_STAGE);
5091
5092         /* clean the DMAE memory */
5093         bp->dmae_ready = 1;
5094         bnx2x_init_fill(bp, TSEM_REG_PRAM, 0, 8);
5095
5096         bnx2x_init_block(bp, TCM_BLOCK, COMMON_STAGE);
5097         bnx2x_init_block(bp, UCM_BLOCK, COMMON_STAGE);
5098         bnx2x_init_block(bp, CCM_BLOCK, COMMON_STAGE);
5099         bnx2x_init_block(bp, XCM_BLOCK, COMMON_STAGE);
5100
5101         bnx2x_read_dmae(bp, XSEM_REG_PASSIVE_BUFFER, 3);
5102         bnx2x_read_dmae(bp, CSEM_REG_PASSIVE_BUFFER, 3);
5103         bnx2x_read_dmae(bp, TSEM_REG_PASSIVE_BUFFER, 3);
5104         bnx2x_read_dmae(bp, USEM_REG_PASSIVE_BUFFER, 3);
5105
5106         bnx2x_init_block(bp, QM_BLOCK, COMMON_STAGE);
5107
5108         if (CHIP_MODE_IS_4_PORT(bp))
5109                 bnx2x_init_block(bp, QM_4PORT_BLOCK, COMMON_STAGE);
5110
5111         /* QM queues pointers table */
5112         bnx2x_qm_init_ptr_table(bp, bp->qm_cid_count, INITOP_SET);
5113
5114         /* soft reset pulse */
5115         REG_WR(bp, QM_REG_SOFT_RESET, 1);
5116         REG_WR(bp, QM_REG_SOFT_RESET, 0);
5117
5118 #ifdef BCM_CNIC
5119         bnx2x_init_block(bp, TIMERS_BLOCK, COMMON_STAGE);
5120 #endif
5121
5122         bnx2x_init_block(bp, DQ_BLOCK, COMMON_STAGE);
5123         REG_WR(bp, DORQ_REG_DPM_CID_OFST, BNX2X_DB_SHIFT);
5124
5125         if (!CHIP_REV_IS_SLOW(bp)) {
5126                 /* enable hw interrupt from doorbell Q */
5127                 REG_WR(bp, DORQ_REG_DORQ_INT_MASK, 0);
5128         }
5129
5130         bnx2x_init_block(bp, BRB1_BLOCK, COMMON_STAGE);
5131         if (CHIP_MODE_IS_4_PORT(bp)) {
5132                 REG_WR(bp, BRB1_REG_FULL_LB_XOFF_THRESHOLD, 248);
5133                 REG_WR(bp, BRB1_REG_FULL_LB_XON_THRESHOLD, 328);
5134         }
5135
5136         bnx2x_init_block(bp, PRS_BLOCK, COMMON_STAGE);
5137         REG_WR(bp, PRS_REG_A_PRSU_20, 0xf);
5138 #ifndef BCM_CNIC
5139         /* set NIC mode */
5140         REG_WR(bp, PRS_REG_NIC_MODE, 1);
5141 #endif
5142         if (!CHIP_IS_E1(bp))
5143                 REG_WR(bp, PRS_REG_E1HOV_MODE, IS_MF_SD(bp));
5144
5145         if (CHIP_IS_E2(bp)) {
5146                 /* Bit-map indicating which L2 hdrs may appear after the
5147                    basic Ethernet header */
5148                 int has_ovlan = IS_MF_SD(bp);
5149                 REG_WR(bp, PRS_REG_HDRS_AFTER_BASIC, (has_ovlan ? 7 : 6));
5150                 REG_WR(bp, PRS_REG_MUST_HAVE_HDRS, (has_ovlan ? 1 : 0));
5151         }
5152
5153         bnx2x_init_block(bp, TSDM_BLOCK, COMMON_STAGE);
5154         bnx2x_init_block(bp, CSDM_BLOCK, COMMON_STAGE);
5155         bnx2x_init_block(bp, USDM_BLOCK, COMMON_STAGE);
5156         bnx2x_init_block(bp, XSDM_BLOCK, COMMON_STAGE);
5157
5158         bnx2x_init_fill(bp, TSEM_REG_FAST_MEMORY, 0, STORM_INTMEM_SIZE(bp));
5159         bnx2x_init_fill(bp, USEM_REG_FAST_MEMORY, 0, STORM_INTMEM_SIZE(bp));
5160         bnx2x_init_fill(bp, CSEM_REG_FAST_MEMORY, 0, STORM_INTMEM_SIZE(bp));
5161         bnx2x_init_fill(bp, XSEM_REG_FAST_MEMORY, 0, STORM_INTMEM_SIZE(bp));
5162
5163         bnx2x_init_block(bp, TSEM_BLOCK, COMMON_STAGE);
5164         bnx2x_init_block(bp, USEM_BLOCK, COMMON_STAGE);
5165         bnx2x_init_block(bp, CSEM_BLOCK, COMMON_STAGE);
5166         bnx2x_init_block(bp, XSEM_BLOCK, COMMON_STAGE);
5167
5168         if (CHIP_MODE_IS_4_PORT(bp))
5169                 bnx2x_init_block(bp, XSEM_4PORT_BLOCK, COMMON_STAGE);
5170
5171         /* sync semi rtc */
5172         REG_WR(bp, GRCBASE_MISC + MISC_REGISTERS_RESET_REG_1_CLEAR,
5173                0x80000000);
5174         REG_WR(bp, GRCBASE_MISC + MISC_REGISTERS_RESET_REG_1_SET,
5175                0x80000000);
5176
5177         bnx2x_init_block(bp, UPB_BLOCK, COMMON_STAGE);
5178         bnx2x_init_block(bp, XPB_BLOCK, COMMON_STAGE);
5179         bnx2x_init_block(bp, PBF_BLOCK, COMMON_STAGE);
5180
5181         if (CHIP_IS_E2(bp)) {
5182                 int has_ovlan = IS_MF_SD(bp);
5183                 REG_WR(bp, PBF_REG_HDRS_AFTER_BASIC, (has_ovlan ? 7 : 6));
5184                 REG_WR(bp, PBF_REG_MUST_HAVE_HDRS, (has_ovlan ? 1 : 0));
5185         }
5186
5187         REG_WR(bp, SRC_REG_SOFT_RST, 1);
5188         for (i = SRC_REG_KEYRSS0_0; i <= SRC_REG_KEYRSS1_9; i += 4)
5189                 REG_WR(bp, i, random32());
5190
5191         bnx2x_init_block(bp, SRCH_BLOCK, COMMON_STAGE);
5192 #ifdef BCM_CNIC
5193         REG_WR(bp, SRC_REG_KEYSEARCH_0, 0x63285672);
5194         REG_WR(bp, SRC_REG_KEYSEARCH_1, 0x24b8f2cc);
5195         REG_WR(bp, SRC_REG_KEYSEARCH_2, 0x223aef9b);
5196         REG_WR(bp, SRC_REG_KEYSEARCH_3, 0x26001e3a);
5197         REG_WR(bp, SRC_REG_KEYSEARCH_4, 0x7ae91116);
5198         REG_WR(bp, SRC_REG_KEYSEARCH_5, 0x5ce5230b);
5199         REG_WR(bp, SRC_REG_KEYSEARCH_6, 0x298d8adf);
5200         REG_WR(bp, SRC_REG_KEYSEARCH_7, 0x6eb0ff09);
5201         REG_WR(bp, SRC_REG_KEYSEARCH_8, 0x1830f82f);
5202         REG_WR(bp, SRC_REG_KEYSEARCH_9, 0x01e46be7);
5203 #endif
5204         REG_WR(bp, SRC_REG_SOFT_RST, 0);
5205
5206         if (sizeof(union cdu_context) != 1024)
5207                 /* we currently assume that a context is 1024 bytes */
5208                 dev_alert(&bp->pdev->dev, "please adjust the size "
5209                                           "of cdu_context(%ld)\n",
5210                          (long)sizeof(union cdu_context));
5211
5212         bnx2x_init_block(bp, CDU_BLOCK, COMMON_STAGE);
5213         val = (4 << 24) + (0 << 12) + 1024;
5214         REG_WR(bp, CDU_REG_CDU_GLOBAL_PARAMS, val);
5215
5216         bnx2x_init_block(bp, CFC_BLOCK, COMMON_STAGE);
5217         REG_WR(bp, CFC_REG_INIT_REG, 0x7FF);
5218         /* enable context validation interrupt from CFC */
5219         REG_WR(bp, CFC_REG_CFC_INT_MASK, 0);
5220
5221         /* set the thresholds to prevent CFC/CDU race */
5222         REG_WR(bp, CFC_REG_DEBUG0, 0x20020000);
5223
5224         bnx2x_init_block(bp, HC_BLOCK, COMMON_STAGE);
5225
5226         if (CHIP_IS_E2(bp) && BP_NOMCP(bp))
5227                 REG_WR(bp, IGU_REG_RESET_MEMORIES, 0x36);
5228
5229         bnx2x_init_block(bp, IGU_BLOCK, COMMON_STAGE);
5230         bnx2x_init_block(bp, MISC_AEU_BLOCK, COMMON_STAGE);
5231
5232         bnx2x_init_block(bp, PXPCS_BLOCK, COMMON_STAGE);
5233         /* Reset PCIE errors for debug */
5234         REG_WR(bp, 0x2814, 0xffffffff);
5235         REG_WR(bp, 0x3820, 0xffffffff);
5236
5237         if (CHIP_IS_E2(bp)) {
5238                 REG_WR(bp, PCICFG_OFFSET + PXPCS_TL_CONTROL_5,
5239                            (PXPCS_TL_CONTROL_5_ERR_UNSPPORT1 |
5240                                 PXPCS_TL_CONTROL_5_ERR_UNSPPORT));
5241                 REG_WR(bp, PCICFG_OFFSET + PXPCS_TL_FUNC345_STAT,
5242                            (PXPCS_TL_FUNC345_STAT_ERR_UNSPPORT4 |
5243                                 PXPCS_TL_FUNC345_STAT_ERR_UNSPPORT3 |
5244                                 PXPCS_TL_FUNC345_STAT_ERR_UNSPPORT2));
5245                 REG_WR(bp, PCICFG_OFFSET + PXPCS_TL_FUNC678_STAT,
5246                            (PXPCS_TL_FUNC678_STAT_ERR_UNSPPORT7 |
5247                                 PXPCS_TL_FUNC678_STAT_ERR_UNSPPORT6 |
5248                                 PXPCS_TL_FUNC678_STAT_ERR_UNSPPORT5));
5249         }
5250
5251         bnx2x_init_block(bp, EMAC0_BLOCK, COMMON_STAGE);
5252         bnx2x_init_block(bp, EMAC1_BLOCK, COMMON_STAGE);
5253         bnx2x_init_block(bp, DBU_BLOCK, COMMON_STAGE);
5254         bnx2x_init_block(bp, DBG_BLOCK, COMMON_STAGE);
5255
5256         bnx2x_init_block(bp, NIG_BLOCK, COMMON_STAGE);
5257         if (!CHIP_IS_E1(bp)) {
5258                 REG_WR(bp, NIG_REG_LLH_MF_MODE, IS_MF(bp));
5259                 REG_WR(bp, NIG_REG_LLH_E1HOV_MODE, IS_MF_SD(bp));
5260         }
5261         if (CHIP_IS_E2(bp)) {
5262                 /* Bit-map indicating which L2 hdrs may appear after the
5263                    basic Ethernet header */
5264                 REG_WR(bp, NIG_REG_P0_HDRS_AFTER_BASIC, (IS_MF_SD(bp) ? 7 : 6));
5265         }
5266
5267         if (CHIP_REV_IS_SLOW(bp))
5268                 msleep(200);
5269
5270         /* finish CFC init */
5271         val = reg_poll(bp, CFC_REG_LL_INIT_DONE, 1, 100, 10);
5272         if (val != 1) {
5273                 BNX2X_ERR("CFC LL_INIT failed\n");
5274                 return -EBUSY;
5275         }
5276         val = reg_poll(bp, CFC_REG_AC_INIT_DONE, 1, 100, 10);
5277         if (val != 1) {
5278                 BNX2X_ERR("CFC AC_INIT failed\n");
5279                 return -EBUSY;
5280         }
5281         val = reg_poll(bp, CFC_REG_CAM_INIT_DONE, 1, 100, 10);
5282         if (val != 1) {
5283                 BNX2X_ERR("CFC CAM_INIT failed\n");
5284                 return -EBUSY;
5285         }
5286         REG_WR(bp, CFC_REG_DEBUG0, 0);
5287
5288         if (CHIP_IS_E1(bp)) {
5289                 /* read NIG statistic
5290                    to see if this is our first up since powerup */
5291                 bnx2x_read_dmae(bp, NIG_REG_STAT2_BRB_OCTET, 2);
5292                 val = *bnx2x_sp(bp, wb_data[0]);
5293
5294                 /* do internal memory self test */
5295                 if ((val == 0) && bnx2x_int_mem_test(bp)) {
5296                         BNX2X_ERR("internal mem self test failed\n");
5297                         return -EBUSY;
5298                 }
5299         }
5300
5301         bnx2x_setup_fan_failure_detection(bp);
5302
5303         /* clear PXP2 attentions */
5304         REG_RD(bp, PXP2_REG_PXP2_INT_STS_CLR_0);
5305
5306         bnx2x_enable_blocks_attention(bp);
5307         if (CHIP_PARITY_ENABLED(bp))
5308                 bnx2x_enable_blocks_parity(bp);
5309
5310         if (!BP_NOMCP(bp)) {
5311                 /* In E2 2-PORT mode, same ext phy is used for the two paths */
5312                 if ((load_code == FW_MSG_CODE_DRV_LOAD_COMMON_CHIP) ||
5313                     CHIP_IS_E1x(bp)) {
5314                         u32 shmem_base[2], shmem2_base[2];
5315                         shmem_base[0] =  bp->common.shmem_base;
5316                         shmem2_base[0] = bp->common.shmem2_base;
5317                         if (CHIP_IS_E2(bp)) {
5318                                 shmem_base[1] =
5319                                         SHMEM2_RD(bp, other_shmem_base_addr);
5320                                 shmem2_base[1] =
5321                                         SHMEM2_RD(bp, other_shmem2_base_addr);
5322                         }
5323                         bnx2x_acquire_phy_lock(bp);
5324                         bnx2x_common_init_phy(bp, shmem_base, shmem2_base,
5325                                               bp->common.chip_id);
5326                         bnx2x_release_phy_lock(bp);
5327                 }
5328         } else
5329                 BNX2X_ERR("Bootcode is missing - can not initialize link\n");
5330
5331         return 0;
5332 }
5333
5334 static int bnx2x_init_hw_port(struct bnx2x *bp)
5335 {
5336         int port = BP_PORT(bp);
5337         int init_stage = port ? PORT1_STAGE : PORT0_STAGE;
5338         u32 low, high;
5339         u32 val;
5340
5341         DP(BNX2X_MSG_MCP, "starting port init  port %d\n", port);
5342
5343         REG_WR(bp, NIG_REG_MASK_INTERRUPT_PORT0 + port*4, 0);
5344
5345         bnx2x_init_block(bp, PXP_BLOCK, init_stage);
5346         bnx2x_init_block(bp, PXP2_BLOCK, init_stage);
5347
5348         /* Timers bug workaround: disables the pf_master bit in pglue at
5349          * common phase, we need to enable it here before any dmae access are
5350          * attempted. Therefore we manually added the enable-master to the
5351          * port phase (it also happens in the function phase)
5352          */
5353         if (CHIP_IS_E2(bp))
5354                 REG_WR(bp, PGLUE_B_REG_INTERNAL_PFID_ENABLE_MASTER, 1);
5355
5356         bnx2x_init_block(bp, TCM_BLOCK, init_stage);
5357         bnx2x_init_block(bp, UCM_BLOCK, init_stage);
5358         bnx2x_init_block(bp, CCM_BLOCK, init_stage);
5359         bnx2x_init_block(bp, XCM_BLOCK, init_stage);
5360
5361         /* QM cid (connection) count */
5362         bnx2x_qm_init_cid_count(bp, bp->qm_cid_count, INITOP_SET);
5363
5364 #ifdef BCM_CNIC
5365         bnx2x_init_block(bp, TIMERS_BLOCK, init_stage);
5366         REG_WR(bp, TM_REG_LIN0_SCAN_TIME + port*4, 20);
5367         REG_WR(bp, TM_REG_LIN0_MAX_ACTIVE_CID + port*4, 31);
5368 #endif
5369
5370         bnx2x_init_block(bp, DQ_BLOCK, init_stage);
5371
5372         if (CHIP_MODE_IS_4_PORT(bp))
5373                 bnx2x_init_block(bp, QM_4PORT_BLOCK, init_stage);
5374
5375         if (CHIP_IS_E1(bp) || CHIP_IS_E1H(bp)) {
5376                 bnx2x_init_block(bp, BRB1_BLOCK, init_stage);
5377                 if (CHIP_REV_IS_SLOW(bp) && CHIP_IS_E1(bp)) {
5378                         /* no pause for emulation and FPGA */
5379                         low = 0;
5380                         high = 513;
5381                 } else {
5382                         if (IS_MF(bp))
5383                                 low = ((bp->flags & ONE_PORT_FLAG) ? 160 : 246);
5384                         else if (bp->dev->mtu > 4096) {
5385                                 if (bp->flags & ONE_PORT_FLAG)
5386                                         low = 160;
5387                                 else {
5388                                         val = bp->dev->mtu;
5389                                         /* (24*1024 + val*4)/256 */
5390                                         low = 96 + (val/64) +
5391                                                         ((val % 64) ? 1 : 0);
5392                                 }
5393                         } else
5394                                 low = ((bp->flags & ONE_PORT_FLAG) ? 80 : 160);
5395                         high = low + 56;        /* 14*1024/256 */
5396                 }
5397                 REG_WR(bp, BRB1_REG_PAUSE_LOW_THRESHOLD_0 + port*4, low);
5398                 REG_WR(bp, BRB1_REG_PAUSE_HIGH_THRESHOLD_0 + port*4, high);
5399         }
5400
5401         if (CHIP_MODE_IS_4_PORT(bp)) {
5402                 REG_WR(bp, BRB1_REG_PAUSE_0_XOFF_THRESHOLD_0 + port*8, 248);
5403                 REG_WR(bp, BRB1_REG_PAUSE_0_XON_THRESHOLD_0 + port*8, 328);
5404                 REG_WR(bp, (BP_PORT(bp) ? BRB1_REG_MAC_GUARANTIED_1 :
5405                                           BRB1_REG_MAC_GUARANTIED_0), 40);
5406         }
5407
5408         bnx2x_init_block(bp, PRS_BLOCK, init_stage);
5409
5410         bnx2x_init_block(bp, TSDM_BLOCK, init_stage);
5411         bnx2x_init_block(bp, CSDM_BLOCK, init_stage);
5412         bnx2x_init_block(bp, USDM_BLOCK, init_stage);
5413         bnx2x_init_block(bp, XSDM_BLOCK, init_stage);
5414
5415         bnx2x_init_block(bp, TSEM_BLOCK, init_stage);
5416         bnx2x_init_block(bp, USEM_BLOCK, init_stage);
5417         bnx2x_init_block(bp, CSEM_BLOCK, init_stage);
5418         bnx2x_init_block(bp, XSEM_BLOCK, init_stage);
5419         if (CHIP_MODE_IS_4_PORT(bp))
5420                 bnx2x_init_block(bp, XSEM_4PORT_BLOCK, init_stage);
5421
5422         bnx2x_init_block(bp, UPB_BLOCK, init_stage);
5423         bnx2x_init_block(bp, XPB_BLOCK, init_stage);
5424
5425         bnx2x_init_block(bp, PBF_BLOCK, init_stage);
5426
5427         if (!CHIP_IS_E2(bp)) {
5428                 /* configure PBF to work without PAUSE mtu 9000 */
5429                 REG_WR(bp, PBF_REG_P0_PAUSE_ENABLE + port*4, 0);
5430
5431                 /* update threshold */
5432                 REG_WR(bp, PBF_REG_P0_ARB_THRSH + port*4, (9040/16));
5433                 /* update init credit */
5434                 REG_WR(bp, PBF_REG_P0_INIT_CRD + port*4, (9040/16) + 553 - 22);
5435
5436                 /* probe changes */
5437                 REG_WR(bp, PBF_REG_INIT_P0 + port*4, 1);
5438                 udelay(50);
5439                 REG_WR(bp, PBF_REG_INIT_P0 + port*4, 0);
5440         }
5441
5442 #ifdef BCM_CNIC
5443         bnx2x_init_block(bp, SRCH_BLOCK, init_stage);
5444 #endif
5445         bnx2x_init_block(bp, CDU_BLOCK, init_stage);
5446         bnx2x_init_block(bp, CFC_BLOCK, init_stage);
5447
5448         if (CHIP_IS_E1(bp)) {
5449                 REG_WR(bp, HC_REG_LEADING_EDGE_0 + port*8, 0);
5450                 REG_WR(bp, HC_REG_TRAILING_EDGE_0 + port*8, 0);
5451         }
5452         bnx2x_init_block(bp, HC_BLOCK, init_stage);
5453
5454         bnx2x_init_block(bp, IGU_BLOCK, init_stage);
5455
5456         bnx2x_init_block(bp, MISC_AEU_BLOCK, init_stage);
5457         /* init aeu_mask_attn_func_0/1:
5458          *  - SF mode: bits 3-7 are masked. only bits 0-2 are in use
5459          *  - MF mode: bit 3 is masked. bits 0-2 are in use as in SF
5460          *             bits 4-7 are used for "per vn group attention" */
5461         val = IS_MF(bp) ? 0xF7 : 0x7;
5462         /* Enable DCBX attention for all but E1 */
5463         val |= CHIP_IS_E1(bp) ? 0 : 0x10;
5464         REG_WR(bp, MISC_REG_AEU_MASK_ATTN_FUNC_0 + port*4, val);
5465
5466         bnx2x_init_block(bp, PXPCS_BLOCK, init_stage);
5467         bnx2x_init_block(bp, EMAC0_BLOCK, init_stage);
5468         bnx2x_init_block(bp, EMAC1_BLOCK, init_stage);
5469         bnx2x_init_block(bp, DBU_BLOCK, init_stage);
5470         bnx2x_init_block(bp, DBG_BLOCK, init_stage);
5471
5472         bnx2x_init_block(bp, NIG_BLOCK, init_stage);
5473
5474         REG_WR(bp, NIG_REG_XGXS_SERDES0_MODE_SEL + port*4, 1);
5475
5476         if (!CHIP_IS_E1(bp)) {
5477                 /* 0x2 disable mf_ov, 0x1 enable */
5478                 REG_WR(bp, NIG_REG_LLH0_BRB1_DRV_MASK_MF + port*4,
5479                        (IS_MF_SD(bp) ? 0x1 : 0x2));
5480
5481                 if (CHIP_IS_E2(bp)) {
5482                         val = 0;
5483                         switch (bp->mf_mode) {
5484                         case MULTI_FUNCTION_SD:
5485                                 val = 1;
5486                                 break;
5487                         case MULTI_FUNCTION_SI:
5488                                 val = 2;
5489                                 break;
5490                         }
5491
5492                         REG_WR(bp, (BP_PORT(bp) ? NIG_REG_LLH1_CLS_TYPE :
5493                                                   NIG_REG_LLH0_CLS_TYPE), val);
5494                 }
5495                 {
5496                         REG_WR(bp, NIG_REG_LLFC_ENABLE_0 + port*4, 0);
5497                         REG_WR(bp, NIG_REG_LLFC_OUT_EN_0 + port*4, 0);
5498                         REG_WR(bp, NIG_REG_PAUSE_ENABLE_0 + port*4, 1);
5499                 }
5500         }
5501
5502         bnx2x_init_block(bp, MCP_BLOCK, init_stage);
5503         bnx2x_init_block(bp, DMAE_BLOCK, init_stage);
5504         if (bnx2x_fan_failure_det_req(bp, bp->common.shmem_base,
5505                                       bp->common.shmem2_base, port)) {
5506                 u32 reg_addr = (port ? MISC_REG_AEU_ENABLE1_FUNC_1_OUT_0 :
5507                                        MISC_REG_AEU_ENABLE1_FUNC_0_OUT_0);
5508                 val = REG_RD(bp, reg_addr);
5509                 val |= AEU_INPUTS_ATTN_BITS_SPIO5;
5510                 REG_WR(bp, reg_addr, val);
5511         }
5512         bnx2x__link_reset(bp);
5513
5514         return 0;
5515 }
5516
5517 static void bnx2x_ilt_wr(struct bnx2x *bp, u32 index, dma_addr_t addr)
5518 {
5519         int reg;
5520
5521         if (CHIP_IS_E1(bp))
5522                 reg = PXP2_REG_RQ_ONCHIP_AT + index*8;
5523         else
5524                 reg = PXP2_REG_RQ_ONCHIP_AT_B0 + index*8;
5525
5526         bnx2x_wb_wr(bp, reg, ONCHIP_ADDR1(addr), ONCHIP_ADDR2(addr));
5527 }
5528
5529 static inline void bnx2x_igu_clear_sb(struct bnx2x *bp, u8 idu_sb_id)
5530 {
5531         bnx2x_igu_clear_sb_gen(bp, idu_sb_id, true /*PF*/);
5532 }
5533
5534 static inline void bnx2x_clear_func_ilt(struct bnx2x *bp, u32 func)
5535 {
5536         u32 i, base = FUNC_ILT_BASE(func);
5537         for (i = base; i < base + ILT_PER_FUNC; i++)
5538                 bnx2x_ilt_wr(bp, i, 0);
5539 }
5540
5541 static int bnx2x_init_hw_func(struct bnx2x *bp)
5542 {
5543         int port = BP_PORT(bp);
5544         int func = BP_FUNC(bp);
5545         struct bnx2x_ilt *ilt = BP_ILT(bp);
5546         u16 cdu_ilt_start;
5547         u32 addr, val;
5548         u32 main_mem_base, main_mem_size, main_mem_prty_clr;
5549         int i, main_mem_width;
5550
5551         DP(BNX2X_MSG_MCP, "starting func init  func %d\n", func);
5552
5553         /* set MSI reconfigure capability */
5554         if (bp->common.int_block == INT_BLOCK_HC) {
5555                 addr = (port ? HC_REG_CONFIG_1 : HC_REG_CONFIG_0);
5556                 val = REG_RD(bp, addr);
5557                 val |= HC_CONFIG_0_REG_MSI_ATTN_EN_0;
5558                 REG_WR(bp, addr, val);
5559         }
5560
5561         ilt = BP_ILT(bp);
5562         cdu_ilt_start = ilt->clients[ILT_CLIENT_CDU].start;
5563
5564         for (i = 0; i < L2_ILT_LINES(bp); i++) {
5565                 ilt->lines[cdu_ilt_start + i].page =
5566                         bp->context.vcxt + (ILT_PAGE_CIDS * i);
5567                 ilt->lines[cdu_ilt_start + i].page_mapping =
5568                         bp->context.cxt_mapping + (CDU_ILT_PAGE_SZ * i);
5569                 /* cdu ilt pages are allocated manually so there's no need to
5570                 set the size */
5571         }
5572         bnx2x_ilt_init_op(bp, INITOP_SET);
5573
5574 #ifdef BCM_CNIC
5575         bnx2x_src_init_t2(bp, bp->t2, bp->t2_mapping, SRC_CONN_NUM);
5576
5577         /* T1 hash bits value determines the T1 number of entries */
5578         REG_WR(bp, SRC_REG_NUMBER_HASH_BITS0 + port*4, SRC_HASH_BITS);
5579 #endif
5580
5581 #ifndef BCM_CNIC
5582         /* set NIC mode */
5583         REG_WR(bp, PRS_REG_NIC_MODE, 1);
5584 #endif  /* BCM_CNIC */
5585
5586         if (CHIP_IS_E2(bp)) {
5587                 u32 pf_conf = IGU_PF_CONF_FUNC_EN;
5588
5589                 /* Turn on a single ISR mode in IGU if driver is going to use
5590                  * INT#x or MSI
5591                  */
5592                 if (!(bp->flags & USING_MSIX_FLAG))
5593                         pf_conf |= IGU_PF_CONF_SINGLE_ISR_EN;
5594                 /*
5595                  * Timers workaround bug: function init part.
5596                  * Need to wait 20msec after initializing ILT,
5597                  * needed to make sure there are no requests in
5598                  * one of the PXP internal queues with "old" ILT addresses
5599                  */
5600                 msleep(20);
5601                 /*
5602                  * Master enable - Due to WB DMAE writes performed before this
5603                  * register is re-initialized as part of the regular function
5604                  * init
5605                  */
5606                 REG_WR(bp, PGLUE_B_REG_INTERNAL_PFID_ENABLE_MASTER, 1);
5607                 /* Enable the function in IGU */
5608                 REG_WR(bp, IGU_REG_PF_CONFIGURATION, pf_conf);
5609         }
5610
5611         bp->dmae_ready = 1;
5612
5613         bnx2x_init_block(bp, PGLUE_B_BLOCK, FUNC0_STAGE + func);
5614
5615         if (CHIP_IS_E2(bp))
5616                 REG_WR(bp, PGLUE_B_REG_WAS_ERROR_PF_7_0_CLR, func);
5617
5618         bnx2x_init_block(bp, MISC_BLOCK, FUNC0_STAGE + func);
5619         bnx2x_init_block(bp, TCM_BLOCK, FUNC0_STAGE + func);
5620         bnx2x_init_block(bp, UCM_BLOCK, FUNC0_STAGE + func);
5621         bnx2x_init_block(bp, CCM_BLOCK, FUNC0_STAGE + func);
5622         bnx2x_init_block(bp, XCM_BLOCK, FUNC0_STAGE + func);
5623         bnx2x_init_block(bp, TSEM_BLOCK, FUNC0_STAGE + func);
5624         bnx2x_init_block(bp, USEM_BLOCK, FUNC0_STAGE + func);
5625         bnx2x_init_block(bp, CSEM_BLOCK, FUNC0_STAGE + func);
5626         bnx2x_init_block(bp, XSEM_BLOCK, FUNC0_STAGE + func);
5627
5628         if (CHIP_IS_E2(bp)) {
5629                 REG_WR(bp, BAR_XSTRORM_INTMEM + XSTORM_PATH_ID_OFFSET,
5630                                                                 BP_PATH(bp));
5631                 REG_WR(bp, BAR_CSTRORM_INTMEM + CSTORM_PATH_ID_OFFSET,
5632                                                                 BP_PATH(bp));
5633         }
5634
5635         if (CHIP_MODE_IS_4_PORT(bp))
5636                 bnx2x_init_block(bp, XSEM_4PORT_BLOCK, FUNC0_STAGE + func);
5637
5638         if (CHIP_IS_E2(bp))
5639                 REG_WR(bp, QM_REG_PF_EN, 1);
5640
5641         bnx2x_init_block(bp, QM_BLOCK, FUNC0_STAGE + func);
5642
5643         if (CHIP_MODE_IS_4_PORT(bp))
5644                 bnx2x_init_block(bp, QM_4PORT_BLOCK, FUNC0_STAGE + func);
5645
5646         bnx2x_init_block(bp, TIMERS_BLOCK, FUNC0_STAGE + func);
5647         bnx2x_init_block(bp, DQ_BLOCK, FUNC0_STAGE + func);
5648         bnx2x_init_block(bp, BRB1_BLOCK, FUNC0_STAGE + func);
5649         bnx2x_init_block(bp, PRS_BLOCK, FUNC0_STAGE + func);
5650         bnx2x_init_block(bp, TSDM_BLOCK, FUNC0_STAGE + func);
5651         bnx2x_init_block(bp, CSDM_BLOCK, FUNC0_STAGE + func);
5652         bnx2x_init_block(bp, USDM_BLOCK, FUNC0_STAGE + func);
5653         bnx2x_init_block(bp, XSDM_BLOCK, FUNC0_STAGE + func);
5654         bnx2x_init_block(bp, UPB_BLOCK, FUNC0_STAGE + func);
5655         bnx2x_init_block(bp, XPB_BLOCK, FUNC0_STAGE + func);
5656         bnx2x_init_block(bp, PBF_BLOCK, FUNC0_STAGE + func);
5657         if (CHIP_IS_E2(bp))
5658                 REG_WR(bp, PBF_REG_DISABLE_PF, 0);
5659
5660         bnx2x_init_block(bp, CDU_BLOCK, FUNC0_STAGE + func);
5661
5662         bnx2x_init_block(bp, CFC_BLOCK, FUNC0_STAGE + func);
5663
5664         if (CHIP_IS_E2(bp))
5665                 REG_WR(bp, CFC_REG_WEAK_ENABLE_PF, 1);
5666
5667         if (IS_MF(bp)) {
5668                 REG_WR(bp, NIG_REG_LLH0_FUNC_EN + port*8, 1);
5669                 REG_WR(bp, NIG_REG_LLH0_FUNC_VLAN_ID + port*8, bp->mf_ov);
5670         }
5671
5672         bnx2x_init_block(bp, MISC_AEU_BLOCK, FUNC0_STAGE + func);
5673
5674         /* HC init per function */
5675         if (bp->common.int_block == INT_BLOCK_HC) {
5676                 if (CHIP_IS_E1H(bp)) {
5677                         REG_WR(bp, MISC_REG_AEU_GENERAL_ATTN_12 + func*4, 0);
5678
5679                         REG_WR(bp, HC_REG_LEADING_EDGE_0 + port*8, 0);
5680                         REG_WR(bp, HC_REG_TRAILING_EDGE_0 + port*8, 0);
5681                 }
5682                 bnx2x_init_block(bp, HC_BLOCK, FUNC0_STAGE + func);
5683
5684         } else {
5685                 int num_segs, sb_idx, prod_offset;
5686
5687                 REG_WR(bp, MISC_REG_AEU_GENERAL_ATTN_12 + func*4, 0);
5688
5689                 if (CHIP_IS_E2(bp)) {
5690                         REG_WR(bp, IGU_REG_LEADING_EDGE_LATCH, 0);
5691                         REG_WR(bp, IGU_REG_TRAILING_EDGE_LATCH, 0);
5692                 }
5693
5694                 bnx2x_init_block(bp, IGU_BLOCK, FUNC0_STAGE + func);
5695
5696                 if (CHIP_IS_E2(bp)) {
5697                         int dsb_idx = 0;
5698                         /**
5699                          * Producer memory:
5700                          * E2 mode: address 0-135 match to the mapping memory;
5701                          * 136 - PF0 default prod; 137 - PF1 default prod;
5702                          * 138 - PF2 default prod; 139 - PF3 default prod;
5703                          * 140 - PF0 attn prod;    141 - PF1 attn prod;
5704                          * 142 - PF2 attn prod;    143 - PF3 attn prod;
5705                          * 144-147 reserved.
5706                          *
5707                          * E1.5 mode - In backward compatible mode;
5708                          * for non default SB; each even line in the memory
5709                          * holds the U producer and each odd line hold
5710                          * the C producer. The first 128 producers are for
5711                          * NDSB (PF0 - 0-31; PF1 - 32-63 and so on). The last 20
5712                          * producers are for the DSB for each PF.
5713                          * Each PF has five segments: (the order inside each
5714                          * segment is PF0; PF1; PF2; PF3) - 128-131 U prods;
5715                          * 132-135 C prods; 136-139 X prods; 140-143 T prods;
5716                          * 144-147 attn prods;
5717                          */
5718                         /* non-default-status-blocks */
5719                         num_segs = CHIP_INT_MODE_IS_BC(bp) ?
5720                                 IGU_BC_NDSB_NUM_SEGS : IGU_NORM_NDSB_NUM_SEGS;
5721                         for (sb_idx = 0; sb_idx < bp->igu_sb_cnt; sb_idx++) {
5722                                 prod_offset = (bp->igu_base_sb + sb_idx) *
5723                                         num_segs;
5724
5725                                 for (i = 0; i < num_segs; i++) {
5726                                         addr = IGU_REG_PROD_CONS_MEMORY +
5727                                                         (prod_offset + i) * 4;
5728                                         REG_WR(bp, addr, 0);
5729                                 }
5730                                 /* send consumer update with value 0 */
5731                                 bnx2x_ack_sb(bp, bp->igu_base_sb + sb_idx,
5732                                              USTORM_ID, 0, IGU_INT_NOP, 1);
5733                                 bnx2x_igu_clear_sb(bp,
5734                                                    bp->igu_base_sb + sb_idx);
5735                         }
5736
5737                         /* default-status-blocks */
5738                         num_segs = CHIP_INT_MODE_IS_BC(bp) ?
5739                                 IGU_BC_DSB_NUM_SEGS : IGU_NORM_DSB_NUM_SEGS;
5740
5741                         if (CHIP_MODE_IS_4_PORT(bp))
5742                                 dsb_idx = BP_FUNC(bp);
5743                         else
5744                                 dsb_idx = BP_E1HVN(bp);
5745
5746                         prod_offset = (CHIP_INT_MODE_IS_BC(bp) ?
5747                                        IGU_BC_BASE_DSB_PROD + dsb_idx :
5748                                        IGU_NORM_BASE_DSB_PROD + dsb_idx);
5749
5750                         for (i = 0; i < (num_segs * E1HVN_MAX);
5751                              i += E1HVN_MAX) {
5752                                 addr = IGU_REG_PROD_CONS_MEMORY +
5753                                                         (prod_offset + i)*4;
5754                                 REG_WR(bp, addr, 0);
5755                         }
5756                         /* send consumer update with 0 */
5757                         if (CHIP_INT_MODE_IS_BC(bp)) {
5758                                 bnx2x_ack_sb(bp, bp->igu_dsb_id,
5759                                              USTORM_ID, 0, IGU_INT_NOP, 1);
5760                                 bnx2x_ack_sb(bp, bp->igu_dsb_id,
5761                                              CSTORM_ID, 0, IGU_INT_NOP, 1);
5762                                 bnx2x_ack_sb(bp, bp->igu_dsb_id,
5763                                              XSTORM_ID, 0, IGU_INT_NOP, 1);
5764                                 bnx2x_ack_sb(bp, bp->igu_dsb_id,
5765                                              TSTORM_ID, 0, IGU_INT_NOP, 1);
5766                                 bnx2x_ack_sb(bp, bp->igu_dsb_id,
5767                                              ATTENTION_ID, 0, IGU_INT_NOP, 1);
5768                         } else {
5769                                 bnx2x_ack_sb(bp, bp->igu_dsb_id,
5770                                              USTORM_ID, 0, IGU_INT_NOP, 1);
5771                                 bnx2x_ack_sb(bp, bp->igu_dsb_id,
5772                                              ATTENTION_ID, 0, IGU_INT_NOP, 1);
5773                         }
5774                         bnx2x_igu_clear_sb(bp, bp->igu_dsb_id);
5775
5776                         /* !!! these should become driver const once
5777                            rf-tool supports split-68 const */
5778                         REG_WR(bp, IGU_REG_SB_INT_BEFORE_MASK_LSB, 0);
5779                         REG_WR(bp, IGU_REG_SB_INT_BEFORE_MASK_MSB, 0);
5780                         REG_WR(bp, IGU_REG_SB_MASK_LSB, 0);
5781                         REG_WR(bp, IGU_REG_SB_MASK_MSB, 0);
5782                         REG_WR(bp, IGU_REG_PBA_STATUS_LSB, 0);
5783                         REG_WR(bp, IGU_REG_PBA_STATUS_MSB, 0);
5784                 }
5785         }
5786
5787         /* Reset PCIE errors for debug */
5788         REG_WR(bp, 0x2114, 0xffffffff);
5789         REG_WR(bp, 0x2120, 0xffffffff);
5790
5791         bnx2x_init_block(bp, EMAC0_BLOCK, FUNC0_STAGE + func);
5792         bnx2x_init_block(bp, EMAC1_BLOCK, FUNC0_STAGE + func);
5793         bnx2x_init_block(bp, DBU_BLOCK, FUNC0_STAGE + func);
5794         bnx2x_init_block(bp, DBG_BLOCK, FUNC0_STAGE + func);
5795         bnx2x_init_block(bp, MCP_BLOCK, FUNC0_STAGE + func);
5796         bnx2x_init_block(bp, DMAE_BLOCK, FUNC0_STAGE + func);
5797
5798         if (CHIP_IS_E1x(bp)) {
5799                 main_mem_size = HC_REG_MAIN_MEMORY_SIZE / 2; /*dwords*/
5800                 main_mem_base = HC_REG_MAIN_MEMORY +
5801                                 BP_PORT(bp) * (main_mem_size * 4);
5802                 main_mem_prty_clr = HC_REG_HC_PRTY_STS_CLR;
5803                 main_mem_width = 8;
5804
5805                 val = REG_RD(bp, main_mem_prty_clr);
5806                 if (val)
5807                         DP(BNX2X_MSG_MCP, "Hmmm... Parity errors in HC "
5808                                           "block during "
5809                                           "function init (0x%x)!\n", val);
5810
5811                 /* Clear "false" parity errors in MSI-X table */
5812                 for (i = main_mem_base;
5813                      i < main_mem_base + main_mem_size * 4;
5814                      i += main_mem_width) {
5815                         bnx2x_read_dmae(bp, i, main_mem_width / 4);
5816                         bnx2x_write_dmae(bp, bnx2x_sp_mapping(bp, wb_data),
5817                                          i, main_mem_width / 4);
5818                 }
5819                 /* Clear HC parity attention */
5820                 REG_RD(bp, main_mem_prty_clr);
5821         }
5822
5823         bnx2x_phy_probe(&bp->link_params);
5824
5825         return 0;
5826 }
5827
5828 int bnx2x_init_hw(struct bnx2x *bp, u32 load_code)
5829 {
5830         int rc = 0;
5831
5832         DP(BNX2X_MSG_MCP, "function %d  load_code %x\n",
5833            BP_ABS_FUNC(bp), load_code);
5834
5835         bp->dmae_ready = 0;
5836         spin_lock_init(&bp->dmae_lock);
5837
5838         switch (load_code) {
5839         case FW_MSG_CODE_DRV_LOAD_COMMON:
5840         case FW_MSG_CODE_DRV_LOAD_COMMON_CHIP:
5841                 rc = bnx2x_init_hw_common(bp, load_code);
5842                 if (rc)
5843                         goto init_hw_err;
5844                 /* no break */
5845
5846         case FW_MSG_CODE_DRV_LOAD_PORT:
5847                 rc = bnx2x_init_hw_port(bp);
5848                 if (rc)
5849                         goto init_hw_err;
5850                 /* no break */
5851
5852         case FW_MSG_CODE_DRV_LOAD_FUNCTION:
5853                 rc = bnx2x_init_hw_func(bp);