mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-16 00:34:20 +08:00
bnx2x: FW (bootcode) interface fixes
FW (bootcode) interface fixes - Making sure that the device will not cause kernel panic of the bootcode is corrupted or missing - Removing module debug parameter "nomcp" since no one should work without the bootcode (this is a left over from the chip bring up days) - Instead of waiting fix amount of time for bootcode response, sample it every 10ms (usually the answer is ready after less than 10ms) Signed-off-by: Eilon Greenstein <eilong@broadcom.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
d4766692e7
commit
19680c4850
@ -76,23 +76,21 @@ MODULE_DESCRIPTION("Broadcom NetXtreme II BCM57710 Driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_VERSION(DRV_MODULE_VERSION);
|
||||
|
||||
static int disable_tpa;
|
||||
static int use_inta;
|
||||
static int poll;
|
||||
static int debug;
|
||||
static int disable_tpa;
|
||||
static int nomcp;
|
||||
static int load_count[3]; /* 0-common, 1-port0, 2-port1 */
|
||||
static int use_multi;
|
||||
|
||||
module_param(disable_tpa, int, 0);
|
||||
module_param(use_inta, int, 0);
|
||||
module_param(poll, int, 0);
|
||||
module_param(debug, int, 0);
|
||||
module_param(disable_tpa, int, 0);
|
||||
module_param(nomcp, int, 0);
|
||||
MODULE_PARM_DESC(disable_tpa, "disable the TPA (LRO) feature");
|
||||
MODULE_PARM_DESC(use_inta, "use INT#A instead of MSI-X");
|
||||
MODULE_PARM_DESC(poll, "use polling (for debug)");
|
||||
MODULE_PARM_DESC(debug, "default debug msglevel");
|
||||
MODULE_PARM_DESC(nomcp, "ignore management CPU");
|
||||
|
||||
#ifdef BNX2X_MULTI
|
||||
module_param(use_multi, int, 0);
|
||||
@ -1940,37 +1938,47 @@ static void bnx2x_link_report(struct bnx2x *bp)
|
||||
|
||||
static u8 bnx2x_initial_phy_init(struct bnx2x *bp)
|
||||
{
|
||||
u8 rc;
|
||||
if (!BP_NOMCP(bp)) {
|
||||
u8 rc;
|
||||
|
||||
/* Initialize link parameters structure variables */
|
||||
bp->link_params.mtu = bp->dev->mtu;
|
||||
/* Initialize link parameters structure variables */
|
||||
bp->link_params.mtu = bp->dev->mtu;
|
||||
|
||||
bnx2x_phy_hw_lock(bp);
|
||||
rc = bnx2x_phy_init(&bp->link_params, &bp->link_vars);
|
||||
bnx2x_phy_hw_unlock(bp);
|
||||
bnx2x_phy_hw_lock(bp);
|
||||
rc = bnx2x_phy_init(&bp->link_params, &bp->link_vars);
|
||||
bnx2x_phy_hw_unlock(bp);
|
||||
|
||||
if (bp->link_vars.link_up)
|
||||
bnx2x_link_report(bp);
|
||||
if (bp->link_vars.link_up)
|
||||
bnx2x_link_report(bp);
|
||||
|
||||
bnx2x_calc_fc_adv(bp);
|
||||
bnx2x_calc_fc_adv(bp);
|
||||
|
||||
return rc;
|
||||
return rc;
|
||||
}
|
||||
BNX2X_ERR("Bootcode is missing -not initializing link\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static void bnx2x_link_set(struct bnx2x *bp)
|
||||
{
|
||||
bnx2x_phy_hw_lock(bp);
|
||||
bnx2x_phy_init(&bp->link_params, &bp->link_vars);
|
||||
bnx2x_phy_hw_unlock(bp);
|
||||
if (!BP_NOMCP(bp)) {
|
||||
bnx2x_phy_hw_lock(bp);
|
||||
bnx2x_phy_init(&bp->link_params, &bp->link_vars);
|
||||
bnx2x_phy_hw_unlock(bp);
|
||||
|
||||
bnx2x_calc_fc_adv(bp);
|
||||
bnx2x_calc_fc_adv(bp);
|
||||
} else
|
||||
BNX2X_ERR("Bootcode is missing -not setting link\n");
|
||||
}
|
||||
|
||||
static void bnx2x__link_reset(struct bnx2x *bp)
|
||||
{
|
||||
bnx2x_phy_hw_lock(bp);
|
||||
bnx2x_link_reset(&bp->link_params, &bp->link_vars);
|
||||
bnx2x_phy_hw_unlock(bp);
|
||||
if (!BP_NOMCP(bp)) {
|
||||
bnx2x_phy_hw_lock(bp);
|
||||
bnx2x_link_reset(&bp->link_params, &bp->link_vars);
|
||||
bnx2x_phy_hw_unlock(bp);
|
||||
} else
|
||||
BNX2X_ERR("Bootcode is missing -not resetting link\n");
|
||||
}
|
||||
|
||||
static u8 bnx2x_link_test(struct bnx2x *bp)
|
||||
@ -2374,7 +2382,7 @@ static int bnx2x_lock_alr(struct bnx2x *bp)
|
||||
msleep(5);
|
||||
}
|
||||
if (!(val & (1L << 31))) {
|
||||
BNX2X_ERR("Cannot acquire nvram interface\n");
|
||||
BNX2X_ERR("Cannot acquire MCP access lock register\n");
|
||||
rc = -EBUSY;
|
||||
}
|
||||
|
||||
@ -5638,18 +5646,23 @@ static u32 bnx2x_fw_command(struct bnx2x *bp, u32 command)
|
||||
int func = BP_FUNC(bp);
|
||||
u32 seq = ++bp->fw_seq;
|
||||
u32 rc = 0;
|
||||
u32 cnt = 1;
|
||||
u8 delay = CHIP_REV_IS_SLOW(bp) ? 100 : 10;
|
||||
|
||||
SHMEM_WR(bp, func_mb[func].drv_mb_header, (command | seq));
|
||||
DP(BNX2X_MSG_MCP, "wrote command (%x) to FW MB\n", (command | seq));
|
||||
|
||||
/* let the FW do it's magic ... */
|
||||
msleep(100); /* TBD */
|
||||
do {
|
||||
/* let the FW do it's magic ... */
|
||||
msleep(delay);
|
||||
|
||||
if (CHIP_REV_IS_SLOW(bp))
|
||||
msleep(900);
|
||||
rc = SHMEM_RD(bp, func_mb[func].fw_mb_header);
|
||||
|
||||
rc = SHMEM_RD(bp, func_mb[func].fw_mb_header);
|
||||
DP(BNX2X_MSG_MCP, "read (%x) seq is (%x) from FW MB\n", rc, seq);
|
||||
/* Give the FW up to 2 second (200*10ms) */
|
||||
} while ((seq != (rc & FW_MSG_SEQ_NUMBER_MASK)) && (cnt++ < 200));
|
||||
|
||||
DP(BNX2X_MSG_MCP, "[after %d ms] read (%x) seq is (%x) from FW MB\n",
|
||||
cnt*delay, rc, seq);
|
||||
|
||||
/* is this a reply to our command? */
|
||||
if (seq == (rc & FW_MSG_SEQ_NUMBER_MASK)) {
|
||||
@ -7337,9 +7350,6 @@ static int __devinit bnx2x_init_bp(struct bnx2x *bp)
|
||||
int func = BP_FUNC(bp);
|
||||
int rc;
|
||||
|
||||
if (nomcp)
|
||||
bp->flags |= NO_MCP_FLAG;
|
||||
|
||||
mutex_init(&bp->port.phy_mutex);
|
||||
|
||||
INIT_WORK(&bp->sp_task, bnx2x_sp_task);
|
||||
|
Loading…
Reference in New Issue
Block a user