提交 523224a3 编写于 作者: D Dmitry Kravkov 提交者: David S. Miller

bnx2x, cnic, bnx2i: use new FW/HSI

This is the new FW HSI blob and the relevant definitions without logic changes.
It also included code adaptation for new HSI. New features are not enabled.

New FW/HSI includes:
- Support for 57712 HW
- Future support for VF (not used)
- Improvements in FW interrupts scheme
- FW FCoE hooks (stubs for future usage)
Signed-off-by: NDmitry Kravkov <dmitry@broadcom.com>
Signed-off-by: NMichael Chan <mchan@broadcom.com>
Signed-off-by: NEilon Greenstein <eilong@broadcom.com>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 0c5b7715
此差异已折叠。
此差异已折叠。
...@@ -106,6 +106,13 @@ void bnx2x_setup_cnic_irq_info(struct bnx2x *bp); ...@@ -106,6 +106,13 @@ void bnx2x_setup_cnic_irq_info(struct bnx2x *bp);
*/ */
void bnx2x_int_enable(struct bnx2x *bp); void bnx2x_int_enable(struct bnx2x *bp);
/**
* Disable HW interrupts.
*
* @param bp
*/
void bnx2x_int_disable(struct bnx2x *bp);
/** /**
* Disable interrupts. This function ensures that there are no * Disable interrupts. This function ensures that there are no
* ISRs or SP DPCs (sp_task) are running after it returns. * ISRs or SP DPCs (sp_task) are running after it returns.
...@@ -163,27 +170,30 @@ int bnx2x_alloc_mem(struct bnx2x *bp); ...@@ -163,27 +170,30 @@ int bnx2x_alloc_mem(struct bnx2x *bp);
void bnx2x_free_mem(struct bnx2x *bp); void bnx2x_free_mem(struct bnx2x *bp);
/** /**
* Bring up a leading (the first) eth Client. * Setup eth Client.
* *
* @param bp * @param bp
* @param fp
* @param is_leading
* *
* @return int * @return int
*/ */
int bnx2x_setup_leading(struct bnx2x *bp); int bnx2x_setup_client(struct bnx2x *bp, struct bnx2x_fastpath *fp,
int is_leading);
/** /**
* Setup non-leading eth Client. * Bring down an eth client.
* *
* @param bp * @param bp
* @param fp * @param p
* *
* @return int * @return int
*/ */
int bnx2x_setup_multi(struct bnx2x *bp, int index); int bnx2x_stop_fw_client(struct bnx2x *bp,
struct bnx2x_client_ramrod_params *p);
/** /**
* Set number of quueus according to mode and number of available * Set number of quueus according to mode
* msi-x vectors
* *
* @param bp * @param bp
* *
...@@ -228,16 +238,7 @@ int bnx2x_release_hw_lock(struct bnx2x *bp, u32 resource); ...@@ -228,16 +238,7 @@ int bnx2x_release_hw_lock(struct bnx2x *bp, u32 resource);
* @param bp driver handle * @param bp driver handle
* @param set * @param set
*/ */
void bnx2x_set_eth_mac_addr_e1h(struct bnx2x *bp, int set); void bnx2x_set_eth_mac(struct bnx2x *bp, int set);
/**
* Configure eth MAC address in the HW according to the value in
* netdev->dev_addr for 57710
*
* @param bp driver handle
* @param set
*/
void bnx2x_set_eth_mac_addr_e1(struct bnx2x *bp, int set);
#ifdef BCM_CNIC #ifdef BCM_CNIC
/** /**
...@@ -257,12 +258,15 @@ int bnx2x_set_iscsi_eth_mac_addr(struct bnx2x *bp, int set); ...@@ -257,12 +258,15 @@ int bnx2x_set_iscsi_eth_mac_addr(struct bnx2x *bp, int set);
* Initialize status block in FW and HW * Initialize status block in FW and HW
* *
* @param bp driver handle * @param bp driver handle
* @param sb host_status_block
* @param dma_addr_t mapping * @param dma_addr_t mapping
* @param int sb_id * @param int sb_id
* @param int vfid
* @param u8 vf_valid
* @param int fw_sb_id
* @param int igu_sb_id
*/ */
void bnx2x_init_sb(struct bnx2x *bp, struct host_status_block *sb, void bnx2x_init_sb(struct bnx2x *bp, dma_addr_t mapping, int vfid,
dma_addr_t mapping, int sb_id); u8 vf_valid, int fw_sb_id, int igu_sb_id);
/** /**
* Reconfigure FW/HW according to dev->flags rx mode * Reconfigure FW/HW according to dev->flags rx mode
...@@ -294,14 +298,6 @@ void bnx2x_disable_close_the_gate(struct bnx2x *bp); ...@@ -294,14 +298,6 @@ void bnx2x_disable_close_the_gate(struct bnx2x *bp);
*/ */
void bnx2x_stats_handle(struct bnx2x *bp, enum bnx2x_stats_event event); void bnx2x_stats_handle(struct bnx2x *bp, enum bnx2x_stats_event event);
/**
* Configures FW with client paramteres (like HW VLAN removal)
* for each active client.
*
* @param bp
*/
void bnx2x_set_client_config(struct bnx2x *bp);
/** /**
* Handle sp events * Handle sp events
* *
...@@ -310,14 +306,29 @@ void bnx2x_set_client_config(struct bnx2x *bp); ...@@ -310,14 +306,29 @@ void bnx2x_set_client_config(struct bnx2x *bp);
*/ */
void bnx2x_sp_event(struct bnx2x_fastpath *fp, union eth_rx_cqe *rr_cqe); void bnx2x_sp_event(struct bnx2x_fastpath *fp, union eth_rx_cqe *rr_cqe);
/**
* Init/halt function before/after sending
* CLIENT_SETUP/CFC_DEL for the first/last client.
*
* @param bp
*
* @return int
*/
int bnx2x_func_start(struct bnx2x *bp);
int bnx2x_func_stop(struct bnx2x *bp);
/**
* Prepare ILT configurations according to current driver
* parameters.
*
* @param bp
*/
void bnx2x_ilt_set_info(struct bnx2x *bp);
static inline void bnx2x_update_fpsb_idx(struct bnx2x_fastpath *fp) static inline void bnx2x_update_fpsb_idx(struct bnx2x_fastpath *fp)
{ {
struct host_status_block *fpsb = fp->status_blk;
barrier(); /* status block is written to by the chip */ barrier(); /* status block is written to by the chip */
fp->fp_c_idx = fpsb->c_status_block.status_block_index; fp->fp_hc_idx = fp->sb_running_index[SM_RX_ID];
fp->fp_u_idx = fpsb->u_status_block.status_block_index;
} }
static inline void bnx2x_update_rx_prod(struct bnx2x *bp, static inline void bnx2x_update_rx_prod(struct bnx2x *bp,
...@@ -344,8 +355,8 @@ static inline void bnx2x_update_rx_prod(struct bnx2x *bp, ...@@ -344,8 +355,8 @@ static inline void bnx2x_update_rx_prod(struct bnx2x *bp,
wmb(); wmb();
for (i = 0; i < sizeof(struct ustorm_eth_rx_producers)/4; i++) for (i = 0; i < sizeof(struct ustorm_eth_rx_producers)/4; i++)
REG_WR(bp, BAR_USTRORM_INTMEM + REG_WR(bp,
USTORM_RX_PRODS_OFFSET(BP_PORT(bp), fp->cl_id) + i*4, BAR_USTRORM_INTMEM + fp->ustorm_rx_prods_offset + i*4,
((u32 *)&rx_prods)[i]); ((u32 *)&rx_prods)[i]);
mmiowb(); /* keep prod updates ordered */ mmiowb(); /* keep prod updates ordered */
...@@ -434,6 +445,17 @@ static inline int bnx2x_has_tx_work(struct bnx2x_fastpath *fp) ...@@ -434,6 +445,17 @@ static inline int bnx2x_has_tx_work(struct bnx2x_fastpath *fp)
return hw_cons != fp->tx_pkt_cons; return hw_cons != fp->tx_pkt_cons;
} }
static inline int bnx2x_has_rx_work(struct bnx2x_fastpath *fp)
{
u16 rx_cons_sb;
/* Tell compiler that status block fields can change */
barrier();
rx_cons_sb = le16_to_cpu(*fp->rx_cons_sb);
if ((rx_cons_sb & MAX_RCQ_DESC_CNT) == MAX_RCQ_DESC_CNT)
rx_cons_sb++;
return (fp->rx_comp_cons != rx_cons_sb);
}
static inline void bnx2x_free_rx_sge(struct bnx2x *bp, static inline void bnx2x_free_rx_sge(struct bnx2x *bp,
struct bnx2x_fastpath *fp, u16 index) struct bnx2x_fastpath *fp, u16 index)
{ {
...@@ -454,13 +476,35 @@ static inline void bnx2x_free_rx_sge(struct bnx2x *bp, ...@@ -454,13 +476,35 @@ static inline void bnx2x_free_rx_sge(struct bnx2x *bp,
sge->addr_lo = 0; sge->addr_lo = 0;
} }
static inline void bnx2x_free_rx_sge_range(struct bnx2x *bp,
struct bnx2x_fastpath *fp, int last)
static inline void bnx2x_clear_sge_mask_next_elems(struct bnx2x_fastpath *fp)
{ {
int i; int i, j;
for (i = 0; i < last; i++) for (i = 1; i <= NUM_RX_SGE_PAGES; i++) {
bnx2x_free_rx_sge(bp, fp, i); int idx = RX_SGE_CNT * i - 1;
for (j = 0; j < 2; j++) {
SGE_MASK_CLEAR_BIT(fp, idx);
idx--;
}
}
}
static inline void bnx2x_init_sge_ring_bit_mask(struct bnx2x_fastpath *fp)
{
/* Set the mask to all 1-s: it's faster to compare to 0 than to 0xf-s */
memset(fp->sge_mask, 0xff,
(NUM_RX_SGE >> RX_SGE_MASK_ELEM_SHIFT)*sizeof(u64));
/* Clear the two last indices in the page to 1:
these are the indices that correspond to the "next" element,
hence will never be indicated and should be removed from
the calculations. */
bnx2x_clear_sge_mask_next_elems(fp);
} }
static inline int bnx2x_alloc_rx_sge(struct bnx2x *bp, static inline int bnx2x_alloc_rx_sge(struct bnx2x *bp,
...@@ -540,33 +584,15 @@ static inline void bnx2x_reuse_rx_skb(struct bnx2x_fastpath *fp, ...@@ -540,33 +584,15 @@ static inline void bnx2x_reuse_rx_skb(struct bnx2x_fastpath *fp,
dma_unmap_addr(cons_rx_buf, mapping)); dma_unmap_addr(cons_rx_buf, mapping));
*prod_bd = *cons_bd; *prod_bd = *cons_bd;
} }
static inline void bnx2x_free_rx_sge_range(struct bnx2x *bp,
static inline void bnx2x_clear_sge_mask_next_elems(struct bnx2x_fastpath *fp) struct bnx2x_fastpath *fp, int last)
{ {
int i, j; int i;
for (i = 1; i <= NUM_RX_SGE_PAGES; i++) {
int idx = RX_SGE_CNT * i - 1;
for (j = 0; j < 2; j++) { for (i = 0; i < last; i++)
SGE_MASK_CLEAR_BIT(fp, idx); bnx2x_free_rx_sge(bp, fp, i);
idx--;
}
}
} }
static inline void bnx2x_init_sge_ring_bit_mask(struct bnx2x_fastpath *fp)
{
/* Set the mask to all 1-s: it's faster to compare to 0 than to 0xf-s */
memset(fp->sge_mask, 0xff,
(NUM_RX_SGE >> RX_SGE_MASK_ELEM_SHIFT)*sizeof(u64));
/* Clear the two last indices in the page to 1:
these are the indices that correspond to the "next" element,
hence will never be indicated and should be removed from
the calculations. */
bnx2x_clear_sge_mask_next_elems(fp);
}
static inline void bnx2x_free_tpa_pool(struct bnx2x *bp, static inline void bnx2x_free_tpa_pool(struct bnx2x *bp,
struct bnx2x_fastpath *fp, int last) struct bnx2x_fastpath *fp, int last)
{ {
...@@ -592,7 +618,7 @@ static inline void bnx2x_free_tpa_pool(struct bnx2x *bp, ...@@ -592,7 +618,7 @@ static inline void bnx2x_free_tpa_pool(struct bnx2x *bp,
} }
static inline void bnx2x_init_tx_ring(struct bnx2x *bp) static inline void bnx2x_init_tx_rings(struct bnx2x *bp)
{ {
int i, j; int i, j;
...@@ -611,7 +637,7 @@ static inline void bnx2x_init_tx_ring(struct bnx2x *bp) ...@@ -611,7 +637,7 @@ static inline void bnx2x_init_tx_ring(struct bnx2x *bp)
BCM_PAGE_SIZE*(i % NUM_TX_RINGS))); BCM_PAGE_SIZE*(i % NUM_TX_RINGS)));
} }
fp->tx_db.data.header.header = DOORBELL_HDR_DB_TYPE; SET_FLAG(fp->tx_db.data.header.header, DOORBELL_HDR_DB_TYPE, 1);
fp->tx_db.data.zero_fill1 = 0; fp->tx_db.data.zero_fill1 = 0;
fp->tx_db.data.prod = 0; fp->tx_db.data.prod = 0;
...@@ -619,22 +645,94 @@ static inline void bnx2x_init_tx_ring(struct bnx2x *bp) ...@@ -619,22 +645,94 @@ static inline void bnx2x_init_tx_ring(struct bnx2x *bp)
fp->tx_pkt_cons = 0; fp->tx_pkt_cons = 0;
fp->tx_bd_prod = 0; fp->tx_bd_prod = 0;
fp->tx_bd_cons = 0; fp->tx_bd_cons = 0;
fp->tx_cons_sb = BNX2X_TX_SB_INDEX;
fp->tx_pkt = 0; fp->tx_pkt = 0;
} }
} }
static inline int bnx2x_has_rx_work(struct bnx2x_fastpath *fp) static inline void bnx2x_set_next_page_rx_bd(struct bnx2x_fastpath *fp)
{ {
u16 rx_cons_sb; int i;
/* Tell compiler that status block fields can change */ for (i = 1; i <= NUM_RX_RINGS; i++) {
barrier(); struct eth_rx_bd *rx_bd;
rx_cons_sb = le16_to_cpu(*fp->rx_cons_sb);
if ((rx_cons_sb & MAX_RCQ_DESC_CNT) == MAX_RCQ_DESC_CNT) rx_bd = &fp->rx_desc_ring[RX_DESC_CNT * i - 2];
rx_cons_sb++; rx_bd->addr_hi =
return fp->rx_comp_cons != rx_cons_sb; cpu_to_le32(U64_HI(fp->rx_desc_mapping +
BCM_PAGE_SIZE*(i % NUM_RX_RINGS)));
rx_bd->addr_lo =
cpu_to_le32(U64_LO(fp->rx_desc_mapping +
BCM_PAGE_SIZE*(i % NUM_RX_RINGS)));
}
} }
static inline void bnx2x_set_next_page_sgl(struct bnx2x_fastpath *fp)
{
int i;
for (i = 1; i <= NUM_RX_SGE_PAGES; i++) {
struct eth_rx_sge *sge;
sge = &fp->rx_sge_ring[RX_SGE_CNT * i - 2];
sge->addr_hi =
cpu_to_le32(U64_HI(fp->rx_sge_mapping +
BCM_PAGE_SIZE*(i % NUM_RX_SGE_PAGES)));
sge->addr_lo =
cpu_to_le32(U64_LO(fp->rx_sge_mapping +
BCM_PAGE_SIZE*(i % NUM_RX_SGE_PAGES)));
}
}
static inline void bnx2x_set_next_page_rx_cq(struct bnx2x_fastpath *fp)
{
int i;
for (i = 1; i <= NUM_RCQ_RINGS; i++) {
struct eth_rx_cqe_next_page *nextpg;
nextpg = (struct eth_rx_cqe_next_page *)
&fp->rx_comp_ring[RCQ_DESC_CNT * i - 1];
nextpg->addr_hi =
cpu_to_le32(U64_HI(fp->rx_comp_mapping +
BCM_PAGE_SIZE*(i % NUM_RCQ_RINGS)));
nextpg->addr_lo =
cpu_to_le32(U64_LO(fp->rx_comp_mapping +
BCM_PAGE_SIZE*(i % NUM_RCQ_RINGS)));
}
}
static inline void __storm_memset_struct(struct bnx2x *bp,
u32 addr, size_t size, u32 *data)
{
int i;
for (i = 0; i < size/4; i++)
REG_WR(bp, addr + (i * 4), data[i]);
}
static inline void storm_memset_mac_filters(struct bnx2x *bp,
struct tstorm_eth_mac_filter_config *mac_filters,
u16 abs_fid)
{
size_t size = sizeof(struct tstorm_eth_mac_filter_config);
u32 addr = BAR_TSTRORM_INTMEM +
TSTORM_MAC_FILTER_CONFIG_OFFSET(abs_fid);
__storm_memset_struct(bp, addr, size, (u32 *)mac_filters);
}
static inline void storm_memset_cmng(struct bnx2x *bp,
struct cmng_struct_per_port *cmng,
u8 port)
{
size_t size = sizeof(struct cmng_struct_per_port);
u32 addr = BAR_XSTRORM_INTMEM +
XSTORM_CMNG_PER_PORT_VARS_OFFSET(port);
__storm_memset_struct(bp, addr, size, (u32 *)cmng);
}
/* HW Lock for shared dual port PHYs */ /* HW Lock for shared dual port PHYs */
void bnx2x_acquire_phy_lock(struct bnx2x *bp); void bnx2x_acquire_phy_lock(struct bnx2x *bp);
void bnx2x_release_phy_lock(struct bnx2x *bp); void bnx2x_release_phy_lock(struct bnx2x *bp);
...@@ -659,4 +757,16 @@ int bnx2x_nic_unload(struct bnx2x *bp, int unload_mode); ...@@ -659,4 +757,16 @@ int bnx2x_nic_unload(struct bnx2x *bp, int unload_mode);
int bnx2x_nic_load(struct bnx2x *bp, int load_mode); int bnx2x_nic_load(struct bnx2x *bp, int load_mode);
int bnx2x_set_power_state(struct bnx2x *bp, pci_power_t state); int bnx2x_set_power_state(struct bnx2x *bp, pci_power_t state);
/**
* Allocate/release memories outsize main driver structure
*
* @param bp
*
* @return int
*/
int __devinit bnx2x_alloc_mem_bp(struct bnx2x *bp);
void bnx2x_free_mem_bp(struct bnx2x *bp);
#define BNX2X_FW_IP_HDR_ALIGN_PAD 2 /* FW places hdr with this padding */
#endif /* BNX2X_CMN_H */ #endif /* BNX2X_CMN_H */
...@@ -1343,7 +1343,7 @@ static int bnx2x_run_loopback(struct bnx2x *bp, int loopback_mode, u8 link_up) ...@@ -1343,7 +1343,7 @@ static int bnx2x_run_loopback(struct bnx2x *bp, int loopback_mode, u8 link_up)
u16 pkt_prod, bd_prod; u16 pkt_prod, bd_prod;
struct sw_tx_bd *tx_buf; struct sw_tx_bd *tx_buf;
struct eth_tx_start_bd *tx_start_bd; struct eth_tx_start_bd *tx_start_bd;
struct eth_tx_parse_bd *pbd = NULL; struct eth_tx_parse_bd_e1x *pbd_e1x = NULL;
dma_addr_t mapping; dma_addr_t mapping;
union eth_rx_cqe *cqe; union eth_rx_cqe *cqe;
u8 cqe_fp_flags; u8 cqe_fp_flags;
...@@ -1399,16 +1399,20 @@ static int bnx2x_run_loopback(struct bnx2x *bp, int loopback_mode, u8 link_up) ...@@ -1399,16 +1399,20 @@ static int bnx2x_run_loopback(struct bnx2x *bp, int loopback_mode, u8 link_up)
tx_start_bd->addr_lo = cpu_to_le32(U64_LO(mapping)); tx_start_bd->addr_lo = cpu_to_le32(U64_LO(mapping));
tx_start_bd->nbd = cpu_to_le16(2); /* start + pbd */ tx_start_bd->nbd = cpu_to_le16(2); /* start + pbd */
tx_start_bd->nbytes = cpu_to_le16(skb_headlen(skb)); tx_start_bd->nbytes = cpu_to_le16(skb_headlen(skb));
tx_start_bd->vlan = cpu_to_le16(pkt_prod); tx_start_bd->vlan_or_ethertype = cpu_to_le16(pkt_prod);
tx_start_bd->bd_flags.as_bitfield = ETH_TX_BD_FLAGS_START_BD; tx_start_bd->bd_flags.as_bitfield = ETH_TX_BD_FLAGS_START_BD;
tx_start_bd->general_data = ((UNICAST_ADDRESS << SET_FLAG(tx_start_bd->general_data,
ETH_TX_START_BD_ETH_ADDR_TYPE_SHIFT) | 1); ETH_TX_START_BD_ETH_ADDR_TYPE,
UNICAST_ADDRESS);
SET_FLAG(tx_start_bd->general_data,
ETH_TX_START_BD_HDR_NBDS,
1);
/* turn on parsing and get a BD */ /* turn on parsing and get a BD */
bd_prod = TX_BD(NEXT_TX_IDX(bd_prod)); bd_prod = TX_BD(NEXT_TX_IDX(bd_prod));
pbd = &fp_tx->tx_desc_ring[bd_prod].parse_bd; pbd_e1x = &fp_tx->tx_desc_ring[bd_prod].parse_bd_e1x;
memset(pbd, 0, sizeof(struct eth_tx_parse_bd)); memset(pbd_e1x, 0, sizeof(struct eth_tx_parse_bd_e1x));
wmb(); wmb();
...@@ -1578,9 +1582,9 @@ static int bnx2x_test_intr(struct bnx2x *bp) ...@@ -1578,9 +1582,9 @@ static int bnx2x_test_intr(struct bnx2x *bp)
bp->set_mac_pending++; bp->set_mac_pending++;
smp_wmb(); smp_wmb();
rc = bnx2x_sp_post(bp, RAMROD_CMD_ID_ETH_SET_MAC, 0, rc = bnx2x_sp_post(bp, RAMROD_CMD_ID_COMMON_SET_MAC, 0,
U64_HI(bnx2x_sp_mapping(bp, mac_config)), U64_HI(bnx2x_sp_mapping(bp, mac_config)),
U64_LO(bnx2x_sp_mapping(bp, mac_config)), 0); U64_LO(bnx2x_sp_mapping(bp, mac_config)), 1);
if (rc == 0) { if (rc == 0) {
for (i = 0; i < 10; i++) { for (i = 0; i < 10; i++) {
if (!bp->set_mac_pending) if (!bp->set_mac_pending)
......
此差异已折叠。
...@@ -31,6 +31,7 @@ struct bnx2x_fw_file_hdr { ...@@ -31,6 +31,7 @@ struct bnx2x_fw_file_hdr {
struct bnx2x_fw_file_section csem_pram_data; struct bnx2x_fw_file_section csem_pram_data;
struct bnx2x_fw_file_section xsem_int_table_data; struct bnx2x_fw_file_section xsem_int_table_data;
struct bnx2x_fw_file_section xsem_pram_data; struct bnx2x_fw_file_section xsem_pram_data;
struct bnx2x_fw_file_section iro_arr;
struct bnx2x_fw_file_section fw_version; struct bnx2x_fw_file_section fw_version;
}; };
......
此差异已折叠。
...@@ -148,5 +148,46 @@ union init_op { ...@@ -148,5 +148,46 @@ union init_op {
struct raw_op raw; struct raw_op raw;
}; };
#define INITOP_SET 0 /* set the HW directly */
#define INITOP_CLEAR 1 /* clear the HW directly */
#define INITOP_INIT 2 /* set the init-value array */
/****************************************************************************
* ILT management
****************************************************************************/
struct ilt_line {
dma_addr_t page_mapping;
void *page;
u32 size;
};
struct ilt_client_info {
u32 page_size;
u16 start;
u16 end;
u16 client_num;
u16 flags;
#define ILT_CLIENT_SKIP_INIT 0x1
#define ILT_CLIENT_SKIP_MEM 0x2
};
struct bnx2x_ilt {
u32 start_line;
struct ilt_line *lines;
struct ilt_client_info clients[4];
#define ILT_CLIENT_CDU 0
#define ILT_CLIENT_QM 1
#define ILT_CLIENT_SRC 2
#define ILT_CLIENT_TM 3
};
/****************************************************************************
* SRC configuration
****************************************************************************/
struct src_ent {
u8 opaque[56];
u64 next;
};
#endif /* BNX2X_INIT_H */ #endif /* BNX2X_INIT_H */
此差异已折叠。
...@@ -28,7 +28,7 @@ ...@@ -28,7 +28,7 @@
/********************************************************/ /********************************************************/
#define ETH_HLEN 14 #define ETH_HLEN 14
#define ETH_OVREHEAD (ETH_HLEN + 8)/* 8 for CRC + VLAN*/ #define ETH_OVREHEAD (ETH_HLEN + 8 + 8)/* 16 for CRC + VLAN + LLC */
#define ETH_MIN_PACKET_SIZE 60 #define ETH_MIN_PACKET_SIZE 60
#define ETH_MAX_PACKET_SIZE 1500 #define ETH_MAX_PACKET_SIZE 1500
#define ETH_MAX_JUMBO_PACKET_SIZE 9600 #define ETH_MAX_JUMBO_PACKET_SIZE 9600
...@@ -4066,6 +4066,7 @@ static u8 bnx2x_verify_sfp_module(struct bnx2x_phy *phy, ...@@ -4066,6 +4066,7 @@ static u8 bnx2x_verify_sfp_module(struct bnx2x_phy *phy,
"verification\n"); "verification\n");
return -EINVAL; return -EINVAL;
} }
fw_cmd_param = FW_PARAM_SET(phy->addr, phy->type, phy->mdio_ctrl); fw_cmd_param = FW_PARAM_SET(phy->addr, phy->type, phy->mdio_ctrl);
fw_resp = bnx2x_fw_command(bp, cmd, fw_cmd_param); fw_resp = bnx2x_fw_command(bp, cmd, fw_cmd_param);
if (fw_resp == FW_MSG_CODE_VRFY_OPT_MDL_SUCCESS) { if (fw_resp == FW_MSG_CODE_VRFY_OPT_MDL_SUCCESS) {
......
此差异已折叠。
...@@ -153,7 +153,7 @@ static inline long bnx2x_hilo(u32 *hiref) ...@@ -153,7 +153,7 @@ static inline long bnx2x_hilo(u32 *hiref)
static void bnx2x_storm_stats_post(struct bnx2x *bp) static void bnx2x_storm_stats_post(struct bnx2x *bp)
{ {
if (!bp->stats_pending) { if (!bp->stats_pending) {
struct eth_query_ramrod_data ramrod_data = {0}; struct common_query_ramrod_data ramrod_data = {0};
int i, rc; int i, rc;
spin_lock_bh(&bp->stats_lock); spin_lock_bh(&bp->stats_lock);
...@@ -163,9 +163,9 @@ static void bnx2x_storm_stats_post(struct bnx2x *bp) ...@@ -163,9 +163,9 @@ static void bnx2x_storm_stats_post(struct bnx2x *bp)
for_each_queue(bp, i) for_each_queue(bp, i)
ramrod_data.ctr_id_vector |= (1 << bp->fp[i].cl_id); ramrod_data.ctr_id_vector |= (1 << bp->fp[i].cl_id);
rc = bnx2x_sp_post(bp, RAMROD_CMD_ID_ETH_STAT_QUERY, 0, rc = bnx2x_sp_post(bp, RAMROD_CMD_ID_COMMON_STAT_QUERY, 0,
((u32 *)&ramrod_data)[1], ((u32 *)&ramrod_data)[1],
((u32 *)&ramrod_data)[0], 0); ((u32 *)&ramrod_data)[0], 1);
if (rc == 0) { if (rc == 0) {
/* stats ramrod has it's own slot on the spq */ /* stats ramrod has it's own slot on the spq */
bp->spq_left++; bp->spq_left++;
...@@ -398,9 +398,9 @@ static void bnx2x_port_stats_init(struct bnx2x *bp) ...@@ -398,9 +398,9 @@ static void bnx2x_port_stats_init(struct bnx2x *bp)
BIGMAC_REGISTER_RX_STAT_GR64) >> 2; BIGMAC_REGISTER_RX_STAT_GR64) >> 2;
dmae->src_addr_hi = 0; dmae->src_addr_hi = 0;
dmae->dst_addr_lo = U64_LO(bnx2x_sp_mapping(bp, mac_stats) + dmae->dst_addr_lo = U64_LO(bnx2x_sp_mapping(bp, mac_stats) +
offsetof(struct bmac_stats, rx_stat_gr64_lo)); offsetof(struct bmac1_stats, rx_stat_gr64_lo));
dmae->dst_addr_hi = U64_HI(bnx2x_sp_mapping(bp, mac_stats) + dmae->dst_addr_hi = U64_HI(bnx2x_sp_mapping(bp, mac_stats) +
offsetof(struct bmac_stats, rx_stat_gr64_lo)); offsetof(struct bmac1_stats, rx_stat_gr64_lo));
dmae->len = (8 + BIGMAC_REGISTER_RX_STAT_GRIPJ - dmae->len = (8 + BIGMAC_REGISTER_RX_STAT_GRIPJ -
BIGMAC_REGISTER_RX_STAT_GR64) >> 2; BIGMAC_REGISTER_RX_STAT_GR64) >> 2;
dmae->comp_addr_lo = dmae_reg_go_c[loader_idx] >> 2; dmae->comp_addr_lo = dmae_reg_go_c[loader_idx] >> 2;
...@@ -571,7 +571,7 @@ static void bnx2x_stats_restart(struct bnx2x *bp) ...@@ -571,7 +571,7 @@ static void bnx2x_stats_restart(struct bnx2x *bp)
static void bnx2x_bmac_stats_update(struct bnx2x *bp) static void bnx2x_bmac_stats_update(struct bnx2x *bp)
{ {
struct bmac_stats *new = bnx2x_sp(bp, mac_stats.bmac_stats); struct bmac1_stats *new = bnx2x_sp(bp, mac_stats.bmac1_stats);
struct host_port_stats *pstats = bnx2x_sp(bp, port_stats); struct host_port_stats *pstats = bnx2x_sp(bp, port_stats);
struct bnx2x_eth_stats *estats = &bp->eth_stats; struct bnx2x_eth_stats *estats = &bp->eth_stats;
struct { struct {
......
此差异已折叠。
...@@ -12,6 +12,13 @@ ...@@ -12,6 +12,13 @@
#ifndef CNIC_H #ifndef CNIC_H
#define CNIC_H #define CNIC_H
#define HC_INDEX_ISCSI_EQ_CONS 6
#define HC_INDEX_FCOE_EQ_CONS 3
#define HC_SP_INDEX_ETH_ISCSI_CQ_CONS 5
#define HC_SP_INDEX_ETH_ISCSI_RX_CQ_CONS 1
#define KWQ_PAGE_CNT 4 #define KWQ_PAGE_CNT 4
#define KCQ_PAGE_CNT 16 #define KCQ_PAGE_CNT 16
...@@ -179,6 +186,14 @@ struct kcq_info { ...@@ -179,6 +186,14 @@ struct kcq_info {
u32 io_addr; u32 io_addr;
}; };
struct iro {
u32 base;
u16 m1;
u16 m2;
u16 m3;
u16 size;
};
struct cnic_local { struct cnic_local {
spinlock_t cnic_ulp_lock; spinlock_t cnic_ulp_lock;
...@@ -213,6 +228,9 @@ struct cnic_local { ...@@ -213,6 +228,9 @@ struct cnic_local {
u16 rx_cons; u16 rx_cons;
u16 tx_cons; u16 tx_cons;
struct iro *iro_arr;
#define IRO (((struct cnic_local *) dev->cnic_priv)->iro_arr)
struct cnic_dma kwq_info; struct cnic_dma kwq_info;
struct kwqe **kwq; struct kwqe **kwq;
...@@ -231,12 +249,16 @@ struct cnic_local { ...@@ -231,12 +249,16 @@ struct cnic_local {
union { union {
void *gen; void *gen;
struct status_block_msix *bnx2; struct status_block_msix *bnx2;
struct host_status_block *bnx2x; struct host_hc_status_block_e1x *bnx2x_e1x;
/* index values - which counter to update */
#define SM_RX_ID 0
#define SM_TX_ID 1
} status_blk; } status_blk;
struct host_def_status_block *bnx2x_def_status_blk; struct host_sp_status_block *bnx2x_def_status_blk;
u32 status_blk_num; u32 status_blk_num;
u32 bnx2x_igu_sb_id;
u32 int_num; u32 int_num;
u32 last_status_idx; u32 last_status_idx;
struct tasklet_struct cnic_irq_task; struct tasklet_struct cnic_irq_task;
...@@ -358,24 +380,33 @@ struct bnx2x_bd_chain_next { ...@@ -358,24 +380,33 @@ struct bnx2x_bd_chain_next {
(BNX2X_MAX_RCQ_DESC_CNT - 1)) ? \ (BNX2X_MAX_RCQ_DESC_CNT - 1)) ? \
((x) + 2) : ((x) + 1) ((x) + 2) : ((x) + 1)
#define BNX2X_DEF_SB_ID 16 #define BNX2X_DEF_SB_ID HC_SP_SB_ID
#define BNX2X_ISCSI_RX_SB_INDEX_NUM \ #define BNX2X_SHMEM_MF_BLK_OFFSET 0x7e4
((HC_INDEX_DEF_U_ETH_ISCSI_RX_CQ_CONS << \
USTORM_ETH_ST_CONTEXT_CONFIG_CQE_SB_INDEX_NUMBER_SHIFT) & \
USTORM_ETH_ST_CONTEXT_CONFIG_CQE_SB_INDEX_NUMBER)
#define BNX2X_SHMEM_ADDR(base, field) (base + \ #define BNX2X_SHMEM_ADDR(base, field) (base + \
offsetof(struct shmem_region, field)) offsetof(struct shmem_region, field))
#define CNIC_PORT(cp) ((cp)->func % PORT_MAX) #define BNX2X_SHMEM2_ADDR(base, field) (base + \
offsetof(struct shmem2_region, field))
#define BNX2X_SHMEM2_HAS(base, field) \
((base) && \
(CNIC_RD(dev, BNX2X_SHMEM2_ADDR(base, size)) > \
offsetof(struct shmem2_region, field)))
#define CNIC_PORT(cp) ((cp)->pfid & 1)
#define CNIC_FUNC(cp) ((cp)->func) #define CNIC_FUNC(cp) ((cp)->func)
#define CNIC_E1HVN(cp) ((cp)->func >> 1) #define CNIC_E1HVN(cp) ((cp)->pfid >> 1)
#define BNX2X_HW_CID(cp, x) (((CNIC_FUNC(cp) % PORT_MAX) << 23) | \ #define BNX2X_HW_CID(cp, x) ((CNIC_PORT(cp) << 23) | \
(CNIC_E1HVN(cp) << 17) | (x)) (CNIC_E1HVN(cp) << 17) | (x))
#define BNX2X_SW_CID(x) (x & 0x1ffff) #define BNX2X_SW_CID(x) (x & 0x1ffff)
#define BNX2X_CL_QZONE_ID(cp, cli) \
(cli + (CNIC_PORT(cp) * ETH_MAX_RX_CLIENTS_E1H))
#define TCP_TSTORM_OOO_DROP_AND_PROC_ACK (0<<4)
#endif #endif
此差异已折叠。
...@@ -138,6 +138,7 @@ struct cnic_irq { ...@@ -138,6 +138,7 @@ struct cnic_irq {
unsigned int vector; unsigned int vector;
void *status_blk; void *status_blk;
u32 status_blk_num; u32 status_blk_num;
u32 status_blk_num2;
u32 irq_flags; u32 irq_flags;
#define CNIC_IRQ_FL_MSIX 0x00000001 #define CNIC_IRQ_FL_MSIX 0x00000001
}; };
...@@ -152,6 +153,7 @@ struct cnic_eth_dev { ...@@ -152,6 +153,7 @@ struct cnic_eth_dev {
struct pci_dev *pdev; struct pci_dev *pdev;
void __iomem *io_base; void __iomem *io_base;
void __iomem *io_base2; void __iomem *io_base2;
void *iro_arr;
u32 ctx_tbl_offset; u32 ctx_tbl_offset;
u32 ctx_tbl_len; u32 ctx_tbl_len;
......
...@@ -58,6 +58,8 @@ ...@@ -58,6 +58,8 @@
#define MAX_PAGES_PER_CTRL_STRUCT_POOL 8 #define MAX_PAGES_PER_CTRL_STRUCT_POOL 8
#define BNX2I_RESERVED_SLOW_PATH_CMD_SLOTS 4 #define BNX2I_RESERVED_SLOW_PATH_CMD_SLOTS 4
#define BNX2I_5771X_DBELL_PAGE_SIZE 128
/* 5706/08 hardware has limit on maximum buffer size per BD it can handle */ /* 5706/08 hardware has limit on maximum buffer size per BD it can handle */
#define MAX_BD_LENGTH 65535 #define MAX_BD_LENGTH 65535
#define BD_SPLIT_SIZE 32768 #define BD_SPLIT_SIZE 32768
......
...@@ -2405,7 +2405,8 @@ int bnx2i_map_ep_dbell_regs(struct bnx2i_endpoint *ep) ...@@ -2405,7 +2405,8 @@ int bnx2i_map_ep_dbell_regs(struct bnx2i_endpoint *ep)
if (test_bit(BNX2I_NX2_DEV_57710, &ep->hba->cnic_dev_type)) { if (test_bit(BNX2I_NX2_DEV_57710, &ep->hba->cnic_dev_type)) {
reg_base = pci_resource_start(ep->hba->pcidev, reg_base = pci_resource_start(ep->hba->pcidev,
BNX2X_DOORBELL_PCI_BAR); BNX2X_DOORBELL_PCI_BAR);
reg_off = PAGE_SIZE * (cid_num & 0x1FFFF) + DPM_TRIGER_TYPE; reg_off = BNX2I_5771X_DBELL_PAGE_SIZE * (cid_num & 0x1FFFF) +
DPM_TRIGER_TYPE;
ep->qp.ctx_base = ioremap_nocache(reg_base + reg_off, 4); ep->qp.ctx_base = ioremap_nocache(reg_base + reg_off, 4);
goto arm_cq; goto arm_cq;
} }
......
...@@ -32,8 +32,8 @@ fw-shipped-$(CONFIG_ADAPTEC_STARFIRE) += adaptec/starfire_rx.bin \ ...@@ -32,8 +32,8 @@ fw-shipped-$(CONFIG_ADAPTEC_STARFIRE) += adaptec/starfire_rx.bin \
adaptec/starfire_tx.bin adaptec/starfire_tx.bin
fw-shipped-$(CONFIG_ATARI_DSP56K) += dsp56k/bootstrap.bin fw-shipped-$(CONFIG_ATARI_DSP56K) += dsp56k/bootstrap.bin
fw-shipped-$(CONFIG_ATM_AMBASSADOR) += atmsar11.fw fw-shipped-$(CONFIG_ATM_AMBASSADOR) += atmsar11.fw
fw-shipped-$(CONFIG_BNX2X) += bnx2x/bnx2x-e1-5.2.13.0.fw \ fw-shipped-$(CONFIG_BNX2X) += bnx2x/bnx2x-e1-6.0.34.0.fw \
bnx2x/bnx2x-e1h-5.2.13.0.fw bnx2x/bnx2x-e1h-6.0.34.0.fw
fw-shipped-$(CONFIG_BNX2) += bnx2/bnx2-mips-09-5.0.0.j15.fw \ fw-shipped-$(CONFIG_BNX2) += bnx2/bnx2-mips-09-5.0.0.j15.fw \
bnx2/bnx2-rv2p-09-5.0.0.j10.fw \ bnx2/bnx2-rv2p-09-5.0.0.j10.fw \
bnx2/bnx2-rv2p-09ax-5.0.0.j10.fw \ bnx2/bnx2-rv2p-09ax-5.0.0.j10.fw \
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册