1/* bnx2.c: Broadcom NX2 network driver.
2 *
3 * Copyright (c) 2004, 2005, 2006 Broadcom Corporation
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation.
8 *
9 * Written by: Michael Chan  (mchan@broadcom.com)
10 *
11 * Etherboot port by Ryan Jackson (rjackson@lnxi.com), based on driver
12 * version 1.4.40 from linux 2.6.17
13 */
14
15FILE_LICENCE ( GPL_ANY );
16
17#include "etherboot.h"
18#include "nic.h"
19#include <errno.h>
20#include <gpxe/pci.h>
21#include <gpxe/ethernet.h>
22#include "string.h"
23#include <mii.h>
24#include "bnx2.h"
25#include "bnx2_fw.h"
26
27#if 0
28/* Dummy defines for error handling */
29#define EBUSY  1
30#define ENODEV 2
31#define EINVAL 3
32#define ENOMEM 4
33#define EIO    5
34#endif
35
36/* The bnx2 seems to be picky about the alignment of the receive buffers
37 * and possibly the status block.
38 */
39static struct bss {
40	struct tx_bd tx_desc_ring[TX_DESC_CNT];
41	struct rx_bd rx_desc_ring[RX_DESC_CNT];
42	unsigned char rx_buf[RX_BUF_CNT][RX_BUF_SIZE];
43	struct status_block status_blk;
44	struct statistics_block stats_blk;
45} bnx2_bss;
46
47static struct bnx2 bnx2;
48
49static struct flash_spec flash_table[] =
50{
51	/* Slow EEPROM */
52	{0x00000000, 0x40830380, 0x009f0081, 0xa184a053, 0xaf000400,
53	 1, SEEPROM_PAGE_BITS, SEEPROM_PAGE_SIZE,
54	 SEEPROM_BYTE_ADDR_MASK, SEEPROM_TOTAL_SIZE,
55	 "EEPROM - slow"},
56	/* Expansion entry 0001 */
57	{0x08000002, 0x4b808201, 0x00050081, 0x03840253, 0xaf020406,
58	 0, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE,
59	 SAIFUN_FLASH_BYTE_ADDR_MASK, 0,
60	 "Entry 0001"},
61	/* Saifun SA25F010 (non-buffered flash) */
62	/* strap, cfg1, & write1 need updates */
63	{0x04000001, 0x47808201, 0x00050081, 0x03840253, 0xaf020406,
64	 0, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE,
65	 SAIFUN_FLASH_BYTE_ADDR_MASK, SAIFUN_FLASH_BASE_TOTAL_SIZE*2,
66	 "Non-buffered flash (128kB)"},
67	/* Saifun SA25F020 (non-buffered flash) */
68	/* strap, cfg1, & write1 need updates */
69	{0x0c000003, 0x4f808201, 0x00050081, 0x03840253, 0xaf020406,
70	 0, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE,
71	 SAIFUN_FLASH_BYTE_ADDR_MASK, SAIFUN_FLASH_BASE_TOTAL_SIZE*4,
72	 "Non-buffered flash (256kB)"},
73	/* Expansion entry 0100 */
74	{0x11000000, 0x53808201, 0x00050081, 0x03840253, 0xaf020406,
75	 0, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE,
76	 SAIFUN_FLASH_BYTE_ADDR_MASK, 0,
77	 "Entry 0100"},
78	/* Entry 0101: ST M45PE10 (non-buffered flash, TetonII B0) */
79	{0x19000002, 0x5b808201, 0x000500db, 0x03840253, 0xaf020406,
80	 0, ST_MICRO_FLASH_PAGE_BITS, ST_MICRO_FLASH_PAGE_SIZE,
81	 ST_MICRO_FLASH_BYTE_ADDR_MASK, ST_MICRO_FLASH_BASE_TOTAL_SIZE*2,
82	 "Entry 0101: ST M45PE10 (128kB non-bufferred)"},
83	/* Entry 0110: ST M45PE20 (non-buffered flash)*/
84	{0x15000001, 0x57808201, 0x000500db, 0x03840253, 0xaf020406,
85	 0, ST_MICRO_FLASH_PAGE_BITS, ST_MICRO_FLASH_PAGE_SIZE,
86	 ST_MICRO_FLASH_BYTE_ADDR_MASK, ST_MICRO_FLASH_BASE_TOTAL_SIZE*4,
87	 "Entry 0110: ST M45PE20 (256kB non-bufferred)"},
88	/* Saifun SA25F005 (non-buffered flash) */
89	/* strap, cfg1, & write1 need updates */
90	{0x1d000003, 0x5f808201, 0x00050081, 0x03840253, 0xaf020406,
91	 0, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE,
92	 SAIFUN_FLASH_BYTE_ADDR_MASK, SAIFUN_FLASH_BASE_TOTAL_SIZE,
93	 "Non-buffered flash (64kB)"},
94	/* Fast EEPROM */
95	{0x22000000, 0x62808380, 0x009f0081, 0xa184a053, 0xaf000400,
96	 1, SEEPROM_PAGE_BITS, SEEPROM_PAGE_SIZE,
97	 SEEPROM_BYTE_ADDR_MASK, SEEPROM_TOTAL_SIZE,
98	 "EEPROM - fast"},
99	/* Expansion entry 1001 */
100	{0x2a000002, 0x6b808201, 0x00050081, 0x03840253, 0xaf020406,
101	 0, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE,
102	 SAIFUN_FLASH_BYTE_ADDR_MASK, 0,
103	 "Entry 1001"},
104	/* Expansion entry 1010 */
105	{0x26000001, 0x67808201, 0x00050081, 0x03840253, 0xaf020406,
106	 0, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE,
107	 SAIFUN_FLASH_BYTE_ADDR_MASK, 0,
108	 "Entry 1010"},
109	/* ATMEL AT45DB011B (buffered flash) */
110	{0x2e000003, 0x6e808273, 0x00570081, 0x68848353, 0xaf000400,
111	 1, BUFFERED_FLASH_PAGE_BITS, BUFFERED_FLASH_PAGE_SIZE,
112	 BUFFERED_FLASH_BYTE_ADDR_MASK, BUFFERED_FLASH_TOTAL_SIZE,
113	 "Buffered flash (128kB)"},
114	/* Expansion entry 1100 */
115	{0x33000000, 0x73808201, 0x00050081, 0x03840253, 0xaf020406,
116	 0, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE,
117	 SAIFUN_FLASH_BYTE_ADDR_MASK, 0,
118	 "Entry 1100"},
119	/* Expansion entry 1101 */
120	{0x3b000002, 0x7b808201, 0x00050081, 0x03840253, 0xaf020406,
121	 0, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE,
122	 SAIFUN_FLASH_BYTE_ADDR_MASK, 0,
123	 "Entry 1101"},
124	/* Ateml Expansion entry 1110 */
125	{0x37000001, 0x76808273, 0x00570081, 0x68848353, 0xaf000400,
126	 1, BUFFERED_FLASH_PAGE_BITS, BUFFERED_FLASH_PAGE_SIZE,
127	 BUFFERED_FLASH_BYTE_ADDR_MASK, 0,
128	 "Entry 1110 (Atmel)"},
129	/* ATMEL AT45DB021B (buffered flash) */
130	{0x3f000003, 0x7e808273, 0x00570081, 0x68848353, 0xaf000400,
131	 1, BUFFERED_FLASH_PAGE_BITS, BUFFERED_FLASH_PAGE_SIZE,
132	 BUFFERED_FLASH_BYTE_ADDR_MASK, BUFFERED_FLASH_TOTAL_SIZE*2,
133	 "Buffered flash (256kB)"},
134};
135
136static u32
137bnx2_reg_rd_ind(struct bnx2 *bp, u32 offset)
138{
139	REG_WR(bp, BNX2_PCICFG_REG_WINDOW_ADDRESS, offset);
140	return (REG_RD(bp, BNX2_PCICFG_REG_WINDOW));
141}
142
143static void
144bnx2_reg_wr_ind(struct bnx2 *bp, u32 offset, u32 val)
145{
146	REG_WR(bp, BNX2_PCICFG_REG_WINDOW_ADDRESS, offset);
147	REG_WR(bp, BNX2_PCICFG_REG_WINDOW, val);
148}
149
150static void
151bnx2_ctx_wr(struct bnx2 *bp, u32 cid_addr, u32 offset, u32 val)
152{
153	offset += cid_addr;
154	REG_WR(bp, BNX2_CTX_DATA_ADR, offset);
155	REG_WR(bp, BNX2_CTX_DATA, val);
156}
157
158static int
159bnx2_read_phy(struct bnx2 *bp, u32 reg, u32 *val)
160{
161	u32 val1;
162	int i, ret;
163
164	if (bp->phy_flags & PHY_INT_MODE_AUTO_POLLING_FLAG) {
165		val1 = REG_RD(bp, BNX2_EMAC_MDIO_MODE);
166		val1 &= ~BNX2_EMAC_MDIO_MODE_AUTO_POLL;
167
168		REG_WR(bp, BNX2_EMAC_MDIO_MODE, val1);
169		REG_RD(bp, BNX2_EMAC_MDIO_MODE);
170
171		udelay(40);
172	}
173
174	val1 = (bp->phy_addr << 21) | (reg << 16) |
175		BNX2_EMAC_MDIO_COMM_COMMAND_READ | BNX2_EMAC_MDIO_COMM_DISEXT |
176		BNX2_EMAC_MDIO_COMM_START_BUSY;
177	REG_WR(bp, BNX2_EMAC_MDIO_COMM, val1);
178
179	for (i = 0; i < 50; i++) {
180		udelay(10);
181
182		val1 = REG_RD(bp, BNX2_EMAC_MDIO_COMM);
183		if (!(val1 & BNX2_EMAC_MDIO_COMM_START_BUSY)) {
184			udelay(5);
185
186			val1 = REG_RD(bp, BNX2_EMAC_MDIO_COMM);
187			val1 &= BNX2_EMAC_MDIO_COMM_DATA;
188
189			break;
190		}
191	}
192
193	if (val1 & BNX2_EMAC_MDIO_COMM_START_BUSY) {
194		*val = 0x0;
195		ret = -EBUSY;
196	}
197	else {
198		*val = val1;
199		ret = 0;
200	}
201
202	if (bp->phy_flags & PHY_INT_MODE_AUTO_POLLING_FLAG) {
203		val1 = REG_RD(bp, BNX2_EMAC_MDIO_MODE);
204		val1 |= BNX2_EMAC_MDIO_MODE_AUTO_POLL;
205
206		REG_WR(bp, BNX2_EMAC_MDIO_MODE, val1);
207		REG_RD(bp, BNX2_EMAC_MDIO_MODE);
208
209		udelay(40);
210	}
211
212	return ret;
213}
214
215static int
216bnx2_write_phy(struct bnx2 *bp, u32 reg, u32 val)
217{
218	u32 val1;
219	int i, ret;
220
221	if (bp->phy_flags & PHY_INT_MODE_AUTO_POLLING_FLAG) {
222		val1 = REG_RD(bp, BNX2_EMAC_MDIO_MODE);
223		val1 &= ~BNX2_EMAC_MDIO_MODE_AUTO_POLL;
224
225		REG_WR(bp, BNX2_EMAC_MDIO_MODE, val1);
226		REG_RD(bp, BNX2_EMAC_MDIO_MODE);
227
228		udelay(40);
229	}
230
231	val1 = (bp->phy_addr << 21) | (reg << 16) | val |
232		BNX2_EMAC_MDIO_COMM_COMMAND_WRITE |
233		BNX2_EMAC_MDIO_COMM_START_BUSY | BNX2_EMAC_MDIO_COMM_DISEXT;
234	REG_WR(bp, BNX2_EMAC_MDIO_COMM, val1);
235
236	for (i = 0; i < 50; i++) {
237		udelay(10);
238
239		val1 = REG_RD(bp, BNX2_EMAC_MDIO_COMM);
240		if (!(val1 & BNX2_EMAC_MDIO_COMM_START_BUSY)) {
241			udelay(5);
242			break;
243		}
244	}
245
246	if (val1 & BNX2_EMAC_MDIO_COMM_START_BUSY)
247        	ret = -EBUSY;
248	else
249		ret = 0;
250
251	if (bp->phy_flags & PHY_INT_MODE_AUTO_POLLING_FLAG) {
252		val1 = REG_RD(bp, BNX2_EMAC_MDIO_MODE);
253		val1 |= BNX2_EMAC_MDIO_MODE_AUTO_POLL;
254
255		REG_WR(bp, BNX2_EMAC_MDIO_MODE, val1);
256		REG_RD(bp, BNX2_EMAC_MDIO_MODE);
257
258		udelay(40);
259	}
260
261	return ret;
262}
263
264static void
265bnx2_disable_int(struct bnx2 *bp)
266{
267	REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD,
268	       BNX2_PCICFG_INT_ACK_CMD_MASK_INT);
269	REG_RD(bp, BNX2_PCICFG_INT_ACK_CMD);
270
271}
272
273static int
274bnx2_alloc_mem(struct bnx2 *bp)
275{
276	bp->tx_desc_ring = bnx2_bss.tx_desc_ring;
277	bp->tx_desc_mapping = virt_to_bus(bp->tx_desc_ring);
278
279	bp->rx_desc_ring = bnx2_bss.rx_desc_ring;
280	memset(bp->rx_desc_ring, 0, sizeof(struct rx_bd) * RX_DESC_CNT);
281	bp->rx_desc_mapping = virt_to_bus(bp->rx_desc_ring);
282
283	memset(&bnx2_bss.status_blk, 0, sizeof(struct status_block));
284	bp->status_blk = &bnx2_bss.status_blk;
285	bp->status_blk_mapping = virt_to_bus(&bnx2_bss.status_blk);
286
287	bp->stats_blk = &bnx2_bss.stats_blk;
288	memset(&bnx2_bss.stats_blk, 0, sizeof(struct statistics_block));
289	bp->stats_blk_mapping = virt_to_bus(&bnx2_bss.stats_blk);
290
291	return 0;
292}
293
294static void
295bnx2_report_fw_link(struct bnx2 *bp)
296{
297	u32 fw_link_status = 0;
298
299	if (bp->link_up) {
300		u32 bmsr;
301
302		switch (bp->line_speed) {
303		case SPEED_10:
304			if (bp->duplex == DUPLEX_HALF)
305				fw_link_status = BNX2_LINK_STATUS_10HALF;
306			else
307				fw_link_status = BNX2_LINK_STATUS_10FULL;
308			break;
309		case SPEED_100:
310			if (bp->duplex == DUPLEX_HALF)
311				fw_link_status = BNX2_LINK_STATUS_100HALF;
312			else
313				fw_link_status = BNX2_LINK_STATUS_100FULL;
314			break;
315		case SPEED_1000:
316			if (bp->duplex == DUPLEX_HALF)
317				fw_link_status = BNX2_LINK_STATUS_1000HALF;
318			else
319				fw_link_status = BNX2_LINK_STATUS_1000FULL;
320			break;
321		case SPEED_2500:
322			if (bp->duplex == DUPLEX_HALF)
323				fw_link_status = BNX2_LINK_STATUS_2500HALF;
324			else
325				fw_link_status = BNX2_LINK_STATUS_2500FULL;
326			break;
327		}
328
329		fw_link_status |= BNX2_LINK_STATUS_LINK_UP;
330
331		if (bp->autoneg) {
332			fw_link_status |= BNX2_LINK_STATUS_AN_ENABLED;
333
334			bnx2_read_phy(bp, MII_BMSR, &bmsr);
335			bnx2_read_phy(bp, MII_BMSR, &bmsr);
336
337			if (!(bmsr & BMSR_ANEGCOMPLETE) ||
338			    bp->phy_flags & PHY_PARALLEL_DETECT_FLAG)
339				fw_link_status |= BNX2_LINK_STATUS_PARALLEL_DET;
340			else
341				fw_link_status |= BNX2_LINK_STATUS_AN_COMPLETE;
342		}
343	}
344	else
345		fw_link_status = BNX2_LINK_STATUS_LINK_DOWN;
346
347	REG_WR_IND(bp, bp->shmem_base + BNX2_LINK_STATUS, fw_link_status);
348}
349
350static void
351bnx2_report_link(struct bnx2 *bp)
352{
353	if (bp->link_up) {
354		printf("NIC Link is Up, ");
355
356		printf("%d Mbps ", bp->line_speed);
357
358		if (bp->duplex == DUPLEX_FULL)
359			printf("full duplex");
360		else
361			printf("half duplex");
362
363		if (bp->flow_ctrl) {
364			if (bp->flow_ctrl & FLOW_CTRL_RX) {
365				printf(", receive ");
366				if (bp->flow_ctrl & FLOW_CTRL_TX)
367					printf("& transmit ");
368			}
369			else {
370				printf(", transmit ");
371			}
372			printf("flow control ON");
373		}
374		printf("\n");
375	}
376	else {
377		printf("NIC Link is Down\n");
378	}
379
380	bnx2_report_fw_link(bp);
381}
382
383static void
384bnx2_resolve_flow_ctrl(struct bnx2 *bp)
385{
386	u32 local_adv, remote_adv;
387
388	bp->flow_ctrl = 0;
389	if ((bp->autoneg & (AUTONEG_SPEED | AUTONEG_FLOW_CTRL)) !=
390		(AUTONEG_SPEED | AUTONEG_FLOW_CTRL)) {
391
392		if (bp->duplex == DUPLEX_FULL) {
393			bp->flow_ctrl = bp->req_flow_ctrl;
394		}
395		return;
396	}
397
398	if (bp->duplex != DUPLEX_FULL) {
399		return;
400	}
401
402	if ((bp->phy_flags & PHY_SERDES_FLAG) &&
403	    (CHIP_NUM(bp) == CHIP_NUM_5708)) {
404		u32 val;
405
406		bnx2_read_phy(bp, BCM5708S_1000X_STAT1, &val);
407		if (val & BCM5708S_1000X_STAT1_TX_PAUSE)
408			bp->flow_ctrl |= FLOW_CTRL_TX;
409		if (val & BCM5708S_1000X_STAT1_RX_PAUSE)
410			bp->flow_ctrl |= FLOW_CTRL_RX;
411		return;
412	}
413
414	bnx2_read_phy(bp, MII_ADVERTISE, &local_adv);
415	bnx2_read_phy(bp, MII_LPA, &remote_adv);
416
417	if (bp->phy_flags & PHY_SERDES_FLAG) {
418		u32 new_local_adv = 0;
419		u32 new_remote_adv = 0;
420
421		if (local_adv & ADVERTISE_1000XPAUSE)
422			new_local_adv |= ADVERTISE_PAUSE_CAP;
423		if (local_adv & ADVERTISE_1000XPSE_ASYM)
424			new_local_adv |= ADVERTISE_PAUSE_ASYM;
425		if (remote_adv & ADVERTISE_1000XPAUSE)
426			new_remote_adv |= ADVERTISE_PAUSE_CAP;
427		if (remote_adv & ADVERTISE_1000XPSE_ASYM)
428			new_remote_adv |= ADVERTISE_PAUSE_ASYM;
429
430		local_adv = new_local_adv;
431		remote_adv = new_remote_adv;
432	}
433
434	/* See Table 28B-3 of 802.3ab-1999 spec. */
435	if (local_adv & ADVERTISE_PAUSE_CAP) {
436		if(local_adv & ADVERTISE_PAUSE_ASYM) {
437	                if (remote_adv & ADVERTISE_PAUSE_CAP) {
438				bp->flow_ctrl = FLOW_CTRL_TX | FLOW_CTRL_RX;
439			}
440			else if (remote_adv & ADVERTISE_PAUSE_ASYM) {
441				bp->flow_ctrl = FLOW_CTRL_RX;
442			}
443		}
444		else {
445			if (remote_adv & ADVERTISE_PAUSE_CAP) {
446				bp->flow_ctrl = FLOW_CTRL_TX | FLOW_CTRL_RX;
447			}
448		}
449	}
450	else if (local_adv & ADVERTISE_PAUSE_ASYM) {
451		if ((remote_adv & ADVERTISE_PAUSE_CAP) &&
452			(remote_adv & ADVERTISE_PAUSE_ASYM)) {
453
454			bp->flow_ctrl = FLOW_CTRL_TX;
455		}
456	}
457}
458
459static int
460bnx2_5708s_linkup(struct bnx2 *bp)
461{
462	u32 val;
463
464	bp->link_up = 1;
465	bnx2_read_phy(bp, BCM5708S_1000X_STAT1, &val);
466	switch (val & BCM5708S_1000X_STAT1_SPEED_MASK) {
467		case BCM5708S_1000X_STAT1_SPEED_10:
468			bp->line_speed = SPEED_10;
469			break;
470		case BCM5708S_1000X_STAT1_SPEED_100:
471			bp->line_speed = SPEED_100;
472			break;
473		case BCM5708S_1000X_STAT1_SPEED_1G:
474			bp->line_speed = SPEED_1000;
475			break;
476		case BCM5708S_1000X_STAT1_SPEED_2G5:
477			bp->line_speed = SPEED_2500;
478			break;
479	}
480	if (val & BCM5708S_1000X_STAT1_FD)
481		bp->duplex = DUPLEX_FULL;
482	else
483		bp->duplex = DUPLEX_HALF;
484
485	return 0;
486}
487
488static int
489bnx2_5706s_linkup(struct bnx2 *bp)
490{
491	u32 bmcr, local_adv, remote_adv, common;
492
493	bp->link_up = 1;
494	bp->line_speed = SPEED_1000;
495
496	bnx2_read_phy(bp, MII_BMCR, &bmcr);
497	if (bmcr & BMCR_FULLDPLX) {
498		bp->duplex = DUPLEX_FULL;
499	}
500	else {
501		bp->duplex = DUPLEX_HALF;
502	}
503
504	if (!(bmcr & BMCR_ANENABLE)) {
505		return 0;
506	}
507
508	bnx2_read_phy(bp, MII_ADVERTISE, &local_adv);
509	bnx2_read_phy(bp, MII_LPA, &remote_adv);
510
511	common = local_adv & remote_adv;
512	if (common & (ADVERTISE_1000XHALF | ADVERTISE_1000XFULL)) {
513
514		if (common & ADVERTISE_1000XFULL) {
515			bp->duplex = DUPLEX_FULL;
516		}
517		else {
518			bp->duplex = DUPLEX_HALF;
519		}
520	}
521
522	return 0;
523}
524
525static int
526bnx2_copper_linkup(struct bnx2 *bp)
527{
528	u32 bmcr;
529
530	bnx2_read_phy(bp, MII_BMCR, &bmcr);
531	if (bmcr & BMCR_ANENABLE) {
532		u32 local_adv, remote_adv, common;
533
534		bnx2_read_phy(bp, MII_CTRL1000, &local_adv);
535		bnx2_read_phy(bp, MII_STAT1000, &remote_adv);
536
537		common = local_adv & (remote_adv >> 2);
538		if (common & ADVERTISE_1000FULL) {
539			bp->line_speed = SPEED_1000;
540			bp->duplex = DUPLEX_FULL;
541		}
542		else if (common & ADVERTISE_1000HALF) {
543			bp->line_speed = SPEED_1000;
544			bp->duplex = DUPLEX_HALF;
545		}
546		else {
547			bnx2_read_phy(bp, MII_ADVERTISE, &local_adv);
548			bnx2_read_phy(bp, MII_LPA, &remote_adv);
549
550			common = local_adv & remote_adv;
551			if (common & ADVERTISE_100FULL) {
552				bp->line_speed = SPEED_100;
553				bp->duplex = DUPLEX_FULL;
554			}
555			else if (common & ADVERTISE_100HALF) {
556				bp->line_speed = SPEED_100;
557				bp->duplex = DUPLEX_HALF;
558			}
559			else if (common & ADVERTISE_10FULL) {
560				bp->line_speed = SPEED_10;
561				bp->duplex = DUPLEX_FULL;
562			}
563			else if (common & ADVERTISE_10HALF) {
564				bp->line_speed = SPEED_10;
565				bp->duplex = DUPLEX_HALF;
566			}
567			else {
568				bp->line_speed = 0;
569				bp->link_up = 0;
570			}
571		}
572	}
573	else {
574		if (bmcr & BMCR_SPEED100) {
575			bp->line_speed = SPEED_100;
576		}
577		else {
578			bp->line_speed = SPEED_10;
579		}
580		if (bmcr & BMCR_FULLDPLX) {
581			bp->duplex = DUPLEX_FULL;
582		}
583		else {
584			bp->duplex = DUPLEX_HALF;
585		}
586	}
587
588	return 0;
589}
590
591static int
592bnx2_set_mac_link(struct bnx2 *bp)
593{
594	u32 val;
595
596	REG_WR(bp, BNX2_EMAC_TX_LENGTHS, 0x2620);
597	if (bp->link_up && (bp->line_speed == SPEED_1000) &&
598		(bp->duplex == DUPLEX_HALF)) {
599		REG_WR(bp, BNX2_EMAC_TX_LENGTHS, 0x26ff);
600	}
601
602	/* Configure the EMAC mode register. */
603	val = REG_RD(bp, BNX2_EMAC_MODE);
604
605	val &= ~(BNX2_EMAC_MODE_PORT | BNX2_EMAC_MODE_HALF_DUPLEX |
606		BNX2_EMAC_MODE_MAC_LOOP | BNX2_EMAC_MODE_FORCE_LINK |
607		BNX2_EMAC_MODE_25G);
608
609	if (bp->link_up) {
610		switch (bp->line_speed) {
611			case SPEED_10:
612				if (CHIP_NUM(bp) == CHIP_NUM_5708) {
613					val |= BNX2_EMAC_MODE_PORT_MII_10;
614					break;
615				}
616				/* fall through */
617			case SPEED_100:
618				val |= BNX2_EMAC_MODE_PORT_MII;
619				break;
620			case SPEED_2500:
621				val |= BNX2_EMAC_MODE_25G;
622				/* fall through */
623			case SPEED_1000:
624				val |= BNX2_EMAC_MODE_PORT_GMII;
625				break;
626		}
627	}
628	else {
629		val |= BNX2_EMAC_MODE_PORT_GMII;
630	}
631
632	/* Set the MAC to operate in the appropriate duplex mode. */
633	if (bp->duplex == DUPLEX_HALF)
634		val |= BNX2_EMAC_MODE_HALF_DUPLEX;
635	REG_WR(bp, BNX2_EMAC_MODE, val);
636
637	/* Enable/disable rx PAUSE. */
638	bp->rx_mode &= ~BNX2_EMAC_RX_MODE_FLOW_EN;
639
640	if (bp->flow_ctrl & FLOW_CTRL_RX)
641		bp->rx_mode |= BNX2_EMAC_RX_MODE_FLOW_EN;
642	REG_WR(bp, BNX2_EMAC_RX_MODE, bp->rx_mode);
643
644	/* Enable/disable tx PAUSE. */
645	val = REG_RD(bp, BNX2_EMAC_TX_MODE);
646	val &= ~BNX2_EMAC_TX_MODE_FLOW_EN;
647
648	if (bp->flow_ctrl & FLOW_CTRL_TX)
649		val |= BNX2_EMAC_TX_MODE_FLOW_EN;
650	REG_WR(bp, BNX2_EMAC_TX_MODE, val);
651
652	/* Acknowledge the interrupt. */
653	REG_WR(bp, BNX2_EMAC_STATUS, BNX2_EMAC_STATUS_LINK_CHANGE);
654
655	return 0;
656}
657
658static int
659bnx2_set_link(struct bnx2 *bp)
660{
661	u32 bmsr;
662	u8 link_up;
663
664	if (bp->loopback == MAC_LOOPBACK) {
665		bp->link_up = 1;
666		return 0;
667	}
668
669	link_up = bp->link_up;
670
671	bnx2_read_phy(bp, MII_BMSR, &bmsr);
672	bnx2_read_phy(bp, MII_BMSR, &bmsr);
673
674	if ((bp->phy_flags & PHY_SERDES_FLAG) &&
675	    (CHIP_NUM(bp) == CHIP_NUM_5706)) {
676		u32 val;
677
678		val = REG_RD(bp, BNX2_EMAC_STATUS);
679		if (val & BNX2_EMAC_STATUS_LINK)
680			bmsr |= BMSR_LSTATUS;
681		else
682			bmsr &= ~BMSR_LSTATUS;
683	}
684
685	if (bmsr & BMSR_LSTATUS) {
686		bp->link_up = 1;
687
688		if (bp->phy_flags & PHY_SERDES_FLAG) {
689			if (CHIP_NUM(bp) == CHIP_NUM_5706)
690				bnx2_5706s_linkup(bp);
691			else if (CHIP_NUM(bp) == CHIP_NUM_5708)
692				bnx2_5708s_linkup(bp);
693		}
694		else {
695			bnx2_copper_linkup(bp);
696		}
697		bnx2_resolve_flow_ctrl(bp);
698	}
699	else {
700		if ((bp->phy_flags & PHY_SERDES_FLAG) &&
701			(bp->autoneg & AUTONEG_SPEED)) {
702
703			u32 bmcr;
704
705			bnx2_read_phy(bp, MII_BMCR, &bmcr);
706			if (!(bmcr & BMCR_ANENABLE)) {
707				bnx2_write_phy(bp, MII_BMCR, bmcr |
708					BMCR_ANENABLE);
709			}
710		}
711		bp->phy_flags &= ~PHY_PARALLEL_DETECT_FLAG;
712		bp->link_up = 0;
713	}
714
715	if (bp->link_up != link_up) {
716		bnx2_report_link(bp);
717	}
718
719	bnx2_set_mac_link(bp);
720
721	return 0;
722}
723
724static int
725bnx2_reset_phy(struct bnx2 *bp)
726{
727	int i;
728	u32 reg;
729
730        bnx2_write_phy(bp, MII_BMCR, BMCR_RESET);
731
732#define PHY_RESET_MAX_WAIT 100
733	for (i = 0; i < PHY_RESET_MAX_WAIT; i++) {
734		udelay(10);
735
736		bnx2_read_phy(bp, MII_BMCR, &reg);
737		if (!(reg & BMCR_RESET)) {
738			udelay(20);
739			break;
740		}
741	}
742	if (i == PHY_RESET_MAX_WAIT) {
743		return -EBUSY;
744	}
745	return 0;
746}
747
748static u32
749bnx2_phy_get_pause_adv(struct bnx2 *bp)
750{
751	u32 adv = 0;
752
753	if ((bp->req_flow_ctrl & (FLOW_CTRL_RX | FLOW_CTRL_TX)) ==
754		(FLOW_CTRL_RX | FLOW_CTRL_TX)) {
755
756		if (bp->phy_flags & PHY_SERDES_FLAG) {
757			adv = ADVERTISE_1000XPAUSE;
758		}
759		else {
760			adv = ADVERTISE_PAUSE_CAP;
761		}
762	}
763	else if (bp->req_flow_ctrl & FLOW_CTRL_TX) {
764		if (bp->phy_flags & PHY_SERDES_FLAG) {
765			adv = ADVERTISE_1000XPSE_ASYM;
766		}
767		else {
768			adv = ADVERTISE_PAUSE_ASYM;
769		}
770	}
771	else if (bp->req_flow_ctrl & FLOW_CTRL_RX) {
772		if (bp->phy_flags & PHY_SERDES_FLAG) {
773			adv = ADVERTISE_1000XPAUSE | ADVERTISE_1000XPSE_ASYM;
774		}
775		else {
776			adv = ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM;
777		}
778	}
779	return adv;
780}
781
782static int
783bnx2_setup_serdes_phy(struct bnx2 *bp)
784{
785	u32 adv, bmcr, up1;
786	u32 new_adv = 0;
787
788	if (!(bp->autoneg & AUTONEG_SPEED)) {
789		u32 new_bmcr;
790		int force_link_down = 0;
791
792		if (CHIP_NUM(bp) == CHIP_NUM_5708) {
793			bnx2_read_phy(bp, BCM5708S_UP1, &up1);
794			if (up1 & BCM5708S_UP1_2G5) {
795				up1 &= ~BCM5708S_UP1_2G5;
796				bnx2_write_phy(bp, BCM5708S_UP1, up1);
797				force_link_down = 1;
798			}
799		}
800
801		bnx2_read_phy(bp, MII_ADVERTISE, &adv);
802		adv &= ~(ADVERTISE_1000XFULL | ADVERTISE_1000XHALF);
803
804		bnx2_read_phy(bp, MII_BMCR, &bmcr);
805		new_bmcr = bmcr & ~BMCR_ANENABLE;
806		new_bmcr |= BMCR_SPEED1000;
807		if (bp->req_duplex == DUPLEX_FULL) {
808			adv |= ADVERTISE_1000XFULL;
809			new_bmcr |= BMCR_FULLDPLX;
810		}
811		else {
812			adv |= ADVERTISE_1000XHALF;
813			new_bmcr &= ~BMCR_FULLDPLX;
814		}
815		if ((new_bmcr != bmcr) || (force_link_down)) {
816			/* Force a link down visible on the other side */
817			if (bp->link_up) {
818				bnx2_write_phy(bp, MII_ADVERTISE, adv &
819					       ~(ADVERTISE_1000XFULL |
820						 ADVERTISE_1000XHALF));
821				bnx2_write_phy(bp, MII_BMCR, bmcr |
822					BMCR_ANRESTART | BMCR_ANENABLE);
823
824				bp->link_up = 0;
825				bnx2_write_phy(bp, MII_BMCR, new_bmcr);
826			}
827			bnx2_write_phy(bp, MII_ADVERTISE, adv);
828			bnx2_write_phy(bp, MII_BMCR, new_bmcr);
829		}
830		return 0;
831	}
832
833	if (bp->phy_flags & PHY_2_5G_CAPABLE_FLAG) {
834		bnx2_read_phy(bp, BCM5708S_UP1, &up1);
835		up1 |= BCM5708S_UP1_2G5;
836		bnx2_write_phy(bp, BCM5708S_UP1, up1);
837	}
838
839	if (bp->advertising & ADVERTISED_1000baseT_Full)
840		new_adv |= ADVERTISE_1000XFULL;
841
842	new_adv |= bnx2_phy_get_pause_adv(bp);
843
844	bnx2_read_phy(bp, MII_ADVERTISE, &adv);
845	bnx2_read_phy(bp, MII_BMCR, &bmcr);
846
847	bp->serdes_an_pending = 0;
848	if ((adv != new_adv) || ((bmcr & BMCR_ANENABLE) == 0)) {
849		/* Force a link down visible on the other side */
850		if (bp->link_up) {
851			int i;
852
853			bnx2_write_phy(bp, MII_BMCR, BMCR_LOOPBACK);
854			for (i = 0; i < 110; i++) {
855				udelay(100);
856			}
857		}
858
859		bnx2_write_phy(bp, MII_ADVERTISE, new_adv);
860		bnx2_write_phy(bp, MII_BMCR, bmcr | BMCR_ANRESTART |
861			BMCR_ANENABLE);
862#if 0
863		if (CHIP_NUM(bp) == CHIP_NUM_5706) {
864			/* Speed up link-up time when the link partner
865			 * does not autonegotiate which is very common
866			 * in blade servers. Some blade servers use
867			 * IPMI for kerboard input and it's important
868			 * to minimize link disruptions. Autoneg. involves
869			 * exchanging base pages plus 3 next pages and
870			 * normally completes in about 120 msec.
871			 */
872			bp->current_interval = SERDES_AN_TIMEOUT;
873			bp->serdes_an_pending = 1;
874			mod_timer(&bp->timer, jiffies + bp->current_interval);
875		}
876#endif
877	}
878
879	return 0;
880}
881
882#define ETHTOOL_ALL_FIBRE_SPEED						\
883	(ADVERTISED_1000baseT_Full)
884
885#define ETHTOOL_ALL_COPPER_SPEED					\
886	(ADVERTISED_10baseT_Half | ADVERTISED_10baseT_Full |		\
887	ADVERTISED_100baseT_Half | ADVERTISED_100baseT_Full |		\
888	ADVERTISED_1000baseT_Full)
889
890#define PHY_ALL_10_100_SPEED (ADVERTISE_10HALF | ADVERTISE_10FULL | \
891	ADVERTISE_100HALF | ADVERTISE_100FULL | ADVERTISE_CSMA)
892
893#define PHY_ALL_1000_SPEED (ADVERTISE_1000HALF | ADVERTISE_1000FULL)
894
895static int
896bnx2_setup_copper_phy(struct bnx2 *bp)
897{
898	u32 bmcr;
899	u32 new_bmcr;
900
901	bnx2_read_phy(bp, MII_BMCR, &bmcr);
902
903	if (bp->autoneg & AUTONEG_SPEED) {
904		u32 adv_reg, adv1000_reg;
905		u32 new_adv_reg = 0;
906		u32 new_adv1000_reg = 0;
907
908		bnx2_read_phy(bp, MII_ADVERTISE, &adv_reg);
909		adv_reg &= (PHY_ALL_10_100_SPEED | ADVERTISE_PAUSE_CAP |
910			ADVERTISE_PAUSE_ASYM);
911
912		bnx2_read_phy(bp, MII_CTRL1000, &adv1000_reg);
913		adv1000_reg &= PHY_ALL_1000_SPEED;
914
915		if (bp->advertising & ADVERTISED_10baseT_Half)
916			new_adv_reg |= ADVERTISE_10HALF;
917		if (bp->advertising & ADVERTISED_10baseT_Full)
918			new_adv_reg |= ADVERTISE_10FULL;
919		if (bp->advertising & ADVERTISED_100baseT_Half)
920			new_adv_reg |= ADVERTISE_100HALF;
921		if (bp->advertising & ADVERTISED_100baseT_Full)
922			new_adv_reg |= ADVERTISE_100FULL;
923		if (bp->advertising & ADVERTISED_1000baseT_Full)
924			new_adv1000_reg |= ADVERTISE_1000FULL;
925
926		new_adv_reg |= ADVERTISE_CSMA;
927
928		new_adv_reg |= bnx2_phy_get_pause_adv(bp);
929
930		if ((adv1000_reg != new_adv1000_reg) ||
931			(adv_reg != new_adv_reg) ||
932			((bmcr & BMCR_ANENABLE) == 0)) {
933
934			bnx2_write_phy(bp, MII_ADVERTISE, new_adv_reg);
935			bnx2_write_phy(bp, MII_CTRL1000, new_adv1000_reg);
936			bnx2_write_phy(bp, MII_BMCR, BMCR_ANRESTART |
937				BMCR_ANENABLE);
938		}
939		else if (bp->link_up) {
940			/* Flow ctrl may have changed from auto to forced */
941			/* or vice-versa. */
942
943			bnx2_resolve_flow_ctrl(bp);
944			bnx2_set_mac_link(bp);
945		}
946		return 0;
947	}
948
949	new_bmcr = 0;
950	if (bp->req_line_speed == SPEED_100) {
951		new_bmcr |= BMCR_SPEED100;
952	}
953	if (bp->req_duplex == DUPLEX_FULL) {
954		new_bmcr |= BMCR_FULLDPLX;
955	}
956	if (new_bmcr != bmcr) {
957		u32 bmsr;
958		int i = 0;
959
960		bnx2_read_phy(bp, MII_BMSR, &bmsr);
961		bnx2_read_phy(bp, MII_BMSR, &bmsr);
962
963		if (bmsr & BMSR_LSTATUS) {
964			/* Force link down */
965			bnx2_write_phy(bp, MII_BMCR, BMCR_LOOPBACK);
966			do {
967				udelay(100);
968				bnx2_read_phy(bp, MII_BMSR, &bmsr);
969				bnx2_read_phy(bp, MII_BMSR, &bmsr);
970				i++;
971			} while ((bmsr & BMSR_LSTATUS) && (i < 620));
972		}
973
974		bnx2_write_phy(bp, MII_BMCR, new_bmcr);
975
976		/* Normally, the new speed is setup after the link has
977		 * gone down and up again. In some cases, link will not go
978		 * down so we need to set up the new speed here.
979		 */
980		if (bmsr & BMSR_LSTATUS) {
981			bp->line_speed = bp->req_line_speed;
982			bp->duplex = bp->req_duplex;
983			bnx2_resolve_flow_ctrl(bp);
984			bnx2_set_mac_link(bp);
985		}
986	}
987	return 0;
988}
989
990static int
991bnx2_setup_phy(struct bnx2 *bp)
992{
993	if (bp->loopback == MAC_LOOPBACK)
994		return 0;
995
996	if (bp->phy_flags & PHY_SERDES_FLAG) {
997		return (bnx2_setup_serdes_phy(bp));
998	}
999	else {
1000		return (bnx2_setup_copper_phy(bp));
1001	}
1002}
1003
1004static int
1005bnx2_init_5708s_phy(struct bnx2 *bp)
1006{
1007	u32 val;
1008
1009	bnx2_write_phy(bp, BCM5708S_BLK_ADDR, BCM5708S_BLK_ADDR_DIG3);
1010	bnx2_write_phy(bp, BCM5708S_DIG_3_0, BCM5708S_DIG_3_0_USE_IEEE);
1011	bnx2_write_phy(bp, BCM5708S_BLK_ADDR, BCM5708S_BLK_ADDR_DIG);
1012
1013	bnx2_read_phy(bp, BCM5708S_1000X_CTL1, &val);
1014	val |= BCM5708S_1000X_CTL1_FIBER_MODE | BCM5708S_1000X_CTL1_AUTODET_EN;
1015	bnx2_write_phy(bp, BCM5708S_1000X_CTL1, val);
1016
1017	bnx2_read_phy(bp, BCM5708S_1000X_CTL2, &val);
1018	val |= BCM5708S_1000X_CTL2_PLLEL_DET_EN;
1019	bnx2_write_phy(bp, BCM5708S_1000X_CTL2, val);
1020
1021	if (bp->phy_flags & PHY_2_5G_CAPABLE_FLAG) {
1022		bnx2_read_phy(bp, BCM5708S_UP1, &val);
1023		val |= BCM5708S_UP1_2G5;
1024		bnx2_write_phy(bp, BCM5708S_UP1, val);
1025	}
1026
1027	if ((CHIP_ID(bp) == CHIP_ID_5708_A0) ||
1028	    (CHIP_ID(bp) == CHIP_ID_5708_B0) ||
1029	    (CHIP_ID(bp) == CHIP_ID_5708_B1)) {
1030		/* increase tx signal amplitude */
1031		bnx2_write_phy(bp, BCM5708S_BLK_ADDR,
1032			       BCM5708S_BLK_ADDR_TX_MISC);
1033		bnx2_read_phy(bp, BCM5708S_TX_ACTL1, &val);
1034		val &= ~BCM5708S_TX_ACTL1_DRIVER_VCM;
1035		bnx2_write_phy(bp, BCM5708S_TX_ACTL1, val);
1036		bnx2_write_phy(bp, BCM5708S_BLK_ADDR, BCM5708S_BLK_ADDR_DIG);
1037	}
1038
1039	val = REG_RD_IND(bp, bp->shmem_base + BNX2_PORT_HW_CFG_CONFIG) &
1040	      BNX2_PORT_HW_CFG_CFG_TXCTL3_MASK;
1041
1042	if (val) {
1043		u32 is_backplane;
1044
1045		is_backplane = REG_RD_IND(bp, bp->shmem_base +
1046					  BNX2_SHARED_HW_CFG_CONFIG);
1047		if (is_backplane & BNX2_SHARED_HW_CFG_PHY_BACKPLANE) {
1048			bnx2_write_phy(bp, BCM5708S_BLK_ADDR,
1049				       BCM5708S_BLK_ADDR_TX_MISC);
1050			bnx2_write_phy(bp, BCM5708S_TX_ACTL3, val);
1051			bnx2_write_phy(bp, BCM5708S_BLK_ADDR,
1052				       BCM5708S_BLK_ADDR_DIG);
1053		}
1054	}
1055	return 0;
1056}
1057
1058static int
1059bnx2_init_5706s_phy(struct bnx2 *bp)
1060{
1061	u32 val;
1062
1063	bp->phy_flags &= ~PHY_PARALLEL_DETECT_FLAG;
1064
1065	if (CHIP_NUM(bp) == CHIP_NUM_5706) {
1066        	REG_WR(bp, BNX2_MISC_UNUSED0, 0x300);
1067	}
1068
1069
1070	bnx2_write_phy(bp, 0x18, 0x7);
1071	bnx2_read_phy(bp, 0x18, &val);
1072	bnx2_write_phy(bp, 0x18, val & ~0x4007);
1073
1074	bnx2_write_phy(bp, 0x1c, 0x6c00);
1075	bnx2_read_phy(bp, 0x1c, &val);
1076	bnx2_write_phy(bp, 0x1c, (val & 0x3fd) | 0xec00);
1077
1078	return 0;
1079}
1080
1081static int
1082bnx2_init_copper_phy(struct bnx2 *bp)
1083{
1084	u32 val;
1085
1086	bp->phy_flags |= PHY_CRC_FIX_FLAG;
1087
1088	if (bp->phy_flags & PHY_CRC_FIX_FLAG) {
1089		bnx2_write_phy(bp, 0x18, 0x0c00);
1090		bnx2_write_phy(bp, 0x17, 0x000a);
1091		bnx2_write_phy(bp, 0x15, 0x310b);
1092		bnx2_write_phy(bp, 0x17, 0x201f);
1093		bnx2_write_phy(bp, 0x15, 0x9506);
1094		bnx2_write_phy(bp, 0x17, 0x401f);
1095		bnx2_write_phy(bp, 0x15, 0x14e2);
1096		bnx2_write_phy(bp, 0x18, 0x0400);
1097	}
1098
1099	bnx2_write_phy(bp, 0x18, 0x7);
1100	bnx2_read_phy(bp, 0x18, &val);
1101	bnx2_write_phy(bp, 0x18, val & ~0x4007);
1102
1103	bnx2_read_phy(bp, 0x10, &val);
1104	bnx2_write_phy(bp, 0x10, val & ~0x1);
1105
1106	/* ethernet@wirespeed */
1107	bnx2_write_phy(bp, 0x18, 0x7007);
1108	bnx2_read_phy(bp, 0x18, &val);
1109	bnx2_write_phy(bp, 0x18, val | (1 << 15) | (1 << 4));
1110	return 0;
1111}
1112
1113static int
1114bnx2_init_phy(struct bnx2 *bp)
1115{
1116	u32 val;
1117	int rc = 0;
1118
1119	bp->phy_flags &= ~PHY_INT_MODE_MASK_FLAG;
1120	bp->phy_flags |= PHY_INT_MODE_LINK_READY_FLAG;
1121
1122        REG_WR(bp, BNX2_EMAC_ATTENTION_ENA, BNX2_EMAC_ATTENTION_ENA_LINK);
1123
1124	bnx2_reset_phy(bp);
1125
1126	bnx2_read_phy(bp, MII_PHYSID1, &val);
1127	bp->phy_id = val << 16;
1128	bnx2_read_phy(bp, MII_PHYSID2, &val);
1129	bp->phy_id |= val & 0xffff;
1130
1131	if (bp->phy_flags & PHY_SERDES_FLAG) {
1132		if (CHIP_NUM(bp) == CHIP_NUM_5706)
1133			rc = bnx2_init_5706s_phy(bp);
1134		else if (CHIP_NUM(bp) == CHIP_NUM_5708)
1135			rc = bnx2_init_5708s_phy(bp);
1136	}
1137	else {
1138		rc = bnx2_init_copper_phy(bp);
1139	}
1140
1141	bnx2_setup_phy(bp);
1142
1143	return rc;
1144}
1145
1146static int
1147bnx2_fw_sync(struct bnx2 *bp, u32 msg_data, int silent)
1148{
1149	int i;
1150	u32 val;
1151
1152	bp->fw_wr_seq++;
1153	msg_data |= bp->fw_wr_seq;
1154
1155	REG_WR_IND(bp, bp->shmem_base + BNX2_DRV_MB, msg_data);
1156
1157	/* wait for an acknowledgement. */
1158	for (i = 0; i < (FW_ACK_TIME_OUT_MS / 50); i++) {
1159		mdelay(50);
1160
1161		val = REG_RD_IND(bp, bp->shmem_base + BNX2_FW_MB);
1162
1163		if ((val & BNX2_FW_MSG_ACK) == (msg_data & BNX2_DRV_MSG_SEQ))
1164			break;
1165	}
1166	if ((msg_data & BNX2_DRV_MSG_DATA) == BNX2_DRV_MSG_DATA_WAIT0)
1167		return 0;
1168
1169	/* If we timed out, inform the firmware that this is the case. */
1170	if ((val & BNX2_FW_MSG_ACK) != (msg_data & BNX2_DRV_MSG_SEQ)) {
1171		if (!silent)
1172		  printf("fw sync timeout, reset code = %x\n", (unsigned int) msg_data);
1173
1174		msg_data &= ~BNX2_DRV_MSG_CODE;
1175		msg_data |= BNX2_DRV_MSG_CODE_FW_TIMEOUT;
1176
1177		REG_WR_IND(bp, bp->shmem_base + BNX2_DRV_MB, msg_data);
1178
1179		return -EBUSY;
1180	}
1181
1182	if ((val & BNX2_FW_MSG_STATUS_MASK) != BNX2_FW_MSG_STATUS_OK)
1183		return -EIO;
1184
1185	return 0;
1186}
1187
1188static void
1189bnx2_init_context(struct bnx2 *bp)
1190{
1191	u32 vcid;
1192
1193	vcid = 96;
1194	while (vcid) {
1195		u32 vcid_addr, pcid_addr, offset;
1196
1197		vcid--;
1198
1199		if (CHIP_ID(bp) == CHIP_ID_5706_A0) {
1200			u32 new_vcid;
1201
1202			vcid_addr = GET_PCID_ADDR(vcid);
1203			if (vcid & 0x8) {
1204				new_vcid = 0x60 + (vcid & 0xf0) + (vcid & 0x7);
1205			}
1206			else {
1207				new_vcid = vcid;
1208			}
1209			pcid_addr = GET_PCID_ADDR(new_vcid);
1210		}
1211		else {
1212	    		vcid_addr = GET_CID_ADDR(vcid);
1213			pcid_addr = vcid_addr;
1214		}
1215
1216		REG_WR(bp, BNX2_CTX_VIRT_ADDR, 0x00);
1217		REG_WR(bp, BNX2_CTX_PAGE_TBL, pcid_addr);
1218
1219		/* Zero out the context. */
1220		for (offset = 0; offset < PHY_CTX_SIZE; offset += 4) {
1221			CTX_WR(bp, 0x00, offset, 0);
1222		}
1223
1224		REG_WR(bp, BNX2_CTX_VIRT_ADDR, vcid_addr);
1225		REG_WR(bp, BNX2_CTX_PAGE_TBL, pcid_addr);
1226	}
1227}
1228
1229static int
1230bnx2_alloc_bad_rbuf(struct bnx2 *bp)
1231{
1232	u16 good_mbuf[512];
1233	u32 good_mbuf_cnt;
1234	u32 val;
1235
1236	REG_WR(bp, BNX2_MISC_ENABLE_SET_BITS,
1237		BNX2_MISC_ENABLE_SET_BITS_RX_MBUF_ENABLE);
1238
1239	good_mbuf_cnt = 0;
1240
1241	/* Allocate a bunch of mbufs and save the good ones in an array. */
1242	val = REG_RD_IND(bp, BNX2_RBUF_STATUS1);
1243	while (val & BNX2_RBUF_STATUS1_FREE_COUNT) {
1244		REG_WR_IND(bp, BNX2_RBUF_COMMAND, BNX2_RBUF_COMMAND_ALLOC_REQ);
1245
1246		val = REG_RD_IND(bp, BNX2_RBUF_FW_BUF_ALLOC);
1247
1248		val &= BNX2_RBUF_FW_BUF_ALLOC_VALUE;
1249
1250		/* The addresses with Bit 9 set are bad memory blocks. */
1251		if (!(val & (1 << 9))) {
1252			good_mbuf[good_mbuf_cnt] = (u16) val;
1253			good_mbuf_cnt++;
1254		}
1255
1256		val = REG_RD_IND(bp, BNX2_RBUF_STATUS1);
1257	}
1258
1259	/* Free the good ones back to the mbuf pool thus discarding
1260	 * all the bad ones. */
1261	while (good_mbuf_cnt) {
1262		good_mbuf_cnt--;
1263
1264		val = good_mbuf[good_mbuf_cnt];
1265		val = (val << 9) | val | 1;
1266
1267		REG_WR_IND(bp, BNX2_RBUF_FW_BUF_FREE, val);
1268	}
1269	return 0;
1270}
1271
1272static void
1273bnx2_set_mac_addr(struct bnx2 *bp)
1274{
1275	u32 val;
1276	u8 *mac_addr = bp->nic->node_addr;
1277
1278	val = (mac_addr[0] << 8) | mac_addr[1];
1279
1280	REG_WR(bp, BNX2_EMAC_MAC_MATCH0, val);
1281
1282	val = (mac_addr[2] << 24) | (mac_addr[3] << 16) |
1283		(mac_addr[4] << 8) | mac_addr[5];
1284
1285	REG_WR(bp, BNX2_EMAC_MAC_MATCH1, val);
1286}
1287
1288static void
1289bnx2_set_rx_mode(struct nic *nic __unused)
1290{
1291	struct bnx2 *bp = &bnx2;
1292	u32 rx_mode, sort_mode;
1293	int i;
1294
1295	rx_mode = bp->rx_mode & ~(BNX2_EMAC_RX_MODE_PROMISCUOUS |
1296				  BNX2_EMAC_RX_MODE_KEEP_VLAN_TAG);
1297	sort_mode = 1 | BNX2_RPM_SORT_USER0_BC_EN;
1298
1299	if (!(bp->flags & ASF_ENABLE_FLAG)) {
1300		rx_mode |= BNX2_EMAC_RX_MODE_KEEP_VLAN_TAG;
1301	}
1302
1303	/* Accept all multicasts */
1304	for (i = 0; i < NUM_MC_HASH_REGISTERS; i++) {
1305		REG_WR(bp, BNX2_EMAC_MULTICAST_HASH0 + (i * 4),
1306		       0xffffffff);
1307       	}
1308	sort_mode |= BNX2_RPM_SORT_USER0_MC_EN;
1309
1310	if (rx_mode != bp->rx_mode) {
1311		bp->rx_mode = rx_mode;
1312		REG_WR(bp, BNX2_EMAC_RX_MODE, rx_mode);
1313	}
1314
1315	REG_WR(bp, BNX2_RPM_SORT_USER0, 0x0);
1316	REG_WR(bp, BNX2_RPM_SORT_USER0, sort_mode);
1317	REG_WR(bp, BNX2_RPM_SORT_USER0, sort_mode | BNX2_RPM_SORT_USER0_ENA);
1318}
1319
1320static void
1321load_rv2p_fw(struct bnx2 *bp, u32 *rv2p_code, u32 rv2p_code_len, u32 rv2p_proc)
1322{
1323	unsigned int i;
1324	u32 val;
1325
1326
1327	for (i = 0; i < rv2p_code_len; i += 8) {
1328		REG_WR(bp, BNX2_RV2P_INSTR_HIGH, *rv2p_code);
1329		rv2p_code++;
1330		REG_WR(bp, BNX2_RV2P_INSTR_LOW, *rv2p_code);
1331		rv2p_code++;
1332
1333		if (rv2p_proc == RV2P_PROC1) {
1334			val = (i / 8) | BNX2_RV2P_PROC1_ADDR_CMD_RDWR;
1335			REG_WR(bp, BNX2_RV2P_PROC1_ADDR_CMD, val);
1336		}
1337		else {
1338			val = (i / 8) | BNX2_RV2P_PROC2_ADDR_CMD_RDWR;
1339			REG_WR(bp, BNX2_RV2P_PROC2_ADDR_CMD, val);
1340		}
1341	}
1342
1343	/* Reset the processor, un-stall is done later. */
1344	if (rv2p_proc == RV2P_PROC1) {
1345		REG_WR(bp, BNX2_RV2P_COMMAND, BNX2_RV2P_COMMAND_PROC1_RESET);
1346	}
1347	else {
1348		REG_WR(bp, BNX2_RV2P_COMMAND, BNX2_RV2P_COMMAND_PROC2_RESET);
1349	}
1350}
1351
1352static void
1353load_cpu_fw(struct bnx2 *bp, struct cpu_reg *cpu_reg, struct fw_info *fw)
1354{
1355	u32 offset;
1356	u32 val;
1357
1358	/* Halt the CPU. */
1359	val = REG_RD_IND(bp, cpu_reg->mode);
1360	val |= cpu_reg->mode_value_halt;
1361	REG_WR_IND(bp, cpu_reg->mode, val);
1362	REG_WR_IND(bp, cpu_reg->state, cpu_reg->state_value_clear);
1363
1364	/* Load the Text area. */
1365	offset = cpu_reg->spad_base + (fw->text_addr - cpu_reg->mips_view_base);
1366	if (fw->text) {
1367		unsigned int j;
1368
1369		for (j = 0; j < (fw->text_len / 4); j++, offset += 4) {
1370			REG_WR_IND(bp, offset, fw->text[j]);
1371	        }
1372	}
1373
1374	/* Load the Data area. */
1375	offset = cpu_reg->spad_base + (fw->data_addr - cpu_reg->mips_view_base);
1376	if (fw->data) {
1377		unsigned int j;
1378
1379		for (j = 0; j < (fw->data_len / 4); j++, offset += 4) {
1380			REG_WR_IND(bp, offset, fw->data[j]);
1381		}
1382	}
1383
1384	/* Load the SBSS area. */
1385	offset = cpu_reg->spad_base + (fw->sbss_addr - cpu_reg->mips_view_base);
1386	if (fw->sbss) {
1387		unsigned int j;
1388
1389		for (j = 0; j < (fw->sbss_len / 4); j++, offset += 4) {
1390			REG_WR_IND(bp, offset, fw->sbss[j]);
1391		}
1392	}
1393
1394	/* Load the BSS area. */
1395	offset = cpu_reg->spad_base + (fw->bss_addr - cpu_reg->mips_view_base);
1396	if (fw->bss) {
1397		unsigned int j;
1398
1399		for (j = 0; j < (fw->bss_len/4); j++, offset += 4) {
1400			REG_WR_IND(bp, offset, fw->bss[j]);
1401		}
1402	}
1403
1404	/* Load the Read-Only area. */
1405	offset = cpu_reg->spad_base +
1406		(fw->rodata_addr - cpu_reg->mips_view_base);
1407	if (fw->rodata) {
1408		unsigned int j;
1409
1410		for (j = 0; j < (fw->rodata_len / 4); j++, offset += 4) {
1411			REG_WR_IND(bp, offset, fw->rodata[j]);
1412		}
1413	}
1414
1415	/* Clear the pre-fetch instruction. */
1416	REG_WR_IND(bp, cpu_reg->inst, 0);
1417	REG_WR_IND(bp, cpu_reg->pc, fw->start_addr);
1418
1419	/* Start the CPU. */
1420	val = REG_RD_IND(bp, cpu_reg->mode);
1421	val &= ~cpu_reg->mode_value_halt;
1422	REG_WR_IND(bp, cpu_reg->state, cpu_reg->state_value_clear);
1423	REG_WR_IND(bp, cpu_reg->mode, val);
1424}
1425
1426static void
1427bnx2_init_cpus(struct bnx2 *bp)
1428{
1429	struct cpu_reg cpu_reg;
1430	struct fw_info fw;
1431
1432	/* Unfortunately, it looks like we need to load the firmware
1433	 * before the card will work properly.  That means this driver
1434	 * will be huge by Etherboot standards (approx. 50K compressed).
1435	 */
1436
1437	/* Initialize the RV2P processor. */
1438	load_rv2p_fw(bp, bnx2_rv2p_proc1, sizeof(bnx2_rv2p_proc1), RV2P_PROC1);
1439	load_rv2p_fw(bp, bnx2_rv2p_proc2, sizeof(bnx2_rv2p_proc2), RV2P_PROC2);
1440
1441	/* Initialize the RX Processor. */
1442	cpu_reg.mode = BNX2_RXP_CPU_MODE;
1443	cpu_reg.mode_value_halt = BNX2_RXP_CPU_MODE_SOFT_HALT;
1444	cpu_reg.mode_value_sstep = BNX2_RXP_CPU_MODE_STEP_ENA;
1445	cpu_reg.state = BNX2_RXP_CPU_STATE;
1446	cpu_reg.state_value_clear = 0xffffff;
1447	cpu_reg.gpr0 = BNX2_RXP_CPU_REG_FILE;
1448	cpu_reg.evmask = BNX2_RXP_CPU_EVENT_MASK;
1449	cpu_reg.pc = BNX2_RXP_CPU_PROGRAM_COUNTER;
1450	cpu_reg.inst = BNX2_RXP_CPU_INSTRUCTION;
1451	cpu_reg.bp = BNX2_RXP_CPU_HW_BREAKPOINT;
1452	cpu_reg.spad_base = BNX2_RXP_SCRATCH;
1453	cpu_reg.mips_view_base = 0x8000000;
1454
1455	fw.ver_major = bnx2_RXP_b06FwReleaseMajor;
1456	fw.ver_minor = bnx2_RXP_b06FwReleaseMinor;
1457	fw.ver_fix = bnx2_RXP_b06FwReleaseFix;
1458	fw.start_addr = bnx2_RXP_b06FwStartAddr;
1459
1460	fw.text_addr = bnx2_RXP_b06FwTextAddr;
1461	fw.text_len = bnx2_RXP_b06FwTextLen;
1462	fw.text_index = 0;
1463	fw.text = bnx2_RXP_b06FwText;
1464
1465	fw.data_addr = bnx2_RXP_b06FwDataAddr;
1466	fw.data_len = bnx2_RXP_b06FwDataLen;
1467	fw.data_index = 0;
1468	fw.data = bnx2_RXP_b06FwData;
1469
1470	fw.sbss_addr = bnx2_RXP_b06FwSbssAddr;
1471	fw.sbss_len = bnx2_RXP_b06FwSbssLen;
1472	fw.sbss_index = 0;
1473	fw.sbss = bnx2_RXP_b06FwSbss;
1474
1475	fw.bss_addr = bnx2_RXP_b06FwBssAddr;
1476	fw.bss_len = bnx2_RXP_b06FwBssLen;
1477	fw.bss_index = 0;
1478	fw.bss = bnx2_RXP_b06FwBss;
1479
1480	fw.rodata_addr = bnx2_RXP_b06FwRodataAddr;
1481	fw.rodata_len = bnx2_RXP_b06FwRodataLen;
1482	fw.rodata_index = 0;
1483	fw.rodata = bnx2_RXP_b06FwRodata;
1484
1485	load_cpu_fw(bp, &cpu_reg, &fw);
1486
1487	/* Initialize the TX Processor. */
1488	cpu_reg.mode = BNX2_TXP_CPU_MODE;
1489	cpu_reg.mode_value_halt = BNX2_TXP_CPU_MODE_SOFT_HALT;
1490	cpu_reg.mode_value_sstep = BNX2_TXP_CPU_MODE_STEP_ENA;
1491	cpu_reg.state = BNX2_TXP_CPU_STATE;
1492	cpu_reg.state_value_clear = 0xffffff;
1493	cpu_reg.gpr0 = BNX2_TXP_CPU_REG_FILE;
1494	cpu_reg.evmask = BNX2_TXP_CPU_EVENT_MASK;
1495	cpu_reg.pc = BNX2_TXP_CPU_PROGRAM_COUNTER;
1496	cpu_reg.inst = BNX2_TXP_CPU_INSTRUCTION;
1497	cpu_reg.bp = BNX2_TXP_CPU_HW_BREAKPOINT;
1498	cpu_reg.spad_base = BNX2_TXP_SCRATCH;
1499	cpu_reg.mips_view_base = 0x8000000;
1500
1501	fw.ver_major = bnx2_TXP_b06FwReleaseMajor;
1502	fw.ver_minor = bnx2_TXP_b06FwReleaseMinor;
1503	fw.ver_fix = bnx2_TXP_b06FwReleaseFix;
1504	fw.start_addr = bnx2_TXP_b06FwStartAddr;
1505
1506	fw.text_addr = bnx2_TXP_b06FwTextAddr;
1507	fw.text_len = bnx2_TXP_b06FwTextLen;
1508	fw.text_index = 0;
1509	fw.text = bnx2_TXP_b06FwText;
1510
1511	fw.data_addr = bnx2_TXP_b06FwDataAddr;
1512	fw.data_len = bnx2_TXP_b06FwDataLen;
1513	fw.data_index = 0;
1514	fw.data = bnx2_TXP_b06FwData;
1515
1516	fw.sbss_addr = bnx2_TXP_b06FwSbssAddr;
1517	fw.sbss_len = bnx2_TXP_b06FwSbssLen;
1518	fw.sbss_index = 0;
1519	fw.sbss = bnx2_TXP_b06FwSbss;
1520
1521	fw.bss_addr = bnx2_TXP_b06FwBssAddr;
1522	fw.bss_len = bnx2_TXP_b06FwBssLen;
1523	fw.bss_index = 0;
1524	fw.bss = bnx2_TXP_b06FwBss;
1525
1526	fw.rodata_addr = bnx2_TXP_b06FwRodataAddr;
1527	fw.rodata_len = bnx2_TXP_b06FwRodataLen;
1528	fw.rodata_index = 0;
1529	fw.rodata = bnx2_TXP_b06FwRodata;
1530
1531	load_cpu_fw(bp, &cpu_reg, &fw);
1532
1533	/* Initialize the TX Patch-up Processor. */
1534	cpu_reg.mode = BNX2_TPAT_CPU_MODE;
1535	cpu_reg.mode_value_halt = BNX2_TPAT_CPU_MODE_SOFT_HALT;
1536	cpu_reg.mode_value_sstep = BNX2_TPAT_CPU_MODE_STEP_ENA;
1537	cpu_reg.state = BNX2_TPAT_CPU_STATE;
1538	cpu_reg.state_value_clear = 0xffffff;
1539	cpu_reg.gpr0 = BNX2_TPAT_CPU_REG_FILE;
1540	cpu_reg.evmask = BNX2_TPAT_CPU_EVENT_MASK;
1541	cpu_reg.pc = BNX2_TPAT_CPU_PROGRAM_COUNTER;
1542	cpu_reg.inst = BNX2_TPAT_CPU_INSTRUCTION;
1543	cpu_reg.bp = BNX2_TPAT_CPU_HW_BREAKPOINT;
1544	cpu_reg.spad_base = BNX2_TPAT_SCRATCH;
1545	cpu_reg.mips_view_base = 0x8000000;
1546
1547	fw.ver_major = bnx2_TPAT_b06FwReleaseMajor;
1548	fw.ver_minor = bnx2_TPAT_b06FwReleaseMinor;
1549	fw.ver_fix = bnx2_TPAT_b06FwReleaseFix;
1550	fw.start_addr = bnx2_TPAT_b06FwStartAddr;
1551
1552	fw.text_addr = bnx2_TPAT_b06FwTextAddr;
1553	fw.text_len = bnx2_TPAT_b06FwTextLen;
1554	fw.text_index = 0;
1555	fw.text = bnx2_TPAT_b06FwText;
1556
1557	fw.data_addr = bnx2_TPAT_b06FwDataAddr;
1558	fw.data_len = bnx2_TPAT_b06FwDataLen;
1559	fw.data_index = 0;
1560	fw.data = bnx2_TPAT_b06FwData;
1561
1562	fw.sbss_addr = bnx2_TPAT_b06FwSbssAddr;
1563	fw.sbss_len = bnx2_TPAT_b06FwSbssLen;
1564	fw.sbss_index = 0;
1565	fw.sbss = bnx2_TPAT_b06FwSbss;
1566
1567	fw.bss_addr = bnx2_TPAT_b06FwBssAddr;
1568	fw.bss_len = bnx2_TPAT_b06FwBssLen;
1569	fw.bss_index = 0;
1570	fw.bss = bnx2_TPAT_b06FwBss;
1571
1572	fw.rodata_addr = bnx2_TPAT_b06FwRodataAddr;
1573	fw.rodata_len = bnx2_TPAT_b06FwRodataLen;
1574	fw.rodata_index = 0;
1575	fw.rodata = bnx2_TPAT_b06FwRodata;
1576
1577	load_cpu_fw(bp, &cpu_reg, &fw);
1578
1579	/* Initialize the Completion Processor. */
1580	cpu_reg.mode = BNX2_COM_CPU_MODE;
1581	cpu_reg.mode_value_halt = BNX2_COM_CPU_MODE_SOFT_HALT;
1582	cpu_reg.mode_value_sstep = BNX2_COM_CPU_MODE_STEP_ENA;
1583	cpu_reg.state = BNX2_COM_CPU_STATE;
1584	cpu_reg.state_value_clear = 0xffffff;
1585	cpu_reg.gpr0 = BNX2_COM_CPU_REG_FILE;
1586	cpu_reg.evmask = BNX2_COM_CPU_EVENT_MASK;
1587	cpu_reg.pc = BNX2_COM_CPU_PROGRAM_COUNTER;
1588	cpu_reg.inst = BNX2_COM_CPU_INSTRUCTION;
1589	cpu_reg.bp = BNX2_COM_CPU_HW_BREAKPOINT;
1590	cpu_reg.spad_base = BNX2_COM_SCRATCH;
1591	cpu_reg.mips_view_base = 0x8000000;
1592
1593	fw.ver_major = bnx2_COM_b06FwReleaseMajor;
1594	fw.ver_minor = bnx2_COM_b06FwReleaseMinor;
1595	fw.ver_fix = bnx2_COM_b06FwReleaseFix;
1596	fw.start_addr = bnx2_COM_b06FwStartAddr;
1597
1598	fw.text_addr = bnx2_COM_b06FwTextAddr;
1599	fw.text_len = bnx2_COM_b06FwTextLen;
1600	fw.text_index = 0;
1601	fw.text = bnx2_COM_b06FwText;
1602
1603	fw.data_addr = bnx2_COM_b06FwDataAddr;
1604	fw.data_len = bnx2_COM_b06FwDataLen;
1605	fw.data_index = 0;
1606	fw.data = bnx2_COM_b06FwData;
1607
1608	fw.sbss_addr = bnx2_COM_b06FwSbssAddr;
1609	fw.sbss_len = bnx2_COM_b06FwSbssLen;
1610	fw.sbss_index = 0;
1611	fw.sbss = bnx2_COM_b06FwSbss;
1612
1613	fw.bss_addr = bnx2_COM_b06FwBssAddr;
1614	fw.bss_len = bnx2_COM_b06FwBssLen;
1615	fw.bss_index = 0;
1616	fw.bss = bnx2_COM_b06FwBss;
1617
1618	fw.rodata_addr = bnx2_COM_b06FwRodataAddr;
1619	fw.rodata_len = bnx2_COM_b06FwRodataLen;
1620	fw.rodata_index = 0;
1621	fw.rodata = bnx2_COM_b06FwRodata;
1622
1623	load_cpu_fw(bp, &cpu_reg, &fw);
1624
1625}
1626
1627static int
1628bnx2_set_power_state_0(struct bnx2 *bp)
1629{
1630	u16 pmcsr;
1631	u32 val;
1632
1633	pci_read_config_word(bp->pdev, bp->pm_cap + PCI_PM_CTRL, &pmcsr);
1634
1635	pci_write_config_word(bp->pdev, bp->pm_cap + PCI_PM_CTRL,
1636		(pmcsr & ~PCI_PM_CTRL_STATE_MASK) |
1637		PCI_PM_CTRL_PME_STATUS);
1638
1639	if (pmcsr & PCI_PM_CTRL_STATE_MASK)
1640		/* delay required during transition out of D3hot */
1641		mdelay(20);
1642
1643	val = REG_RD(bp, BNX2_EMAC_MODE);
1644	val |= BNX2_EMAC_MODE_MPKT_RCVD | BNX2_EMAC_MODE_ACPI_RCVD;
1645	val &= ~BNX2_EMAC_MODE_MPKT;
1646	REG_WR(bp, BNX2_EMAC_MODE, val);
1647
1648	val = REG_RD(bp, BNX2_RPM_CONFIG);
1649	val &= ~BNX2_RPM_CONFIG_ACPI_ENA;
1650	REG_WR(bp, BNX2_RPM_CONFIG, val);
1651
1652	return 0;
1653}
1654
1655static void
1656bnx2_enable_nvram_access(struct bnx2 *bp)
1657{
1658	u32 val;
1659
1660	val = REG_RD(bp, BNX2_NVM_ACCESS_ENABLE);
1661	/* Enable both bits, even on read. */
1662	REG_WR(bp, BNX2_NVM_ACCESS_ENABLE,
1663	       val | BNX2_NVM_ACCESS_ENABLE_EN | BNX2_NVM_ACCESS_ENABLE_WR_EN);
1664}
1665
1666static void
1667bnx2_disable_nvram_access(struct bnx2 *bp)
1668{
1669	u32 val;
1670
1671	val = REG_RD(bp, BNX2_NVM_ACCESS_ENABLE);
1672	/* Disable both bits, even after read. */
1673	REG_WR(bp, BNX2_NVM_ACCESS_ENABLE,
1674		val & ~(BNX2_NVM_ACCESS_ENABLE_EN |
1675			BNX2_NVM_ACCESS_ENABLE_WR_EN));
1676}
1677
1678static int
1679bnx2_init_nvram(struct bnx2 *bp)
1680{
1681	u32 val;
1682	int j, entry_count, rc;
1683	struct flash_spec *flash;
1684
1685	/* Determine the selected interface. */
1686	val = REG_RD(bp, BNX2_NVM_CFG1);
1687
1688	entry_count = sizeof(flash_table) / sizeof(struct flash_spec);
1689
1690	rc = 0;
1691	if (val & 0x40000000) {
1692		/* Flash interface has been reconfigured */
1693		for (j = 0, flash = &flash_table[0]; j < entry_count;
1694		     j++, flash++) {
1695			if ((val & FLASH_BACKUP_STRAP_MASK) ==
1696			    (flash->config1 & FLASH_BACKUP_STRAP_MASK)) {
1697				bp->flash_info = flash;
1698				break;
1699			}
1700		}
1701	}
1702	else {
1703		u32 mask;
1704		/* Not yet been reconfigured */
1705
1706		if (val & (1 << 23))
1707			mask = FLASH_BACKUP_STRAP_MASK;
1708		else
1709			mask = FLASH_STRAP_MASK;
1710
1711		for (j = 0, flash = &flash_table[0]; j < entry_count;
1712			j++, flash++) {
1713
1714			if ((val & mask) == (flash->strapping & mask)) {
1715				bp->flash_info = flash;
1716
1717				/* Enable access to flash interface */
1718				bnx2_enable_nvram_access(bp);
1719
1720				/* Reconfigure the flash interface */
1721				REG_WR(bp, BNX2_NVM_CFG1, flash->config1);
1722				REG_WR(bp, BNX2_NVM_CFG2, flash->config2);
1723				REG_WR(bp, BNX2_NVM_CFG3, flash->config3);
1724				REG_WR(bp, BNX2_NVM_WRITE1, flash->write1);
1725
1726				/* Disable access to flash interface */
1727				bnx2_disable_nvram_access(bp);
1728
1729				break;
1730			}
1731		}
1732	} /* if (val & 0x40000000) */
1733
1734	if (j == entry_count) {
1735		bp->flash_info = NULL;
1736		printf("Unknown flash/EEPROM type.\n");
1737		return -ENODEV;
1738	}
1739
1740	val = REG_RD_IND(bp, bp->shmem_base + BNX2_SHARED_HW_CFG_CONFIG2);
1741	val &= BNX2_SHARED_HW_CFG2_NVM_SIZE_MASK;
1742	if (val) {
1743		bp->flash_size = val;
1744	}
1745	else {
1746		bp->flash_size = bp->flash_info->total_size;
1747	}
1748
1749	return rc;
1750}
1751
1752static int
1753bnx2_reset_chip(struct bnx2 *bp, u32 reset_code)
1754{
1755	u32 val;
1756	int i, rc = 0;
1757
1758	/* Wait for the current PCI transaction to complete before
1759	 * issuing a reset. */
1760	REG_WR(bp, BNX2_MISC_ENABLE_CLR_BITS,
1761	       BNX2_MISC_ENABLE_CLR_BITS_TX_DMA_ENABLE |
1762	       BNX2_MISC_ENABLE_CLR_BITS_DMA_ENGINE_ENABLE |
1763	       BNX2_MISC_ENABLE_CLR_BITS_RX_DMA_ENABLE |
1764	       BNX2_MISC_ENABLE_CLR_BITS_HOST_COALESCE_ENABLE);
1765	val = REG_RD(bp, BNX2_MISC_ENABLE_CLR_BITS);
1766	udelay(5);
1767
1768
1769	/* Wait for the firmware to tell us it is ok to issue a reset. */
1770	bnx2_fw_sync(bp, BNX2_DRV_MSG_DATA_WAIT0 | reset_code, 1);
1771
1772	/* Deposit a driver reset signature so the firmware knows that
1773	 * this is a soft reset. */
1774	REG_WR_IND(bp, bp->shmem_base + BNX2_DRV_RESET_SIGNATURE,
1775		   BNX2_DRV_RESET_SIGNATURE_MAGIC);
1776
1777	/* Do a dummy read to force the chip to complete all current transaction
1778	 * before we issue a reset. */
1779	val = REG_RD(bp, BNX2_MISC_ID);
1780
1781	val = BNX2_PCICFG_MISC_CONFIG_CORE_RST_REQ |
1782	      BNX2_PCICFG_MISC_CONFIG_REG_WINDOW_ENA |
1783	      BNX2_PCICFG_MISC_CONFIG_TARGET_MB_WORD_SWAP;
1784
1785	/* Chip reset. */
1786	REG_WR(bp, BNX2_PCICFG_MISC_CONFIG, val);
1787
1788	if ((CHIP_ID(bp) == CHIP_ID_5706_A0) ||
1789	    (CHIP_ID(bp) == CHIP_ID_5706_A1))
1790		mdelay(15);
1791
1792	/* Reset takes approximate 30 usec */
1793	for (i = 0; i < 10; i++) {
1794		val = REG_RD(bp, BNX2_PCICFG_MISC_CONFIG);
1795		if ((val & (BNX2_PCICFG_MISC_CONFIG_CORE_RST_REQ |
1796			    BNX2_PCICFG_MISC_CONFIG_CORE_RST_BSY)) == 0) {
1797			break;
1798		}
1799		udelay(10);
1800	}
1801
1802	if (val & (BNX2_PCICFG_MISC_CONFIG_CORE_RST_REQ |
1803		   BNX2_PCICFG_MISC_CONFIG_CORE_RST_BSY)) {
1804		printf("Chip reset did not complete\n");
1805		return -EBUSY;
1806	}
1807
1808	/* Make sure byte swapping is properly configured. */
1809	val = REG_RD(bp, BNX2_PCI_SWAP_DIAG0);
1810	if (val != 0x01020304) {
1811		printf("Chip not in correct endian mode\n");
1812		return -ENODEV;
1813	}
1814
1815	/* Wait for the firmware to finish its initialization. */
1816	rc = bnx2_fw_sync(bp, BNX2_DRV_MSG_DATA_WAIT1 | reset_code, 0);
1817	if (rc) {
1818		return rc;
1819	}
1820
1821	if (CHIP_ID(bp) == CHIP_ID_5706_A0) {
1822		/* Adjust the voltage regular to two steps lower.  The default
1823		 * of this register is 0x0000000e. */
1824		REG_WR(bp, BNX2_MISC_VREG_CONTROL, 0x000000fa);
1825
1826		/* Remove bad rbuf memory from the free pool. */
1827		rc = bnx2_alloc_bad_rbuf(bp);
1828	}
1829
1830	return rc;
1831}
1832
1833static void
1834bnx2_disable(struct nic *nic __unused)
1835{
1836	struct bnx2* bp = &bnx2;
1837
1838	if (bp->regview) {
1839		bnx2_reset_chip(bp, BNX2_DRV_MSG_CODE_UNLOAD);
1840		iounmap(bp->regview);
1841	}
1842}
1843
1844static int
1845bnx2_init_chip(struct bnx2 *bp)
1846{
1847	u32 val;
1848	int rc;
1849
1850	/* Make sure the interrupt is not active. */
1851	REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD, BNX2_PCICFG_INT_ACK_CMD_MASK_INT);
1852
1853	val = BNX2_DMA_CONFIG_DATA_BYTE_SWAP |
1854	      BNX2_DMA_CONFIG_DATA_WORD_SWAP |
1855#if __BYTE_ORDER ==  __BIG_ENDIAN
1856	      BNX2_DMA_CONFIG_CNTL_BYTE_SWAP |
1857#endif
1858	      BNX2_DMA_CONFIG_CNTL_WORD_SWAP |
1859	      DMA_READ_CHANS << 12 |
1860	      DMA_WRITE_CHANS << 16;
1861
1862	val |= (0x2 << 20) | (1 << 11);
1863
1864	if ((bp->flags & PCIX_FLAG) && (bp->bus_speed_mhz == 133))
1865		val |= (1 << 23);
1866
1867	if ((CHIP_NUM(bp) == CHIP_NUM_5706) &&
1868	    (CHIP_ID(bp) != CHIP_ID_5706_A0) && !(bp->flags & PCIX_FLAG))
1869		val |= BNX2_DMA_CONFIG_CNTL_PING_PONG_DMA;
1870
1871	REG_WR(bp, BNX2_DMA_CONFIG, val);
1872
1873	if (CHIP_ID(bp) == CHIP_ID_5706_A0) {
1874		val = REG_RD(bp, BNX2_TDMA_CONFIG);
1875		val |= BNX2_TDMA_CONFIG_ONE_DMA;
1876		REG_WR(bp, BNX2_TDMA_CONFIG, val);
1877	}
1878
1879	if (bp->flags & PCIX_FLAG) {
1880		u16 val16;
1881
1882		pci_read_config_word(bp->pdev, bp->pcix_cap + PCI_X_CMD,
1883				     &val16);
1884		pci_write_config_word(bp->pdev, bp->pcix_cap + PCI_X_CMD,
1885				      val16 & ~PCI_X_CMD_ERO);
1886	}
1887
1888	REG_WR(bp, BNX2_MISC_ENABLE_SET_BITS,
1889	       BNX2_MISC_ENABLE_SET_BITS_HOST_COALESCE_ENABLE |
1890	       BNX2_MISC_ENABLE_STATUS_BITS_RX_V2P_ENABLE |
1891	       BNX2_MISC_ENABLE_STATUS_BITS_CONTEXT_ENABLE);
1892
1893	/* Initialize context mapping and zero out the quick contexts.  The
1894	 * context block must have already been enabled. */
1895	bnx2_init_context(bp);
1896
1897	bnx2_init_nvram(bp);
1898	bnx2_init_cpus(bp);
1899
1900	bnx2_set_mac_addr(bp);
1901
1902	val = REG_RD(bp, BNX2_MQ_CONFIG);
1903	val &= ~BNX2_MQ_CONFIG_KNL_BYP_BLK_SIZE;
1904	val |= BNX2_MQ_CONFIG_KNL_BYP_BLK_SIZE_256;
1905	REG_WR(bp, BNX2_MQ_CONFIG, val);
1906
1907	val = 0x10000 + (MAX_CID_CNT * MB_KERNEL_CTX_SIZE);
1908	REG_WR(bp, BNX2_MQ_KNL_BYP_WIND_START, val);
1909	REG_WR(bp, BNX2_MQ_KNL_WIND_END, val);
1910
1911	val = (BCM_PAGE_BITS - 8) << 24;
1912	REG_WR(bp, BNX2_RV2P_CONFIG, val);
1913
1914	/* Configure page size. */
1915	val = REG_RD(bp, BNX2_TBDR_CONFIG);
1916	val &= ~BNX2_TBDR_CONFIG_PAGE_SIZE;
1917	val |= (BCM_PAGE_BITS - 8) << 24 | 0x40;
1918	REG_WR(bp, BNX2_TBDR_CONFIG, val);
1919
1920	val = bp->mac_addr[0] +
1921	      (bp->mac_addr[1] << 8) +
1922	      (bp->mac_addr[2] << 16) +
1923	      bp->mac_addr[3] +
1924	      (bp->mac_addr[4] << 8) +
1925	      (bp->mac_addr[5] << 16);
1926	REG_WR(bp, BNX2_EMAC_BACKOFF_SEED, val);
1927
1928	/* Program the MTU.  Also include 4 bytes for CRC32. */
1929	val = ETH_MAX_MTU + ETH_HLEN + 4;
1930	if (val > (MAX_ETHERNET_PACKET_SIZE + 4))
1931		val |= BNX2_EMAC_RX_MTU_SIZE_JUMBO_ENA;
1932	REG_WR(bp, BNX2_EMAC_RX_MTU_SIZE, val);
1933
1934	bp->last_status_idx = 0;
1935	bp->rx_mode = BNX2_EMAC_RX_MODE_SORT_MODE;
1936
1937	/* Set up how to generate a link change interrupt. */
1938	REG_WR(bp, BNX2_EMAC_ATTENTION_ENA, BNX2_EMAC_ATTENTION_ENA_LINK);
1939
1940	REG_WR(bp, BNX2_HC_STATUS_ADDR_L,
1941	       (u64) bp->status_blk_mapping & 0xffffffff);
1942	REG_WR(bp, BNX2_HC_STATUS_ADDR_H, (u64) bp->status_blk_mapping >> 32);
1943
1944	REG_WR(bp, BNX2_HC_STATISTICS_ADDR_L,
1945	       (u64) bp->stats_blk_mapping & 0xffffffff);
1946	REG_WR(bp, BNX2_HC_STATISTICS_ADDR_H,
1947	       (u64) bp->stats_blk_mapping >> 32);
1948
1949	REG_WR(bp, BNX2_HC_TX_QUICK_CONS_TRIP,
1950	       (bp->tx_quick_cons_trip_int << 16) | bp->tx_quick_cons_trip);
1951
1952	REG_WR(bp, BNX2_HC_RX_QUICK_CONS_TRIP,
1953	       (bp->rx_quick_cons_trip_int << 16) | bp->rx_quick_cons_trip);
1954
1955	REG_WR(bp, BNX2_HC_COMP_PROD_TRIP,
1956	       (bp->comp_prod_trip_int << 16) | bp->comp_prod_trip);
1957
1958	REG_WR(bp, BNX2_HC_TX_TICKS, (bp->tx_ticks_int << 16) | bp->tx_ticks);
1959
1960	REG_WR(bp, BNX2_HC_RX_TICKS, (bp->rx_ticks_int << 16) | bp->rx_ticks);
1961
1962	REG_WR(bp, BNX2_HC_COM_TICKS,
1963	       (bp->com_ticks_int << 16) | bp->com_ticks);
1964
1965	REG_WR(bp, BNX2_HC_CMD_TICKS,
1966	       (bp->cmd_ticks_int << 16) | bp->cmd_ticks);
1967
1968	REG_WR(bp, BNX2_HC_STATS_TICKS, bp->stats_ticks & 0xffff00);
1969	REG_WR(bp, BNX2_HC_STAT_COLLECT_TICKS, 0xbb8);  /* 3ms */
1970
1971	if (CHIP_ID(bp) == CHIP_ID_5706_A1)
1972		REG_WR(bp, BNX2_HC_CONFIG, BNX2_HC_CONFIG_COLLECT_STATS);
1973	else {
1974		REG_WR(bp, BNX2_HC_CONFIG, BNX2_HC_CONFIG_RX_TMR_MODE |
1975		       BNX2_HC_CONFIG_TX_TMR_MODE |
1976		       BNX2_HC_CONFIG_COLLECT_STATS);
1977	}
1978
1979	/* Clear internal stats counters. */
1980	REG_WR(bp, BNX2_HC_COMMAND, BNX2_HC_COMMAND_CLR_STAT_NOW);
1981
1982	REG_WR(bp, BNX2_HC_ATTN_BITS_ENABLE, STATUS_ATTN_BITS_LINK_STATE);
1983
1984	if (REG_RD_IND(bp, bp->shmem_base + BNX2_PORT_FEATURE) &
1985	    BNX2_PORT_FEATURE_ASF_ENABLED)
1986		bp->flags |= ASF_ENABLE_FLAG;
1987
1988	/* Initialize the receive filter. */
1989	bnx2_set_rx_mode(bp->nic);
1990
1991	rc = bnx2_fw_sync(bp, BNX2_DRV_MSG_DATA_WAIT2 | BNX2_DRV_MSG_CODE_RESET,
1992			  0);
1993
1994	REG_WR(bp, BNX2_MISC_ENABLE_SET_BITS, 0x5ffffff);
1995	REG_RD(bp, BNX2_MISC_ENABLE_SET_BITS);
1996
1997	udelay(20);
1998
1999	bp->hc_cmd = REG_RD(bp, BNX2_HC_COMMAND);
2000
2001	return rc;
2002}
2003
2004static void
2005bnx2_init_tx_ring(struct bnx2 *bp)
2006{
2007	struct tx_bd *txbd;
2008	u32 val;
2009
2010	txbd = &bp->tx_desc_ring[MAX_TX_DESC_CNT];
2011
2012	/* Etherboot lives below 4GB, so hi is always 0 */
2013	txbd->tx_bd_haddr_hi = 0;
2014	txbd->tx_bd_haddr_lo = bp->tx_desc_mapping;
2015
2016	bp->tx_prod = 0;
2017	bp->tx_cons = 0;
2018	bp->hw_tx_cons = 0;
2019	bp->tx_prod_bseq = 0;
2020
2021	val = BNX2_L2CTX_TYPE_TYPE_L2;
2022	val |= BNX2_L2CTX_TYPE_SIZE_L2;
2023	CTX_WR(bp, GET_CID_ADDR(TX_CID), BNX2_L2CTX_TYPE, val);
2024
2025	val = BNX2_L2CTX_CMD_TYPE_TYPE_L2;
2026	val |= 8 << 16;
2027	CTX_WR(bp, GET_CID_ADDR(TX_CID), BNX2_L2CTX_CMD_TYPE, val);
2028
2029	/* Etherboot lives below 4GB, so hi is always 0 */
2030	CTX_WR(bp, GET_CID_ADDR(TX_CID), BNX2_L2CTX_TBDR_BHADDR_HI, 0);
2031
2032	val = (u64) bp->tx_desc_mapping & 0xffffffff;
2033	CTX_WR(bp, GET_CID_ADDR(TX_CID), BNX2_L2CTX_TBDR_BHADDR_LO, val);
2034}
2035
2036static void
2037bnx2_init_rx_ring(struct bnx2 *bp)
2038{
2039	struct rx_bd *rxbd;
2040	unsigned int i;
2041	u16 prod, ring_prod;
2042	u32 val;
2043
2044	bp->rx_buf_use_size = RX_BUF_USE_SIZE;
2045	bp->rx_buf_size = RX_BUF_SIZE;
2046
2047	ring_prod = prod = bp->rx_prod = 0;
2048	bp->rx_cons = 0;
2049	bp->hw_rx_cons = 0;
2050	bp->rx_prod_bseq = 0;
2051
2052	memset(bnx2_bss.rx_buf, 0, sizeof(bnx2_bss.rx_buf));
2053
2054	rxbd = &bp->rx_desc_ring[0];
2055	for (i = 0; i < MAX_RX_DESC_CNT; i++, rxbd++) {
2056		rxbd->rx_bd_len = bp->rx_buf_use_size;
2057		rxbd->rx_bd_flags = RX_BD_FLAGS_START | RX_BD_FLAGS_END;
2058	}
2059	rxbd->rx_bd_haddr_hi = 0;
2060	rxbd->rx_bd_haddr_lo = (u64) bp->rx_desc_mapping & 0xffffffff;
2061
2062	val = BNX2_L2CTX_CTX_TYPE_CTX_BD_CHN_TYPE_VALUE;
2063	val |= BNX2_L2CTX_CTX_TYPE_SIZE_L2;
2064	val |= 0x02 << 8;
2065	CTX_WR(bp, GET_CID_ADDR(RX_CID), BNX2_L2CTX_CTX_TYPE, val);
2066
2067	/* Etherboot doesn't use memory above 4GB, so this is always 0 */
2068	CTX_WR(bp, GET_CID_ADDR(RX_CID), BNX2_L2CTX_NX_BDHADDR_HI, 0);
2069
2070	val = bp->rx_desc_mapping & 0xffffffff;
2071	CTX_WR(bp, GET_CID_ADDR(RX_CID), BNX2_L2CTX_NX_BDHADDR_LO, val);
2072
2073	for (i = 0; (int) i < bp->rx_ring_size; i++) {
2074		rxbd = &bp->rx_desc_ring[RX_RING_IDX(ring_prod)];
2075		rxbd->rx_bd_haddr_hi = 0;
2076		rxbd->rx_bd_haddr_lo = virt_to_bus(&bnx2_bss.rx_buf[ring_prod][0]);
2077		bp->rx_prod_bseq += bp->rx_buf_use_size;
2078		prod = NEXT_RX_BD(prod);
2079		ring_prod = RX_RING_IDX(prod);
2080	}
2081	bp->rx_prod = prod;
2082
2083	REG_WR16(bp, MB_RX_CID_ADDR + BNX2_L2CTX_HOST_BDIDX, bp->rx_prod);
2084
2085	REG_WR(bp, MB_RX_CID_ADDR + BNX2_L2CTX_HOST_BSEQ, bp->rx_prod_bseq);
2086}
2087
2088static int
2089bnx2_reset_nic(struct bnx2 *bp, u32 reset_code)
2090{
2091	int rc;
2092
2093	rc = bnx2_reset_chip(bp, reset_code);
2094	if (rc) {
2095		return rc;
2096	}
2097
2098	bnx2_init_chip(bp);
2099	bnx2_init_tx_ring(bp);
2100	bnx2_init_rx_ring(bp);
2101	return 0;
2102}
2103
2104static int
2105bnx2_init_nic(struct bnx2 *bp)
2106{
2107	int rc;
2108
2109	if ((rc = bnx2_reset_nic(bp, BNX2_DRV_MSG_CODE_RESET)) != 0)
2110		return rc;
2111
2112	bnx2_init_phy(bp);
2113	bnx2_set_link(bp);
2114	return 0;
2115}
2116
2117static int
2118bnx2_init_board(struct pci_device *pdev, struct nic *nic)
2119{
2120	unsigned long bnx2reg_base, bnx2reg_len;
2121	struct bnx2 *bp = &bnx2;
2122	int rc;
2123	u32 reg;
2124
2125	bp->flags = 0;
2126	bp->phy_flags = 0;
2127
2128	/* enable device (incl. PCI PM wakeup), and bus-mastering */
2129	adjust_pci_device(pdev);
2130
2131	nic->ioaddr = pdev->ioaddr & ~3;
2132	nic->irqno = 0;
2133
2134	rc = 0;
2135	bp->pm_cap = pci_find_capability(pdev, PCI_CAP_ID_PM);
2136	if (bp->pm_cap == 0) {
2137		printf("Cannot find power management capability, aborting.\n");
2138		rc = -EIO;
2139		goto err_out_disable;
2140	}
2141
2142	bp->pcix_cap = pci_find_capability(pdev, PCI_CAP_ID_PCIX);
2143	if (bp->pcix_cap == 0) {
2144		printf("Cannot find PCIX capability, aborting.\n");
2145		rc = -EIO;
2146		goto err_out_disable;
2147	}
2148
2149	bp->pdev = pdev;
2150	bp->nic = nic;
2151
2152	bnx2reg_base = pci_bar_start(pdev, PCI_BASE_ADDRESS_0);
2153	bnx2reg_len = MB_GET_CID_ADDR(17);
2154
2155	bp->regview = ioremap(bnx2reg_base, bnx2reg_len);
2156
2157	if (!bp->regview) {
2158		printf("Cannot map register space, aborting.\n");
2159		rc = -EIO;
2160		goto err_out_disable;
2161	}
2162
2163	/* Configure byte swap and enable write to the reg_window registers.
2164	 * Rely on CPU to do target byte swapping on big endian systems
2165	 * The chip's target access swapping will not swap all accesses
2166	 */
2167	pci_write_config_dword(bp->pdev, BNX2_PCICFG_MISC_CONFIG,
2168			       BNX2_PCICFG_MISC_CONFIG_REG_WINDOW_ENA |
2169			       BNX2_PCICFG_MISC_CONFIG_TARGET_MB_WORD_SWAP);
2170
2171	bnx2_set_power_state_0(bp);
2172
2173	bp->chip_id = REG_RD(bp, BNX2_MISC_ID);
2174
2175	/* Get bus information. */
2176	reg = REG_RD(bp, BNX2_PCICFG_MISC_STATUS);
2177	if (reg & BNX2_PCICFG_MISC_STATUS_PCIX_DET) {
2178		u32 clkreg;
2179
2180		bp->flags |= PCIX_FLAG;
2181
2182		clkreg = REG_RD(bp, BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS);
2183
2184		clkreg &= BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET;
2185		switch (clkreg) {
2186		case BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_133MHZ:
2187			bp->bus_speed_mhz = 133;
2188			break;
2189
2190		case BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_95MHZ:
2191			bp->bus_speed_mhz = 100;
2192			break;
2193
2194		case BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_66MHZ:
2195		case BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_80MHZ:
2196			bp->bus_speed_mhz = 66;
2197			break;
2198
2199		case BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_48MHZ:
2200		case BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_55MHZ:
2201			bp->bus_speed_mhz = 50;
2202			break;
2203
2204		case BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_LOW:
2205		case BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_32MHZ:
2206		case BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_38MHZ:
2207			bp->bus_speed_mhz = 33;
2208			break;
2209		}
2210	}
2211	else {
2212		if (reg & BNX2_PCICFG_MISC_STATUS_M66EN)
2213			bp->bus_speed_mhz = 66;
2214		else
2215			bp->bus_speed_mhz = 33;
2216	}
2217
2218	if (reg & BNX2_PCICFG_MISC_STATUS_32BIT_DET)
2219		bp->flags |= PCI_32BIT_FLAG;
2220
2221	/* 5706A0 may falsely detect SERR and PERR. */
2222	if (CHIP_ID(bp) == CHIP_ID_5706_A0) {
2223		reg = REG_RD(bp, PCI_COMMAND);
2224		reg &= ~(PCI_COMMAND_SERR | PCI_COMMAND_PARITY);
2225		REG_WR(bp, PCI_COMMAND, reg);
2226	}
2227	else if ((CHIP_ID(bp) == CHIP_ID_5706_A1) &&
2228		!(bp->flags & PCIX_FLAG)) {
2229
2230		printf("5706 A1 can only be used in a PCIX bus, aborting.\n");
2231		goto err_out_disable;
2232	}
2233
2234	bnx2_init_nvram(bp);
2235
2236	reg = REG_RD_IND(bp, BNX2_SHM_HDR_SIGNATURE);
2237
2238	if ((reg & BNX2_SHM_HDR_SIGNATURE_SIG_MASK) ==
2239	    BNX2_SHM_HDR_SIGNATURE_SIG)
2240		bp->shmem_base = REG_RD_IND(bp, BNX2_SHM_HDR_ADDR_0);
2241	else
2242		bp->shmem_base = HOST_VIEW_SHMEM_BASE;
2243
2244	/* Get the permanent MAC address.  First we need to make sure the
2245	 * firmware is actually running.
2246	 */
2247	reg = REG_RD_IND(bp, bp->shmem_base + BNX2_DEV_INFO_SIGNATURE);
2248
2249	if ((reg & BNX2_DEV_INFO_SIGNATURE_MAGIC_MASK) !=
2250	    BNX2_DEV_INFO_SIGNATURE_MAGIC) {
2251		printf("Firmware not running, aborting.\n");
2252		rc = -ENODEV;
2253		goto err_out_disable;
2254	}
2255
2256	bp->fw_ver = REG_RD_IND(bp, bp->shmem_base + BNX2_DEV_INFO_BC_REV);
2257
2258	reg = REG_RD_IND(bp, bp->shmem_base + BNX2_PORT_HW_CFG_MAC_UPPER);
2259	bp->mac_addr[0] = (u8) (reg >> 8);
2260	bp->mac_addr[1] = (u8) reg;
2261
2262	reg = REG_RD_IND(bp, bp->shmem_base + BNX2_PORT_HW_CFG_MAC_LOWER);
2263	bp->mac_addr[2] = (u8) (reg >> 24);
2264	bp->mac_addr[3] = (u8) (reg >> 16);
2265	bp->mac_addr[4] = (u8) (reg >> 8);
2266	bp->mac_addr[5] = (u8) reg;
2267
2268	bp->tx_ring_size = MAX_TX_DESC_CNT;
2269	bp->rx_ring_size = RX_BUF_CNT;
2270	bp->rx_max_ring_idx = MAX_RX_DESC_CNT;
2271
2272	bp->rx_offset = RX_OFFSET;
2273
2274	bp->tx_quick_cons_trip_int = 20;
2275	bp->tx_quick_cons_trip = 20;
2276	bp->tx_ticks_int = 80;
2277	bp->tx_ticks = 80;
2278
2279	bp->rx_quick_cons_trip_int = 6;
2280	bp->rx_quick_cons_trip = 6;
2281	bp->rx_ticks_int = 18;
2282	bp->rx_ticks = 18;
2283
2284	bp->stats_ticks = 1000000 & 0xffff00;
2285
2286	bp->phy_addr = 1;
2287
2288	/* No need for WOL support in Etherboot */
2289	bp->flags |= NO_WOL_FLAG;
2290
2291	/* Disable WOL support if we are running on a SERDES chip. */
2292	if (CHIP_BOND_ID(bp) & CHIP_BOND_ID_SERDES_BIT) {
2293		bp->phy_flags |= PHY_SERDES_FLAG;
2294		if (CHIP_NUM(bp) == CHIP_NUM_5708) {
2295			bp->phy_addr = 2;
2296			reg = REG_RD_IND(bp, bp->shmem_base +
2297					 BNX2_SHARED_HW_CFG_CONFIG);
2298			if (reg & BNX2_SHARED_HW_CFG_PHY_2_5G)
2299				bp->phy_flags |= PHY_2_5G_CAPABLE_FLAG;
2300		}
2301	}
2302
2303	if (CHIP_ID(bp) == CHIP_ID_5706_A0) {
2304		bp->tx_quick_cons_trip_int =
2305			bp->tx_quick_cons_trip;
2306		bp->tx_ticks_int = bp->tx_ticks;
2307		bp->rx_quick_cons_trip_int =
2308			bp->rx_quick_cons_trip;
2309		bp->rx_ticks_int = bp->rx_ticks;
2310		bp->comp_prod_trip_int = bp->comp_prod_trip;
2311		bp->com_ticks_int = bp->com_ticks;
2312		bp->cmd_ticks_int = bp->cmd_ticks;
2313	}
2314
2315	bp->autoneg = AUTONEG_SPEED | AUTONEG_FLOW_CTRL;
2316	bp->req_line_speed = 0;
2317	if (bp->phy_flags & PHY_SERDES_FLAG) {
2318		bp->advertising = ETHTOOL_ALL_FIBRE_SPEED | ADVERTISED_Autoneg;
2319
2320		reg = REG_RD_IND(bp, bp->shmem_base + BNX2_PORT_HW_CFG_CONFIG);
2321		reg &= BNX2_PORT_HW_CFG_CFG_DFLT_LINK_MASK;
2322		if (reg == BNX2_PORT_HW_CFG_CFG_DFLT_LINK_1G) {
2323			bp->autoneg = 0;
2324			bp->req_line_speed = bp->line_speed = SPEED_1000;
2325			bp->req_duplex = DUPLEX_FULL;
2326		}
2327	}
2328	else {
2329		bp->advertising = ETHTOOL_ALL_COPPER_SPEED | ADVERTISED_Autoneg;
2330	}
2331
2332	bp->req_flow_ctrl = FLOW_CTRL_RX | FLOW_CTRL_TX;
2333
2334	/* Disable driver heartbeat checking */
2335	REG_WR_IND(bp, bp->shmem_base + BNX2_DRV_PULSE_MB,
2336			BNX2_DRV_MSG_DATA_PULSE_CODE_ALWAYS_ALIVE);
2337	REG_RD_IND(bp, bp->shmem_base + BNX2_DRV_PULSE_MB);
2338
2339	return 0;
2340
2341err_out_disable:
2342	bnx2_disable(nic);
2343
2344	return rc;
2345}
2346
2347static void
2348bnx2_transmit(struct nic *nic, const char *dst_addr,
2349		unsigned int type, unsigned int size, const char *packet)
2350{
2351	/* Sometimes the nic will be behind by a frame.  Using two transmit
2352	 * buffers prevents us from timing out in that case.
2353	 */
2354	static struct eth_frame {
2355		uint8_t  dst_addr[ETH_ALEN];
2356		uint8_t  src_addr[ETH_ALEN];
2357		uint16_t type;
2358		uint8_t  data [ETH_FRAME_LEN - ETH_HLEN];
2359	} frame[2];
2360	static int frame_idx = 0;
2361
2362	/* send the packet to destination */
2363	struct tx_bd *txbd;
2364	struct bnx2 *bp = &bnx2;
2365	u16 prod, ring_prod;
2366	u16 hw_cons;
2367	int i = 0;
2368
2369	prod = bp->tx_prod;
2370	ring_prod = TX_RING_IDX(prod);
2371	hw_cons = bp->status_blk->status_tx_quick_consumer_index0;
2372	if ((hw_cons & MAX_TX_DESC_CNT) == MAX_TX_DESC_CNT) {
2373		hw_cons++;
2374	}
2375
2376	while((hw_cons != prod) && (hw_cons != (PREV_TX_BD(prod)))) {
2377		mdelay(10);	/* give the nic a chance */
2378		//poll_interruptions();
2379		if (++i > 500) { /* timeout 5s for transmit */
2380			printf("transmit timed out\n");
2381			bnx2_disable(bp->nic);
2382			bnx2_init_board(bp->pdev, bp->nic);
2383			return;
2384		}
2385	}
2386	if (i != 0) {
2387		printf("#");
2388	}
2389
2390	/* Copy the packet to the our local buffer */
2391	memcpy(&frame[frame_idx].dst_addr, dst_addr, ETH_ALEN);
2392	memcpy(&frame[frame_idx].src_addr, nic->node_addr, ETH_ALEN);
2393	frame[frame_idx].type = htons(type);
2394	memset(&frame[frame_idx].data, 0, sizeof(frame[frame_idx].data));
2395	memcpy(&frame[frame_idx].data, packet, size);
2396
2397	/* Setup the ring buffer entry to transmit */
2398	txbd = &bp->tx_desc_ring[ring_prod];
2399	txbd->tx_bd_haddr_hi = 0; /* Etherboot runs under 4GB */
2400	txbd->tx_bd_haddr_lo = virt_to_bus(&frame[frame_idx]);
2401	txbd->tx_bd_mss_nbytes = (size + ETH_HLEN);
2402	txbd->tx_bd_vlan_tag_flags = TX_BD_FLAGS_START | TX_BD_FLAGS_END;
2403
2404	/* Advance to the next entry */
2405	prod = NEXT_TX_BD(prod);
2406	frame_idx ^= 1;
2407
2408	bp->tx_prod_bseq += (size + ETH_HLEN);
2409
2410	REG_WR16(bp, MB_TX_CID_ADDR + BNX2_L2CTX_TX_HOST_BIDX, prod);
2411	REG_WR(bp, MB_TX_CID_ADDR + BNX2_L2CTX_TX_HOST_BSEQ, bp->tx_prod_bseq);
2412
2413	wmb();
2414
2415	bp->tx_prod = prod;
2416}
2417
2418static int
2419bnx2_poll_link(struct bnx2 *bp)
2420{
2421	u32 new_link_state, old_link_state, emac_status;
2422
2423	new_link_state = bp->status_blk->status_attn_bits &
2424		STATUS_ATTN_BITS_LINK_STATE;
2425
2426	old_link_state = bp->status_blk->status_attn_bits_ack &
2427		STATUS_ATTN_BITS_LINK_STATE;
2428
2429	if (!new_link_state && !old_link_state) {
2430		/* For some reason the card doesn't always update the link
2431		 * status bits properly.  Kick the stupid thing and try again.
2432		 */
2433		u32 bmsr;
2434
2435		bnx2_read_phy(bp, MII_BMSR, &bmsr);
2436		bnx2_read_phy(bp, MII_BMSR, &bmsr);
2437
2438		if ((bp->phy_flags & PHY_SERDES_FLAG) &&
2439		    (CHIP_NUM(bp) == CHIP_NUM_5706)) {
2440			REG_RD(bp, BNX2_EMAC_STATUS);
2441		}
2442
2443		new_link_state = bp->status_blk->status_attn_bits &
2444			STATUS_ATTN_BITS_LINK_STATE;
2445
2446		old_link_state = bp->status_blk->status_attn_bits_ack &
2447			STATUS_ATTN_BITS_LINK_STATE;
2448
2449		/* Okay, for some reason the above doesn't work with some
2450		 * switches (like HP ProCurve). If the above doesn't work,
2451		 * check the MAC directly to see if we have a link.  Perhaps we
2452		 * should always check the MAC instead probing the MII.
2453		 */
2454		if (!new_link_state && !old_link_state) {
2455			emac_status = REG_RD(bp, BNX2_EMAC_STATUS);
2456			if (emac_status & BNX2_EMAC_STATUS_LINK_CHANGE) {
2457				/* Acknowledge the link change */
2458				REG_WR(bp, BNX2_EMAC_STATUS, BNX2_EMAC_STATUS_LINK_CHANGE);
2459			} else if (emac_status & BNX2_EMAC_STATUS_LINK) {
2460				new_link_state = !old_link_state;
2461			}
2462		}
2463
2464	}
2465
2466	if (new_link_state != old_link_state) {
2467		if (new_link_state) {
2468			REG_WR(bp, BNX2_PCICFG_STATUS_BIT_SET_CMD,
2469				STATUS_ATTN_BITS_LINK_STATE);
2470		}
2471		else {
2472			REG_WR(bp, BNX2_PCICFG_STATUS_BIT_CLEAR_CMD,
2473				STATUS_ATTN_BITS_LINK_STATE);
2474		}
2475
2476		bnx2_set_link(bp);
2477
2478		/* This is needed to take care of transient status
2479		 * during link changes.
2480		 */
2481
2482		REG_WR(bp, BNX2_HC_COMMAND,
2483		       bp->hc_cmd | BNX2_HC_COMMAND_COAL_NOW_WO_INT);
2484		REG_RD(bp, BNX2_HC_COMMAND);
2485
2486	}
2487
2488	return bp->link_up;
2489}
2490
2491static int
2492bnx2_poll(struct nic* nic, int retrieve)
2493{
2494	struct bnx2 *bp = &bnx2;
2495	struct rx_bd *cons_bd, *prod_bd;
2496	u16 hw_cons, sw_cons, sw_ring_cons, sw_prod, sw_ring_prod;
2497	struct l2_fhdr *rx_hdr;
2498	int result = 0;
2499	unsigned int len;
2500	unsigned char *data;
2501	u32 status;
2502
2503#if 0
2504	if ((bp->status_blk->status_idx == bp->last_status_idx) &&
2505	    (REG_RD(bp, BNX2_PCICFG_MISC_STATUS) &
2506	     BNX2_PCICFG_MISC_STATUS_INTA_VALUE)) {
2507
2508		bp->last_status_idx = bp->status_blk->status_idx;
2509		REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD,
2510	       BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID |
2511	       BNX2_PCICFG_INT_ACK_CMD_MASK_INT |
2512	       bp->last_status_idx);
2513		return 0;
2514	}
2515#endif
2516
2517	if ((bp->status_blk->status_rx_quick_consumer_index0 != bp->rx_cons) && !retrieve)
2518		return 1;
2519
2520	if (bp->status_blk->status_rx_quick_consumer_index0 != bp->rx_cons) {
2521
2522		hw_cons = bp->hw_rx_cons = bp->status_blk->status_rx_quick_consumer_index0;
2523		if ((hw_cons & MAX_RX_DESC_CNT) == MAX_RX_DESC_CNT) {
2524			hw_cons++;
2525		}
2526		sw_cons = bp->rx_cons;
2527		sw_prod = bp->rx_prod;
2528
2529		rmb();
2530		if (sw_cons != hw_cons) {
2531
2532			sw_ring_cons = RX_RING_IDX(sw_cons);
2533			sw_ring_prod = RX_RING_IDX(sw_prod);
2534
2535			data = bus_to_virt(bp->rx_desc_ring[sw_ring_cons].rx_bd_haddr_lo);
2536
2537			rx_hdr = (struct l2_fhdr *)data;
2538			len = rx_hdr->l2_fhdr_pkt_len - 4;
2539			if ((len > (ETH_MAX_MTU + ETH_HLEN)) ||
2540				((status = rx_hdr->l2_fhdr_status) &
2541				(L2_FHDR_ERRORS_BAD_CRC |
2542				L2_FHDR_ERRORS_PHY_DECODE |
2543				L2_FHDR_ERRORS_ALIGNMENT |
2544				L2_FHDR_ERRORS_TOO_SHORT |
2545				L2_FHDR_ERRORS_GIANT_FRAME))) {
2546				result = 0;
2547			}
2548			else
2549			{
2550				nic->packetlen = len;
2551				memcpy(nic->packet, data + bp->rx_offset, len);
2552				result = 1;
2553			}
2554
2555			/* Reuse the buffer */
2556			bp->rx_prod_bseq += bp->rx_buf_use_size;
2557			if (sw_cons != sw_prod) {
2558				cons_bd = &bp->rx_desc_ring[sw_ring_cons];
2559				prod_bd = &bp->rx_desc_ring[sw_ring_prod];
2560				prod_bd->rx_bd_haddr_hi = 0; /* Etherboot runs under 4GB */
2561				prod_bd->rx_bd_haddr_lo = cons_bd->rx_bd_haddr_lo;
2562			}
2563
2564			sw_cons = NEXT_RX_BD(sw_cons);
2565			sw_prod = NEXT_RX_BD(sw_prod);
2566
2567		}
2568
2569		bp->rx_cons = sw_cons;
2570		bp->rx_prod = sw_prod;
2571
2572		REG_WR16(bp, MB_RX_CID_ADDR + BNX2_L2CTX_HOST_BDIDX, bp->rx_prod);
2573
2574		REG_WR(bp, MB_RX_CID_ADDR + BNX2_L2CTX_HOST_BSEQ, bp->rx_prod_bseq);
2575
2576		wmb();
2577
2578	}
2579
2580	bnx2_poll_link(bp);
2581
2582#if 0
2583	bp->last_status_idx = bp->status_blk->status_idx;
2584	rmb();
2585
2586	REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD,
2587	       BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID |
2588	       BNX2_PCICFG_INT_ACK_CMD_MASK_INT |
2589	       bp->last_status_idx);
2590
2591	REG_WR(bp, BNX2_HC_COMMAND, bp->hc_cmd | BNX2_HC_COMMAND_COAL_NOW_WO_INT);
2592#endif
2593
2594	return result;
2595}
2596
2597static void
2598bnx2_irq(struct nic *nic __unused, irq_action_t action __unused)
2599{
2600	switch ( action ) {
2601		case DISABLE: break;
2602		case ENABLE: break;
2603		case FORCE: break;
2604	}
2605}
2606
2607static struct nic_operations bnx2_operations = {
2608	.connect	= dummy_connect,
2609	.poll		= bnx2_poll,
2610	.transmit	= bnx2_transmit,
2611	.irq		= bnx2_irq,
2612};
2613
2614static int
2615bnx2_probe(struct nic *nic, struct pci_device *pdev)
2616{
2617	struct bnx2 *bp = &bnx2;
2618	int i, rc;
2619
2620	if (pdev == 0)
2621		return 0;
2622
2623	memset(bp, 0, sizeof(*bp));
2624
2625	rc = bnx2_init_board(pdev, nic);
2626	if (rc < 0) {
2627		return 0;
2628	}
2629
2630	/*
2631	nic->disable = bnx2_disable;
2632	nic->transmit = bnx2_transmit;
2633	nic->poll = bnx2_poll;
2634	nic->irq = bnx2_irq;
2635	*/
2636
2637	nic->nic_op	= &bnx2_operations;
2638
2639	memcpy(nic->node_addr, bp->mac_addr, ETH_ALEN);
2640	printf("Ethernet addr: %s\n", eth_ntoa( nic->node_addr ) );
2641	printf("Broadcom NetXtreme II (%c%d) PCI%s %s %dMHz\n",
2642	        (int) ((CHIP_ID(bp) & 0xf000) >> 12) + 'A',
2643	        (int) ((CHIP_ID(bp) & 0x0ff0) >> 4),
2644		((bp->flags & PCIX_FLAG) ? "-X" : ""),
2645		((bp->flags & PCI_32BIT_FLAG) ? "32-bit" : "64-bit"),
2646		bp->bus_speed_mhz);
2647
2648	bnx2_set_power_state_0(bp);
2649	bnx2_disable_int(bp);
2650
2651	bnx2_alloc_mem(bp);
2652
2653	rc = bnx2_init_nic(bp);
2654	if (rc) {
2655		return 0;
2656	}
2657
2658	bnx2_poll_link(bp);
2659	for(i = 0; !bp->link_up && (i < VALID_LINK_TIMEOUT*100); i++) {
2660		mdelay(1);
2661		bnx2_poll_link(bp);
2662	}
2663#if 1
2664	if (!bp->link_up){
2665		printf("Valid link not established\n");
2666		goto err_out_disable;
2667	}
2668#endif
2669
2670	return 1;
2671
2672err_out_disable:
2673	bnx2_disable(nic);
2674	return 0;
2675}
2676
2677static struct pci_device_id bnx2_nics[] = {
2678	PCI_ROM(0x14e4, 0x164a, "bnx2-5706",        "Broadcom NetXtreme II BCM5706", 0),
2679	PCI_ROM(0x14e4, 0x164c, "bnx2-5708",        "Broadcom NetXtreme II BCM5708", 0),
2680	PCI_ROM(0x14e4, 0x16aa, "bnx2-5706S",       "Broadcom NetXtreme II BCM5706S", 0),
2681	PCI_ROM(0x14e4, 0x16ac, "bnx2-5708S",       "Broadcom NetXtreme II BCM5708S", 0),
2682};
2683
2684PCI_DRIVER ( bnx2_driver, bnx2_nics, PCI_NO_CLASS );
2685
2686DRIVER ( "BNX2", nic_driver, pci_driver, bnx2_driver, bnx2_probe, bnx2_disable );
2687
2688/*
2689static struct pci_driver bnx2_driver __pci_driver = {
2690	.type     = NIC_DRIVER,
2691	.name     = "BNX2",
2692	.probe    = bnx2_probe,
2693	.ids      = bnx2_nics,
2694	.id_count = sizeof(bnx2_nics)/sizeof(bnx2_nics[0]),
2695	.class    = 0,
2696};
2697*/
2698