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 (at) broadcom.com) 10 * 11 * Etherboot port by Ryan Jackson (rjackson (at) lnxi.com), based on driver 12 * version 1.4.40 from linux 2.6.17 13 */ 14 15 FILE_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 */ 39 static 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 47 static struct bnx2 bnx2; 48 49 static 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 136 static u32 137 bnx2_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 143 static void 144 bnx2_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 150 static void 151 bnx2_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 158 static int 159 bnx2_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 215 static int 216 bnx2_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 264 static void 265 bnx2_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 273 static int 274 bnx2_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 294 static void 295 bnx2_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 350 static void 351 bnx2_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 383 static void 384 bnx2_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 459 static int 460 bnx2_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 488 static int 489 bnx2_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 525 static int 526 bnx2_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 591 static int 592 bnx2_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 658 static int 659 bnx2_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 724 static int 725 bnx2_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, ®); 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 748 static u32 749 bnx2_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 782 static int 783 bnx2_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 895 static int 896 bnx2_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 990 static int 991 bnx2_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 1004 static int 1005 bnx2_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 1058 static int 1059 bnx2_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 1081 static int 1082 bnx2_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 1113 static int 1114 bnx2_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 1146 static int 1147 bnx2_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 1188 static void 1189 bnx2_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 1229 static int 1230 bnx2_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 1272 static void 1273 bnx2_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 1288 static void 1289 bnx2_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 1320 static void 1321 load_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 1352 static void 1353 load_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 1426 static void 1427 bnx2_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 1627 static int 1628 bnx2_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 1655 static void 1656 bnx2_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 1666 static void 1667 bnx2_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 1678 static int 1679 bnx2_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 1752 static int 1753 bnx2_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 1833 static void 1834 bnx2_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 1844 static int 1845 bnx2_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 2004 static void 2005 bnx2_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 2036 static void 2037 bnx2_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 2088 static int 2089 bnx2_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 2104 static int 2105 bnx2_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 2117 static int 2118 bnx2_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 2341 err_out_disable: 2342 bnx2_disable(nic); 2343 2344 return rc; 2345 } 2346 2347 static void 2348 bnx2_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 2418 static int 2419 bnx2_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 2491 static int 2492 bnx2_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 2597 static void 2598 bnx2_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 2607 static struct nic_operations bnx2_operations = { 2608 .connect = dummy_connect, 2609 .poll = bnx2_poll, 2610 .transmit = bnx2_transmit, 2611 .irq = bnx2_irq, 2612 }; 2613 2614 static int 2615 bnx2_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 2672 err_out_disable: 2673 bnx2_disable(nic); 2674 return 0; 2675 } 2676 2677 static 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 2684 PCI_DRIVER ( bnx2_driver, bnx2_nics, PCI_NO_CLASS ); 2685 2686 DRIVER ( "BNX2", nic_driver, pci_driver, bnx2_driver, bnx2_probe, bnx2_disable ); 2687 2688 /* 2689 static 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