Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
This commit is contained in:
@@ -84,7 +84,7 @@ config BNX2
|
||||
|
||||
config CNIC
|
||||
tristate "QLogic CNIC support"
|
||||
depends on PCI
|
||||
depends on PCI && (IPV6 || IPV6=n)
|
||||
select BNX2
|
||||
select UIO
|
||||
---help---
|
||||
|
@@ -2233,7 +2233,12 @@ struct shmem2_region {
|
||||
u32 reserved3; /* Offset 0x14C */
|
||||
u32 reserved4; /* Offset 0x150 */
|
||||
u32 link_attr_sync[PORT_MAX]; /* Offset 0x154 */
|
||||
#define LINK_ATTR_SYNC_KR2_ENABLE (1<<0)
|
||||
#define LINK_ATTR_SYNC_KR2_ENABLE 0x00000001
|
||||
#define LINK_SFP_EEPROM_COMP_CODE_MASK 0x0000ff00
|
||||
#define LINK_SFP_EEPROM_COMP_CODE_SHIFT 8
|
||||
#define LINK_SFP_EEPROM_COMP_CODE_SR 0x00001000
|
||||
#define LINK_SFP_EEPROM_COMP_CODE_LR 0x00002000
|
||||
#define LINK_SFP_EEPROM_COMP_CODE_LRM 0x00004000
|
||||
|
||||
u32 reserved5[2];
|
||||
u32 reserved6[PORT_MAX];
|
||||
|
@@ -154,15 +154,22 @@ typedef int (*read_sfp_module_eeprom_func_p)(struct bnx2x_phy *phy,
|
||||
LINK_STATUS_LINK_PARTNER_ASYMMETRIC_PAUSE)
|
||||
|
||||
#define SFP_EEPROM_CON_TYPE_ADDR 0x2
|
||||
#define SFP_EEPROM_CON_TYPE_VAL_UNKNOWN 0x0
|
||||
#define SFP_EEPROM_CON_TYPE_VAL_LC 0x7
|
||||
#define SFP_EEPROM_CON_TYPE_VAL_COPPER 0x21
|
||||
#define SFP_EEPROM_CON_TYPE_VAL_RJ45 0x22
|
||||
|
||||
|
||||
#define SFP_EEPROM_COMP_CODE_ADDR 0x3
|
||||
#define SFP_EEPROM_COMP_CODE_SR_MASK (1<<4)
|
||||
#define SFP_EEPROM_COMP_CODE_LR_MASK (1<<5)
|
||||
#define SFP_EEPROM_COMP_CODE_LRM_MASK (1<<6)
|
||||
#define SFP_EEPROM_10G_COMP_CODE_ADDR 0x3
|
||||
#define SFP_EEPROM_10G_COMP_CODE_SR_MASK (1<<4)
|
||||
#define SFP_EEPROM_10G_COMP_CODE_LR_MASK (1<<5)
|
||||
#define SFP_EEPROM_10G_COMP_CODE_LRM_MASK (1<<6)
|
||||
|
||||
#define SFP_EEPROM_1G_COMP_CODE_ADDR 0x6
|
||||
#define SFP_EEPROM_1G_COMP_CODE_SX (1<<0)
|
||||
#define SFP_EEPROM_1G_COMP_CODE_LX (1<<1)
|
||||
#define SFP_EEPROM_1G_COMP_CODE_CX (1<<2)
|
||||
#define SFP_EEPROM_1G_COMP_CODE_BASE_T (1<<3)
|
||||
|
||||
#define SFP_EEPROM_FC_TX_TECH_ADDR 0x8
|
||||
#define SFP_EEPROM_FC_TX_TECH_BITMASK_COPPER_PASSIVE 0x4
|
||||
@@ -3633,8 +3640,8 @@ static void bnx2x_warpcore_enable_AN_KR2(struct bnx2x_phy *phy,
|
||||
reg_set[i].val);
|
||||
|
||||
/* Start KR2 work-around timer which handles BCM8073 link-parner */
|
||||
vars->link_attr_sync |= LINK_ATTR_SYNC_KR2_ENABLE;
|
||||
bnx2x_update_link_attr(params, vars->link_attr_sync);
|
||||
params->link_attr_sync |= LINK_ATTR_SYNC_KR2_ENABLE;
|
||||
bnx2x_update_link_attr(params, params->link_attr_sync);
|
||||
}
|
||||
|
||||
static void bnx2x_disable_kr2(struct link_params *params,
|
||||
@@ -3666,8 +3673,8 @@ static void bnx2x_disable_kr2(struct link_params *params,
|
||||
for (i = 0; i < ARRAY_SIZE(reg_set); i++)
|
||||
bnx2x_cl45_write(bp, phy, reg_set[i].devad, reg_set[i].reg,
|
||||
reg_set[i].val);
|
||||
vars->link_attr_sync &= ~LINK_ATTR_SYNC_KR2_ENABLE;
|
||||
bnx2x_update_link_attr(params, vars->link_attr_sync);
|
||||
params->link_attr_sync &= ~LINK_ATTR_SYNC_KR2_ENABLE;
|
||||
bnx2x_update_link_attr(params, params->link_attr_sync);
|
||||
|
||||
vars->check_kr2_recovery_cnt = CHECK_KR2_RECOVERY_CNT;
|
||||
}
|
||||
@@ -4810,7 +4817,7 @@ void bnx2x_link_status_update(struct link_params *params,
|
||||
~FEATURE_CONFIG_PFC_ENABLED;
|
||||
|
||||
if (SHMEM2_HAS(bp, link_attr_sync))
|
||||
vars->link_attr_sync = SHMEM2_RD(bp,
|
||||
params->link_attr_sync = SHMEM2_RD(bp,
|
||||
link_attr_sync[params->port]);
|
||||
|
||||
DP(NETIF_MSG_LINK, "link_status 0x%x phy_link_up %x int_mask 0x%x\n",
|
||||
@@ -8057,21 +8064,24 @@ static int bnx2x_get_edc_mode(struct bnx2x_phy *phy,
|
||||
{
|
||||
struct bnx2x *bp = params->bp;
|
||||
u32 sync_offset = 0, phy_idx, media_types;
|
||||
u8 gport, val[2], check_limiting_mode = 0;
|
||||
u8 val[SFP_EEPROM_FC_TX_TECH_ADDR + 1], check_limiting_mode = 0;
|
||||
*edc_mode = EDC_MODE_LIMITING;
|
||||
phy->media_type = ETH_PHY_UNSPECIFIED;
|
||||
/* First check for copper cable */
|
||||
if (bnx2x_read_sfp_module_eeprom(phy,
|
||||
params,
|
||||
I2C_DEV_ADDR_A0,
|
||||
SFP_EEPROM_CON_TYPE_ADDR,
|
||||
2,
|
||||
0,
|
||||
SFP_EEPROM_FC_TX_TECH_ADDR + 1,
|
||||
(u8 *)val) != 0) {
|
||||
DP(NETIF_MSG_LINK, "Failed to read from SFP+ module EEPROM\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
switch (val[0]) {
|
||||
params->link_attr_sync &= ~LINK_SFP_EEPROM_COMP_CODE_MASK;
|
||||
params->link_attr_sync |= val[SFP_EEPROM_10G_COMP_CODE_ADDR] <<
|
||||
LINK_SFP_EEPROM_COMP_CODE_SHIFT;
|
||||
bnx2x_update_link_attr(params, params->link_attr_sync);
|
||||
switch (val[SFP_EEPROM_CON_TYPE_ADDR]) {
|
||||
case SFP_EEPROM_CON_TYPE_VAL_COPPER:
|
||||
{
|
||||
u8 copper_module_type;
|
||||
@@ -8079,17 +8089,7 @@ static int bnx2x_get_edc_mode(struct bnx2x_phy *phy,
|
||||
/* Check if its active cable (includes SFP+ module)
|
||||
* of passive cable
|
||||
*/
|
||||
if (bnx2x_read_sfp_module_eeprom(phy,
|
||||
params,
|
||||
I2C_DEV_ADDR_A0,
|
||||
SFP_EEPROM_FC_TX_TECH_ADDR,
|
||||
1,
|
||||
&copper_module_type) != 0) {
|
||||
DP(NETIF_MSG_LINK,
|
||||
"Failed to read copper-cable-type"
|
||||
" from SFP+ EEPROM\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
copper_module_type = val[SFP_EEPROM_FC_TX_TECH_ADDR];
|
||||
|
||||
if (copper_module_type &
|
||||
SFP_EEPROM_FC_TX_TECH_BITMASK_COPPER_ACTIVE) {
|
||||
@@ -8115,16 +8115,18 @@ static int bnx2x_get_edc_mode(struct bnx2x_phy *phy,
|
||||
}
|
||||
break;
|
||||
}
|
||||
case SFP_EEPROM_CON_TYPE_VAL_UNKNOWN:
|
||||
case SFP_EEPROM_CON_TYPE_VAL_LC:
|
||||
case SFP_EEPROM_CON_TYPE_VAL_RJ45:
|
||||
check_limiting_mode = 1;
|
||||
if ((val[1] & (SFP_EEPROM_COMP_CODE_SR_MASK |
|
||||
SFP_EEPROM_COMP_CODE_LR_MASK |
|
||||
SFP_EEPROM_COMP_CODE_LRM_MASK)) == 0) {
|
||||
if ((val[SFP_EEPROM_10G_COMP_CODE_ADDR] &
|
||||
(SFP_EEPROM_10G_COMP_CODE_SR_MASK |
|
||||
SFP_EEPROM_10G_COMP_CODE_LR_MASK |
|
||||
SFP_EEPROM_10G_COMP_CODE_LRM_MASK)) == 0) {
|
||||
DP(NETIF_MSG_LINK, "1G SFP module detected\n");
|
||||
gport = params->port;
|
||||
phy->media_type = ETH_PHY_SFP_1G_FIBER;
|
||||
if (phy->req_line_speed != SPEED_1000) {
|
||||
u8 gport = params->port;
|
||||
phy->req_line_speed = SPEED_1000;
|
||||
if (!CHIP_IS_E1x(bp)) {
|
||||
gport = BP_PATH(bp) +
|
||||
@@ -8134,6 +8136,12 @@ static int bnx2x_get_edc_mode(struct bnx2x_phy *phy,
|
||||
"Warning: Link speed was forced to 1000Mbps. Current SFP module in port %d is not compliant with 10G Ethernet\n",
|
||||
gport);
|
||||
}
|
||||
if (val[SFP_EEPROM_1G_COMP_CODE_ADDR] &
|
||||
SFP_EEPROM_1G_COMP_CODE_BASE_T) {
|
||||
bnx2x_sfp_set_transmitter(params, phy, 0);
|
||||
msleep(40);
|
||||
bnx2x_sfp_set_transmitter(params, phy, 1);
|
||||
}
|
||||
} else {
|
||||
int idx, cfg_idx = 0;
|
||||
DP(NETIF_MSG_LINK, "10G Optic module detected\n");
|
||||
@@ -8149,7 +8157,7 @@ static int bnx2x_get_edc_mode(struct bnx2x_phy *phy,
|
||||
break;
|
||||
default:
|
||||
DP(NETIF_MSG_LINK, "Unable to determine module type 0x%x !!!\n",
|
||||
val[0]);
|
||||
val[SFP_EEPROM_CON_TYPE_ADDR]);
|
||||
return -EINVAL;
|
||||
}
|
||||
sync_offset = params->shmem_base +
|
||||
@@ -13507,7 +13515,7 @@ static void bnx2x_check_kr2_wa(struct link_params *params,
|
||||
|
||||
sigdet = bnx2x_warpcore_get_sigdet(phy, params);
|
||||
if (!sigdet) {
|
||||
if (!(vars->link_attr_sync & LINK_ATTR_SYNC_KR2_ENABLE)) {
|
||||
if (!(params->link_attr_sync & LINK_ATTR_SYNC_KR2_ENABLE)) {
|
||||
bnx2x_kr2_recovery(params, vars, phy);
|
||||
DP(NETIF_MSG_LINK, "No sigdet\n");
|
||||
}
|
||||
@@ -13525,7 +13533,7 @@ static void bnx2x_check_kr2_wa(struct link_params *params,
|
||||
|
||||
/* CL73 has not begun yet */
|
||||
if (base_page == 0) {
|
||||
if (!(vars->link_attr_sync & LINK_ATTR_SYNC_KR2_ENABLE)) {
|
||||
if (!(params->link_attr_sync & LINK_ATTR_SYNC_KR2_ENABLE)) {
|
||||
bnx2x_kr2_recovery(params, vars, phy);
|
||||
DP(NETIF_MSG_LINK, "No BP\n");
|
||||
}
|
||||
@@ -13541,7 +13549,7 @@ static void bnx2x_check_kr2_wa(struct link_params *params,
|
||||
((next_page & 0xe0) == 0x20))));
|
||||
|
||||
/* In case KR2 is already disabled, check if we need to re-enable it */
|
||||
if (!(vars->link_attr_sync & LINK_ATTR_SYNC_KR2_ENABLE)) {
|
||||
if (!(params->link_attr_sync & LINK_ATTR_SYNC_KR2_ENABLE)) {
|
||||
if (!not_kr2_device) {
|
||||
DP(NETIF_MSG_LINK, "BP=0x%x, NP=0x%x\n", base_page,
|
||||
next_page);
|
||||
|
@@ -323,6 +323,9 @@ struct link_params {
|
||||
#define LINK_FLAGS_INT_DISABLED (1<<0)
|
||||
#define PHY_INITIALIZED (1<<1)
|
||||
u32 lfa_base;
|
||||
|
||||
/* The same definitions as the shmem2 parameter */
|
||||
u32 link_attr_sync;
|
||||
};
|
||||
|
||||
/* Output parameters */
|
||||
@@ -364,8 +367,6 @@ struct link_vars {
|
||||
u8 rx_tx_asic_rst;
|
||||
u8 turn_to_run_wc_rt;
|
||||
u16 rsrv2;
|
||||
/* The same definitions as the shmem2 parameter */
|
||||
u32 link_attr_sync;
|
||||
};
|
||||
|
||||
/***********************************************************/
|
||||
|
@@ -6868,6 +6868,37 @@ static void bnx2x__common_init_phy(struct bnx2x *bp)
|
||||
bnx2x_release_phy_lock(bp);
|
||||
}
|
||||
|
||||
static void bnx2x_config_endianity(struct bnx2x *bp, u32 val)
|
||||
{
|
||||
REG_WR(bp, PXP2_REG_RQ_QM_ENDIAN_M, val);
|
||||
REG_WR(bp, PXP2_REG_RQ_TM_ENDIAN_M, val);
|
||||
REG_WR(bp, PXP2_REG_RQ_SRC_ENDIAN_M, val);
|
||||
REG_WR(bp, PXP2_REG_RQ_CDU_ENDIAN_M, val);
|
||||
REG_WR(bp, PXP2_REG_RQ_DBG_ENDIAN_M, val);
|
||||
|
||||
/* make sure this value is 0 */
|
||||
REG_WR(bp, PXP2_REG_RQ_HC_ENDIAN_M, 0);
|
||||
|
||||
REG_WR(bp, PXP2_REG_RD_QM_SWAP_MODE, val);
|
||||
REG_WR(bp, PXP2_REG_RD_TM_SWAP_MODE, val);
|
||||
REG_WR(bp, PXP2_REG_RD_SRC_SWAP_MODE, val);
|
||||
REG_WR(bp, PXP2_REG_RD_CDURD_SWAP_MODE, val);
|
||||
}
|
||||
|
||||
static void bnx2x_set_endianity(struct bnx2x *bp)
|
||||
{
|
||||
#ifdef __BIG_ENDIAN
|
||||
bnx2x_config_endianity(bp, 1);
|
||||
#else
|
||||
bnx2x_config_endianity(bp, 0);
|
||||
#endif
|
||||
}
|
||||
|
||||
static void bnx2x_reset_endianity(struct bnx2x *bp)
|
||||
{
|
||||
bnx2x_config_endianity(bp, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* bnx2x_init_hw_common - initialize the HW at the COMMON phase.
|
||||
*
|
||||
@@ -6934,23 +6965,7 @@ static int bnx2x_init_hw_common(struct bnx2x *bp)
|
||||
|
||||
bnx2x_init_block(bp, BLOCK_PXP2, PHASE_COMMON);
|
||||
bnx2x_init_pxp(bp);
|
||||
|
||||
#ifdef __BIG_ENDIAN
|
||||
REG_WR(bp, PXP2_REG_RQ_QM_ENDIAN_M, 1);
|
||||
REG_WR(bp, PXP2_REG_RQ_TM_ENDIAN_M, 1);
|
||||
REG_WR(bp, PXP2_REG_RQ_SRC_ENDIAN_M, 1);
|
||||
REG_WR(bp, PXP2_REG_RQ_CDU_ENDIAN_M, 1);
|
||||
REG_WR(bp, PXP2_REG_RQ_DBG_ENDIAN_M, 1);
|
||||
/* make sure this value is 0 */
|
||||
REG_WR(bp, PXP2_REG_RQ_HC_ENDIAN_M, 0);
|
||||
|
||||
/* REG_WR(bp, PXP2_REG_RD_PBF_SWAP_MODE, 1); */
|
||||
REG_WR(bp, PXP2_REG_RD_QM_SWAP_MODE, 1);
|
||||
REG_WR(bp, PXP2_REG_RD_TM_SWAP_MODE, 1);
|
||||
REG_WR(bp, PXP2_REG_RD_SRC_SWAP_MODE, 1);
|
||||
REG_WR(bp, PXP2_REG_RD_CDURD_SWAP_MODE, 1);
|
||||
#endif
|
||||
|
||||
bnx2x_set_endianity(bp);
|
||||
bnx2x_ilt_init_page_size(bp, INITOP_SET);
|
||||
|
||||
if (CHIP_REV_IS_FPGA(bp) && CHIP_IS_E1H(bp))
|
||||
@@ -13440,9 +13455,15 @@ static void __bnx2x_remove(struct pci_dev *pdev,
|
||||
bnx2x_iov_remove_one(bp);
|
||||
|
||||
/* Power on: we can't let PCI layer write to us while we are in D3 */
|
||||
if (IS_PF(bp))
|
||||
if (IS_PF(bp)) {
|
||||
bnx2x_set_power_state(bp, PCI_D0);
|
||||
|
||||
/* Set endianity registers to reset values in case next driver
|
||||
* boots in different endianty environment.
|
||||
*/
|
||||
bnx2x_reset_endianity(bp);
|
||||
}
|
||||
|
||||
/* Disable MSI/MSI-X */
|
||||
bnx2x_disable_msi(bp);
|
||||
|
||||
|
@@ -31,7 +31,7 @@
|
||||
#include <linux/if_vlan.h>
|
||||
#include <linux/prefetch.h>
|
||||
#include <linux/random.h>
|
||||
#if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE)
|
||||
#if IS_ENABLED(CONFIG_VLAN_8021Q)
|
||||
#define BCM_VLAN 1
|
||||
#endif
|
||||
#include <net/ip.h>
|
||||
@@ -3685,7 +3685,7 @@ static int cnic_get_v4_route(struct sockaddr_in *dst_addr,
|
||||
static int cnic_get_v6_route(struct sockaddr_in6 *dst_addr,
|
||||
struct dst_entry **dst)
|
||||
{
|
||||
#if defined(CONFIG_IPV6) || (defined(CONFIG_IPV6_MODULE) && defined(MODULE))
|
||||
#if IS_ENABLED(CONFIG_IPV6)
|
||||
struct flowi6 fl6;
|
||||
|
||||
memset(&fl6, 0, sizeof(fl6));
|
||||
|
@@ -11617,6 +11617,12 @@ static int tg3_open(struct net_device *dev)
|
||||
struct tg3 *tp = netdev_priv(dev);
|
||||
int err;
|
||||
|
||||
if (tp->pcierr_recovery) {
|
||||
netdev_err(dev, "Failed to open device. PCI error recovery "
|
||||
"in progress\n");
|
||||
return -EAGAIN;
|
||||
}
|
||||
|
||||
if (tp->fw_needed) {
|
||||
err = tg3_request_firmware(tp);
|
||||
if (tg3_asic_rev(tp) == ASIC_REV_57766) {
|
||||
@@ -11674,6 +11680,12 @@ static int tg3_close(struct net_device *dev)
|
||||
{
|
||||
struct tg3 *tp = netdev_priv(dev);
|
||||
|
||||
if (tp->pcierr_recovery) {
|
||||
netdev_err(dev, "Failed to close device. PCI error recovery "
|
||||
"in progress\n");
|
||||
return -EAGAIN;
|
||||
}
|
||||
|
||||
tg3_ptp_fini(tp);
|
||||
|
||||
tg3_stop(tp);
|
||||
@@ -17561,6 +17573,7 @@ static int tg3_init_one(struct pci_dev *pdev,
|
||||
tp->rx_mode = TG3_DEF_RX_MODE;
|
||||
tp->tx_mode = TG3_DEF_TX_MODE;
|
||||
tp->irq_sync = 1;
|
||||
tp->pcierr_recovery = false;
|
||||
|
||||
if (tg3_debug > 0)
|
||||
tp->msg_enable = tg3_debug;
|
||||
@@ -18071,6 +18084,8 @@ static pci_ers_result_t tg3_io_error_detected(struct pci_dev *pdev,
|
||||
|
||||
rtnl_lock();
|
||||
|
||||
tp->pcierr_recovery = true;
|
||||
|
||||
/* We probably don't have netdev yet */
|
||||
if (!netdev || !netif_running(netdev))
|
||||
goto done;
|
||||
@@ -18195,6 +18210,7 @@ static void tg3_io_resume(struct pci_dev *pdev)
|
||||
tg3_phy_start(tp);
|
||||
|
||||
done:
|
||||
tp->pcierr_recovery = false;
|
||||
rtnl_unlock();
|
||||
}
|
||||
|
||||
|
@@ -3407,6 +3407,7 @@ struct tg3 {
|
||||
|
||||
struct device *hwmon_dev;
|
||||
bool link_up;
|
||||
bool pcierr_recovery;
|
||||
};
|
||||
|
||||
/* Accessor macros for chip and asic attributes
|
||||
|
Reference in New Issue
Block a user