diff options
Diffstat (limited to 'drivers/net/bnx2x/bnx2x_main.c')
-rw-r--r-- | drivers/net/bnx2x/bnx2x_main.c | 162 |
1 files changed, 115 insertions, 47 deletions
diff --git a/drivers/net/bnx2x/bnx2x_main.c b/drivers/net/bnx2x/bnx2x_main.c index f74582a22c68..c027e9341a1a 100644 --- a/drivers/net/bnx2x/bnx2x_main.c +++ b/drivers/net/bnx2x/bnx2x_main.c | |||
@@ -407,8 +407,8 @@ u32 bnx2x_dmae_opcode(struct bnx2x *bp, u8 src_type, u8 dst_type, | |||
407 | opcode |= (DMAE_CMD_SRC_RESET | DMAE_CMD_DST_RESET); | 407 | opcode |= (DMAE_CMD_SRC_RESET | DMAE_CMD_DST_RESET); |
408 | 408 | ||
409 | opcode |= (BP_PORT(bp) ? DMAE_CMD_PORT_1 : DMAE_CMD_PORT_0); | 409 | opcode |= (BP_PORT(bp) ? DMAE_CMD_PORT_1 : DMAE_CMD_PORT_0); |
410 | opcode |= ((BP_E1HVN(bp) << DMAE_CMD_E1HVN_SHIFT) | | 410 | opcode |= ((BP_VN(bp) << DMAE_CMD_E1HVN_SHIFT) | |
411 | (BP_E1HVN(bp) << DMAE_COMMAND_DST_VN_SHIFT)); | 411 | (BP_VN(bp) << DMAE_COMMAND_DST_VN_SHIFT)); |
412 | opcode |= (DMAE_COM_SET_ERR << DMAE_COMMAND_ERR_POLICY_SHIFT); | 412 | opcode |= (DMAE_COM_SET_ERR << DMAE_COMMAND_ERR_POLICY_SHIFT); |
413 | 413 | ||
414 | #ifdef __BIG_ENDIAN | 414 | #ifdef __BIG_ENDIAN |
@@ -1419,7 +1419,7 @@ static void bnx2x_hc_int_enable(struct bnx2x *bp) | |||
1419 | if (!CHIP_IS_E1(bp)) { | 1419 | if (!CHIP_IS_E1(bp)) { |
1420 | /* init leading/trailing edge */ | 1420 | /* init leading/trailing edge */ |
1421 | if (IS_MF(bp)) { | 1421 | if (IS_MF(bp)) { |
1422 | val = (0xee0f | (1 << (BP_E1HVN(bp) + 4))); | 1422 | val = (0xee0f | (1 << (BP_VN(bp) + 4))); |
1423 | if (bp->port.pmf) | 1423 | if (bp->port.pmf) |
1424 | /* enable nig and gpio3 attention */ | 1424 | /* enable nig and gpio3 attention */ |
1425 | val |= 0x1100; | 1425 | val |= 0x1100; |
@@ -1471,7 +1471,7 @@ static void bnx2x_igu_int_enable(struct bnx2x *bp) | |||
1471 | 1471 | ||
1472 | /* init leading/trailing edge */ | 1472 | /* init leading/trailing edge */ |
1473 | if (IS_MF(bp)) { | 1473 | if (IS_MF(bp)) { |
1474 | val = (0xee0f | (1 << (BP_E1HVN(bp) + 4))); | 1474 | val = (0xee0f | (1 << (BP_VN(bp) + 4))); |
1475 | if (bp->port.pmf) | 1475 | if (bp->port.pmf) |
1476 | /* enable nig and gpio3 attention */ | 1476 | /* enable nig and gpio3 attention */ |
1477 | val |= 0x1100; | 1477 | val |= 0x1100; |
@@ -2287,7 +2287,7 @@ static void bnx2x_calc_vn_weight_sum(struct bnx2x *bp) | |||
2287 | int vn; | 2287 | int vn; |
2288 | 2288 | ||
2289 | bp->vn_weight_sum = 0; | 2289 | bp->vn_weight_sum = 0; |
2290 | for (vn = VN_0; vn < E1HVN_MAX; vn++) { | 2290 | for (vn = VN_0; vn < BP_MAX_VN_NUM(bp); vn++) { |
2291 | u32 vn_cfg = bp->mf_config[vn]; | 2291 | u32 vn_cfg = bp->mf_config[vn]; |
2292 | u32 vn_min_rate = ((vn_cfg & FUNC_MF_CFG_MIN_BW_MASK) >> | 2292 | u32 vn_min_rate = ((vn_cfg & FUNC_MF_CFG_MIN_BW_MASK) >> |
2293 | FUNC_MF_CFG_MIN_BW_SHIFT) * 100; | 2293 | FUNC_MF_CFG_MIN_BW_SHIFT) * 100; |
@@ -2320,12 +2320,18 @@ static void bnx2x_calc_vn_weight_sum(struct bnx2x *bp) | |||
2320 | CMNG_FLAGS_PER_PORT_FAIRNESS_VN; | 2320 | CMNG_FLAGS_PER_PORT_FAIRNESS_VN; |
2321 | } | 2321 | } |
2322 | 2322 | ||
2323 | /* returns func by VN for current port */ | ||
2324 | static inline int func_by_vn(struct bnx2x *bp, int vn) | ||
2325 | { | ||
2326 | return 2 * vn + BP_PORT(bp); | ||
2327 | } | ||
2328 | |||
2323 | static void bnx2x_init_vn_minmax(struct bnx2x *bp, int vn) | 2329 | static void bnx2x_init_vn_minmax(struct bnx2x *bp, int vn) |
2324 | { | 2330 | { |
2325 | struct rate_shaping_vars_per_vn m_rs_vn; | 2331 | struct rate_shaping_vars_per_vn m_rs_vn; |
2326 | struct fairness_vars_per_vn m_fair_vn; | 2332 | struct fairness_vars_per_vn m_fair_vn; |
2327 | u32 vn_cfg = bp->mf_config[vn]; | 2333 | u32 vn_cfg = bp->mf_config[vn]; |
2328 | int func = 2*vn + BP_PORT(bp); | 2334 | int func = func_by_vn(bp, vn); |
2329 | u16 vn_min_rate, vn_max_rate; | 2335 | u16 vn_min_rate, vn_max_rate; |
2330 | int i; | 2336 | int i; |
2331 | 2337 | ||
@@ -2422,7 +2428,7 @@ void bnx2x_read_mf_cfg(struct bnx2x *bp) | |||
2422 | * | 2428 | * |
2423 | * and there are 2 functions per port | 2429 | * and there are 2 functions per port |
2424 | */ | 2430 | */ |
2425 | for (vn = VN_0; vn < E1HVN_MAX; vn++) { | 2431 | for (vn = VN_0; vn < BP_MAX_VN_NUM(bp); vn++) { |
2426 | int /*abs*/func = n * (2 * vn + BP_PORT(bp)) + BP_PATH(bp); | 2432 | int /*abs*/func = n * (2 * vn + BP_PORT(bp)) + BP_PATH(bp); |
2427 | 2433 | ||
2428 | if (func >= E1H_FUNC_MAX) | 2434 | if (func >= E1H_FUNC_MAX) |
@@ -2454,7 +2460,7 @@ static void bnx2x_cmng_fns_init(struct bnx2x *bp, u8 read_cfg, u8 cmng_type) | |||
2454 | 2460 | ||
2455 | /* calculate and set min-max rate for each vn */ | 2461 | /* calculate and set min-max rate for each vn */ |
2456 | if (bp->port.pmf) | 2462 | if (bp->port.pmf) |
2457 | for (vn = VN_0; vn < E1HVN_MAX; vn++) | 2463 | for (vn = VN_0; vn < BP_MAX_VN_NUM(bp); vn++) |
2458 | bnx2x_init_vn_minmax(bp, vn); | 2464 | bnx2x_init_vn_minmax(bp, vn); |
2459 | 2465 | ||
2460 | /* always enable rate shaping and fairness */ | 2466 | /* always enable rate shaping and fairness */ |
@@ -2473,16 +2479,15 @@ static void bnx2x_cmng_fns_init(struct bnx2x *bp, u8 read_cfg, u8 cmng_type) | |||
2473 | 2479 | ||
2474 | static inline void bnx2x_link_sync_notify(struct bnx2x *bp) | 2480 | static inline void bnx2x_link_sync_notify(struct bnx2x *bp) |
2475 | { | 2481 | { |
2476 | int port = BP_PORT(bp); | ||
2477 | int func; | 2482 | int func; |
2478 | int vn; | 2483 | int vn; |
2479 | 2484 | ||
2480 | /* Set the attention towards other drivers on the same port */ | 2485 | /* Set the attention towards other drivers on the same port */ |
2481 | for (vn = VN_0; vn < E1HVN_MAX; vn++) { | 2486 | for (vn = VN_0; vn < BP_MAX_VN_NUM(bp); vn++) { |
2482 | if (vn == BP_E1HVN(bp)) | 2487 | if (vn == BP_VN(bp)) |
2483 | continue; | 2488 | continue; |
2484 | 2489 | ||
2485 | func = ((vn << 1) | port); | 2490 | func = func_by_vn(bp, vn); |
2486 | REG_WR(bp, MISC_REG_AEU_GENERAL_ATTN_0 + | 2491 | REG_WR(bp, MISC_REG_AEU_GENERAL_ATTN_0 + |
2487 | (LINK_SYNC_ATTENTION_BIT_FUNC_0 + func)*4, 1); | 2492 | (LINK_SYNC_ATTENTION_BIT_FUNC_0 + func)*4, 1); |
2488 | } | 2493 | } |
@@ -2577,7 +2582,7 @@ static void bnx2x_pmf_update(struct bnx2x *bp) | |||
2577 | bnx2x_dcbx_pmf_update(bp); | 2582 | bnx2x_dcbx_pmf_update(bp); |
2578 | 2583 | ||
2579 | /* enable nig attention */ | 2584 | /* enable nig attention */ |
2580 | val = (0xff0f | (1 << (BP_E1HVN(bp) + 4))); | 2585 | val = (0xff0f | (1 << (BP_VN(bp) + 4))); |
2581 | if (bp->common.int_block == INT_BLOCK_HC) { | 2586 | if (bp->common.int_block == INT_BLOCK_HC) { |
2582 | REG_WR(bp, HC_REG_TRAILING_EDGE_0 + port*8, val); | 2587 | REG_WR(bp, HC_REG_TRAILING_EDGE_0 + port*8, val); |
2583 | REG_WR(bp, HC_REG_LEADING_EDGE_0 + port*8, val); | 2588 | REG_WR(bp, HC_REG_LEADING_EDGE_0 + port*8, val); |
@@ -2756,8 +2761,14 @@ static void bnx2x_pf_rx_q_prep(struct bnx2x *bp, | |||
2756 | u16 tpa_agg_size = 0; | 2761 | u16 tpa_agg_size = 0; |
2757 | 2762 | ||
2758 | if (!fp->disable_tpa) { | 2763 | if (!fp->disable_tpa) { |
2759 | pause->sge_th_hi = 250; | 2764 | pause->sge_th_lo = SGE_TH_LO(bp); |
2760 | pause->sge_th_lo = 150; | 2765 | pause->sge_th_hi = SGE_TH_HI(bp); |
2766 | |||
2767 | /* validate SGE ring has enough to cross high threshold */ | ||
2768 | WARN_ON(bp->dropless_fc && | ||
2769 | pause->sge_th_hi + FW_PREFETCH_CNT > | ||
2770 | MAX_RX_SGE_CNT * NUM_RX_SGE_PAGES); | ||
2771 | |||
2761 | tpa_agg_size = min_t(u32, | 2772 | tpa_agg_size = min_t(u32, |
2762 | (min_t(u32, 8, MAX_SKB_FRAGS) * | 2773 | (min_t(u32, 8, MAX_SKB_FRAGS) * |
2763 | SGE_PAGE_SIZE * PAGES_PER_SGE), 0xffff); | 2774 | SGE_PAGE_SIZE * PAGES_PER_SGE), 0xffff); |
@@ -2771,10 +2782,21 @@ static void bnx2x_pf_rx_q_prep(struct bnx2x *bp, | |||
2771 | 2782 | ||
2772 | /* pause - not for e1 */ | 2783 | /* pause - not for e1 */ |
2773 | if (!CHIP_IS_E1(bp)) { | 2784 | if (!CHIP_IS_E1(bp)) { |
2774 | pause->bd_th_hi = 350; | 2785 | pause->bd_th_lo = BD_TH_LO(bp); |
2775 | pause->bd_th_lo = 250; | 2786 | pause->bd_th_hi = BD_TH_HI(bp); |
2776 | pause->rcq_th_hi = 350; | 2787 | |
2777 | pause->rcq_th_lo = 250; | 2788 | pause->rcq_th_lo = RCQ_TH_LO(bp); |
2789 | pause->rcq_th_hi = RCQ_TH_HI(bp); | ||
2790 | /* | ||
2791 | * validate that rings have enough entries to cross | ||
2792 | * high thresholds | ||
2793 | */ | ||
2794 | WARN_ON(bp->dropless_fc && | ||
2795 | pause->bd_th_hi + FW_PREFETCH_CNT > | ||
2796 | bp->rx_ring_size); | ||
2797 | WARN_ON(bp->dropless_fc && | ||
2798 | pause->rcq_th_hi + FW_PREFETCH_CNT > | ||
2799 | NUM_RCQ_RINGS * MAX_RCQ_DESC_CNT); | ||
2778 | 2800 | ||
2779 | pause->pri_map = 1; | 2801 | pause->pri_map = 1; |
2780 | } | 2802 | } |
@@ -2802,9 +2824,7 @@ static void bnx2x_pf_rx_q_prep(struct bnx2x *bp, | |||
2802 | * For PF Clients it should be the maximum avaliable number. | 2824 | * For PF Clients it should be the maximum avaliable number. |
2803 | * VF driver(s) may want to define it to a smaller value. | 2825 | * VF driver(s) may want to define it to a smaller value. |
2804 | */ | 2826 | */ |
2805 | rxq_init->max_tpa_queues = | 2827 | rxq_init->max_tpa_queues = MAX_AGG_QS(bp); |
2806 | (CHIP_IS_E1(bp) ? ETH_MAX_AGGREGATION_QUEUES_E1 : | ||
2807 | ETH_MAX_AGGREGATION_QUEUES_E1H_E2); | ||
2808 | 2828 | ||
2809 | rxq_init->cache_line_log = BNX2X_RX_ALIGN_SHIFT; | 2829 | rxq_init->cache_line_log = BNX2X_RX_ALIGN_SHIFT; |
2810 | rxq_init->fw_sb_id = fp->fw_sb_id; | 2830 | rxq_init->fw_sb_id = fp->fw_sb_id; |
@@ -4808,6 +4828,37 @@ void bnx2x_setup_ndsb_state_machine(struct hc_status_block_sm *hc_sm, | |||
4808 | hc_sm->time_to_expire = 0xFFFFFFFF; | 4828 | hc_sm->time_to_expire = 0xFFFFFFFF; |
4809 | } | 4829 | } |
4810 | 4830 | ||
4831 | |||
4832 | /* allocates state machine ids. */ | ||
4833 | static inline | ||
4834 | void bnx2x_map_sb_state_machines(struct hc_index_data *index_data) | ||
4835 | { | ||
4836 | /* zero out state machine indices */ | ||
4837 | /* rx indices */ | ||
4838 | index_data[HC_INDEX_ETH_RX_CQ_CONS].flags &= ~HC_INDEX_DATA_SM_ID; | ||
4839 | |||
4840 | /* tx indices */ | ||
4841 | index_data[HC_INDEX_OOO_TX_CQ_CONS].flags &= ~HC_INDEX_DATA_SM_ID; | ||
4842 | index_data[HC_INDEX_ETH_TX_CQ_CONS_COS0].flags &= ~HC_INDEX_DATA_SM_ID; | ||
4843 | index_data[HC_INDEX_ETH_TX_CQ_CONS_COS1].flags &= ~HC_INDEX_DATA_SM_ID; | ||
4844 | index_data[HC_INDEX_ETH_TX_CQ_CONS_COS2].flags &= ~HC_INDEX_DATA_SM_ID; | ||
4845 | |||
4846 | /* map indices */ | ||
4847 | /* rx indices */ | ||
4848 | index_data[HC_INDEX_ETH_RX_CQ_CONS].flags |= | ||
4849 | SM_RX_ID << HC_INDEX_DATA_SM_ID_SHIFT; | ||
4850 | |||
4851 | /* tx indices */ | ||
4852 | index_data[HC_INDEX_OOO_TX_CQ_CONS].flags |= | ||
4853 | SM_TX_ID << HC_INDEX_DATA_SM_ID_SHIFT; | ||
4854 | index_data[HC_INDEX_ETH_TX_CQ_CONS_COS0].flags |= | ||
4855 | SM_TX_ID << HC_INDEX_DATA_SM_ID_SHIFT; | ||
4856 | index_data[HC_INDEX_ETH_TX_CQ_CONS_COS1].flags |= | ||
4857 | SM_TX_ID << HC_INDEX_DATA_SM_ID_SHIFT; | ||
4858 | index_data[HC_INDEX_ETH_TX_CQ_CONS_COS2].flags |= | ||
4859 | SM_TX_ID << HC_INDEX_DATA_SM_ID_SHIFT; | ||
4860 | } | ||
4861 | |||
4811 | static void bnx2x_init_sb(struct bnx2x *bp, dma_addr_t mapping, int vfid, | 4862 | static void bnx2x_init_sb(struct bnx2x *bp, dma_addr_t mapping, int vfid, |
4812 | u8 vf_valid, int fw_sb_id, int igu_sb_id) | 4863 | u8 vf_valid, int fw_sb_id, int igu_sb_id) |
4813 | { | 4864 | { |
@@ -4839,6 +4890,7 @@ static void bnx2x_init_sb(struct bnx2x *bp, dma_addr_t mapping, int vfid, | |||
4839 | hc_sm_p = sb_data_e2.common.state_machine; | 4890 | hc_sm_p = sb_data_e2.common.state_machine; |
4840 | sb_data_p = (u32 *)&sb_data_e2; | 4891 | sb_data_p = (u32 *)&sb_data_e2; |
4841 | data_size = sizeof(struct hc_status_block_data_e2)/sizeof(u32); | 4892 | data_size = sizeof(struct hc_status_block_data_e2)/sizeof(u32); |
4893 | bnx2x_map_sb_state_machines(sb_data_e2.index_data); | ||
4842 | } else { | 4894 | } else { |
4843 | memset(&sb_data_e1x, 0, | 4895 | memset(&sb_data_e1x, 0, |
4844 | sizeof(struct hc_status_block_data_e1x)); | 4896 | sizeof(struct hc_status_block_data_e1x)); |
@@ -4853,6 +4905,7 @@ static void bnx2x_init_sb(struct bnx2x *bp, dma_addr_t mapping, int vfid, | |||
4853 | hc_sm_p = sb_data_e1x.common.state_machine; | 4905 | hc_sm_p = sb_data_e1x.common.state_machine; |
4854 | sb_data_p = (u32 *)&sb_data_e1x; | 4906 | sb_data_p = (u32 *)&sb_data_e1x; |
4855 | data_size = sizeof(struct hc_status_block_data_e1x)/sizeof(u32); | 4907 | data_size = sizeof(struct hc_status_block_data_e1x)/sizeof(u32); |
4908 | bnx2x_map_sb_state_machines(sb_data_e1x.index_data); | ||
4856 | } | 4909 | } |
4857 | 4910 | ||
4858 | bnx2x_setup_ndsb_state_machine(&hc_sm_p[SM_RX_ID], | 4911 | bnx2x_setup_ndsb_state_machine(&hc_sm_p[SM_RX_ID], |
@@ -5802,7 +5855,7 @@ static int bnx2x_init_hw_common(struct bnx2x *bp) | |||
5802 | * take the UNDI lock to protect undi_unload flow from accessing | 5855 | * take the UNDI lock to protect undi_unload flow from accessing |
5803 | * registers while we're resetting the chip | 5856 | * registers while we're resetting the chip |
5804 | */ | 5857 | */ |
5805 | bnx2x_acquire_hw_lock(bp, HW_LOCK_RESOURCE_UNDI); | 5858 | bnx2x_acquire_hw_lock(bp, HW_LOCK_RESOURCE_RESET); |
5806 | 5859 | ||
5807 | bnx2x_reset_common(bp); | 5860 | bnx2x_reset_common(bp); |
5808 | REG_WR(bp, GRCBASE_MISC + MISC_REGISTERS_RESET_REG_1_SET, 0xffffffff); | 5861 | REG_WR(bp, GRCBASE_MISC + MISC_REGISTERS_RESET_REG_1_SET, 0xffffffff); |
@@ -5814,7 +5867,7 @@ static int bnx2x_init_hw_common(struct bnx2x *bp) | |||
5814 | } | 5867 | } |
5815 | REG_WR(bp, GRCBASE_MISC + MISC_REGISTERS_RESET_REG_2_SET, val); | 5868 | REG_WR(bp, GRCBASE_MISC + MISC_REGISTERS_RESET_REG_2_SET, val); |
5816 | 5869 | ||
5817 | bnx2x_release_hw_lock(bp, HW_LOCK_RESOURCE_UNDI); | 5870 | bnx2x_release_hw_lock(bp, HW_LOCK_RESOURCE_RESET); |
5818 | 5871 | ||
5819 | bnx2x_init_block(bp, BLOCK_MISC, PHASE_COMMON); | 5872 | bnx2x_init_block(bp, BLOCK_MISC, PHASE_COMMON); |
5820 | 5873 | ||
@@ -6671,12 +6724,16 @@ static int bnx2x_init_hw_func(struct bnx2x *bp) | |||
6671 | if (CHIP_MODE_IS_4_PORT(bp)) | 6724 | if (CHIP_MODE_IS_4_PORT(bp)) |
6672 | dsb_idx = BP_FUNC(bp); | 6725 | dsb_idx = BP_FUNC(bp); |
6673 | else | 6726 | else |
6674 | dsb_idx = BP_E1HVN(bp); | 6727 | dsb_idx = BP_VN(bp); |
6675 | 6728 | ||
6676 | prod_offset = (CHIP_INT_MODE_IS_BC(bp) ? | 6729 | prod_offset = (CHIP_INT_MODE_IS_BC(bp) ? |
6677 | IGU_BC_BASE_DSB_PROD + dsb_idx : | 6730 | IGU_BC_BASE_DSB_PROD + dsb_idx : |
6678 | IGU_NORM_BASE_DSB_PROD + dsb_idx); | 6731 | IGU_NORM_BASE_DSB_PROD + dsb_idx); |
6679 | 6732 | ||
6733 | /* | ||
6734 | * igu prods come in chunks of E1HVN_MAX (4) - | ||
6735 | * does not matters what is the current chip mode | ||
6736 | */ | ||
6680 | for (i = 0; i < (num_segs * E1HVN_MAX); | 6737 | for (i = 0; i < (num_segs * E1HVN_MAX); |
6681 | i += E1HVN_MAX) { | 6738 | i += E1HVN_MAX) { |
6682 | addr = IGU_REG_PROD_CONS_MEMORY + | 6739 | addr = IGU_REG_PROD_CONS_MEMORY + |
@@ -7570,7 +7627,7 @@ u32 bnx2x_send_unload_req(struct bnx2x *bp, int unload_mode) | |||
7570 | u32 val; | 7627 | u32 val; |
7571 | /* The mac address is written to entries 1-4 to | 7628 | /* The mac address is written to entries 1-4 to |
7572 | preserve entry 0 which is used by the PMF */ | 7629 | preserve entry 0 which is used by the PMF */ |
7573 | u8 entry = (BP_E1HVN(bp) + 1)*8; | 7630 | u8 entry = (BP_VN(bp) + 1)*8; |
7574 | 7631 | ||
7575 | val = (mac_addr[0] << 8) | mac_addr[1]; | 7632 | val = (mac_addr[0] << 8) | mac_addr[1]; |
7576 | EMAC_WR(bp, EMAC_REG_EMAC_MAC_MATCH + entry, val); | 7633 | EMAC_WR(bp, EMAC_REG_EMAC_MAC_MATCH + entry, val); |
@@ -8546,10 +8603,12 @@ static void __devinit bnx2x_undi_unload(struct bnx2x *bp) | |||
8546 | /* Check if there is any driver already loaded */ | 8603 | /* Check if there is any driver already loaded */ |
8547 | val = REG_RD(bp, MISC_REG_UNPREPARED); | 8604 | val = REG_RD(bp, MISC_REG_UNPREPARED); |
8548 | if (val == 0x1) { | 8605 | if (val == 0x1) { |
8549 | /* Check if it is the UNDI driver | 8606 | |
8607 | bnx2x_acquire_hw_lock(bp, HW_LOCK_RESOURCE_RESET); | ||
8608 | /* | ||
8609 | * Check if it is the UNDI driver | ||
8550 | * UNDI driver initializes CID offset for normal bell to 0x7 | 8610 | * UNDI driver initializes CID offset for normal bell to 0x7 |
8551 | */ | 8611 | */ |
8552 | bnx2x_acquire_hw_lock(bp, HW_LOCK_RESOURCE_UNDI); | ||
8553 | val = REG_RD(bp, DORQ_REG_NORM_CID_OFST); | 8612 | val = REG_RD(bp, DORQ_REG_NORM_CID_OFST); |
8554 | if (val == 0x7) { | 8613 | if (val == 0x7) { |
8555 | u32 reset_code = DRV_MSG_CODE_UNLOAD_REQ_WOL_DIS; | 8614 | u32 reset_code = DRV_MSG_CODE_UNLOAD_REQ_WOL_DIS; |
@@ -8587,9 +8646,6 @@ static void __devinit bnx2x_undi_unload(struct bnx2x *bp) | |||
8587 | bnx2x_fw_command(bp, reset_code, 0); | 8646 | bnx2x_fw_command(bp, reset_code, 0); |
8588 | } | 8647 | } |
8589 | 8648 | ||
8590 | /* now it's safe to release the lock */ | ||
8591 | bnx2x_release_hw_lock(bp, HW_LOCK_RESOURCE_UNDI); | ||
8592 | |||
8593 | bnx2x_undi_int_disable(bp); | 8649 | bnx2x_undi_int_disable(bp); |
8594 | port = BP_PORT(bp); | 8650 | port = BP_PORT(bp); |
8595 | 8651 | ||
@@ -8639,8 +8695,10 @@ static void __devinit bnx2x_undi_unload(struct bnx2x *bp) | |||
8639 | bp->fw_seq = | 8695 | bp->fw_seq = |
8640 | (SHMEM_RD(bp, func_mb[bp->pf_num].drv_mb_header) & | 8696 | (SHMEM_RD(bp, func_mb[bp->pf_num].drv_mb_header) & |
8641 | DRV_MSG_SEQ_NUMBER_MASK); | 8697 | DRV_MSG_SEQ_NUMBER_MASK); |
8642 | } else | 8698 | } |
8643 | bnx2x_release_hw_lock(bp, HW_LOCK_RESOURCE_UNDI); | 8699 | |
8700 | /* now it's safe to release the lock */ | ||
8701 | bnx2x_release_hw_lock(bp, HW_LOCK_RESOURCE_RESET); | ||
8644 | } | 8702 | } |
8645 | } | 8703 | } |
8646 | 8704 | ||
@@ -8777,13 +8835,13 @@ static void __devinit bnx2x_get_common_hwinfo(struct bnx2x *bp) | |||
8777 | static void __devinit bnx2x_get_igu_cam_info(struct bnx2x *bp) | 8835 | static void __devinit bnx2x_get_igu_cam_info(struct bnx2x *bp) |
8778 | { | 8836 | { |
8779 | int pfid = BP_FUNC(bp); | 8837 | int pfid = BP_FUNC(bp); |
8780 | int vn = BP_E1HVN(bp); | ||
8781 | int igu_sb_id; | 8838 | int igu_sb_id; |
8782 | u32 val; | 8839 | u32 val; |
8783 | u8 fid, igu_sb_cnt = 0; | 8840 | u8 fid, igu_sb_cnt = 0; |
8784 | 8841 | ||
8785 | bp->igu_base_sb = 0xff; | 8842 | bp->igu_base_sb = 0xff; |
8786 | if (CHIP_INT_MODE_IS_BC(bp)) { | 8843 | if (CHIP_INT_MODE_IS_BC(bp)) { |
8844 | int vn = BP_VN(bp); | ||
8787 | igu_sb_cnt = bp->igu_sb_cnt; | 8845 | igu_sb_cnt = bp->igu_sb_cnt; |
8788 | bp->igu_base_sb = (CHIP_MODE_IS_4_PORT(bp) ? pfid : vn) * | 8846 | bp->igu_base_sb = (CHIP_MODE_IS_4_PORT(bp) ? pfid : vn) * |
8789 | FP_SB_MAX_E1x; | 8847 | FP_SB_MAX_E1x; |
@@ -9416,6 +9474,10 @@ static int __devinit bnx2x_get_hwinfo(struct bnx2x *bp) | |||
9416 | bp->igu_base_sb = 0; | 9474 | bp->igu_base_sb = 0; |
9417 | } else { | 9475 | } else { |
9418 | bp->common.int_block = INT_BLOCK_IGU; | 9476 | bp->common.int_block = INT_BLOCK_IGU; |
9477 | |||
9478 | /* do not allow device reset during IGU info preocessing */ | ||
9479 | bnx2x_acquire_hw_lock(bp, HW_LOCK_RESOURCE_RESET); | ||
9480 | |||
9419 | val = REG_RD(bp, IGU_REG_BLOCK_CONFIGURATION); | 9481 | val = REG_RD(bp, IGU_REG_BLOCK_CONFIGURATION); |
9420 | 9482 | ||
9421 | if (val & IGU_BLOCK_CONFIGURATION_REG_BACKWARD_COMP_EN) { | 9483 | if (val & IGU_BLOCK_CONFIGURATION_REG_BACKWARD_COMP_EN) { |
@@ -9447,6 +9509,7 @@ static int __devinit bnx2x_get_hwinfo(struct bnx2x *bp) | |||
9447 | 9509 | ||
9448 | bnx2x_get_igu_cam_info(bp); | 9510 | bnx2x_get_igu_cam_info(bp); |
9449 | 9511 | ||
9512 | bnx2x_release_hw_lock(bp, HW_LOCK_RESOURCE_RESET); | ||
9450 | } | 9513 | } |
9451 | 9514 | ||
9452 | /* | 9515 | /* |
@@ -9473,7 +9536,7 @@ static int __devinit bnx2x_get_hwinfo(struct bnx2x *bp) | |||
9473 | 9536 | ||
9474 | bp->mf_ov = 0; | 9537 | bp->mf_ov = 0; |
9475 | bp->mf_mode = 0; | 9538 | bp->mf_mode = 0; |
9476 | vn = BP_E1HVN(bp); | 9539 | vn = BP_VN(bp); |
9477 | 9540 | ||
9478 | if (!CHIP_IS_E1(bp) && !BP_NOMCP(bp)) { | 9541 | if (!CHIP_IS_E1(bp) && !BP_NOMCP(bp)) { |
9479 | BNX2X_DEV_INFO("shmem2base 0x%x, size %d, mfcfg offset %d\n", | 9542 | BNX2X_DEV_INFO("shmem2base 0x%x, size %d, mfcfg offset %d\n", |
@@ -9593,13 +9656,6 @@ static int __devinit bnx2x_get_hwinfo(struct bnx2x *bp) | |||
9593 | /* port info */ | 9656 | /* port info */ |
9594 | bnx2x_get_port_hwinfo(bp); | 9657 | bnx2x_get_port_hwinfo(bp); |
9595 | 9658 | ||
9596 | if (!BP_NOMCP(bp)) { | ||
9597 | bp->fw_seq = | ||
9598 | (SHMEM_RD(bp, func_mb[BP_FW_MB_IDX(bp)].drv_mb_header) & | ||
9599 | DRV_MSG_SEQ_NUMBER_MASK); | ||
9600 | BNX2X_DEV_INFO("fw_seq 0x%08x\n", bp->fw_seq); | ||
9601 | } | ||
9602 | |||
9603 | /* Get MAC addresses */ | 9659 | /* Get MAC addresses */ |
9604 | bnx2x_get_mac_hwinfo(bp); | 9660 | bnx2x_get_mac_hwinfo(bp); |
9605 | 9661 | ||
@@ -9765,6 +9821,14 @@ static int __devinit bnx2x_init_bp(struct bnx2x *bp) | |||
9765 | if (!BP_NOMCP(bp)) | 9821 | if (!BP_NOMCP(bp)) |
9766 | bnx2x_undi_unload(bp); | 9822 | bnx2x_undi_unload(bp); |
9767 | 9823 | ||
9824 | /* init fw_seq after undi_unload! */ | ||
9825 | if (!BP_NOMCP(bp)) { | ||
9826 | bp->fw_seq = | ||
9827 | (SHMEM_RD(bp, func_mb[BP_FW_MB_IDX(bp)].drv_mb_header) & | ||
9828 | DRV_MSG_SEQ_NUMBER_MASK); | ||
9829 | BNX2X_DEV_INFO("fw_seq 0x%08x\n", bp->fw_seq); | ||
9830 | } | ||
9831 | |||
9768 | if (CHIP_REV_IS_FPGA(bp)) | 9832 | if (CHIP_REV_IS_FPGA(bp)) |
9769 | dev_err(&bp->pdev->dev, "FPGA detected\n"); | 9833 | dev_err(&bp->pdev->dev, "FPGA detected\n"); |
9770 | 9834 | ||
@@ -10259,17 +10323,21 @@ static int __devinit bnx2x_init_dev(struct pci_dev *pdev, | |||
10259 | /* clean indirect addresses */ | 10323 | /* clean indirect addresses */ |
10260 | pci_write_config_dword(bp->pdev, PCICFG_GRC_ADDRESS, | 10324 | pci_write_config_dword(bp->pdev, PCICFG_GRC_ADDRESS, |
10261 | PCICFG_VENDOR_ID_OFFSET); | 10325 | PCICFG_VENDOR_ID_OFFSET); |
10262 | /* Clean the following indirect addresses for all functions since it | 10326 | /* |
10327 | * Clean the following indirect addresses for all functions since it | ||
10263 | * is not used by the driver. | 10328 | * is not used by the driver. |
10264 | */ | 10329 | */ |
10265 | REG_WR(bp, PXP2_REG_PGL_ADDR_88_F0, 0); | 10330 | REG_WR(bp, PXP2_REG_PGL_ADDR_88_F0, 0); |
10266 | REG_WR(bp, PXP2_REG_PGL_ADDR_8C_F0, 0); | 10331 | REG_WR(bp, PXP2_REG_PGL_ADDR_8C_F0, 0); |
10267 | REG_WR(bp, PXP2_REG_PGL_ADDR_90_F0, 0); | 10332 | REG_WR(bp, PXP2_REG_PGL_ADDR_90_F0, 0); |
10268 | REG_WR(bp, PXP2_REG_PGL_ADDR_94_F0, 0); | 10333 | REG_WR(bp, PXP2_REG_PGL_ADDR_94_F0, 0); |
10269 | REG_WR(bp, PXP2_REG_PGL_ADDR_88_F1, 0); | 10334 | |
10270 | REG_WR(bp, PXP2_REG_PGL_ADDR_8C_F1, 0); | 10335 | if (CHIP_IS_E1x(bp)) { |
10271 | REG_WR(bp, PXP2_REG_PGL_ADDR_90_F1, 0); | 10336 | REG_WR(bp, PXP2_REG_PGL_ADDR_88_F1, 0); |
10272 | REG_WR(bp, PXP2_REG_PGL_ADDR_94_F1, 0); | 10337 | REG_WR(bp, PXP2_REG_PGL_ADDR_8C_F1, 0); |
10338 | REG_WR(bp, PXP2_REG_PGL_ADDR_90_F1, 0); | ||
10339 | REG_WR(bp, PXP2_REG_PGL_ADDR_94_F1, 0); | ||
10340 | } | ||
10273 | 10341 | ||
10274 | /* | 10342 | /* |
10275 | * Enable internal target-read (in case we are probed after PF FLR). | 10343 | * Enable internal target-read (in case we are probed after PF FLR). |