You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
New 7.0 FW: bnx2x, cnic, bnx2i, bnx2fc
New FW/HSI (7.0): - Added support to 578xx chips - Improved HSI - much less driver's direct access to the FW internal memory needed. New implementation of the HSI handling layer in the bnx2x (bnx2x_sp.c): - Introduced chip dependent objects that have chip independent interfaces for configuration of MACs, multicast addresses, Rx mode, indirection table, fast path queues and function initialization/cleanup. - Objects functionality is based on the private function pointers, which allows not only a per-chip but also PF/VF differentiation while still preserving the same interface towards the driver. - Objects interface is not influenced by the HSI changes which do not require providing new parameters keeping the code outside the bnx2x_sp.c invariant with regard to such HSI chnages. Changes in a CNIC, bnx2fc and bnx2i modules due to the new HSI. Signed-off-by: Vladislav Zolotarov <vladz@broadcom.com> Signed-off-by: Michael Chan <mchan@broadcom.com> Signed-off-by: Bhanu Prakash Gollapudi <bprakash@broadcom.com> Signed-off-by: Eilon Greenstein <eilong@broadcom.com> Signed-off-by: David S. Miller <davem@conan.davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
042181f5aa
commit
619c5cb688
+446
-338
File diff suppressed because it is too large
Load Diff
+580
-282
File diff suppressed because it is too large
Load Diff
+430
-129
File diff suppressed because it is too large
Load Diff
+61
-102
@@ -55,15 +55,14 @@ static void bnx2x_pfc_set(struct bnx2x *bp)
|
||||
struct bnx2x_nig_brb_pfc_port_params pfc_params = {0};
|
||||
u32 pri_bit, val = 0;
|
||||
u8 pri;
|
||||
int i;
|
||||
|
||||
/* Tx COS configuration */
|
||||
if (bp->dcbx_port_params.ets.cos_params[0].pauseable)
|
||||
pfc_params.rx_cos0_priority_mask =
|
||||
bp->dcbx_port_params.ets.cos_params[0].pri_bitmask;
|
||||
if (bp->dcbx_port_params.ets.cos_params[1].pauseable)
|
||||
pfc_params.rx_cos1_priority_mask =
|
||||
bp->dcbx_port_params.ets.cos_params[1].pri_bitmask;
|
||||
|
||||
for (i = 0; i < bp->dcbx_port_params.ets.num_of_cos; i++)
|
||||
if (bp->dcbx_port_params.ets.cos_params[i].pauseable)
|
||||
pfc_params.rx_cos_priority_mask[i] =
|
||||
bp->dcbx_port_params.ets.
|
||||
cos_params[i].pri_bitmask;
|
||||
|
||||
/**
|
||||
* Rx COS configuration
|
||||
@@ -378,7 +377,7 @@ static int bnx2x_dcbx_read_mib(struct bnx2x *bp,
|
||||
|
||||
static void bnx2x_pfc_set_pfc(struct bnx2x *bp)
|
||||
{
|
||||
if (CHIP_IS_E2(bp)) {
|
||||
if (!CHIP_IS_E1x(bp)) {
|
||||
if (BP_PORT(bp)) {
|
||||
BNX2X_ERR("4 port mode is not supported");
|
||||
return;
|
||||
@@ -406,7 +405,7 @@ static void bnx2x_dcbx_stop_hw_tx(struct bnx2x *bp)
|
||||
0 /* connectionless */,
|
||||
0 /* dataHi is zero */,
|
||||
0 /* dataLo is zero */,
|
||||
1 /* common */);
|
||||
NONE_CONNECTION_TYPE);
|
||||
}
|
||||
|
||||
static void bnx2x_dcbx_resume_hw_tx(struct bnx2x *bp)
|
||||
@@ -417,7 +416,7 @@ static void bnx2x_dcbx_resume_hw_tx(struct bnx2x *bp)
|
||||
0, /* connectionless */
|
||||
U64_HI(bnx2x_sp_mapping(bp, pfc_config)),
|
||||
U64_LO(bnx2x_sp_mapping(bp, pfc_config)),
|
||||
1 /* commmon */);
|
||||
NONE_CONNECTION_TYPE);
|
||||
}
|
||||
|
||||
static void bnx2x_dcbx_update_ets_params(struct bnx2x *bp)
|
||||
@@ -425,7 +424,7 @@ static void bnx2x_dcbx_update_ets_params(struct bnx2x *bp)
|
||||
struct bnx2x_dcbx_pg_params *ets = &(bp->dcbx_port_params.ets);
|
||||
u8 status = 0;
|
||||
|
||||
bnx2x_ets_disabled(&bp->link_params);
|
||||
bnx2x_ets_disabled(&bp->link_params/*, &bp->link_vars*/);
|
||||
|
||||
if (!ets->enabled)
|
||||
return;
|
||||
@@ -527,6 +526,7 @@ static int bnx2x_dcbx_read_shmem_neg_results(struct bnx2x *bp)
|
||||
BNX2X_ERR("FW doesn't support dcbx_neg_res_offset\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
rc = bnx2x_dcbx_read_mib(bp, (u32 *)&local_mib, dcbx_neg_res_offset,
|
||||
DCBX_READ_LOCAL_MIB);
|
||||
|
||||
@@ -563,15 +563,6 @@ u8 bnx2x_dcbx_dcbnl_app_idtype(struct dcbx_app_priority_entry *ent)
|
||||
DCB_APP_IDTYPE_ETHTYPE;
|
||||
}
|
||||
|
||||
static inline
|
||||
void bnx2x_dcbx_invalidate_local_apps(struct bnx2x *bp)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < DCBX_MAX_APP_PROTOCOL; i++)
|
||||
bp->dcbx_local_feat.app.app_pri_tbl[i].appBitfield &=
|
||||
~DCBX_APP_ENTRY_VALID;
|
||||
}
|
||||
|
||||
int bnx2x_dcbnl_update_applist(struct bnx2x *bp, bool delall)
|
||||
{
|
||||
int i, err = 0;
|
||||
@@ -597,32 +588,28 @@ int bnx2x_dcbnl_update_applist(struct bnx2x *bp, bool delall)
|
||||
}
|
||||
#endif
|
||||
|
||||
static inline void bnx2x_update_drv_flags(struct bnx2x *bp, u32 flags, u32 set)
|
||||
{
|
||||
if (SHMEM2_HAS(bp, drv_flags)) {
|
||||
u32 drv_flags;
|
||||
bnx2x_acquire_hw_lock(bp, HW_LOCK_DRV_FLAGS);
|
||||
drv_flags = SHMEM2_RD(bp, drv_flags);
|
||||
|
||||
if (set)
|
||||
SET_FLAGS(drv_flags, flags);
|
||||
else
|
||||
RESET_FLAGS(drv_flags, flags);
|
||||
|
||||
SHMEM2_WR(bp, drv_flags, drv_flags);
|
||||
DP(NETIF_MSG_HW, "drv_flags 0x%08x\n", drv_flags);
|
||||
bnx2x_release_hw_lock(bp, HW_LOCK_DRV_FLAGS);
|
||||
}
|
||||
}
|
||||
|
||||
void bnx2x_dcbx_set_params(struct bnx2x *bp, u32 state)
|
||||
{
|
||||
switch (state) {
|
||||
case BNX2X_DCBX_STATE_NEG_RECEIVED:
|
||||
#ifdef BCM_CNIC
|
||||
if (bp->state != BNX2X_STATE_OPENING_WAIT4_LOAD) {
|
||||
struct cnic_ops *c_ops;
|
||||
struct cnic_eth_dev *cp = &bp->cnic_eth_dev;
|
||||
bp->flags |= NO_ISCSI_OOO_FLAG | NO_ISCSI_FLAG;
|
||||
cp->drv_state |= CNIC_DRV_STATE_NO_ISCSI_OOO;
|
||||
cp->drv_state |= CNIC_DRV_STATE_NO_ISCSI;
|
||||
|
||||
rcu_read_lock();
|
||||
c_ops = rcu_dereference(bp->cnic_ops);
|
||||
if (c_ops) {
|
||||
bnx2x_cnic_notify(bp, CNIC_CTL_STOP_ISCSI_CMD);
|
||||
rcu_read_unlock();
|
||||
return;
|
||||
}
|
||||
rcu_read_unlock();
|
||||
}
|
||||
|
||||
/* fall through if no CNIC initialized */
|
||||
case BNX2X_DCBX_STATE_ISCSI_STOPPED:
|
||||
#endif
|
||||
|
||||
{
|
||||
DP(NETIF_MSG_LINK, "BNX2X_DCBX_STATE_NEG_RECEIVED\n");
|
||||
#ifdef BCM_DCBNL
|
||||
@@ -646,7 +633,8 @@ void bnx2x_dcbx_set_params(struct bnx2x *bp, u32 state)
|
||||
bnx2x_get_dcbx_drv_param(bp, &bp->dcbx_local_feat,
|
||||
bp->dcbx_error);
|
||||
|
||||
if (bp->state != BNX2X_STATE_OPENING_WAIT4_LOAD) {
|
||||
/* mark DCBX result for PMF migration */
|
||||
bnx2x_update_drv_flags(bp, DRV_FLAGS_DCB_CONFIGURED, 1);
|
||||
#ifdef BCM_DCBNL
|
||||
/**
|
||||
* Add new app tlvs to dcbnl
|
||||
@@ -654,33 +642,19 @@ void bnx2x_dcbx_set_params(struct bnx2x *bp, u32 state)
|
||||
bnx2x_dcbnl_update_applist(bp, false);
|
||||
#endif
|
||||
bnx2x_dcbx_stop_hw_tx(bp);
|
||||
|
||||
return;
|
||||
}
|
||||
/* fall through */
|
||||
#ifdef BCM_DCBNL
|
||||
/**
|
||||
* Invalidate the local app tlvs if they are not added
|
||||
* to the dcbnl app list to avoid deleting them from
|
||||
* the list later on
|
||||
*/
|
||||
bnx2x_dcbx_invalidate_local_apps(bp);
|
||||
#endif
|
||||
}
|
||||
case BNX2X_DCBX_STATE_TX_PAUSED:
|
||||
DP(NETIF_MSG_LINK, "BNX2X_DCBX_STATE_TX_PAUSED\n");
|
||||
bnx2x_pfc_set_pfc(bp);
|
||||
|
||||
bnx2x_dcbx_update_ets_params(bp);
|
||||
if (bp->state != BNX2X_STATE_OPENING_WAIT4_LOAD) {
|
||||
bnx2x_dcbx_resume_hw_tx(bp);
|
||||
return;
|
||||
}
|
||||
/* fall through */
|
||||
case BNX2X_DCBX_STATE_TX_RELEASED:
|
||||
DP(NETIF_MSG_LINK, "BNX2X_DCBX_STATE_TX_RELEASED\n");
|
||||
if (bp->state != BNX2X_STATE_OPENING_WAIT4_LOAD)
|
||||
bnx2x_fw_command(bp, DRV_MSG_CODE_DCBX_PMF_DRV_OK, 0);
|
||||
|
||||
return;
|
||||
default:
|
||||
BNX2X_ERR("Unknown DCBX_STATE\n");
|
||||
@@ -868,7 +842,7 @@ static void bnx2x_dcbx_admin_mib_updated_params(struct bnx2x *bp,
|
||||
|
||||
void bnx2x_dcbx_set_state(struct bnx2x *bp, bool dcb_on, u32 dcbx_enabled)
|
||||
{
|
||||
if (CHIP_IS_E2(bp) && !CHIP_MODE_IS_4_PORT(bp)) {
|
||||
if (!CHIP_IS_E1x(bp) && !CHIP_MODE_IS_4_PORT(bp)) {
|
||||
bp->dcb_state = dcb_on;
|
||||
bp->dcbx_enabled = dcbx_enabled;
|
||||
} else {
|
||||
@@ -974,6 +948,8 @@ void bnx2x_dcbx_init(struct bnx2x *bp)
|
||||
DP(NETIF_MSG_LINK, "dcbx_lldp_params_offset 0x%x\n",
|
||||
dcbx_lldp_params_offset);
|
||||
|
||||
bnx2x_update_drv_flags(bp, DRV_FLAGS_DCB_CONFIGURED, 0);
|
||||
|
||||
if (SHMEM_LLDP_DCBX_PARAMS_NONE != dcbx_lldp_params_offset) {
|
||||
bnx2x_dcbx_lldp_updated_params(bp,
|
||||
dcbx_lldp_params_offset);
|
||||
@@ -981,46 +957,12 @@ void bnx2x_dcbx_init(struct bnx2x *bp)
|
||||
bnx2x_dcbx_admin_mib_updated_params(bp,
|
||||
dcbx_lldp_params_offset);
|
||||
|
||||
/* set default configuration BC has */
|
||||
bnx2x_dcbx_set_params(bp,
|
||||
BNX2X_DCBX_STATE_NEG_RECEIVED);
|
||||
|
||||
/* Let HW start negotiation */
|
||||
bnx2x_fw_command(bp,
|
||||
DRV_MSG_CODE_DCBX_ADMIN_PMF_MSG, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void bnx2x_dcb_init_intmem_pfc(struct bnx2x *bp)
|
||||
{
|
||||
struct priority_cos pricos[MAX_PFC_TRAFFIC_TYPES];
|
||||
u32 i = 0, addr;
|
||||
memset(pricos, 0, sizeof(pricos));
|
||||
/* Default initialization */
|
||||
for (i = 0; i < MAX_PFC_TRAFFIC_TYPES; i++)
|
||||
pricos[i].priority = LLFC_TRAFFIC_TYPE_TO_PRIORITY_UNMAPPED;
|
||||
|
||||
/* Store per port struct to internal memory */
|
||||
addr = BAR_XSTRORM_INTMEM +
|
||||
XSTORM_CMNG_PER_PORT_VARS_OFFSET(BP_PORT(bp)) +
|
||||
offsetof(struct cmng_struct_per_port,
|
||||
traffic_type_to_priority_cos);
|
||||
__storm_memset_struct(bp, addr, sizeof(pricos), (u32 *)pricos);
|
||||
|
||||
|
||||
/* LLFC disabled.*/
|
||||
REG_WR8(bp , BAR_XSTRORM_INTMEM +
|
||||
XSTORM_CMNG_PER_PORT_VARS_OFFSET(BP_PORT(bp)) +
|
||||
offsetof(struct cmng_struct_per_port, llfc_mode),
|
||||
LLFC_MODE_NONE);
|
||||
|
||||
/* DCBX disabled.*/
|
||||
REG_WR8(bp , BAR_XSTRORM_INTMEM +
|
||||
XSTORM_CMNG_PER_PORT_VARS_OFFSET(BP_PORT(bp)) +
|
||||
offsetof(struct cmng_struct_per_port, dcb_enabled),
|
||||
DCB_DISABLED);
|
||||
}
|
||||
|
||||
static void
|
||||
bnx2x_dcbx_print_cos_params(struct bnx2x *bp,
|
||||
struct flow_control_configuration *pfc_fw_cfg)
|
||||
@@ -1591,13 +1533,7 @@ static void bnx2x_pfc_fw_struct_e2(struct bnx2x *bp)
|
||||
|
||||
/* Fw version should be incremented each update */
|
||||
pfc_fw_cfg->dcb_version = ++bp->dcb_version;
|
||||
pfc_fw_cfg->dcb_enabled = DCB_ENABLED;
|
||||
|
||||
/* Default initialization */
|
||||
for (pri = 0; pri < MAX_PFC_TRAFFIC_TYPES ; pri++) {
|
||||
tt2cos[pri].priority = LLFC_TRAFFIC_TYPE_TO_PRIORITY_UNMAPPED;
|
||||
tt2cos[pri].cos = 0;
|
||||
}
|
||||
pfc_fw_cfg->dcb_enabled = 1;
|
||||
|
||||
/* Fill priority parameters */
|
||||
for (pri = 0; pri < LLFC_DRIVER_TRAFFIC_TYPE_MAX; pri++) {
|
||||
@@ -1605,14 +1541,37 @@ static void bnx2x_pfc_fw_struct_e2(struct bnx2x *bp)
|
||||
pri_bit = 1 << tt2cos[pri].priority;
|
||||
|
||||
/* Fill COS parameters based on COS calculated to
|
||||
* make it more generally for future use */
|
||||
* make it more general for future use */
|
||||
for (cos = 0; cos < bp->dcbx_port_params.ets.num_of_cos; cos++)
|
||||
if (bp->dcbx_port_params.ets.cos_params[cos].
|
||||
pri_bitmask & pri_bit)
|
||||
tt2cos[pri].cos = cos;
|
||||
}
|
||||
|
||||
/* we never want the FW to add a 0 vlan tag */
|
||||
pfc_fw_cfg->dont_add_pri_0_en = 1;
|
||||
|
||||
bnx2x_dcbx_print_cos_params(bp, pfc_fw_cfg);
|
||||
}
|
||||
|
||||
void bnx2x_dcbx_pmf_update(struct bnx2x *bp)
|
||||
{
|
||||
/* if we need to syncronize DCBX result from prev PMF
|
||||
* read it from shmem and update bp accordingly
|
||||
*/
|
||||
if (SHMEM2_HAS(bp, drv_flags) &&
|
||||
GET_FLAGS(SHMEM2_RD(bp, drv_flags), DRV_FLAGS_DCB_CONFIGURED)) {
|
||||
/* Read neg results if dcbx is in the FW */
|
||||
if (bnx2x_dcbx_read_shmem_neg_results(bp))
|
||||
return;
|
||||
|
||||
bnx2x_dump_dcbx_drv_param(bp, &bp->dcbx_local_feat,
|
||||
bp->dcbx_error);
|
||||
bnx2x_get_dcbx_drv_param(bp, &bp->dcbx_local_feat,
|
||||
bp->dcbx_error);
|
||||
}
|
||||
}
|
||||
|
||||
/* DCB netlink */
|
||||
#ifdef BCM_DCBNL
|
||||
|
||||
|
||||
@@ -179,9 +179,6 @@ void bnx2x_dcbx_set_state(struct bnx2x *bp, bool dcb_on, u32 dcbx_enabled);
|
||||
|
||||
enum {
|
||||
BNX2X_DCBX_STATE_NEG_RECEIVED = 0x1,
|
||||
#ifdef BCM_CNIC
|
||||
BNX2X_DCBX_STATE_ISCSI_STOPPED,
|
||||
#endif
|
||||
BNX2X_DCBX_STATE_TX_PAUSED,
|
||||
BNX2X_DCBX_STATE_TX_RELEASED
|
||||
};
|
||||
|
||||
+497
-368
File diff suppressed because it is too large
Load Diff
+251
-133
File diff suppressed because it is too large
Load Diff
+241
-362
File diff suppressed because it is too large
Load Diff
+3019
-1648
File diff suppressed because it is too large
Load Diff
+224
-92
@@ -15,98 +15,34 @@
|
||||
#ifndef BNX2X_INIT_H
|
||||
#define BNX2X_INIT_H
|
||||
|
||||
/* RAM0 size in bytes */
|
||||
#define STORM_INTMEM_SIZE_E1 0x5800
|
||||
#define STORM_INTMEM_SIZE_E1H 0x10000
|
||||
#define STORM_INTMEM_SIZE(bp) ((CHIP_IS_E1(bp) ? STORM_INTMEM_SIZE_E1 : \
|
||||
STORM_INTMEM_SIZE_E1H) / 4)
|
||||
|
||||
|
||||
/* Init operation types and structures */
|
||||
/* Common for both E1 and E1H */
|
||||
#define OP_RD 0x1 /* read single register */
|
||||
#define OP_WR 0x2 /* write single register */
|
||||
#define OP_IW 0x3 /* write single register using mailbox */
|
||||
#define OP_SW 0x4 /* copy a string to the device */
|
||||
#define OP_SI 0x5 /* copy a string using mailbox */
|
||||
#define OP_ZR 0x6 /* clear memory */
|
||||
#define OP_ZP 0x7 /* unzip then copy with DMAE */
|
||||
#define OP_WR_64 0x8 /* write 64 bit pattern */
|
||||
#define OP_WB 0x9 /* copy a string using DMAE */
|
||||
|
||||
/* FPGA and EMUL specific operations */
|
||||
#define OP_WR_EMUL 0xa /* write single register on Emulation */
|
||||
#define OP_WR_FPGA 0xb /* write single register on FPGA */
|
||||
#define OP_WR_ASIC 0xc /* write single register on ASIC */
|
||||
|
||||
/* Init stages */
|
||||
/* Never reorder stages !!! */
|
||||
#define COMMON_STAGE 0
|
||||
#define PORT0_STAGE 1
|
||||
#define PORT1_STAGE 2
|
||||
#define FUNC0_STAGE 3
|
||||
#define FUNC1_STAGE 4
|
||||
#define FUNC2_STAGE 5
|
||||
#define FUNC3_STAGE 6
|
||||
#define FUNC4_STAGE 7
|
||||
#define FUNC5_STAGE 8
|
||||
#define FUNC6_STAGE 9
|
||||
#define FUNC7_STAGE 10
|
||||
#define STAGE_IDX_MAX 11
|
||||
|
||||
#define STAGE_START 0
|
||||
#define STAGE_END 1
|
||||
|
||||
|
||||
/* Indices of blocks */
|
||||
#define PRS_BLOCK 0
|
||||
#define SRCH_BLOCK 1
|
||||
#define TSDM_BLOCK 2
|
||||
#define TCM_BLOCK 3
|
||||
#define BRB1_BLOCK 4
|
||||
#define TSEM_BLOCK 5
|
||||
#define PXPCS_BLOCK 6
|
||||
#define EMAC0_BLOCK 7
|
||||
#define EMAC1_BLOCK 8
|
||||
#define DBU_BLOCK 9
|
||||
#define MISC_BLOCK 10
|
||||
#define DBG_BLOCK 11
|
||||
#define NIG_BLOCK 12
|
||||
#define MCP_BLOCK 13
|
||||
#define UPB_BLOCK 14
|
||||
#define CSDM_BLOCK 15
|
||||
#define USDM_BLOCK 16
|
||||
#define CCM_BLOCK 17
|
||||
#define UCM_BLOCK 18
|
||||
#define USEM_BLOCK 19
|
||||
#define CSEM_BLOCK 20
|
||||
#define XPB_BLOCK 21
|
||||
#define DQ_BLOCK 22
|
||||
#define TIMERS_BLOCK 23
|
||||
#define XSDM_BLOCK 24
|
||||
#define QM_BLOCK 25
|
||||
#define PBF_BLOCK 26
|
||||
#define XCM_BLOCK 27
|
||||
#define XSEM_BLOCK 28
|
||||
#define CDU_BLOCK 29
|
||||
#define DMAE_BLOCK 30
|
||||
#define PXP_BLOCK 31
|
||||
#define CFC_BLOCK 32
|
||||
#define HC_BLOCK 33
|
||||
#define PXP2_BLOCK 34
|
||||
#define MISC_AEU_BLOCK 35
|
||||
#define PGLUE_B_BLOCK 36
|
||||
#define IGU_BLOCK 37
|
||||
#define ATC_BLOCK 38
|
||||
#define QM_4PORT_BLOCK 39
|
||||
#define XSEM_4PORT_BLOCK 40
|
||||
enum {
|
||||
OP_RD = 0x1, /* read a single register */
|
||||
OP_WR, /* write a single register */
|
||||
OP_SW, /* copy a string to the device */
|
||||
OP_ZR, /* clear memory */
|
||||
OP_ZP, /* unzip then copy with DMAE */
|
||||
OP_WR_64, /* write 64 bit pattern */
|
||||
OP_WB, /* copy a string using DMAE */
|
||||
OP_WB_ZR, /* Clear a string using DMAE or indirect-wr */
|
||||
/* Skip the following ops if all of the init modes don't match */
|
||||
OP_IF_MODE_OR,
|
||||
/* Skip the following ops if any of the init modes don't match */
|
||||
OP_IF_MODE_AND,
|
||||
OP_MAX
|
||||
};
|
||||
|
||||
enum {
|
||||
STAGE_START,
|
||||
STAGE_END,
|
||||
};
|
||||
|
||||
/* Returns the index of start or end of a specific block stage in ops array*/
|
||||
#define BLOCK_OPS_IDX(block, stage, end) \
|
||||
(2*(((block)*STAGE_IDX_MAX) + (stage)) + (end))
|
||||
(2*(((block)*NUM_OF_INIT_PHASES) + (stage)) + (end))
|
||||
|
||||
|
||||
/* structs for the various opcodes */
|
||||
struct raw_op {
|
||||
u32 op:8;
|
||||
u32 offset:24;
|
||||
@@ -116,7 +52,7 @@ struct raw_op {
|
||||
struct op_read {
|
||||
u32 op:8;
|
||||
u32 offset:24;
|
||||
u32 pad;
|
||||
u32 val;
|
||||
};
|
||||
|
||||
struct op_write {
|
||||
@@ -125,15 +61,15 @@ struct op_write {
|
||||
u32 val;
|
||||
};
|
||||
|
||||
struct op_string_write {
|
||||
struct op_arr_write {
|
||||
u32 op:8;
|
||||
u32 offset:24;
|
||||
#ifdef __LITTLE_ENDIAN
|
||||
u16 data_off;
|
||||
u16 data_len;
|
||||
#else /* __BIG_ENDIAN */
|
||||
#ifdef __BIG_ENDIAN
|
||||
u16 data_len;
|
||||
u16 data_off;
|
||||
#else /* __LITTLE_ENDIAN */
|
||||
u16 data_off;
|
||||
u16 data_len;
|
||||
#endif
|
||||
};
|
||||
|
||||
@@ -143,14 +79,210 @@ struct op_zero {
|
||||
u32 len;
|
||||
};
|
||||
|
||||
struct op_if_mode {
|
||||
u32 op:8;
|
||||
u32 cmd_offset:24;
|
||||
u32 mode_bit_map;
|
||||
};
|
||||
|
||||
|
||||
union init_op {
|
||||
struct op_read read;
|
||||
struct op_write write;
|
||||
struct op_string_write str_wr;
|
||||
struct op_arr_write arr_wr;
|
||||
struct op_zero zero;
|
||||
struct raw_op raw;
|
||||
struct op_if_mode if_mode;
|
||||
};
|
||||
|
||||
|
||||
/* Init Phases */
|
||||
enum {
|
||||
PHASE_COMMON,
|
||||
PHASE_PORT0,
|
||||
PHASE_PORT1,
|
||||
PHASE_PF0,
|
||||
PHASE_PF1,
|
||||
PHASE_PF2,
|
||||
PHASE_PF3,
|
||||
PHASE_PF4,
|
||||
PHASE_PF5,
|
||||
PHASE_PF6,
|
||||
PHASE_PF7,
|
||||
NUM_OF_INIT_PHASES
|
||||
};
|
||||
|
||||
/* Init Modes */
|
||||
enum {
|
||||
MODE_ASIC = 0x00000001,
|
||||
MODE_FPGA = 0x00000002,
|
||||
MODE_EMUL = 0x00000004,
|
||||
MODE_E2 = 0x00000008,
|
||||
MODE_E3 = 0x00000010,
|
||||
MODE_PORT2 = 0x00000020,
|
||||
MODE_PORT4 = 0x00000040,
|
||||
MODE_SF = 0x00000080,
|
||||
MODE_MF = 0x00000100,
|
||||
MODE_MF_SD = 0x00000200,
|
||||
MODE_MF_SI = 0x00000400,
|
||||
MODE_MF_NIV = 0x00000800,
|
||||
MODE_E3_A0 = 0x00001000,
|
||||
MODE_E3_B0 = 0x00002000,
|
||||
MODE_COS_BC = 0x00004000,
|
||||
MODE_COS3 = 0x00008000,
|
||||
MODE_COS6 = 0x00010000,
|
||||
MODE_LITTLE_ENDIAN = 0x00020000,
|
||||
MODE_BIG_ENDIAN = 0x00040000,
|
||||
};
|
||||
|
||||
/* Init Blocks */
|
||||
enum {
|
||||
BLOCK_ATC,
|
||||
BLOCK_BRB1,
|
||||
BLOCK_CCM,
|
||||
BLOCK_CDU,
|
||||
BLOCK_CFC,
|
||||
BLOCK_CSDM,
|
||||
BLOCK_CSEM,
|
||||
BLOCK_DBG,
|
||||
BLOCK_DMAE,
|
||||
BLOCK_DORQ,
|
||||
BLOCK_HC,
|
||||
BLOCK_IGU,
|
||||
BLOCK_MISC,
|
||||
BLOCK_NIG,
|
||||
BLOCK_PBF,
|
||||
BLOCK_PGLUE_B,
|
||||
BLOCK_PRS,
|
||||
BLOCK_PXP2,
|
||||
BLOCK_PXP,
|
||||
BLOCK_QM,
|
||||
BLOCK_SRC,
|
||||
BLOCK_TCM,
|
||||
BLOCK_TM,
|
||||
BLOCK_TSDM,
|
||||
BLOCK_TSEM,
|
||||
BLOCK_UCM,
|
||||
BLOCK_UPB,
|
||||
BLOCK_USDM,
|
||||
BLOCK_USEM,
|
||||
BLOCK_XCM,
|
||||
BLOCK_XPB,
|
||||
BLOCK_XSDM,
|
||||
BLOCK_XSEM,
|
||||
BLOCK_MISC_AEU,
|
||||
NUM_OF_INIT_BLOCKS
|
||||
};
|
||||
|
||||
/* QM queue numbers */
|
||||
#define BNX2X_ETH_Q 0
|
||||
#define BNX2X_TOE_Q 3
|
||||
#define BNX2X_TOE_ACK_Q 6
|
||||
#define BNX2X_ISCSI_Q 9
|
||||
#define BNX2X_ISCSI_ACK_Q 8
|
||||
#define BNX2X_FCOE_Q 10
|
||||
|
||||
/* Vnics per mode */
|
||||
#define BNX2X_PORT2_MODE_NUM_VNICS 4
|
||||
#define BNX2X_PORT4_MODE_NUM_VNICS 2
|
||||
|
||||
/* COS offset for port1 in E3 B0 4port mode */
|
||||
#define BNX2X_E3B0_PORT1_COS_OFFSET 3
|
||||
|
||||
/* QM Register addresses */
|
||||
#define BNX2X_Q_VOQ_REG_ADDR(pf_q_num)\
|
||||
(QM_REG_QVOQIDX_0 + 4 * (pf_q_num))
|
||||
#define BNX2X_VOQ_Q_REG_ADDR(cos, pf_q_num)\
|
||||
(QM_REG_VOQQMASK_0_LSB + 4 * ((cos) * 2 + ((pf_q_num) >> 5)))
|
||||
#define BNX2X_Q_CMDQ_REG_ADDR(pf_q_num)\
|
||||
(QM_REG_BYTECRDCMDQ_0 + 4 * ((pf_q_num) >> 4))
|
||||
|
||||
/* extracts the QM queue number for the specified port and vnic */
|
||||
#define BNX2X_PF_Q_NUM(q_num, port, vnic)\
|
||||
((((port) << 1) | (vnic)) * 16 + (q_num))
|
||||
|
||||
|
||||
/* Maps the specified queue to the specified COS */
|
||||
static inline void bnx2x_map_q_cos(struct bnx2x *bp, u32 q_num, u32 new_cos)
|
||||
{
|
||||
/* find current COS mapping */
|
||||
u32 curr_cos = REG_RD(bp, QM_REG_QVOQIDX_0 + q_num * 4);
|
||||
|
||||
/* check if queue->COS mapping has changed */
|
||||
if (curr_cos != new_cos) {
|
||||
u32 num_vnics = BNX2X_PORT2_MODE_NUM_VNICS;
|
||||
u32 reg_addr, reg_bit_map, vnic;
|
||||
|
||||
/* update parameters for 4port mode */
|
||||
if (INIT_MODE_FLAGS(bp) & MODE_PORT4) {
|
||||
num_vnics = BNX2X_PORT4_MODE_NUM_VNICS;
|
||||
if (BP_PORT(bp)) {
|
||||
curr_cos += BNX2X_E3B0_PORT1_COS_OFFSET;
|
||||
new_cos += BNX2X_E3B0_PORT1_COS_OFFSET;
|
||||
}
|
||||
}
|
||||
|
||||
/* change queue mapping for each VNIC */
|
||||
for (vnic = 0; vnic < num_vnics; vnic++) {
|
||||
u32 pf_q_num =
|
||||
BNX2X_PF_Q_NUM(q_num, BP_PORT(bp), vnic);
|
||||
u32 q_bit_map = 1 << (pf_q_num & 0x1f);
|
||||
|
||||
/* overwrite queue->VOQ mapping */
|
||||
REG_WR(bp, BNX2X_Q_VOQ_REG_ADDR(pf_q_num), new_cos);
|
||||
|
||||
/* clear queue bit from current COS bit map */
|
||||
reg_addr = BNX2X_VOQ_Q_REG_ADDR(curr_cos, pf_q_num);
|
||||
reg_bit_map = REG_RD(bp, reg_addr);
|
||||
REG_WR(bp, reg_addr, reg_bit_map & (~q_bit_map));
|
||||
|
||||
/* set queue bit in new COS bit map */
|
||||
reg_addr = BNX2X_VOQ_Q_REG_ADDR(new_cos, pf_q_num);
|
||||
reg_bit_map = REG_RD(bp, reg_addr);
|
||||
REG_WR(bp, reg_addr, reg_bit_map | q_bit_map);
|
||||
|
||||
/* set/clear queue bit in command-queue bit map
|
||||
(E2/E3A0 only, valid COS values are 0/1) */
|
||||
if (!(INIT_MODE_FLAGS(bp) & MODE_E3_B0)) {
|
||||
reg_addr = BNX2X_Q_CMDQ_REG_ADDR(pf_q_num);
|
||||
reg_bit_map = REG_RD(bp, reg_addr);
|
||||
q_bit_map = 1 << (2 * (pf_q_num & 0xf));
|
||||
reg_bit_map = new_cos ?
|
||||
(reg_bit_map | q_bit_map) :
|
||||
(reg_bit_map & (~q_bit_map));
|
||||
REG_WR(bp, reg_addr, reg_bit_map);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Configures the QM according to the specified per-traffic-type COSes */
|
||||
static inline void bnx2x_dcb_config_qm(struct bnx2x *bp,
|
||||
struct priority_cos *traffic_cos)
|
||||
{
|
||||
bnx2x_map_q_cos(bp, BNX2X_FCOE_Q,
|
||||
traffic_cos[LLFC_TRAFFIC_TYPE_FCOE].cos);
|
||||
bnx2x_map_q_cos(bp, BNX2X_ISCSI_Q,
|
||||
traffic_cos[LLFC_TRAFFIC_TYPE_ISCSI].cos);
|
||||
if (INIT_MODE_FLAGS(bp) & MODE_COS_BC) {
|
||||
/* required only in backward compatible COS mode */
|
||||
bnx2x_map_q_cos(bp, BNX2X_ETH_Q,
|
||||
traffic_cos[LLFC_TRAFFIC_TYPE_NW].cos);
|
||||
bnx2x_map_q_cos(bp, BNX2X_TOE_Q,
|
||||
traffic_cos[LLFC_TRAFFIC_TYPE_NW].cos);
|
||||
bnx2x_map_q_cos(bp, BNX2X_TOE_ACK_Q,
|
||||
traffic_cos[LLFC_TRAFFIC_TYPE_NW].cos);
|
||||
bnx2x_map_q_cos(bp, BNX2X_ISCSI_ACK_Q,
|
||||
traffic_cos[LLFC_TRAFFIC_TYPE_ISCSI].cos);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Returns the index of start or end of a specific block stage in ops array*/
|
||||
#define BLOCK_OPS_IDX(block, stage, end) \
|
||||
(2*(((block)*NUM_OF_INIT_PHASES) + (stage)) + (end))
|
||||
|
||||
|
||||
#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 */
|
||||
|
||||
@@ -15,13 +15,39 @@
|
||||
#ifndef BNX2X_INIT_OPS_H
|
||||
#define BNX2X_INIT_OPS_H
|
||||
|
||||
|
||||
#ifndef BP_ILT
|
||||
#define BP_ILT(bp) NULL
|
||||
#endif
|
||||
|
||||
#ifndef BP_FUNC
|
||||
#define BP_FUNC(bp) 0
|
||||
#endif
|
||||
|
||||
#ifndef BP_PORT
|
||||
#define BP_PORT(bp) 0
|
||||
#endif
|
||||
|
||||
#ifndef BNX2X_ILT_FREE
|
||||
#define BNX2X_ILT_FREE(x, y, sz)
|
||||
#endif
|
||||
|
||||
#ifndef BNX2X_ILT_ZALLOC
|
||||
#define BNX2X_ILT_ZALLOC(x, y, sz)
|
||||
#endif
|
||||
|
||||
#ifndef ILOG2
|
||||
#define ILOG2(x) x
|
||||
#endif
|
||||
|
||||
static int bnx2x_gunzip(struct bnx2x *bp, const u8 *zbuf, int len);
|
||||
static void bnx2x_reg_wr_ind(struct bnx2x *bp, u32 addr, u32 val);
|
||||
static void bnx2x_write_dmae_phys_len(struct bnx2x *bp, dma_addr_t phys_addr,
|
||||
u32 addr, u32 len);
|
||||
static void bnx2x_write_dmae_phys_len(struct bnx2x *bp,
|
||||
dma_addr_t phys_addr, u32 addr,
|
||||
u32 len);
|
||||
|
||||
static void bnx2x_init_str_wr(struct bnx2x *bp, u32 addr, const u32 *data,
|
||||
u32 len)
|
||||
static void bnx2x_init_str_wr(struct bnx2x *bp, u32 addr,
|
||||
const u32 *data, u32 len)
|
||||
{
|
||||
u32 i;
|
||||
|
||||
@@ -29,24 +55,32 @@ static void bnx2x_init_str_wr(struct bnx2x *bp, u32 addr, const u32 *data,
|
||||
REG_WR(bp, addr + i*4, data[i]);
|
||||
}
|
||||
|
||||
static void bnx2x_init_ind_wr(struct bnx2x *bp, u32 addr, const u32 *data,
|
||||
u32 len)
|
||||
static void bnx2x_init_ind_wr(struct bnx2x *bp, u32 addr,
|
||||
const u32 *data, u32 len)
|
||||
{
|
||||
u32 i;
|
||||
|
||||
for (i = 0; i < len; i++)
|
||||
REG_WR_IND(bp, addr + i*4, data[i]);
|
||||
bnx2x_reg_wr_ind(bp, addr + i*4, data[i]);
|
||||
}
|
||||
|
||||
static void bnx2x_write_big_buf(struct bnx2x *bp, u32 addr, u32 len)
|
||||
static void bnx2x_write_big_buf(struct bnx2x *bp, u32 addr, u32 len,
|
||||
u8 wb)
|
||||
{
|
||||
if (bp->dmae_ready)
|
||||
bnx2x_write_dmae_phys_len(bp, GUNZIP_PHYS(bp), addr, len);
|
||||
else if (wb)
|
||||
/*
|
||||
* Wide bus registers with no dmae need to be written
|
||||
* using indirect write.
|
||||
*/
|
||||
bnx2x_init_ind_wr(bp, addr, GUNZIP_BUF(bp), len);
|
||||
else
|
||||
bnx2x_init_str_wr(bp, addr, GUNZIP_BUF(bp), len);
|
||||
}
|
||||
|
||||
static void bnx2x_init_fill(struct bnx2x *bp, u32 addr, int fill, u32 len)
|
||||
static void bnx2x_init_fill(struct bnx2x *bp, u32 addr, int fill,
|
||||
u32 len, u8 wb)
|
||||
{
|
||||
u32 buf_len = (((len*4) > FW_BUF_SIZE) ? FW_BUF_SIZE : (len*4));
|
||||
u32 buf_len32 = buf_len/4;
|
||||
@@ -57,12 +91,20 @@ static void bnx2x_init_fill(struct bnx2x *bp, u32 addr, int fill, u32 len)
|
||||
for (i = 0; i < len; i += buf_len32) {
|
||||
u32 cur_len = min(buf_len32, len - i);
|
||||
|
||||
bnx2x_write_big_buf(bp, addr + i*4, cur_len);
|
||||
bnx2x_write_big_buf(bp, addr + i*4, cur_len, wb);
|
||||
}
|
||||
}
|
||||
|
||||
static void bnx2x_init_wr_64(struct bnx2x *bp, u32 addr, const u32 *data,
|
||||
u32 len64)
|
||||
static void bnx2x_write_big_buf_wb(struct bnx2x *bp, u32 addr, u32 len)
|
||||
{
|
||||
if (bp->dmae_ready)
|
||||
bnx2x_write_dmae_phys_len(bp, GUNZIP_PHYS(bp), addr, len);
|
||||
else
|
||||
bnx2x_init_ind_wr(bp, addr, GUNZIP_BUF(bp), len);
|
||||
}
|
||||
|
||||
static void bnx2x_init_wr_64(struct bnx2x *bp, u32 addr,
|
||||
const u32 *data, u32 len64)
|
||||
{
|
||||
u32 buf_len32 = FW_BUF_SIZE/4;
|
||||
u32 len = len64*2;
|
||||
@@ -82,7 +124,7 @@ static void bnx2x_init_wr_64(struct bnx2x *bp, u32 addr, const u32 *data,
|
||||
for (i = 0; i < len; i += buf_len32) {
|
||||
u32 cur_len = min(buf_len32, len - i);
|
||||
|
||||
bnx2x_write_big_buf(bp, addr + i*4, cur_len);
|
||||
bnx2x_write_big_buf_wb(bp, addr + i*4, cur_len);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -100,7 +142,8 @@ static void bnx2x_init_wr_64(struct bnx2x *bp, u32 addr, const u32 *data,
|
||||
#define IF_IS_PRAM_ADDR(base, addr) \
|
||||
if (((base) <= (addr)) && ((base) + 0x40000 >= (addr)))
|
||||
|
||||
static const u8 *bnx2x_sel_blob(struct bnx2x *bp, u32 addr, const u8 *data)
|
||||
static const u8 *bnx2x_sel_blob(struct bnx2x *bp, u32 addr,
|
||||
const u8 *data)
|
||||
{
|
||||
IF_IS_INT_TABLE_ADDR(TSEM_REG_INT_TABLE, addr)
|
||||
data = INIT_TSEM_INT_TABLE_DATA(bp);
|
||||
@@ -129,31 +172,17 @@ static const u8 *bnx2x_sel_blob(struct bnx2x *bp, u32 addr, const u8 *data)
|
||||
return data;
|
||||
}
|
||||
|
||||
static void bnx2x_write_big_buf_wb(struct bnx2x *bp, u32 addr, u32 len)
|
||||
static void bnx2x_init_wr_wb(struct bnx2x *bp, u32 addr,
|
||||
const u32 *data, u32 len)
|
||||
{
|
||||
if (bp->dmae_ready)
|
||||
bnx2x_write_dmae_phys_len(bp, GUNZIP_PHYS(bp), addr, len);
|
||||
else
|
||||
bnx2x_init_ind_wr(bp, addr, GUNZIP_BUF(bp), len);
|
||||
}
|
||||
|
||||
static void bnx2x_init_wr_wb(struct bnx2x *bp, u32 addr, const u32 *data,
|
||||
u32 len)
|
||||
{
|
||||
const u32 *old_data = data;
|
||||
|
||||
data = (const u32 *)bnx2x_sel_blob(bp, addr, (const u8 *)data);
|
||||
|
||||
if (bp->dmae_ready) {
|
||||
if (old_data != data)
|
||||
VIRT_WR_DMAE_LEN(bp, data, addr, len, 1);
|
||||
else
|
||||
VIRT_WR_DMAE_LEN(bp, data, addr, len, 0);
|
||||
} else
|
||||
else
|
||||
bnx2x_init_ind_wr(bp, addr, data, len);
|
||||
}
|
||||
|
||||
static void bnx2x_wr_64(struct bnx2x *bp, u32 reg, u32 val_lo, u32 val_hi)
|
||||
static void bnx2x_wr_64(struct bnx2x *bp, u32 reg, u32 val_lo,
|
||||
u32 val_hi)
|
||||
{
|
||||
u32 wb_write[2];
|
||||
|
||||
@@ -161,8 +190,8 @@ static void bnx2x_wr_64(struct bnx2x *bp, u32 reg, u32 val_lo, u32 val_hi)
|
||||
wb_write[1] = val_hi;
|
||||
REG_WR_DMAE_LEN(bp, reg, wb_write, 2);
|
||||
}
|
||||
|
||||
static void bnx2x_init_wr_zp(struct bnx2x *bp, u32 addr, u32 len, u32 blob_off)
|
||||
static void bnx2x_init_wr_zp(struct bnx2x *bp, u32 addr, u32 len,
|
||||
u32 blob_off)
|
||||
{
|
||||
const u8 *data = NULL;
|
||||
int rc;
|
||||
@@ -186,39 +215,33 @@ static void bnx2x_init_wr_zp(struct bnx2x *bp, u32 addr, u32 len, u32 blob_off)
|
||||
static void bnx2x_init_block(struct bnx2x *bp, u32 block, u32 stage)
|
||||
{
|
||||
u16 op_start =
|
||||
INIT_OPS_OFFSETS(bp)[BLOCK_OPS_IDX(block, stage, STAGE_START)];
|
||||
INIT_OPS_OFFSETS(bp)[BLOCK_OPS_IDX(block, stage,
|
||||
STAGE_START)];
|
||||
u16 op_end =
|
||||
INIT_OPS_OFFSETS(bp)[BLOCK_OPS_IDX(block, stage, STAGE_END)];
|
||||
INIT_OPS_OFFSETS(bp)[BLOCK_OPS_IDX(block, stage,
|
||||
STAGE_END)];
|
||||
union init_op *op;
|
||||
int hw_wr;
|
||||
u32 i, op_type, addr, len;
|
||||
u32 op_idx, op_type, addr, len;
|
||||
const u32 *data, *data_base;
|
||||
|
||||
/* If empty block */
|
||||
if (op_start == op_end)
|
||||
return;
|
||||
|
||||
if (CHIP_REV_IS_FPGA(bp))
|
||||
hw_wr = OP_WR_FPGA;
|
||||
else if (CHIP_REV_IS_EMUL(bp))
|
||||
hw_wr = OP_WR_EMUL;
|
||||
else
|
||||
hw_wr = OP_WR_ASIC;
|
||||
|
||||
data_base = INIT_DATA(bp);
|
||||
|
||||
for (i = op_start; i < op_end; i++) {
|
||||
for (op_idx = op_start; op_idx < op_end; op_idx++) {
|
||||
|
||||
op = (union init_op *)&(INIT_OPS(bp)[i]);
|
||||
|
||||
op_type = op->str_wr.op;
|
||||
addr = op->str_wr.offset;
|
||||
len = op->str_wr.data_len;
|
||||
data = data_base + op->str_wr.data_off;
|
||||
|
||||
/* HW/EMUL specific */
|
||||
if ((op_type > OP_WB) && (op_type == hw_wr))
|
||||
op_type = OP_WR;
|
||||
op = (union init_op *)&(INIT_OPS(bp)[op_idx]);
|
||||
/* Get generic data */
|
||||
op_type = op->raw.op;
|
||||
addr = op->raw.offset;
|
||||
/* Get data that's used for OP_SW, OP_WB, OP_FW, OP_ZP and
|
||||
* OP_WR64 (we assume that op_arr_write and op_write have the
|
||||
* same structure).
|
||||
*/
|
||||
len = op->arr_wr.data_len;
|
||||
data = data_base + op->arr_wr.data_off;
|
||||
|
||||
switch (op_type) {
|
||||
case OP_RD:
|
||||
@@ -233,21 +256,39 @@ static void bnx2x_init_block(struct bnx2x *bp, u32 block, u32 stage)
|
||||
case OP_WB:
|
||||
bnx2x_init_wr_wb(bp, addr, data, len);
|
||||
break;
|
||||
case OP_SI:
|
||||
bnx2x_init_ind_wr(bp, addr, data, len);
|
||||
break;
|
||||
case OP_ZR:
|
||||
bnx2x_init_fill(bp, addr, 0, op->zero.len);
|
||||
bnx2x_init_fill(bp, addr, 0, op->zero.len, 0);
|
||||
break;
|
||||
case OP_WB_ZR:
|
||||
bnx2x_init_fill(bp, addr, 0, op->zero.len, 1);
|
||||
break;
|
||||
case OP_ZP:
|
||||
bnx2x_init_wr_zp(bp, addr, len,
|
||||
op->str_wr.data_off);
|
||||
op->arr_wr.data_off);
|
||||
break;
|
||||
case OP_WR_64:
|
||||
bnx2x_init_wr_64(bp, addr, data, len);
|
||||
break;
|
||||
case OP_IF_MODE_AND:
|
||||
/* if any of the flags doesn't match, skip the
|
||||
* conditional block.
|
||||
*/
|
||||
if ((INIT_MODE_FLAGS(bp) &
|
||||
op->if_mode.mode_bit_map) !=
|
||||
op->if_mode.mode_bit_map)
|
||||
op_idx += op->if_mode.cmd_offset;
|
||||
break;
|
||||
case OP_IF_MODE_OR:
|
||||
/* if all the flags don't match, skip the conditional
|
||||
* block.
|
||||
*/
|
||||
if ((INIT_MODE_FLAGS(bp) &
|
||||
op->if_mode.mode_bit_map) == 0)
|
||||
op_idx += op->if_mode.cmd_offset;
|
||||
break;
|
||||
default:
|
||||
/* happens whenever an op is of a diff HW */
|
||||
/* Should never get here! */
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -417,7 +458,8 @@ static const struct arb_line write_arb_addr[NUM_WR_Q-1] = {
|
||||
PXP2_REG_RQ_BW_WR_UBOUND30}
|
||||
};
|
||||
|
||||
static void bnx2x_init_pxp_arb(struct bnx2x *bp, int r_order, int w_order)
|
||||
static void bnx2x_init_pxp_arb(struct bnx2x *bp, int r_order,
|
||||
int w_order)
|
||||
{
|
||||
u32 val, i;
|
||||
|
||||
@@ -491,19 +533,21 @@ static void bnx2x_init_pxp_arb(struct bnx2x *bp, int r_order, int w_order)
|
||||
if ((CHIP_IS_E1(bp) || CHIP_IS_E1H(bp)) && (r_order == MAX_RD_ORD))
|
||||
REG_WR(bp, PXP2_REG_RQ_PDR_LIMIT, 0xe00);
|
||||
|
||||
if (CHIP_IS_E2(bp))
|
||||
if (CHIP_IS_E3(bp))
|
||||
REG_WR(bp, PXP2_REG_WR_USDMDP_TH, (0x4 << w_order));
|
||||
else if (CHIP_IS_E2(bp))
|
||||
REG_WR(bp, PXP2_REG_WR_USDMDP_TH, (0x8 << w_order));
|
||||
else
|
||||
REG_WR(bp, PXP2_REG_WR_USDMDP_TH, (0x18 << w_order));
|
||||
|
||||
if (CHIP_IS_E1H(bp) || CHIP_IS_E2(bp)) {
|
||||
if (!CHIP_IS_E1(bp)) {
|
||||
/* MPS w_order optimal TH presently TH
|
||||
* 128 0 0 2
|
||||
* 256 1 1 3
|
||||
* >=512 2 2 3
|
||||
*/
|
||||
/* DMAE is special */
|
||||
if (CHIP_IS_E2(bp)) {
|
||||
if (!CHIP_IS_E1H(bp)) {
|
||||
/* E2 can use optimal TH */
|
||||
val = w_order;
|
||||
REG_WR(bp, PXP2_REG_WR_DMAE_MPS, val);
|
||||
@@ -557,8 +601,8 @@ static void bnx2x_init_pxp_arb(struct bnx2x *bp, int r_order, int w_order)
|
||||
#define ILT_ADDR2(x) ((u32)((1 << 20) | ((u64)x >> 44)))
|
||||
#define ILT_RANGE(f, l) (((l) << 10) | f)
|
||||
|
||||
static int bnx2x_ilt_line_mem_op(struct bnx2x *bp, struct ilt_line *line,
|
||||
u32 size, u8 memop)
|
||||
static int bnx2x_ilt_line_mem_op(struct bnx2x *bp,
|
||||
struct ilt_line *line, u32 size, u8 memop)
|
||||
{
|
||||
if (memop == ILT_MEMOP_FREE) {
|
||||
BNX2X_ILT_FREE(line->page, line->page_mapping, line->size);
|
||||
@@ -572,7 +616,8 @@ static int bnx2x_ilt_line_mem_op(struct bnx2x *bp, struct ilt_line *line,
|
||||
}
|
||||
|
||||
|
||||
static int bnx2x_ilt_client_mem_op(struct bnx2x *bp, int cli_num, u8 memop)
|
||||
static int bnx2x_ilt_client_mem_op(struct bnx2x *bp, int cli_num,
|
||||
u8 memop)
|
||||
{
|
||||
int i, rc;
|
||||
struct bnx2x_ilt *ilt = BP_ILT(bp);
|
||||
@@ -617,8 +662,8 @@ static void bnx2x_ilt_line_wr(struct bnx2x *bp, int abs_idx,
|
||||
bnx2x_wr_64(bp, reg, ILT_ADDR1(page_mapping), ILT_ADDR2(page_mapping));
|
||||
}
|
||||
|
||||
static void bnx2x_ilt_line_init_op(struct bnx2x *bp, struct bnx2x_ilt *ilt,
|
||||
int idx, u8 initop)
|
||||
static void bnx2x_ilt_line_init_op(struct bnx2x *bp,
|
||||
struct bnx2x_ilt *ilt, int idx, u8 initop)
|
||||
{
|
||||
dma_addr_t null_mapping;
|
||||
int abs_idx = ilt->start_line + idx;
|
||||
@@ -848,7 +893,8 @@ static void bnx2x_src_init_t2(struct bnx2x *bp, struct src_ent *t2,
|
||||
|
||||
/* Initialize T2 */
|
||||
for (i = 0; i < src_cid_count-1; i++)
|
||||
t2[i].next = (u64)(t2_mapping + (i+1)*sizeof(struct src_ent));
|
||||
t2[i].next = (u64)(t2_mapping +
|
||||
(i+1)*sizeof(struct src_ent));
|
||||
|
||||
/* tell the searcher where the T2 table is */
|
||||
REG_WR(bp, SRC_REG_COUNTFREE0 + port*4, src_cid_count);
|
||||
|
||||
@@ -25,6 +25,8 @@
|
||||
#include <linux/mutex.h>
|
||||
|
||||
#include "bnx2x.h"
|
||||
#include "bnx2x_cmn.h"
|
||||
|
||||
|
||||
/********************************************************/
|
||||
#define ETH_HLEN 14
|
||||
@@ -874,6 +876,54 @@ static void bnx2x_update_pfc_brb(struct link_params *params,
|
||||
}
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
* Description:
|
||||
* This function is needed because NIG ARB_CREDIT_WEIGHT_X are
|
||||
* not continues and ARB_CREDIT_WEIGHT_0 + offset is suitable.
|
||||
******************************************************************************/
|
||||
int bnx2x_pfc_nig_rx_priority_mask(struct bnx2x *bp,
|
||||
u8 cos_entry,
|
||||
u32 priority_mask, u8 port)
|
||||
{
|
||||
u32 nig_reg_rx_priority_mask_add = 0;
|
||||
|
||||
switch (cos_entry) {
|
||||
case 0:
|
||||
nig_reg_rx_priority_mask_add = (port) ?
|
||||
NIG_REG_P1_RX_COS0_PRIORITY_MASK :
|
||||
NIG_REG_P0_RX_COS0_PRIORITY_MASK;
|
||||
break;
|
||||
case 1:
|
||||
nig_reg_rx_priority_mask_add = (port) ?
|
||||
NIG_REG_P1_RX_COS1_PRIORITY_MASK :
|
||||
NIG_REG_P0_RX_COS1_PRIORITY_MASK;
|
||||
break;
|
||||
case 2:
|
||||
nig_reg_rx_priority_mask_add = (port) ?
|
||||
NIG_REG_P1_RX_COS2_PRIORITY_MASK :
|
||||
NIG_REG_P0_RX_COS2_PRIORITY_MASK;
|
||||
break;
|
||||
case 3:
|
||||
if (port)
|
||||
return -EINVAL;
|
||||
nig_reg_rx_priority_mask_add = NIG_REG_P0_RX_COS3_PRIORITY_MASK;
|
||||
break;
|
||||
case 4:
|
||||
if (port)
|
||||
return -EINVAL;
|
||||
nig_reg_rx_priority_mask_add = NIG_REG_P0_RX_COS4_PRIORITY_MASK;
|
||||
break;
|
||||
case 5:
|
||||
if (port)
|
||||
return -EINVAL;
|
||||
nig_reg_rx_priority_mask_add = NIG_REG_P0_RX_COS5_PRIORITY_MASK;
|
||||
break;
|
||||
}
|
||||
|
||||
REG_WR(bp, nig_reg_rx_priority_mask_add, priority_mask);
|
||||
|
||||
return 0;
|
||||
}
|
||||
static void bnx2x_update_pfc_nig(struct link_params *params,
|
||||
struct link_vars *vars,
|
||||
struct bnx2x_nig_brb_pfc_port_params *nig_params)
|
||||
@@ -958,15 +1008,12 @@ static void bnx2x_update_pfc_nig(struct link_params *params,
|
||||
REG_WR(bp, NIG_REG_EGRESS_EMAC0_PORT, val);
|
||||
|
||||
if (nig_params) {
|
||||
u8 i = 0;
|
||||
pkt_priority_to_cos = nig_params->pkt_priority_to_cos;
|
||||
|
||||
REG_WR(bp, port ? NIG_REG_P1_RX_COS0_PRIORITY_MASK :
|
||||
NIG_REG_P0_RX_COS0_PRIORITY_MASK,
|
||||
nig_params->rx_cos0_priority_mask);
|
||||
|
||||
REG_WR(bp, port ? NIG_REG_P1_RX_COS1_PRIORITY_MASK :
|
||||
NIG_REG_P0_RX_COS1_PRIORITY_MASK,
|
||||
nig_params->rx_cos1_priority_mask);
|
||||
for (i = 0; i < nig_params->num_of_rx_cos_priority_mask; i++)
|
||||
bnx2x_pfc_nig_rx_priority_mask(bp, i,
|
||||
nig_params->rx_cos_priority_mask[i], port);
|
||||
|
||||
REG_WR(bp, port ? NIG_REG_LLFC_HIGH_PRIORITY_CLASSES_1 :
|
||||
NIG_REG_LLFC_HIGH_PRIORITY_CLASSES_0,
|
||||
@@ -1824,26 +1871,6 @@ void bnx2x_link_status_update(struct link_params *params,
|
||||
vars->line_speed = SPEED_10000;
|
||||
break;
|
||||
|
||||
case LINK_12GTFD:
|
||||
vars->line_speed = SPEED_12000;
|
||||
break;
|
||||
|
||||
case LINK_12_5GTFD:
|
||||
vars->line_speed = SPEED_12500;
|
||||
break;
|
||||
|
||||
case LINK_13GTFD:
|
||||
vars->line_speed = SPEED_13000;
|
||||
break;
|
||||
|
||||
case LINK_15GTFD:
|
||||
vars->line_speed = SPEED_15000;
|
||||
break;
|
||||
|
||||
case LINK_16GTFD:
|
||||
vars->line_speed = SPEED_16000;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -2667,31 +2694,6 @@ static int bnx2x_link_settings_status(struct bnx2x_phy *phy,
|
||||
vars->link_status |= LINK_10GTFD;
|
||||
break;
|
||||
|
||||
case GP_STATUS_12G_HIG:
|
||||
new_line_speed = SPEED_12000;
|
||||
vars->link_status |= LINK_12GTFD;
|
||||
break;
|
||||
|
||||
case GP_STATUS_12_5G:
|
||||
new_line_speed = SPEED_12500;
|
||||
vars->link_status |= LINK_12_5GTFD;
|
||||
break;
|
||||
|
||||
case GP_STATUS_13G:
|
||||
new_line_speed = SPEED_13000;
|
||||
vars->link_status |= LINK_13GTFD;
|
||||
break;
|
||||
|
||||
case GP_STATUS_15G:
|
||||
new_line_speed = SPEED_15000;
|
||||
vars->link_status |= LINK_15GTFD;
|
||||
break;
|
||||
|
||||
case GP_STATUS_16G:
|
||||
new_line_speed = SPEED_16000;
|
||||
vars->link_status |= LINK_16GTFD;
|
||||
break;
|
||||
|
||||
default:
|
||||
DP(NETIF_MSG_LINK,
|
||||
"link speed unsupported gp_status 0x%x\n",
|
||||
|
||||
@@ -81,6 +81,7 @@
|
||||
#define PFC_BRB_FULL_LB_XOFF_THRESHOLD 170
|
||||
#define PFC_BRB_FULL_LB_XON_THRESHOLD 250
|
||||
|
||||
#define MAXVAL(a, b) (((a) > (b)) ? (a) : (b))
|
||||
/***********************************************************/
|
||||
/* Structs */
|
||||
/***********************************************************/
|
||||
@@ -262,6 +263,8 @@ struct link_vars {
|
||||
#define MAC_TYPE_NONE 0
|
||||
#define MAC_TYPE_EMAC 1
|
||||
#define MAC_TYPE_BMAC 2
|
||||
#define MAC_TYPE_UMAC 3
|
||||
#define MAC_TYPE_XMAC 4
|
||||
|
||||
u8 phy_link_up; /* internal phy link indication */
|
||||
u8 link_up;
|
||||
@@ -363,6 +366,20 @@ int bnx2x_phy_probe(struct link_params *params);
|
||||
u8 bnx2x_fan_failure_det_req(struct bnx2x *bp, u32 shmem_base,
|
||||
u32 shmem2_base, u8 port);
|
||||
|
||||
/* DCBX structs */
|
||||
|
||||
/* Number of maximum COS per chip */
|
||||
#define DCBX_E2E3_MAX_NUM_COS (2)
|
||||
#define DCBX_E3B0_MAX_NUM_COS_PORT0 (6)
|
||||
#define DCBX_E3B0_MAX_NUM_COS_PORT1 (3)
|
||||
#define DCBX_E3B0_MAX_NUM_COS ( \
|
||||
MAXVAL(DCBX_E3B0_MAX_NUM_COS_PORT0, \
|
||||
DCBX_E3B0_MAX_NUM_COS_PORT1))
|
||||
|
||||
#define DCBX_MAX_NUM_COS ( \
|
||||
MAXVAL(DCBX_E3B0_MAX_NUM_COS, \
|
||||
DCBX_E2E3_MAX_NUM_COS))
|
||||
|
||||
/* PFC port configuration params */
|
||||
struct bnx2x_nig_brb_pfc_port_params {
|
||||
/* NIG */
|
||||
@@ -370,8 +387,8 @@ struct bnx2x_nig_brb_pfc_port_params {
|
||||
u32 llfc_out_en;
|
||||
u32 llfc_enable;
|
||||
u32 pkt_priority_to_cos;
|
||||
u32 rx_cos0_priority_mask;
|
||||
u32 rx_cos1_priority_mask;
|
||||
u8 num_of_rx_cos_priority_mask;
|
||||
u32 rx_cos_priority_mask[DCBX_MAX_NUM_COS];
|
||||
u32 llfc_high_priority_classes;
|
||||
u32 llfc_low_priority_classes;
|
||||
/* BRB */
|
||||
|
||||
+2392
-1311
File diff suppressed because it is too large
Load Diff
+165
-27
@@ -422,6 +422,7 @@
|
||||
#define CFC_REG_NUM_LCIDS_ALLOC 0x104020
|
||||
/* [R 9] Number of Arriving LCIDs in Link List Block */
|
||||
#define CFC_REG_NUM_LCIDS_ARRIVING 0x104004
|
||||
#define CFC_REG_NUM_LCIDS_INSIDE_PF 0x104120
|
||||
/* [R 9] Number of Leaving LCIDs in Link List Block */
|
||||
#define CFC_REG_NUM_LCIDS_LEAVING 0x104018
|
||||
#define CFC_REG_WEAK_ENABLE_PF 0x104124
|
||||
@@ -783,6 +784,7 @@
|
||||
/* [RW 3] The number of simultaneous outstanding requests to Context Fetch
|
||||
Interface. */
|
||||
#define DORQ_REG_OUTST_REQ 0x17003c
|
||||
#define DORQ_REG_PF_USAGE_CNT 0x1701d0
|
||||
#define DORQ_REG_REGN 0x170038
|
||||
/* [R 4] Current value of response A counter credit. Initial credit is
|
||||
configured through write to ~dorq_registers_rsp_init_crd.rsp_init_crd
|
||||
@@ -1645,6 +1647,17 @@
|
||||
#define NIG_LLH0_BRB1_DRV_MASK_REG_LLH0_BRB1_DRV_MASK_NO_VLAN (0x1<<4)
|
||||
#define NIG_LLH0_BRB1_DRV_MASK_REG_LLH0_BRB1_DRV_MASK_UNCST (0x1<<2)
|
||||
#define NIG_LLH0_BRB1_DRV_MASK_REG_LLH0_BRB1_DRV_MASK_VLAN (0x1<<3)
|
||||
/* [RW 5] MDIO PHY Address. The WC uses this address to determine whether or
|
||||
* not it is the recipient of the message on the MDIO interface. The value
|
||||
* is compared to the value on ctrl_md_devad. Drives output
|
||||
* misc_xgxs0_phy_addr. Global register. */
|
||||
#define MISC_REG_WC0_CTRL_PHY_ADDR 0xa9cc
|
||||
/* [RW 32] 1 [47] Packet Size = 64 Write to this register write bits 31:0.
|
||||
* Reads from this register will clear bits 31:0. */
|
||||
#define MSTAT_REG_RX_STAT_GR64_LO 0x200
|
||||
/* [RW 32] 1 [00] Tx Good Packet Count Write to this register write bits
|
||||
* 31:0. Reads from this register will clear bits 31:0. */
|
||||
#define MSTAT_REG_TX_STAT_GTXPOK_LO 0
|
||||
#define NIG_LLH0_XCM_MASK_REG_LLH0_XCM_MASK_BCN (0x1<<0)
|
||||
#define NIG_LLH1_XCM_MASK_REG_LLH1_XCM_MASK_BCN (0x1<<0)
|
||||
#define NIG_MASK_INTERRUPT_PORT0_REG_MASK_EMAC0_MISC_MI_INT (0x1<<0)
|
||||
@@ -1838,6 +1851,10 @@
|
||||
#define NIG_REG_LLH1_FUNC_MEM 0x161c0
|
||||
#define NIG_REG_LLH1_FUNC_MEM_ENABLE 0x16160
|
||||
#define NIG_REG_LLH1_FUNC_MEM_SIZE 16
|
||||
/* [RW 1] When this bit is set; the LLH will classify the packet before
|
||||
* sending it to the BRB or calculating WoL on it. This bit controls port 1
|
||||
* only. The legacy llh_multi_function_mode bit controls port 0. */
|
||||
#define NIG_REG_LLH1_MF_MODE 0x18614
|
||||
/* [RW 8] init credit counter for port1 in LLH */
|
||||
#define NIG_REG_LLH1_XCM_INIT_CREDIT 0x10564
|
||||
#define NIG_REG_LLH1_XCM_MASK 0x10134
|
||||
@@ -1889,6 +1906,26 @@
|
||||
* than one bit may be set; allowing multiple priorities to be mapped to one
|
||||
* COS. */
|
||||
#define NIG_REG_P0_RX_COS1_PRIORITY_MASK 0x1805c
|
||||
/* [RW 16] Bit-map indicating which SAFC/PFC priorities to map to COS 2. A
|
||||
* priority is mapped to COS 2 when the corresponding mask bit is 1. More
|
||||
* than one bit may be set; allowing multiple priorities to be mapped to one
|
||||
* COS. */
|
||||
#define NIG_REG_P0_RX_COS2_PRIORITY_MASK 0x186b0
|
||||
/* [RW 16] Bit-map indicating which SAFC/PFC priorities to map to COS 3. A
|
||||
* priority is mapped to COS 3 when the corresponding mask bit is 1. More
|
||||
* than one bit may be set; allowing multiple priorities to be mapped to one
|
||||
* COS. */
|
||||
#define NIG_REG_P0_RX_COS3_PRIORITY_MASK 0x186b4
|
||||
/* [RW 16] Bit-map indicating which SAFC/PFC priorities to map to COS 4. A
|
||||
* priority is mapped to COS 4 when the corresponding mask bit is 1. More
|
||||
* than one bit may be set; allowing multiple priorities to be mapped to one
|
||||
* COS. */
|
||||
#define NIG_REG_P0_RX_COS4_PRIORITY_MASK 0x186b8
|
||||
/* [RW 16] Bit-map indicating which SAFC/PFC priorities to map to COS 5. A
|
||||
* priority is mapped to COS 5 when the corresponding mask bit is 1. More
|
||||
* than one bit may be set; allowing multiple priorities to be mapped to one
|
||||
* COS. */
|
||||
#define NIG_REG_P0_RX_COS5_PRIORITY_MASK 0x186bc
|
||||
/* [RW 15] Specify which of the credit registers the client is to be mapped
|
||||
* to. Bits[2:0] are for client 0; bits [14:12] are for client 4. For
|
||||
* clients that are not subject to WFQ credit blocking - their
|
||||
@@ -1926,6 +1963,9 @@
|
||||
* for management at priority 0; debug traffic at priorities 1 and 2; COS0
|
||||
* traffic at priority 3; and COS1 traffic at priority 4. */
|
||||
#define NIG_REG_P0_TX_ARB_PRIORITY_CLIENT 0x180e4
|
||||
/* [RW 6] Bit-map indicating which L2 hdrs may appear after the basic
|
||||
* Ethernet header. */
|
||||
#define NIG_REG_P1_HDRS_AFTER_BASIC 0x1818c
|
||||
#define NIG_REG_P1_LLH_FUNC_MEM2 0x184c0
|
||||
#define NIG_REG_P1_LLH_FUNC_MEM2_ENABLE 0x18460
|
||||
/* [RW 32] Eight 4-bit configurations for specifying which COS (0-15 for
|
||||
@@ -1944,6 +1984,11 @@
|
||||
* than one bit may be set; allowing multiple priorities to be mapped to one
|
||||
* COS. */
|
||||
#define NIG_REG_P1_RX_COS1_PRIORITY_MASK 0x181b0
|
||||
/* [RW 16] Bit-map indicating which SAFC/PFC priorities to map to COS 2. A
|
||||
* priority is mapped to COS 2 when the corresponding mask bit is 1. More
|
||||
* than one bit may be set; allowing multiple priorities to be mapped to one
|
||||
* COS. */
|
||||
#define NIG_REG_P1_RX_COS2_PRIORITY_MASK 0x186f8
|
||||
/* [RW 1] Pause enable for port0. This register may get 1 only when
|
||||
~safc_enable.safc_enable = 0 and ppp_enable.ppp_enable =0 for the same
|
||||
port */
|
||||
@@ -2033,6 +2078,15 @@
|
||||
#define PBF_REG_COS1_UPPER_BOUND 0x15c060
|
||||
/* [RW 31] The weight of COS1 in the ETS command arbiter. */
|
||||
#define PBF_REG_COS1_WEIGHT 0x15c058
|
||||
/* [R 11] Current credit for the LB queue in the tx port buffers in 16 byte
|
||||
* lines. */
|
||||
#define PBF_REG_CREDIT_LB_Q 0x140338
|
||||
/* [R 11] Current credit for queue 0 in the tx port buffers in 16 byte
|
||||
* lines. */
|
||||
#define PBF_REG_CREDIT_Q0 0x14033c
|
||||
/* [R 11] Current credit for queue 1 in the tx port buffers in 16 byte
|
||||
* lines. */
|
||||
#define PBF_REG_CREDIT_Q1 0x140340
|
||||
/* [RW 1] Disable processing further tasks from port 0 (after ending the
|
||||
current task in process). */
|
||||
#define PBF_REG_DISABLE_NEW_TASK_PROC_P0 0x14005c
|
||||
@@ -2050,14 +2104,25 @@
|
||||
/* [RW 6] Bit-map indicating which L2 hdrs may appear after the basic
|
||||
* Ethernet header. */
|
||||
#define PBF_REG_HDRS_AFTER_BASIC 0x15c0a8
|
||||
/* [RW 1] Indicates which COS is conncted to the highest priority in the
|
||||
* command arbiter. */
|
||||
/* [RW 6] Bit-map indicating which L2 hdrs may appear after L2 tag 0 */
|
||||
#define PBF_REG_HDRS_AFTER_TAG_0 0x15c0b8
|
||||
/* [R 1] Removed for E3 B0 - Indicates which COS is conncted to the highest
|
||||
* priority in the command arbiter. */
|
||||
#define PBF_REG_HIGH_PRIORITY_COS_NUM 0x15c04c
|
||||
#define PBF_REG_IF_ENABLE_REG 0x140044
|
||||
/* [RW 1] Init bit. When set the initial credits are copied to the credit
|
||||
registers (except the port credits). Should be set and then reset after
|
||||
the configuration of the block has ended. */
|
||||
#define PBF_REG_INIT 0x140000
|
||||
/* [RW 11] Initial credit for the LB queue in the tx port buffers in 16 byte
|
||||
* lines. */
|
||||
#define PBF_REG_INIT_CRD_LB_Q 0x15c248
|
||||
/* [RW 11] Initial credit for queue 0 in the tx port buffers in 16 byte
|
||||
* lines. */
|
||||
#define PBF_REG_INIT_CRD_Q0 0x15c230
|
||||
/* [RW 11] Initial credit for queue 1 in the tx port buffers in 16 byte
|
||||
* lines. */
|
||||
#define PBF_REG_INIT_CRD_Q1 0x15c234
|
||||
/* [RW 1] Init bit for port 0. When set the initial credit of port 0 is
|
||||
copied to the credit register. Should be set and then reset after the
|
||||
configuration of the port has ended. */
|
||||
@@ -2070,6 +2135,15 @@
|
||||
copied to the credit register. Should be set and then reset after the
|
||||
configuration of the port has ended. */
|
||||
#define PBF_REG_INIT_P4 0x14000c
|
||||
/* [R 32] Cyclic counter for the amount credits in 16 bytes lines added for
|
||||
* the LB queue. Reset upon init. */
|
||||
#define PBF_REG_INTERNAL_CRD_FREED_CNT_LB_Q 0x140354
|
||||
/* [R 32] Cyclic counter for the amount credits in 16 bytes lines added for
|
||||
* queue 0. Reset upon init. */
|
||||
#define PBF_REG_INTERNAL_CRD_FREED_CNT_Q0 0x140358
|
||||
/* [R 32] Cyclic counter for the amount credits in 16 bytes lines added for
|
||||
* queue 1. Reset upon init. */
|
||||
#define PBF_REG_INTERNAL_CRD_FREED_CNT_Q1 0x14035c
|
||||
/* [RW 1] Enable for mac interface 0. */
|
||||
#define PBF_REG_MAC_IF0_ENABLE 0x140030
|
||||
/* [RW 1] Enable for mac interface 1. */
|
||||
@@ -2090,24 +2164,49 @@
|
||||
/* [RW 11] Initial credit for port 0 in the tx port buffers in 16 byte
|
||||
lines. */
|
||||
#define PBF_REG_P0_INIT_CRD 0x1400d0
|
||||
/* [RW 1] Indication that pause is enabled for port 0. */
|
||||
/* [R 32] Cyclic counter for the amount credits in 16 bytes lines added for
|
||||
* port 0. Reset upon init. */
|
||||
#define PBF_REG_P0_INTERNAL_CRD_FREED_CNT 0x140308
|
||||
/* [R 1] Removed for E3 B0 - Indication that pause is enabled for port 0. */
|
||||
#define PBF_REG_P0_PAUSE_ENABLE 0x140014
|
||||
/* [R 8] Number of tasks in port 0 task queue. */
|
||||
/* [R 8] Removed for E3 B0 - Number of tasks in port 0 task queue. */
|
||||
#define PBF_REG_P0_TASK_CNT 0x140204
|
||||
/* [R 11] Current credit for port 1 in the tx port buffers in 16 byte lines. */
|
||||
/* [R 32] Removed for E3 B0 - Cyclic counter for number of 8 byte lines
|
||||
* freed from the task queue of port 0. Reset upon init. */
|
||||
#define PBF_REG_P0_TQ_LINES_FREED_CNT 0x1402f0
|
||||
/* [R 12] Number of 8 bytes lines occupied in the task queue of port 0. */
|
||||
#define PBF_REG_P0_TQ_OCCUPANCY 0x1402fc
|
||||
/* [R 11] Removed for E3 B0 - Current credit for port 1 in the tx port
|
||||
* buffers in 16 byte lines. */
|
||||
#define PBF_REG_P1_CREDIT 0x140208
|
||||
/* [RW 11] Initial credit for port 1 in the tx port buffers in 16 byte
|
||||
lines. */
|
||||
/* [R 11] Removed for E3 B0 - Initial credit for port 0 in the tx port
|
||||
* buffers in 16 byte lines. */
|
||||
#define PBF_REG_P1_INIT_CRD 0x1400d4
|
||||
/* [R 8] Number of tasks in port 1 task queue. */
|
||||
/* [R 32] Cyclic counter for the amount credits in 16 bytes lines added for
|
||||
* port 1. Reset upon init. */
|
||||
#define PBF_REG_P1_INTERNAL_CRD_FREED_CNT 0x14030c
|
||||
/* [R 8] Removed for E3 B0 - Number of tasks in port 1 task queue. */
|
||||
#define PBF_REG_P1_TASK_CNT 0x14020c
|
||||
/* [R 32] Removed for E3 B0 - Cyclic counter for number of 8 byte lines
|
||||
* freed from the task queue of port 1. Reset upon init. */
|
||||
#define PBF_REG_P1_TQ_LINES_FREED_CNT 0x1402f4
|
||||
/* [R 12] Number of 8 bytes lines occupied in the task queue of port 1. */
|
||||
#define PBF_REG_P1_TQ_OCCUPANCY 0x140300
|
||||
/* [R 11] Current credit for port 4 in the tx port buffers in 16 byte lines. */
|
||||
#define PBF_REG_P4_CREDIT 0x140210
|
||||
/* [RW 11] Initial credit for port 4 in the tx port buffers in 16 byte
|
||||
lines. */
|
||||
#define PBF_REG_P4_INIT_CRD 0x1400e0
|
||||
/* [R 8] Number of tasks in port 4 task queue. */
|
||||
/* [R 32] Cyclic counter for the amount credits in 16 bytes lines added for
|
||||
* port 4. Reset upon init. */
|
||||
#define PBF_REG_P4_INTERNAL_CRD_FREED_CNT 0x140310
|
||||
/* [R 8] Removed for E3 B0 - Number of tasks in port 4 task queue. */
|
||||
#define PBF_REG_P4_TASK_CNT 0x140214
|
||||
/* [R 32] Removed for E3 B0 - Cyclic counter for number of 8 byte lines
|
||||
* freed from the task queue of port 4. Reset upon init. */
|
||||
#define PBF_REG_P4_TQ_LINES_FREED_CNT 0x1402f8
|
||||
/* [R 12] Number of 8 bytes lines occupied in the task queue of port 4. */
|
||||
#define PBF_REG_P4_TQ_OCCUPANCY 0x140304
|
||||
/* [RW 5] Interrupt mask register #0 read/write */
|
||||
#define PBF_REG_PBF_INT_MASK 0x1401d4
|
||||
/* [R 5] Interrupt register #0 read */
|
||||
@@ -2116,6 +2215,27 @@
|
||||
#define PBF_REG_PBF_PRTY_MASK 0x1401e4
|
||||
/* [RC 20] Parity register #0 read clear */
|
||||
#define PBF_REG_PBF_PRTY_STS_CLR 0x1401dc
|
||||
/* [RW 16] The Ethernet type value for L2 tag 0 */
|
||||
#define PBF_REG_TAG_ETHERTYPE_0 0x15c090
|
||||
/* [RW 4] The length of the info field for L2 tag 0. The length is between
|
||||
* 2B and 14B; in 2B granularity */
|
||||
#define PBF_REG_TAG_LEN_0 0x15c09c
|
||||
/* [R 32] Cyclic counter for number of 8 byte lines freed from the LB task
|
||||
* queue. Reset upon init. */
|
||||
#define PBF_REG_TQ_LINES_FREED_CNT_LB_Q 0x14038c
|
||||
/* [R 32] Cyclic counter for number of 8 byte lines freed from the task
|
||||
* queue 0. Reset upon init. */
|
||||
#define PBF_REG_TQ_LINES_FREED_CNT_Q0 0x140390
|
||||
/* [R 32] Cyclic counter for number of 8 byte lines freed from task queue 1.
|
||||
* Reset upon init. */
|
||||
#define PBF_REG_TQ_LINES_FREED_CNT_Q1 0x140394
|
||||
/* [R 13] Number of 8 bytes lines occupied in the task queue of the LB
|
||||
* queue. */
|
||||
#define PBF_REG_TQ_OCCUPANCY_LB_Q 0x1403a8
|
||||
/* [R 13] Number of 8 bytes lines occupied in the task queue of queue 0. */
|
||||
#define PBF_REG_TQ_OCCUPANCY_Q0 0x1403ac
|
||||
/* [R 13] Number of 8 bytes lines occupied in the task queue of queue 1. */
|
||||
#define PBF_REG_TQ_OCCUPANCY_Q1 0x1403b0
|
||||
#define PB_REG_CONTROL 0
|
||||
/* [RW 2] Interrupt mask register #0 read/write */
|
||||
#define PB_REG_PB_INT_MASK 0x28
|
||||
@@ -2445,10 +2565,24 @@
|
||||
/* [RW 6] Bit-map indicating which L2 hdrs may appear after the basic
|
||||
* Ethernet header. */
|
||||
#define PRS_REG_HDRS_AFTER_BASIC 0x40238
|
||||
/* [RW 6] Bit-map indicating which L2 hdrs may appear after the basic
|
||||
* Ethernet header for port 0 packets. */
|
||||
#define PRS_REG_HDRS_AFTER_BASIC_PORT_0 0x40270
|
||||
#define PRS_REG_HDRS_AFTER_BASIC_PORT_1 0x40290
|
||||
/* [R 6] Bit-map indicating which L2 hdrs may appear after L2 tag 0 */
|
||||
#define PRS_REG_HDRS_AFTER_TAG_0 0x40248
|
||||
/* [RW 6] Bit-map indicating which L2 hdrs may appear after L2 tag 0 for
|
||||
* port 0 packets */
|
||||
#define PRS_REG_HDRS_AFTER_TAG_0_PORT_0 0x40280
|
||||
#define PRS_REG_HDRS_AFTER_TAG_0_PORT_1 0x402a0
|
||||
/* [RW 4] The increment value to send in the CFC load request message */
|
||||
#define PRS_REG_INC_VALUE 0x40048
|
||||
/* [RW 6] Bit-map indicating which headers must appear in the packet */
|
||||
#define PRS_REG_MUST_HAVE_HDRS 0x40254
|
||||
/* [RW 6] Bit-map indicating which headers must appear in the packet for
|
||||
* port 0 packets */
|
||||
#define PRS_REG_MUST_HAVE_HDRS_PORT_0 0x4028c
|
||||
#define PRS_REG_MUST_HAVE_HDRS_PORT_1 0x402ac
|
||||
#define PRS_REG_NIC_MODE 0x40138
|
||||
/* [RW 8] The 8-bit event ID for cases where there is no match on the
|
||||
connection. Used in packet start message to TCM. */
|
||||
@@ -2497,6 +2631,11 @@
|
||||
#define PRS_REG_SERIAL_NUM_STATUS_MSB 0x40158
|
||||
/* [R 4] debug only: SRC current credit. Transaction based. */
|
||||
#define PRS_REG_SRC_CURRENT_CREDIT 0x4016c
|
||||
/* [RW 16] The Ethernet type value for L2 tag 0 */
|
||||
#define PRS_REG_TAG_ETHERTYPE_0 0x401d4
|
||||
/* [RW 4] The length of the info field for L2 tag 0. The length is between
|
||||
* 2B and 14B; in 2B granularity */
|
||||
#define PRS_REG_TAG_LEN_0 0x4022c
|
||||
/* [R 8] debug only: TCM current credit. Cycle based. */
|
||||
#define PRS_REG_TCM_CURRENT_CREDIT 0x40160
|
||||
/* [R 8] debug only: TSDM current credit. Transaction based. */
|
||||
@@ -3081,6 +3220,7 @@
|
||||
#define QM_REG_BYTECREDITAFULLTHR 0x168094
|
||||
/* [RW 4] The initial credit for interface */
|
||||
#define QM_REG_CMINITCRD_0 0x1680cc
|
||||
#define QM_REG_BYTECRDCMDQ_0 0x16e6e8
|
||||
#define QM_REG_CMINITCRD_1 0x1680d0
|
||||
#define QM_REG_CMINITCRD_2 0x1680d4
|
||||
#define QM_REG_CMINITCRD_3 0x1680d8
|
||||
@@ -3171,7 +3311,10 @@
|
||||
/* [RW 2] The PCI attributes field used in the PCI request. */
|
||||
#define QM_REG_PCIREQAT 0x168054
|
||||
#define QM_REG_PF_EN 0x16e70c
|
||||
/* [R 16] The byte credit of port 0 */
|
||||
/* [R 24] The number of tasks stored in the QM for the PF. only even
|
||||
* functions are valid in E2 (odd I registers will be hard wired to 0) */
|
||||
#define QM_REG_PF_USG_CNT_0 0x16e040
|
||||
/* [R 16] NOT USED */
|
||||
#define QM_REG_PORT0BYTECRD 0x168300
|
||||
/* [R 16] The byte credit of port 1 */
|
||||
#define QM_REG_PORT1BYTECRD 0x168304
|
||||
@@ -3783,6 +3926,8 @@
|
||||
#define TM_REG_LIN0_LOGIC_ADDR 0x164240
|
||||
/* [RW 18] Linear0 Max active cid (in banks of 32 entries). */
|
||||
#define TM_REG_LIN0_MAX_ACTIVE_CID 0x164048
|
||||
/* [ST 16] Linear0 Number of scans counter. */
|
||||
#define TM_REG_LIN0_NUM_SCANS 0x1640a0
|
||||
/* [WB 64] Linear0 phy address. */
|
||||
#define TM_REG_LIN0_PHY_ADDR 0x164270
|
||||
/* [RW 1] Linear0 physical address valid. */
|
||||
@@ -3790,6 +3935,7 @@
|
||||
#define TM_REG_LIN0_SCAN_ON 0x1640d0
|
||||
/* [RW 24] Linear0 array scan timeout. */
|
||||
#define TM_REG_LIN0_SCAN_TIME 0x16403c
|
||||
#define TM_REG_LIN0_VNIC_UC 0x164128
|
||||
/* [RW 32] Linear1 logic address. */
|
||||
#define TM_REG_LIN1_LOGIC_ADDR 0x164250
|
||||
/* [WB 64] Linear1 phy address. */
|
||||
@@ -4845,8 +4991,10 @@
|
||||
#define XSDM_REG_NUM_OF_Q8_CMD 0x166264
|
||||
/* [ST 32] The number of commands received in queue 9 */
|
||||
#define XSDM_REG_NUM_OF_Q9_CMD 0x166268
|
||||
/* [RW 13] The start address in the internal RAM for queue counters */
|
||||
#define XSDM_REG_Q_COUNTER_START_ADDR 0x166010
|
||||
/* [W 17] Generate an operation after completion; bit-16 is
|
||||
* AggVectIdx_valid; bits 15:8 are AggVectIdx; bits 7:5 are the TRIG and
|
||||
* bits 4:0 are the T124Param[4:0] */
|
||||
#define XSDM_REG_OPERATION_GEN 0x1664c4
|
||||
/* [R 1] pxp_ctrl rd_data fifo empty in sdm_dma_rsp block */
|
||||
#define XSDM_REG_RSP_PXP_CTRL_RDATA_EMPTY 0x166548
|
||||
/* [R 1] parser fifo empty in sdm_sync block */
|
||||
@@ -5129,6 +5277,8 @@
|
||||
#define MISC_REGISTERS_RESET_REG_1_RST_PXPV (0x1<<27)
|
||||
#define MISC_REGISTERS_RESET_REG_1_SET 0x584
|
||||
#define MISC_REGISTERS_RESET_REG_2_CLEAR 0x598
|
||||
#define MISC_REGISTERS_RESET_REG_2_MSTAT0 (0x1<<24)
|
||||
#define MISC_REGISTERS_RESET_REG_2_MSTAT1 (0x1<<25)
|
||||
#define MISC_REGISTERS_RESET_REG_2_RST_BMAC0 (0x1<<0)
|
||||
#define MISC_REGISTERS_RESET_REG_2_RST_EMAC0_HARD_CORE (0x1<<14)
|
||||
#define MISC_REGISTERS_RESET_REG_2_RST_EMAC1_HARD_CORE (0x1<<15)
|
||||
@@ -5161,6 +5311,7 @@
|
||||
#define MISC_REGISTERS_SPIO_OUTPUT_HIGH 1
|
||||
#define MISC_REGISTERS_SPIO_OUTPUT_LOW 0
|
||||
#define MISC_REGISTERS_SPIO_SET_POS 8
|
||||
#define HW_LOCK_DRV_FLAGS 10
|
||||
#define HW_LOCK_MAX_RESOURCE_VALUE 31
|
||||
#define HW_LOCK_RESOURCE_GPIO 1
|
||||
#define HW_LOCK_RESOURCE_MDIO 0
|
||||
@@ -5168,7 +5319,6 @@
|
||||
#define HW_LOCK_RESOURCE_RESERVED_08 8
|
||||
#define HW_LOCK_RESOURCE_SPIO 2
|
||||
#define HW_LOCK_RESOURCE_UNDI 5
|
||||
#define PRS_FLAG_OVERETH_IPV4 1
|
||||
#define AEU_INPUTS_ATTN_BITS_ATC_HW_INTERRUPT (0x1<<4)
|
||||
#define AEU_INPUTS_ATTN_BITS_ATC_PARITY_ERROR (0x1<<5)
|
||||
#define AEU_INPUTS_ATTN_BITS_BRB_PARITY_ERROR (1<<18)
|
||||
@@ -5320,6 +5470,8 @@
|
||||
#define GRCBASE_PXP2 0x120000
|
||||
#define GRCBASE_PBF 0x140000
|
||||
#define GRCBASE_XPB 0x161000
|
||||
#define GRCBASE_MSTAT0 0x162000
|
||||
#define GRCBASE_MSTAT1 0x162800
|
||||
#define GRCBASE_TIMERS 0x164000
|
||||
#define GRCBASE_XSDM 0x166000
|
||||
#define GRCBASE_QM 0x168000
|
||||
@@ -6243,11 +6395,6 @@ Theotherbitsarereservedandshouldbezero*/
|
||||
#define IGU_ADDR_MSI_ADDR_HI 0x0212
|
||||
#define IGU_ADDR_MSI_DATA 0x0213
|
||||
|
||||
#define IGU_INT_ENABLE 0
|
||||
#define IGU_INT_DISABLE 1
|
||||
#define IGU_INT_NOP 2
|
||||
#define IGU_INT_NOP2 3
|
||||
|
||||
#define IGU_USE_REGISTER_ustorm_type_0_sb_cleanup 0
|
||||
#define IGU_USE_REGISTER_ustorm_type_1_sb_cleanup 1
|
||||
#define IGU_USE_REGISTER_cstorm_type_0_sb_cleanup 2
|
||||
@@ -6318,15 +6465,6 @@ Theotherbitsarereservedandshouldbezero*/
|
||||
#define IGU_BC_BASE_DSB_PROD 128
|
||||
#define IGU_NORM_BASE_DSB_PROD 136
|
||||
|
||||
#define IGU_CTRL_CMD_TYPE_WR\
|
||||
1
|
||||
#define IGU_CTRL_CMD_TYPE_RD\
|
||||
0
|
||||
|
||||
#define IGU_SEG_ACCESS_NORM 0
|
||||
#define IGU_SEG_ACCESS_DEF 1
|
||||
#define IGU_SEG_ACCESS_ATTN 2
|
||||
|
||||
/* FID (if VF - [6] = 0; [5:0] = VF number; if PF - [6] = 1; \
|
||||
[5:2] = 0; [1:0] = PF number) */
|
||||
#define IGU_FID_ENCODE_IS_PF (0x1<<6)
|
||||
|
||||
+5159
-645
File diff suppressed because it is too large
Load Diff
+1228
-36
File diff suppressed because it is too large
Load Diff
+493
-323
File diff suppressed because it is too large
Load Diff
+186
-42
@@ -14,48 +14,11 @@
|
||||
* Statistics and Link management by Yitchak Gertner
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef BNX2X_STATS_H
|
||||
#define BNX2X_STATS_H
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
struct bnx2x_eth_q_stats {
|
||||
u32 total_bytes_received_hi;
|
||||
u32 total_bytes_received_lo;
|
||||
u32 total_bytes_transmitted_hi;
|
||||
u32 total_bytes_transmitted_lo;
|
||||
u32 total_unicast_packets_received_hi;
|
||||
u32 total_unicast_packets_received_lo;
|
||||
u32 total_multicast_packets_received_hi;
|
||||
u32 total_multicast_packets_received_lo;
|
||||
u32 total_broadcast_packets_received_hi;
|
||||
u32 total_broadcast_packets_received_lo;
|
||||
u32 total_unicast_packets_transmitted_hi;
|
||||
u32 total_unicast_packets_transmitted_lo;
|
||||
u32 total_multicast_packets_transmitted_hi;
|
||||
u32 total_multicast_packets_transmitted_lo;
|
||||
u32 total_broadcast_packets_transmitted_hi;
|
||||
u32 total_broadcast_packets_transmitted_lo;
|
||||
u32 valid_bytes_received_hi;
|
||||
u32 valid_bytes_received_lo;
|
||||
|
||||
u32 error_bytes_received_hi;
|
||||
u32 error_bytes_received_lo;
|
||||
u32 etherstatsoverrsizepkts_hi;
|
||||
u32 etherstatsoverrsizepkts_lo;
|
||||
u32 no_buff_discard_hi;
|
||||
u32 no_buff_discard_lo;
|
||||
|
||||
u32 driver_xoff;
|
||||
u32 rx_err_discard_pkt;
|
||||
u32 rx_skb_alloc_failed;
|
||||
u32 hw_csum_err;
|
||||
};
|
||||
|
||||
#define Q_STATS_OFFSET32(stat_name) \
|
||||
(offsetof(struct bnx2x_eth_q_stats, stat_name) / 4)
|
||||
|
||||
struct nig_stats {
|
||||
u32 brb_discard;
|
||||
u32 brb_packet;
|
||||
@@ -212,7 +175,7 @@ struct bnx2x_eth_stats {
|
||||
u32 brb_truncate_lo;
|
||||
|
||||
u32 mac_filter_discard;
|
||||
u32 xxoverflow_discard;
|
||||
u32 mf_tag_discard;
|
||||
u32 brb_truncate_discard;
|
||||
u32 mac_discard;
|
||||
|
||||
@@ -222,16 +185,197 @@ struct bnx2x_eth_stats {
|
||||
u32 hw_csum_err;
|
||||
|
||||
u32 nig_timer_max;
|
||||
|
||||
/* TPA */
|
||||
u32 total_tpa_aggregations_hi;
|
||||
u32 total_tpa_aggregations_lo;
|
||||
u32 total_tpa_aggregated_frames_hi;
|
||||
u32 total_tpa_aggregated_frames_lo;
|
||||
u32 total_tpa_bytes_hi;
|
||||
u32 total_tpa_bytes_lo;
|
||||
};
|
||||
|
||||
#define STATS_OFFSET32(stat_name) \
|
||||
(offsetof(struct bnx2x_eth_stats, stat_name) / 4)
|
||||
|
||||
/* Forward declaration */
|
||||
struct bnx2x_eth_q_stats {
|
||||
u32 total_unicast_bytes_received_hi;
|
||||
u32 total_unicast_bytes_received_lo;
|
||||
u32 total_broadcast_bytes_received_hi;
|
||||
u32 total_broadcast_bytes_received_lo;
|
||||
u32 total_multicast_bytes_received_hi;
|
||||
u32 total_multicast_bytes_received_lo;
|
||||
u32 total_bytes_received_hi;
|
||||
u32 total_bytes_received_lo;
|
||||
u32 total_unicast_bytes_transmitted_hi;
|
||||
u32 total_unicast_bytes_transmitted_lo;
|
||||
u32 total_broadcast_bytes_transmitted_hi;
|
||||
u32 total_broadcast_bytes_transmitted_lo;
|
||||
u32 total_multicast_bytes_transmitted_hi;
|
||||
u32 total_multicast_bytes_transmitted_lo;
|
||||
u32 total_bytes_transmitted_hi;
|
||||
u32 total_bytes_transmitted_lo;
|
||||
u32 total_unicast_packets_received_hi;
|
||||
u32 total_unicast_packets_received_lo;
|
||||
u32 total_multicast_packets_received_hi;
|
||||
u32 total_multicast_packets_received_lo;
|
||||
u32 total_broadcast_packets_received_hi;
|
||||
u32 total_broadcast_packets_received_lo;
|
||||
u32 total_unicast_packets_transmitted_hi;
|
||||
u32 total_unicast_packets_transmitted_lo;
|
||||
u32 total_multicast_packets_transmitted_hi;
|
||||
u32 total_multicast_packets_transmitted_lo;
|
||||
u32 total_broadcast_packets_transmitted_hi;
|
||||
u32 total_broadcast_packets_transmitted_lo;
|
||||
u32 valid_bytes_received_hi;
|
||||
u32 valid_bytes_received_lo;
|
||||
|
||||
u32 etherstatsoverrsizepkts_hi;
|
||||
u32 etherstatsoverrsizepkts_lo;
|
||||
u32 no_buff_discard_hi;
|
||||
u32 no_buff_discard_lo;
|
||||
|
||||
u32 driver_xoff;
|
||||
u32 rx_err_discard_pkt;
|
||||
u32 rx_skb_alloc_failed;
|
||||
u32 hw_csum_err;
|
||||
|
||||
u32 total_packets_received_checksum_discarded_hi;
|
||||
u32 total_packets_received_checksum_discarded_lo;
|
||||
u32 total_packets_received_ttl0_discarded_hi;
|
||||
u32 total_packets_received_ttl0_discarded_lo;
|
||||
u32 total_transmitted_dropped_packets_error_hi;
|
||||
u32 total_transmitted_dropped_packets_error_lo;
|
||||
|
||||
/* TPA */
|
||||
u32 total_tpa_aggregations_hi;
|
||||
u32 total_tpa_aggregations_lo;
|
||||
u32 total_tpa_aggregated_frames_hi;
|
||||
u32 total_tpa_aggregated_frames_lo;
|
||||
u32 total_tpa_bytes_hi;
|
||||
u32 total_tpa_bytes_lo;
|
||||
};
|
||||
|
||||
/****************************************************************************
|
||||
* Macros
|
||||
****************************************************************************/
|
||||
|
||||
/* sum[hi:lo] += add[hi:lo] */
|
||||
#define ADD_64(s_hi, a_hi, s_lo, a_lo) \
|
||||
do { \
|
||||
s_lo += a_lo; \
|
||||
s_hi += a_hi + ((s_lo < a_lo) ? 1 : 0); \
|
||||
} while (0)
|
||||
|
||||
/* difference = minuend - subtrahend */
|
||||
#define DIFF_64(d_hi, m_hi, s_hi, d_lo, m_lo, s_lo) \
|
||||
do { \
|
||||
if (m_lo < s_lo) { \
|
||||
/* underflow */ \
|
||||
d_hi = m_hi - s_hi; \
|
||||
if (d_hi > 0) { \
|
||||
/* we can 'loan' 1 */ \
|
||||
d_hi--; \
|
||||
d_lo = m_lo + (UINT_MAX - s_lo) + 1; \
|
||||
} else { \
|
||||
/* m_hi <= s_hi */ \
|
||||
d_hi = 0; \
|
||||
d_lo = 0; \
|
||||
} \
|
||||
} else { \
|
||||
/* m_lo >= s_lo */ \
|
||||
if (m_hi < s_hi) { \
|
||||
d_hi = 0; \
|
||||
d_lo = 0; \
|
||||
} else { \
|
||||
/* m_hi >= s_hi */ \
|
||||
d_hi = m_hi - s_hi; \
|
||||
d_lo = m_lo - s_lo; \
|
||||
} \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define UPDATE_STAT64(s, t) \
|
||||
do { \
|
||||
DIFF_64(diff.hi, new->s##_hi, pstats->mac_stx[0].t##_hi, \
|
||||
diff.lo, new->s##_lo, pstats->mac_stx[0].t##_lo); \
|
||||
pstats->mac_stx[0].t##_hi = new->s##_hi; \
|
||||
pstats->mac_stx[0].t##_lo = new->s##_lo; \
|
||||
ADD_64(pstats->mac_stx[1].t##_hi, diff.hi, \
|
||||
pstats->mac_stx[1].t##_lo, diff.lo); \
|
||||
} while (0)
|
||||
|
||||
#define UPDATE_STAT64_NIG(s, t) \
|
||||
do { \
|
||||
DIFF_64(diff.hi, new->s##_hi, old->s##_hi, \
|
||||
diff.lo, new->s##_lo, old->s##_lo); \
|
||||
ADD_64(estats->t##_hi, diff.hi, \
|
||||
estats->t##_lo, diff.lo); \
|
||||
} while (0)
|
||||
|
||||
/* sum[hi:lo] += add */
|
||||
#define ADD_EXTEND_64(s_hi, s_lo, a) \
|
||||
do { \
|
||||
s_lo += a; \
|
||||
s_hi += (s_lo < a) ? 1 : 0; \
|
||||
} while (0)
|
||||
|
||||
#define ADD_STAT64(diff, t) \
|
||||
do { \
|
||||
ADD_64(pstats->mac_stx[1].t##_hi, new->diff##_hi, \
|
||||
pstats->mac_stx[1].t##_lo, new->diff##_lo); \
|
||||
} while (0)
|
||||
|
||||
#define UPDATE_EXTEND_STAT(s) \
|
||||
do { \
|
||||
ADD_EXTEND_64(pstats->mac_stx[1].s##_hi, \
|
||||
pstats->mac_stx[1].s##_lo, \
|
||||
new->s); \
|
||||
} while (0)
|
||||
|
||||
#define UPDATE_EXTEND_TSTAT(s, t) \
|
||||
do { \
|
||||
diff = le32_to_cpu(tclient->s) - le32_to_cpu(old_tclient->s); \
|
||||
old_tclient->s = tclient->s; \
|
||||
ADD_EXTEND_64(qstats->t##_hi, qstats->t##_lo, diff); \
|
||||
} while (0)
|
||||
|
||||
#define UPDATE_EXTEND_USTAT(s, t) \
|
||||
do { \
|
||||
diff = le32_to_cpu(uclient->s) - le32_to_cpu(old_uclient->s); \
|
||||
old_uclient->s = uclient->s; \
|
||||
ADD_EXTEND_64(qstats->t##_hi, qstats->t##_lo, diff); \
|
||||
} while (0)
|
||||
|
||||
#define UPDATE_EXTEND_XSTAT(s, t) \
|
||||
do { \
|
||||
diff = le32_to_cpu(xclient->s) - le32_to_cpu(old_xclient->s); \
|
||||
old_xclient->s = xclient->s; \
|
||||
ADD_EXTEND_64(qstats->t##_hi, qstats->t##_lo, diff); \
|
||||
} while (0)
|
||||
|
||||
/* minuend -= subtrahend */
|
||||
#define SUB_64(m_hi, s_hi, m_lo, s_lo) \
|
||||
do { \
|
||||
DIFF_64(m_hi, m_hi, s_hi, m_lo, m_lo, s_lo); \
|
||||
} while (0)
|
||||
|
||||
/* minuend[hi:lo] -= subtrahend */
|
||||
#define SUB_EXTEND_64(m_hi, m_lo, s) \
|
||||
do { \
|
||||
SUB_64(m_hi, 0, m_lo, s); \
|
||||
} while (0)
|
||||
|
||||
#define SUB_EXTEND_USTAT(s, t) \
|
||||
do { \
|
||||
diff = le32_to_cpu(uclient->s) - le32_to_cpu(old_uclient->s); \
|
||||
SUB_EXTEND_64(qstats->t##_hi, qstats->t##_lo, diff); \
|
||||
} while (0)
|
||||
|
||||
|
||||
/* forward */
|
||||
struct bnx2x;
|
||||
|
||||
void bnx2x_stats_init(struct bnx2x *bp);
|
||||
|
||||
extern const u32 dmae_reg_go_c[];
|
||||
void bnx2x_stats_handle(struct bnx2x *bp, enum bnx2x_stats_event event);
|
||||
|
||||
#endif /* BNX2X_STATS_H */
|
||||
|
||||
+79
-75
@@ -1,6 +1,6 @@
|
||||
/* cnic.c: Broadcom CNIC core network driver.
|
||||
*
|
||||
* Copyright (c) 2006-2010 Broadcom Corporation
|
||||
* Copyright (c) 2006-2011 Broadcom Corporation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -836,7 +836,6 @@ static void cnic_free_resc(struct cnic_dev *dev)
|
||||
cp->ctx_blks = 0;
|
||||
|
||||
cnic_free_dma(dev, &cp->gbl_buf_info);
|
||||
cnic_free_dma(dev, &cp->conn_buf_info);
|
||||
cnic_free_dma(dev, &cp->kwq_info);
|
||||
cnic_free_dma(dev, &cp->kwq_16_data_info);
|
||||
cnic_free_dma(dev, &cp->kcq2.dma);
|
||||
@@ -1176,7 +1175,7 @@ static int cnic_alloc_bnx2x_resc(struct cnic_dev *dev)
|
||||
cp->iscsi_start_cid = start_cid;
|
||||
cp->fcoe_start_cid = start_cid + MAX_ISCSI_TBL_SZ;
|
||||
|
||||
if (BNX2X_CHIP_IS_E2(cp->chip_id)) {
|
||||
if (BNX2X_CHIP_IS_E2_PLUS(cp->chip_id)) {
|
||||
cp->max_cid_space += BNX2X_FCOE_NUM_CONNECTIONS;
|
||||
cp->fcoe_init_cid = ethdev->fcoe_init_cid;
|
||||
if (!cp->fcoe_init_cid)
|
||||
@@ -1232,18 +1231,12 @@ static int cnic_alloc_bnx2x_resc(struct cnic_dev *dev)
|
||||
if (ret)
|
||||
goto error;
|
||||
|
||||
if (BNX2X_CHIP_IS_E2(cp->chip_id)) {
|
||||
ret = cnic_alloc_kcq(dev, &cp->kcq2, false);
|
||||
if (BNX2X_CHIP_IS_E2_PLUS(cp->chip_id)) {
|
||||
ret = cnic_alloc_kcq(dev, &cp->kcq2, true);
|
||||
if (ret)
|
||||
goto error;
|
||||
}
|
||||
|
||||
pages = PAGE_ALIGN(BNX2X_ISCSI_NUM_CONNECTIONS *
|
||||
BNX2X_ISCSI_CONN_BUF_SIZE) / PAGE_SIZE;
|
||||
ret = cnic_alloc_dma(dev, &cp->conn_buf_info, pages, 1);
|
||||
if (ret)
|
||||
goto error;
|
||||
|
||||
pages = PAGE_ALIGN(BNX2X_ISCSI_GLB_BUF_SIZE) / PAGE_SIZE;
|
||||
ret = cnic_alloc_dma(dev, &cp->gbl_buf_info, pages, 0);
|
||||
if (ret)
|
||||
@@ -1610,6 +1603,7 @@ static int cnic_setup_bnx2x_ctx(struct cnic_dev *dev, struct kwqe *wqes[],
|
||||
struct iscsi_context *ictx;
|
||||
struct regpair context_addr;
|
||||
int i, j, n = 2, n_max;
|
||||
u8 port = CNIC_PORT(cp);
|
||||
|
||||
ctx->ctx_flags = 0;
|
||||
if (!req2->num_additional_wqes)
|
||||
@@ -1661,6 +1655,17 @@ static int cnic_setup_bnx2x_ctx(struct cnic_dev *dev, struct kwqe *wqes[],
|
||||
XSTORM_ISCSI_CONTEXT_FLAGS_B_IMMEDIATE_DATA;
|
||||
ictx->xstorm_st_context.iscsi.flags.flags |=
|
||||
XSTORM_ISCSI_CONTEXT_FLAGS_B_INITIAL_R2T;
|
||||
ictx->xstorm_st_context.common.ethernet.reserved_vlan_type =
|
||||
ETH_P_8021Q;
|
||||
if (BNX2X_CHIP_IS_E2_PLUS(cp->chip_id) &&
|
||||
cp->port_mode == CHIP_2_PORT_MODE) {
|
||||
|
||||
port = 0;
|
||||
}
|
||||
ictx->xstorm_st_context.common.flags =
|
||||
1 << XSTORM_COMMON_CONTEXT_SECTION_PHYSQ_INITIALIZED_SHIFT;
|
||||
ictx->xstorm_st_context.common.flags =
|
||||
port << XSTORM_COMMON_CONTEXT_SECTION_PBF_PORT_SHIFT;
|
||||
|
||||
ictx->tstorm_st_context.iscsi.hdr_bytes_2_fetch = ISCSI_HEADER_SIZE;
|
||||
/* TSTORM requires the base address of RQ DB & not PTE */
|
||||
@@ -1876,8 +1881,11 @@ static int cnic_bnx2x_destroy_ramrod(struct cnic_dev *dev, u32 l5_cid)
|
||||
ret = cnic_submit_kwqe_16(dev, RAMROD_CMD_ID_COMMON_CFC_DEL,
|
||||
hw_cid, NONE_CONNECTION_TYPE, &l5_data);
|
||||
|
||||
if (ret == 0)
|
||||
if (ret == 0) {
|
||||
wait_event(ctx->waitq, ctx->wait_cond);
|
||||
if (unlikely(test_bit(CTX_FL_CID_ERROR, &ctx->ctx_flags)))
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -1912,8 +1920,10 @@ static int cnic_bnx2x_iscsi_destroy(struct cnic_dev *dev, struct kwqe *kwqe)
|
||||
skip_cfc_delete:
|
||||
cnic_free_bnx2x_conn_resc(dev, l5_cid);
|
||||
|
||||
if (!ret) {
|
||||
atomic_dec(&cp->iscsi_conn);
|
||||
clear_bit(CTX_FL_OFFLD_START, &ctx->ctx_flags);
|
||||
}
|
||||
|
||||
destroy_reply:
|
||||
memset(&kcqe, 0, sizeof(kcqe));
|
||||
@@ -1972,8 +1982,6 @@ static void cnic_init_storm_conn_bufs(struct cnic_dev *dev,
|
||||
tstorm_buf->ka_interval = kwqe3->ka_interval;
|
||||
tstorm_buf->ka_max_probe_count = kwqe3->ka_max_probe_count;
|
||||
}
|
||||
tstorm_buf->rcv_buf = kwqe3->rcv_buf;
|
||||
tstorm_buf->snd_buf = kwqe3->snd_buf;
|
||||
tstorm_buf->max_rt_time = 0xffffffff;
|
||||
}
|
||||
|
||||
@@ -2002,15 +2010,14 @@ static void cnic_init_bnx2x_mac(struct cnic_dev *dev)
|
||||
TSTORM_ISCSI_TCP_VARS_LSB_LOCAL_MAC_ADDR_OFFSET(pfid) + 1,
|
||||
mac[4]);
|
||||
CNIC_WR8(dev, BAR_TSTRORM_INTMEM +
|
||||
TSTORM_ISCSI_TCP_VARS_MSB_LOCAL_MAC_ADDR_OFFSET(pfid), mac[3]);
|
||||
TSTORM_ISCSI_TCP_VARS_MID_LOCAL_MAC_ADDR_OFFSET(pfid), mac[3]);
|
||||
CNIC_WR8(dev, BAR_TSTRORM_INTMEM +
|
||||
TSTORM_ISCSI_TCP_VARS_MSB_LOCAL_MAC_ADDR_OFFSET(pfid) + 1,
|
||||
TSTORM_ISCSI_TCP_VARS_MID_LOCAL_MAC_ADDR_OFFSET(pfid) + 1,
|
||||
mac[2]);
|
||||
CNIC_WR8(dev, BAR_TSTRORM_INTMEM +
|
||||
TSTORM_ISCSI_TCP_VARS_MSB_LOCAL_MAC_ADDR_OFFSET(pfid) + 2,
|
||||
mac[1]);
|
||||
TSTORM_ISCSI_TCP_VARS_MSB_LOCAL_MAC_ADDR_OFFSET(pfid), mac[1]);
|
||||
CNIC_WR8(dev, BAR_TSTRORM_INTMEM +
|
||||
TSTORM_ISCSI_TCP_VARS_MSB_LOCAL_MAC_ADDR_OFFSET(pfid) + 3,
|
||||
TSTORM_ISCSI_TCP_VARS_MSB_LOCAL_MAC_ADDR_OFFSET(pfid) + 1,
|
||||
mac[0]);
|
||||
}
|
||||
|
||||
@@ -2189,7 +2196,7 @@ static int cnic_bnx2x_fcoe_stat(struct cnic_dev *dev, struct kwqe *kwqe)
|
||||
memset(fcoe_stat, 0, sizeof(*fcoe_stat));
|
||||
memcpy(&fcoe_stat->stat_kwqe, req, sizeof(*req));
|
||||
|
||||
ret = cnic_submit_kwqe_16(dev, FCOE_RAMROD_CMD_ID_STAT, cid,
|
||||
ret = cnic_submit_kwqe_16(dev, FCOE_RAMROD_CMD_ID_STAT_FUNC, cid,
|
||||
FCOE_CONNECTION_TYPE, &l5_data);
|
||||
return ret;
|
||||
}
|
||||
@@ -2234,12 +2241,9 @@ static int cnic_bnx2x_fcoe_init1(struct cnic_dev *dev, struct kwqe *wqes[],
|
||||
memcpy(&fcoe_init->init_kwqe1, req1, sizeof(*req1));
|
||||
memcpy(&fcoe_init->init_kwqe2, req2, sizeof(*req2));
|
||||
memcpy(&fcoe_init->init_kwqe3, req3, sizeof(*req3));
|
||||
fcoe_init->eq_addr.lo = cp->kcq2.dma.pg_map_arr[0] & 0xffffffff;
|
||||
fcoe_init->eq_addr.hi = (u64) cp->kcq2.dma.pg_map_arr[0] >> 32;
|
||||
fcoe_init->eq_next_page_addr.lo =
|
||||
cp->kcq2.dma.pg_map_arr[1] & 0xffffffff;
|
||||
fcoe_init->eq_next_page_addr.hi =
|
||||
(u64) cp->kcq2.dma.pg_map_arr[1] >> 32;
|
||||
fcoe_init->eq_pbl_base.lo = cp->kcq2.dma.pgtbl_map & 0xffffffff;
|
||||
fcoe_init->eq_pbl_base.hi = (u64) cp->kcq2.dma.pgtbl_map >> 32;
|
||||
fcoe_init->eq_pbl_size = cp->kcq2.dma.num_pages;
|
||||
|
||||
fcoe_init->sb_num = cp->status_blk_num;
|
||||
fcoe_init->eq_prod = MAX_KCQ_IDX;
|
||||
@@ -2247,7 +2251,7 @@ static int cnic_bnx2x_fcoe_init1(struct cnic_dev *dev, struct kwqe *wqes[],
|
||||
cp->kcq2.sw_prod_idx = 0;
|
||||
|
||||
cid = BNX2X_HW_CID(cp, cp->fcoe_init_cid);
|
||||
ret = cnic_submit_kwqe_16(dev, FCOE_RAMROD_CMD_ID_INIT, cid,
|
||||
ret = cnic_submit_kwqe_16(dev, FCOE_RAMROD_CMD_ID_INIT_FUNC, cid,
|
||||
FCOE_CONNECTION_TYPE, &l5_data);
|
||||
*work = 3;
|
||||
return ret;
|
||||
@@ -2463,7 +2467,7 @@ static int cnic_bnx2x_fcoe_fw_destroy(struct cnic_dev *dev, struct kwqe *kwqe)
|
||||
cid = BNX2X_HW_CID(cp, cp->fcoe_init_cid);
|
||||
|
||||
memset(&l5_data, 0, sizeof(l5_data));
|
||||
ret = cnic_submit_kwqe_16(dev, FCOE_RAMROD_CMD_ID_DESTROY, cid,
|
||||
ret = cnic_submit_kwqe_16(dev, FCOE_RAMROD_CMD_ID_DESTROY_FUNC, cid,
|
||||
FCOE_CONNECTION_TYPE, &l5_data);
|
||||
return ret;
|
||||
}
|
||||
@@ -2544,7 +2548,7 @@ static int cnic_submit_bnx2x_fcoe_kwqes(struct cnic_dev *dev,
|
||||
if (!test_bit(CNIC_F_CNIC_UP, &dev->flags))
|
||||
return -EAGAIN; /* bnx2 is down */
|
||||
|
||||
if (BNX2X_CHIP_NUM(cp->chip_id) == BNX2X_CHIP_NUM_57710)
|
||||
if (!BNX2X_CHIP_IS_E2_PLUS(cp->chip_id))
|
||||
return -EINVAL;
|
||||
|
||||
for (i = 0; i < num_wqes; ) {
|
||||
@@ -2935,7 +2939,7 @@ static void cnic_service_bnx2x_bh(unsigned long data)
|
||||
CNIC_WR16(dev, cp->kcq1.io_addr,
|
||||
cp->kcq1.sw_prod_idx + MAX_KCQ_IDX);
|
||||
|
||||
if (!BNX2X_CHIP_IS_E2(cp->chip_id)) {
|
||||
if (!BNX2X_CHIP_IS_E2_PLUS(cp->chip_id)) {
|
||||
cnic_ack_bnx2x_int(dev, cp->bnx2x_igu_sb_id, USTORM_ID,
|
||||
status_idx, IGU_INT_ENABLE, 1);
|
||||
break;
|
||||
@@ -3054,13 +3058,21 @@ static int cnic_ctl(void *data, struct cnic_ctl_info *info)
|
||||
break;
|
||||
}
|
||||
case CNIC_CTL_COMPLETION_CMD: {
|
||||
u32 cid = BNX2X_SW_CID(info->data.comp.cid);
|
||||
struct cnic_ctl_completion *comp = &info->data.comp;
|
||||
u32 cid = BNX2X_SW_CID(comp->cid);
|
||||
u32 l5_cid;
|
||||
struct cnic_local *cp = dev->cnic_priv;
|
||||
|
||||
if (cnic_get_l5_cid(cp, cid, &l5_cid) == 0) {
|
||||
struct cnic_context *ctx = &cp->ctx_tbl[l5_cid];
|
||||
|
||||
if (unlikely(comp->error)) {
|
||||
set_bit(CTX_FL_CID_ERROR, &ctx->ctx_flags);
|
||||
netdev_err(dev->netdev,
|
||||
"CID %x CFC delete comp error %x\n",
|
||||
cid, comp->error);
|
||||
}
|
||||
|
||||
ctx->wait_cond = 1;
|
||||
wake_up(&ctx->waitq);
|
||||
}
|
||||
@@ -3935,10 +3947,17 @@ static void cnic_cm_stop_bnx2x_hw(struct cnic_dev *dev)
|
||||
|
||||
for (i = 0; i < cp->max_cid_space; i++) {
|
||||
struct cnic_context *ctx = &cp->ctx_tbl[i];
|
||||
int j;
|
||||
|
||||
while (test_bit(CTX_FL_DELETE_WAIT, &ctx->ctx_flags))
|
||||
msleep(10);
|
||||
|
||||
for (j = 0; j < 5; j++) {
|
||||
if (!test_bit(CTX_FL_OFFLD_START, &ctx->ctx_flags))
|
||||
break;
|
||||
msleep(20);
|
||||
}
|
||||
|
||||
if (test_bit(CTX_FL_OFFLD_START, &ctx->ctx_flags))
|
||||
netdev_warn(dev->netdev, "CID %x not deleted\n",
|
||||
ctx->cid);
|
||||
@@ -4005,6 +4024,7 @@ static void cnic_delete_task(struct work_struct *work)
|
||||
|
||||
for (i = 0; i < cp->max_cid_space; i++) {
|
||||
struct cnic_context *ctx = &cp->ctx_tbl[i];
|
||||
int err;
|
||||
|
||||
if (!test_bit(CTX_FL_OFFLD_START, &ctx->ctx_flags) ||
|
||||
!test_bit(CTX_FL_DELETE_WAIT, &ctx->ctx_flags))
|
||||
@@ -4018,14 +4038,16 @@ static void cnic_delete_task(struct work_struct *work)
|
||||
if (!test_and_clear_bit(CTX_FL_DELETE_WAIT, &ctx->ctx_flags))
|
||||
continue;
|
||||
|
||||
cnic_bnx2x_destroy_ramrod(dev, i);
|
||||
err = cnic_bnx2x_destroy_ramrod(dev, i);
|
||||
|
||||
cnic_free_bnx2x_conn_resc(dev, i);
|
||||
if (!err) {
|
||||
if (ctx->ulp_proto_id == CNIC_ULP_ISCSI)
|
||||
atomic_dec(&cp->iscsi_conn);
|
||||
|
||||
clear_bit(CTX_FL_OFFLD_START, &ctx->ctx_flags);
|
||||
}
|
||||
}
|
||||
|
||||
if (need_resched)
|
||||
queue_delayed_work(cnic_wq, &cp->delete_task,
|
||||
@@ -4620,7 +4642,7 @@ static void cnic_enable_bnx2x_int(struct cnic_dev *dev)
|
||||
CSTORM_STATUS_BLOCK_DATA_OFFSET(sb_id) +
|
||||
offsetof(struct hc_status_block_data_e1x, index_data) +
|
||||
sizeof(struct hc_index_data)*HC_INDEX_ISCSI_EQ_CONS +
|
||||
offsetof(struct hc_index_data, timeout), 64 / 12);
|
||||
offsetof(struct hc_index_data, timeout), 64 / 4);
|
||||
cnic_storm_memset_hc_disable(dev, sb_id, HC_INDEX_ISCSI_EQ_CONS, 0);
|
||||
}
|
||||
|
||||
@@ -4636,7 +4658,6 @@ static void cnic_init_bnx2x_tx_ring(struct cnic_dev *dev,
|
||||
union eth_tx_bd_types *txbd = (union eth_tx_bd_types *) udev->l2_ring;
|
||||
dma_addr_t buf_map, ring_map = udev->l2_ring_map;
|
||||
struct host_sp_status_block *sb = cp->bnx2x_def_status_blk;
|
||||
int port = CNIC_PORT(cp);
|
||||
int i;
|
||||
u32 cli = cp->ethdev->iscsi_l2_client_id;
|
||||
u32 val;
|
||||
@@ -4677,10 +4698,9 @@ static void cnic_init_bnx2x_tx_ring(struct cnic_dev *dev,
|
||||
|
||||
/* reset xstorm per client statistics */
|
||||
if (cli < MAX_STAT_COUNTER_ID) {
|
||||
val = BAR_XSTRORM_INTMEM +
|
||||
XSTORM_PER_COUNTER_ID_STATS_OFFSET(port, cli);
|
||||
for (i = 0; i < sizeof(struct xstorm_per_client_stats) / 4; i++)
|
||||
CNIC_WR(dev, val + i * 4, 0);
|
||||
data->general.statistics_zero_flg = 1;
|
||||
data->general.statistics_en_flg = 1;
|
||||
data->general.statistics_counter_id = cli;
|
||||
}
|
||||
|
||||
cp->tx_cons_ptr =
|
||||
@@ -4698,7 +4718,6 @@ static void cnic_init_bnx2x_rx_ring(struct cnic_dev *dev,
|
||||
(udev->l2_ring + (2 * BCM_PAGE_SIZE));
|
||||
struct host_sp_status_block *sb = cp->bnx2x_def_status_blk;
|
||||
int i;
|
||||
int port = CNIC_PORT(cp);
|
||||
u32 cli = cp->ethdev->iscsi_l2_client_id;
|
||||
int cl_qzone_id = BNX2X_CL_QZONE_ID(cp, cli);
|
||||
u32 val;
|
||||
@@ -4706,10 +4725,10 @@ static void cnic_init_bnx2x_rx_ring(struct cnic_dev *dev,
|
||||
|
||||
/* General data */
|
||||
data->general.client_id = cli;
|
||||
data->general.statistics_en_flg = 1;
|
||||
data->general.statistics_counter_id = cli;
|
||||
data->general.activate_flg = 1;
|
||||
data->general.sp_client_id = cli;
|
||||
data->general.mtu = cpu_to_le16(cp->l2_single_buf_size - 14);
|
||||
data->general.func_id = cp->pfid;
|
||||
|
||||
for (i = 0; i < BNX2X_MAX_RX_DESC_CNT; i++, rxbd++) {
|
||||
dma_addr_t buf_map;
|
||||
@@ -4743,23 +4762,12 @@ static void cnic_init_bnx2x_rx_ring(struct cnic_dev *dev,
|
||||
data->rx.status_block_id = BNX2X_DEF_SB_ID;
|
||||
|
||||
data->rx.cache_line_alignment_log_size = L1_CACHE_SHIFT;
|
||||
data->rx.bd_buff_size = cpu_to_le16(cp->l2_single_buf_size);
|
||||
|
||||
data->rx.mtu = cpu_to_le16(cp->l2_single_buf_size - 14);
|
||||
data->rx.max_bytes_on_bd = cpu_to_le16(cp->l2_single_buf_size);
|
||||
data->rx.outer_vlan_removal_enable_flg = 1;
|
||||
|
||||
/* reset tstorm and ustorm per client statistics */
|
||||
if (cli < MAX_STAT_COUNTER_ID) {
|
||||
val = BAR_TSTRORM_INTMEM +
|
||||
TSTORM_PER_COUNTER_ID_STATS_OFFSET(port, cli);
|
||||
for (i = 0; i < sizeof(struct tstorm_per_client_stats) / 4; i++)
|
||||
CNIC_WR(dev, val + i * 4, 0);
|
||||
|
||||
val = BAR_USTRORM_INTMEM +
|
||||
USTORM_PER_COUNTER_ID_STATS_OFFSET(port, cli);
|
||||
for (i = 0; i < sizeof(struct ustorm_per_client_stats) / 4; i++)
|
||||
CNIC_WR(dev, val + i * 4, 0);
|
||||
}
|
||||
data->rx.silent_vlan_removal_flg = 1;
|
||||
data->rx.silent_vlan_value = 0;
|
||||
data->rx.silent_vlan_mask = 0xffff;
|
||||
|
||||
cp->rx_cons_ptr =
|
||||
&sb->sp_sb.index_values[HC_SP_INDEX_ETH_ISCSI_RX_CQ_CONS];
|
||||
@@ -4775,7 +4783,7 @@ static void cnic_init_bnx2x_kcq(struct cnic_dev *dev)
|
||||
CSTORM_ISCSI_EQ_PROD_OFFSET(pfid, 0);
|
||||
cp->kcq1.sw_prod_idx = 0;
|
||||
|
||||
if (BNX2X_CHIP_IS_E2(cp->chip_id)) {
|
||||
if (BNX2X_CHIP_IS_E2_PLUS(cp->chip_id)) {
|
||||
struct host_hc_status_block_e2 *sb = cp->status_blk.gen;
|
||||
|
||||
cp->kcq1.hw_prod_idx_ptr =
|
||||
@@ -4791,7 +4799,7 @@ static void cnic_init_bnx2x_kcq(struct cnic_dev *dev)
|
||||
&sb->sb.running_index[SM_RX_ID];
|
||||
}
|
||||
|
||||
if (BNX2X_CHIP_IS_E2(cp->chip_id)) {
|
||||
if (BNX2X_CHIP_IS_E2_PLUS(cp->chip_id)) {
|
||||
struct host_hc_status_block_e2 *sb = cp->status_blk.gen;
|
||||
|
||||
cp->kcq2.io_addr = BAR_USTRORM_INTMEM +
|
||||
@@ -4808,10 +4816,12 @@ static int cnic_start_bnx2x_hw(struct cnic_dev *dev)
|
||||
{
|
||||
struct cnic_local *cp = dev->cnic_priv;
|
||||
struct cnic_eth_dev *ethdev = cp->ethdev;
|
||||
int func = CNIC_FUNC(cp), ret, i;
|
||||
int func = CNIC_FUNC(cp), ret;
|
||||
u32 pfid;
|
||||
|
||||
if (BNX2X_CHIP_IS_E2(cp->chip_id)) {
|
||||
cp->port_mode = CHIP_PORT_MODE_NONE;
|
||||
|
||||
if (BNX2X_CHIP_IS_E2_PLUS(cp->chip_id)) {
|
||||
u32 val = CNIC_RD(dev, MISC_REG_PORT4MODE_EN_OVWR);
|
||||
|
||||
if (!(val & 1))
|
||||
@@ -4819,10 +4829,13 @@ static int cnic_start_bnx2x_hw(struct cnic_dev *dev)
|
||||
else
|
||||
val = (val >> 1) & 1;
|
||||
|
||||
if (val)
|
||||
if (val) {
|
||||
cp->port_mode = CHIP_4_PORT_MODE;
|
||||
cp->pfid = func >> 1;
|
||||
else
|
||||
} else {
|
||||
cp->port_mode = CHIP_4_PORT_MODE;
|
||||
cp->pfid = func & 0x6;
|
||||
}
|
||||
} else {
|
||||
cp->pfid = func;
|
||||
}
|
||||
@@ -4834,7 +4847,7 @@ static int cnic_start_bnx2x_hw(struct cnic_dev *dev)
|
||||
if (ret)
|
||||
return -ENOMEM;
|
||||
|
||||
if (BNX2X_CHIP_IS_E2(cp->chip_id)) {
|
||||
if (BNX2X_CHIP_IS_E2_PLUS(cp->chip_id)) {
|
||||
ret = cnic_init_id_tbl(&cp->fcoe_cid_tbl,
|
||||
BNX2X_FCOE_NUM_CONNECTIONS,
|
||||
cp->fcoe_start_cid, 0);
|
||||
@@ -4871,15 +4884,6 @@ static int cnic_start_bnx2x_hw(struct cnic_dev *dev)
|
||||
CSTORM_ISCSI_EQ_SB_INDEX_OFFSET(pfid, 0),
|
||||
HC_INDEX_ISCSI_EQ_CONS);
|
||||
|
||||
for (i = 0; i < cp->conn_buf_info.num_pages; i++) {
|
||||
CNIC_WR(dev, BAR_TSTRORM_INTMEM +
|
||||
TSTORM_ISCSI_CONN_BUF_PBL_OFFSET(pfid, i),
|
||||
cp->conn_buf_info.pgtbl[2 * i]);
|
||||
CNIC_WR(dev, BAR_TSTRORM_INTMEM +
|
||||
TSTORM_ISCSI_CONN_BUF_PBL_OFFSET(pfid, i) + 4,
|
||||
cp->conn_buf_info.pgtbl[(2 * i) + 1]);
|
||||
}
|
||||
|
||||
CNIC_WR(dev, BAR_USTRORM_INTMEM +
|
||||
USTORM_ISCSI_GLOBAL_BUF_PHYS_ADDR_OFFSET(pfid),
|
||||
cp->gbl_buf_info.pg_map_arr[0] & 0xffffffff);
|
||||
@@ -4927,7 +4931,7 @@ static void cnic_init_rings(struct cnic_dev *dev)
|
||||
cl_qzone_id = BNX2X_CL_QZONE_ID(cp, cli);
|
||||
|
||||
off = BAR_USTRORM_INTMEM +
|
||||
(BNX2X_CHIP_IS_E2(cp->chip_id) ?
|
||||
(BNX2X_CHIP_IS_E2_PLUS(cp->chip_id) ?
|
||||
USTORM_RX_PRODS_E2_OFFSET(cl_qzone_id) :
|
||||
USTORM_RX_PRODS_E1X_OFFSET(CNIC_PORT(cp), cli));
|
||||
|
||||
@@ -5277,7 +5281,7 @@ static struct cnic_dev *init_bnx2x_cnic(struct net_device *dev)
|
||||
|
||||
if (!(ethdev->drv_state & CNIC_DRV_STATE_NO_ISCSI))
|
||||
cdev->max_iscsi_conn = ethdev->max_iscsi_conn;
|
||||
if (BNX2X_CHIP_IS_E2(cp->chip_id) &&
|
||||
if (BNX2X_CHIP_IS_E2_PLUS(cp->chip_id) &&
|
||||
!(ethdev->drv_state & CNIC_DRV_STATE_NO_FCOE))
|
||||
cdev->max_fcoe_conn = ethdev->max_fcoe_conn;
|
||||
|
||||
@@ -5293,7 +5297,7 @@ static struct cnic_dev *init_bnx2x_cnic(struct net_device *dev)
|
||||
cp->stop_cm = cnic_cm_stop_bnx2x_hw;
|
||||
cp->enable_int = cnic_enable_bnx2x_int;
|
||||
cp->disable_int_sync = cnic_disable_bnx2x_int_sync;
|
||||
if (BNX2X_CHIP_IS_E2(cp->chip_id))
|
||||
if (BNX2X_CHIP_IS_E2_PLUS(cp->chip_id))
|
||||
cp->ack_int = cnic_ack_bnx2x_e2_msix;
|
||||
else
|
||||
cp->ack_int = cnic_ack_bnx2x_msix;
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user