aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEilon Greenstein <eilong@broadcom.com>2008-08-13 18:47:33 -0400
committerDavid S. Miller <davem@davemloft.net>2008-08-13 19:01:13 -0400
commit19680c4850c1e5c2b4371388637c7ce86b8570b6 (patch)
treee280a0a8de89dfb9996086a7dd12db48c0596035
parentd4766692e72422f3b0f0e9ac6773d92baad07d51 (diff)
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>
-rw-r--r--drivers/net/bnx2x_main.c74
1 files changed, 42 insertions, 32 deletions
diff --git a/drivers/net/bnx2x_main.c b/drivers/net/bnx2x_main.c
index 272a4bd25953..9eb8a3e6d629 100644
--- a/drivers/net/bnx2x_main.c
+++ b/drivers/net/bnx2x_main.c
@@ -76,23 +76,21 @@ MODULE_DESCRIPTION("Broadcom NetXtreme II BCM57710 Driver");
76MODULE_LICENSE("GPL"); 76MODULE_LICENSE("GPL");
77MODULE_VERSION(DRV_MODULE_VERSION); 77MODULE_VERSION(DRV_MODULE_VERSION);
78 78
79static int disable_tpa;
79static int use_inta; 80static int use_inta;
80static int poll; 81static int poll;
81static int debug; 82static int debug;
82static int disable_tpa;
83static int nomcp;
84static int load_count[3]; /* 0-common, 1-port0, 2-port1 */ 83static int load_count[3]; /* 0-common, 1-port0, 2-port1 */
85static int use_multi; 84static int use_multi;
86 85
86module_param(disable_tpa, int, 0);
87module_param(use_inta, int, 0); 87module_param(use_inta, int, 0);
88module_param(poll, int, 0); 88module_param(poll, int, 0);
89module_param(debug, int, 0); 89module_param(debug, int, 0);
90module_param(disable_tpa, int, 0); 90MODULE_PARM_DESC(disable_tpa, "disable the TPA (LRO) feature");
91module_param(nomcp, int, 0);
92MODULE_PARM_DESC(use_inta, "use INT#A instead of MSI-X"); 91MODULE_PARM_DESC(use_inta, "use INT#A instead of MSI-X");
93MODULE_PARM_DESC(poll, "use polling (for debug)"); 92MODULE_PARM_DESC(poll, "use polling (for debug)");
94MODULE_PARM_DESC(debug, "default debug msglevel"); 93MODULE_PARM_DESC(debug, "default debug msglevel");
95MODULE_PARM_DESC(nomcp, "ignore management CPU");
96 94
97#ifdef BNX2X_MULTI 95#ifdef BNX2X_MULTI
98module_param(use_multi, int, 0); 96module_param(use_multi, int, 0);
@@ -1940,37 +1938,47 @@ static void bnx2x_link_report(struct bnx2x *bp)
1940 1938
1941static u8 bnx2x_initial_phy_init(struct bnx2x *bp) 1939static u8 bnx2x_initial_phy_init(struct bnx2x *bp)
1942{ 1940{
1943 u8 rc; 1941 if (!BP_NOMCP(bp)) {
1942 u8 rc;
1944 1943
1945 /* Initialize link parameters structure variables */ 1944 /* Initialize link parameters structure variables */
1946 bp->link_params.mtu = bp->dev->mtu; 1945 bp->link_params.mtu = bp->dev->mtu;
1947 1946
1948 bnx2x_phy_hw_lock(bp); 1947 bnx2x_phy_hw_lock(bp);
1949 rc = bnx2x_phy_init(&bp->link_params, &bp->link_vars); 1948 rc = bnx2x_phy_init(&bp->link_params, &bp->link_vars);
1950 bnx2x_phy_hw_unlock(bp); 1949 bnx2x_phy_hw_unlock(bp);
1951 1950
1952 if (bp->link_vars.link_up) 1951 if (bp->link_vars.link_up)
1953 bnx2x_link_report(bp); 1952 bnx2x_link_report(bp);
1954 1953
1955 bnx2x_calc_fc_adv(bp); 1954 bnx2x_calc_fc_adv(bp);
1956 1955
1957 return rc; 1956 return rc;
1957 }
1958 BNX2X_ERR("Bootcode is missing -not initializing link\n");
1959 return -EINVAL;
1958} 1960}
1959 1961
1960static void bnx2x_link_set(struct bnx2x *bp) 1962static void bnx2x_link_set(struct bnx2x *bp)
1961{ 1963{
1962 bnx2x_phy_hw_lock(bp); 1964 if (!BP_NOMCP(bp)) {
1963 bnx2x_phy_init(&bp->link_params, &bp->link_vars); 1965 bnx2x_phy_hw_lock(bp);
1964 bnx2x_phy_hw_unlock(bp); 1966 bnx2x_phy_init(&bp->link_params, &bp->link_vars);
1967 bnx2x_phy_hw_unlock(bp);
1965 1968
1966 bnx2x_calc_fc_adv(bp); 1969 bnx2x_calc_fc_adv(bp);
1970 } else
1971 BNX2X_ERR("Bootcode is missing -not setting link\n");
1967} 1972}
1968 1973
1969static void bnx2x__link_reset(struct bnx2x *bp) 1974static void bnx2x__link_reset(struct bnx2x *bp)
1970{ 1975{
1971 bnx2x_phy_hw_lock(bp); 1976 if (!BP_NOMCP(bp)) {
1972 bnx2x_link_reset(&bp->link_params, &bp->link_vars); 1977 bnx2x_phy_hw_lock(bp);
1973 bnx2x_phy_hw_unlock(bp); 1978 bnx2x_link_reset(&bp->link_params, &bp->link_vars);
1979 bnx2x_phy_hw_unlock(bp);
1980 } else
1981 BNX2X_ERR("Bootcode is missing -not resetting link\n");
1974} 1982}
1975 1983
1976static u8 bnx2x_link_test(struct bnx2x *bp) 1984static u8 bnx2x_link_test(struct bnx2x *bp)
@@ -2374,7 +2382,7 @@ static int bnx2x_lock_alr(struct bnx2x *bp)
2374 msleep(5); 2382 msleep(5);
2375 } 2383 }
2376 if (!(val & (1L << 31))) { 2384 if (!(val & (1L << 31))) {
2377 BNX2X_ERR("Cannot acquire nvram interface\n"); 2385 BNX2X_ERR("Cannot acquire MCP access lock register\n");
2378 rc = -EBUSY; 2386 rc = -EBUSY;
2379 } 2387 }
2380 2388
@@ -5638,18 +5646,23 @@ static u32 bnx2x_fw_command(struct bnx2x *bp, u32 command)
5638 int func = BP_FUNC(bp); 5646 int func = BP_FUNC(bp);
5639 u32 seq = ++bp->fw_seq; 5647 u32 seq = ++bp->fw_seq;
5640 u32 rc = 0; 5648 u32 rc = 0;
5649 u32 cnt = 1;
5650 u8 delay = CHIP_REV_IS_SLOW(bp) ? 100 : 10;
5641 5651
5642 SHMEM_WR(bp, func_mb[func].drv_mb_header, (command | seq)); 5652 SHMEM_WR(bp, func_mb[func].drv_mb_header, (command | seq));
5643 DP(BNX2X_MSG_MCP, "wrote command (%x) to FW MB\n", (command | seq)); 5653 DP(BNX2X_MSG_MCP, "wrote command (%x) to FW MB\n", (command | seq));
5644 5654
5645 /* let the FW do it's magic ... */ 5655 do {
5646 msleep(100); /* TBD */ 5656 /* let the FW do it's magic ... */
5657 msleep(delay);
5658
5659 rc = SHMEM_RD(bp, func_mb[func].fw_mb_header);
5647 5660
5648 if (CHIP_REV_IS_SLOW(bp)) 5661 /* Give the FW up to 2 second (200*10ms) */
5649 msleep(900); 5662 } while ((seq != (rc & FW_MSG_SEQ_NUMBER_MASK)) && (cnt++ < 200));
5650 5663
5651 rc = SHMEM_RD(bp, func_mb[func].fw_mb_header); 5664 DP(BNX2X_MSG_MCP, "[after %d ms] read (%x) seq is (%x) from FW MB\n",
5652 DP(BNX2X_MSG_MCP, "read (%x) seq is (%x) from FW MB\n", rc, seq); 5665 cnt*delay, rc, seq);
5653 5666
5654 /* is this a reply to our command? */ 5667 /* is this a reply to our command? */
5655 if (seq == (rc & FW_MSG_SEQ_NUMBER_MASK)) { 5668 if (seq == (rc & FW_MSG_SEQ_NUMBER_MASK)) {
@@ -7337,9 +7350,6 @@ static int __devinit bnx2x_init_bp(struct bnx2x *bp)
7337 int func = BP_FUNC(bp); 7350 int func = BP_FUNC(bp);
7338 int rc; 7351 int rc;
7339 7352
7340 if (nomcp)
7341 bp->flags |= NO_MCP_FLAG;
7342
7343 mutex_init(&bp->port.phy_mutex); 7353 mutex_init(&bp->port.phy_mutex);
7344 7354
7345 INIT_WORK(&bp->sp_task, bnx2x_sp_task); 7355 INIT_WORK(&bp->sp_task, bnx2x_sp_task);