Print this page
Just the 5719/5720 changes

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/io/bge/bge_chip2.c
          +++ new/usr/src/uts/common/io/bge/bge_chip2.c
↓ open down ↓ 16 lines elided ↑ open up ↑
  17   17   * information: Portions Copyright [yyyy] [name of copyright owner]
  18   18   *
  19   19   * CDDL HEADER END
  20   20   */
  21   21  
  22   22  /*
  23   23   * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
  24   24   */
  25   25  
  26   26  /*
  27      - * Copyright 2011 Nexenta Systems, Inc.  All rights reserved.
       27 + * Copyright 2011, 2012 Nexenta Systems, Inc.  All rights reserved.
  28   28   */
  29   29  
  30   30  #include "bge_impl.h"
  31   31  
  32   32  #define PIO_ADDR(bgep, offset)  ((void *)((caddr_t)(bgep)->io_regs+(offset)))
  33   33  
  34   34  /*
  35   35   * Future features ... ?
  36   36   */
  37   37  #define BGE_CFG_IO8     1       /* 8/16-bit cfg space BIS/BIC   */
↓ open down ↓ 318 lines elided ↑ open up ↑
 356  356  
 357  357          /*
 358  358           * For some chipsets (e.g., BCM5718), if MHCR_ENABLE_ENDIAN_BYTE_SWAP
 359  359           * has been set in PCI_CONF_COMM already, we need to write the
 360  360           * byte-swapped value to it. So we just write zero first for simplicity.
 361  361           */
 362  362          cidp->device = pci_config_get16(handle, PCI_CONF_DEVID);
 363  363          if (DEVICE_5717_SERIES_CHIPSETS(bgep))
 364  364                  pci_config_put32(handle, PCI_CONF_BGE_MHCR, 0);
 365  365          mhcr = pci_config_get32(handle, PCI_CONF_BGE_MHCR);
 366      -        cidp->asic_rev = mhcr & MHCR_CHIP_REV_MASK;
      366 +        cidp->asic_rev = (mhcr & MHCR_CHIP_REV_MASK) >> MHCR_CHIP_REV_SHIFT;
      367 +        if (MHCR_CHIP_ASIC_REV(cidp->asic_rev) == MHCR_CHIP_ASIC_REV_PRODID) {
      368 +                uint32_t reg;
      369 +                switch (cidp->device) {
      370 +                case DEVICE_ID_5717:
      371 +                case DEVICE_ID_5718:
      372 +                case DEVICE_ID_5719:
      373 +                case DEVICE_ID_5720:
      374 +                        reg = PCI_CONF_GEN2_PRODID_ASICREV;
      375 +                        break;
      376 +                case DEVICE_ID_57781:
      377 +                case DEVICE_ID_57785:
      378 +                case DEVICE_ID_57761:
      379 +                case DEVICE_ID_57765:
      380 +                case DEVICE_ID_57791:
      381 +                case DEVICE_ID_57795:
      382 +                case DEVICE_ID_57762:
      383 +                case DEVICE_ID_57766:
      384 +                case DEVICE_ID_57782:
      385 +                case DEVICE_ID_57786:
      386 +                        reg = PCI_CONF_GEN15_PRODID_ASICREV;
      387 +                        break;
      388 +                default:
      389 +                        reg = PCI_CONF_PRODID_ASICREV;
      390 +                        break;
      391 +                }
      392 +                cidp->asic_rev = pci_config_get32(handle, reg);
      393 +        }
 367  394          cidp->businfo = pci_config_get32(handle, PCI_CONF_BGE_PCISTATE);
 368  395          cidp->command = pci_config_get16(handle, PCI_CONF_COMM);
 369  396  
 370  397          cidp->vendor = pci_config_get16(handle, PCI_CONF_VENID);
 371  398          cidp->subven = pci_config_get16(handle, PCI_CONF_SUBVENID);
 372  399          cidp->subdev = pci_config_get16(handle, PCI_CONF_SUBSYSID);
 373  400          cidp->revision = pci_config_get8(handle, PCI_CONF_REVID);
 374  401          cidp->clsize = pci_config_get8(handle, PCI_CONF_CACHE_LINESZ);
 375  402          cidp->latency = pci_config_get8(handle, PCI_CONF_LATENCY_TIMER);
 376  403  
↓ open down ↓ 2 lines elided ↑ open up ↑
 379  406              cidp->businfo & PCISTATE_BUS_IS_FAST ? "fast" : "slow",
 380  407              cidp->businfo & PCISTATE_BUS_IS_32_BIT ? "narrow" : "wide",
 381  408              cidp->businfo & PCISTATE_INTA_STATE ? "high" : "low"));
 382  409          BGE_DEBUG(("bge_chip_cfg_init: vendor 0x%x device 0x%x revision 0x%x",
 383  410              cidp->vendor, cidp->device, cidp->revision));
 384  411          BGE_DEBUG(("bge_chip_cfg_init: subven 0x%x subdev 0x%x asic_rev 0x%x",
 385  412              cidp->subven, cidp->subdev, cidp->asic_rev));
 386  413          BGE_DEBUG(("bge_chip_cfg_init: clsize %d latency %d command 0x%x",
 387  414              cidp->clsize, cidp->latency, cidp->command));
 388  415  
      416 +        cidp->chip_type = 0;
      417 +        if (MHCR_CHIP_ASIC_REV(cidp->asic_rev) == MHCR_CHIP_ASIC_REV_5717 ||
      418 +            MHCR_CHIP_ASIC_REV(cidp->asic_rev) == MHCR_CHIP_ASIC_REV_5719 ||
      419 +            MHCR_CHIP_ASIC_REV(cidp->asic_rev) == MHCR_CHIP_ASIC_REV_5720)
      420 +                cidp->chip_type |= CHIP_TYPE_5717_PLUS;
      421 +
      422 +        if (MHCR_CHIP_ASIC_REV(cidp->asic_rev) == MHCR_CHIP_ASIC_REV_57765 ||
      423 +            MHCR_CHIP_ASIC_REV(cidp->asic_rev) == MHCR_CHIP_ASIC_REV_57766)
      424 +                cidp->chip_type |= CHIP_TYPE_57765_CLASS;
      425 +
      426 +        if (cidp->chip_type & CHIP_TYPE_57765_CLASS ||
      427 +            cidp->chip_type & CHIP_TYPE_5717_PLUS)
      428 +                cidp->chip_type |= CHIP_TYPE_57765_PLUS;
      429 +
      430 +        /* Intentionally exclude ASIC_REV_5906 */
      431 +        if (MHCR_CHIP_ASIC_REV(cidp->asic_rev) == MHCR_CHIP_ASIC_REV_5755 ||
      432 +            MHCR_CHIP_ASIC_REV(cidp->asic_rev) == MHCR_CHIP_ASIC_REV_5787 ||
      433 +            MHCR_CHIP_ASIC_REV(cidp->asic_rev) == MHCR_CHIP_ASIC_REV_5784 ||
      434 +            MHCR_CHIP_ASIC_REV(cidp->asic_rev) == MHCR_CHIP_ASIC_REV_5761 ||
      435 +            MHCR_CHIP_ASIC_REV(cidp->asic_rev) == MHCR_CHIP_ASIC_REV_5785 ||
      436 +            MHCR_CHIP_ASIC_REV(cidp->asic_rev) == MHCR_CHIP_ASIC_REV_57780 ||
      437 +            cidp->chip_type & CHIP_TYPE_57765_PLUS)
      438 +                cidp->chip_type |= CHIP_TYPE_5755_PLUS;
      439 +
      440 +        if (MHCR_CHIP_ASIC_REV(cidp->asic_rev) == MHCR_CHIP_ASIC_REV_5780 ||
      441 +            MHCR_CHIP_ASIC_REV(cidp->asic_rev) == MHCR_CHIP_ASIC_REV_5714)
      442 +                cidp->chip_type |= CHIP_TYPE_5780_CLASS;
      443 +
      444 +        if (MHCR_CHIP_ASIC_REV(cidp->asic_rev) == MHCR_CHIP_ASIC_REV_5750 ||
      445 +            MHCR_CHIP_ASIC_REV(cidp->asic_rev) == MHCR_CHIP_ASIC_REV_5752 ||
      446 +            MHCR_CHIP_ASIC_REV(cidp->asic_rev) == MHCR_CHIP_ASIC_REV_5906 ||
      447 +            cidp->chip_type & CHIP_TYPE_5755_PLUS ||
      448 +            cidp->chip_type & CHIP_TYPE_5780_CLASS)
      449 +                cidp->chip_type |= CHIP_TYPE_5750_PLUS;
      450 +
      451 +        if (MHCR_CHIP_ASIC_REV(cidp->asic_rev) == MHCR_CHIP_ASIC_REV_5705 ||
      452 +            cidp->chip_type & CHIP_TYPE_5750_PLUS)
      453 +                cidp->chip_type |= CHIP_TYPE_5705_PLUS;
      454 +
 389  455          /*
 390  456           * Step 2 (also step 6): disable and clear interrupts.
 391  457           * Steps 11-13: configure PIO endianness options, and enable
 392  458           * indirect register access.  We'll also select any other
 393  459           * options controlled by the MHCR (e.g. tagged status, mask
 394  460           * interrupt mode) at this stage ...
 395  461           *
 396  462           * Note: internally, the chip is 64-bit and BIG-endian, but
 397  463           * since it talks to the host over a (LITTLE-endian) PCI bus,
 398  464           * it normally swaps bytes around at the PCI interface.
↓ open down ↓ 39 lines elided ↑ open up ↑
 438  504           * an interrupt between the check at (2) and the mbox write
 439  505           * at (3), this interrupt would be lost :-(
 440  506           *
 441  507           * The best way to avoid this is to use TAGGED STATUS mode,
 442  508           * where the chip includes a unique tag in each status block
 443  509           * update, and the host, when re-enabling interrupts, passes
 444  510           * the last tag it saw back to the chip; then the chip can
 445  511           * see whether the host is truly up to date, and regenerate
 446  512           * its interrupt if not.
 447  513           */
 448      -        mhcr =  MHCR_ENABLE_INDIRECT_ACCESS |
      514 +        mhcr = MHCR_ENABLE_INDIRECT_ACCESS |
 449  515              MHCR_ENABLE_TAGGED_STATUS_MODE |
      516 +            MHCR_ENABLE_PCI_STATE_WRITE |
 450  517              MHCR_MASK_INTERRUPT_MODE |
 451  518              MHCR_CLEAR_INTERRUPT_INTA;
 452  519  
 453  520          if (bgep->intr_type == DDI_INTR_TYPE_FIXED)
 454  521                  mhcr |= MHCR_MASK_PCI_INT_OUTPUT;
 455  522  
 456  523  #ifdef  _BIG_ENDIAN
 457  524          mhcr |= MHCR_ENABLE_ENDIAN_WORD_SWAP | MHCR_ENABLE_ENDIAN_BYTE_SWAP;
 458  525  #endif  /* _BIG_ENDIAN */
 459  526  
↓ open down ↓ 1429 lines elided ↑ open up ↑
1889 1956          case DEVICE_ID_5703C:
1890 1957          case DEVICE_ID_5703S:
1891 1958          case DEVICE_ID_5704C:
1892 1959          case DEVICE_ID_5704S:
1893 1960          case DEVICE_ID_5704:
1894 1961          case DEVICE_ID_5705M:
1895 1962          case DEVICE_ID_5705C:
1896 1963          case DEVICE_ID_5705_2:
1897 1964          case DEVICE_ID_5717:
1898 1965          case DEVICE_ID_5718:
     1966 +        case DEVICE_ID_5719:
     1967 +        case DEVICE_ID_5720:
1899 1968          case DEVICE_ID_5724:
1900 1969          case DEVICE_ID_57760:
1901 1970          case DEVICE_ID_57780:
1902 1971          case DEVICE_ID_57788:
1903 1972          case DEVICE_ID_57790:
1904 1973          case DEVICE_ID_5780:
1905 1974          case DEVICE_ID_5782:
1906 1975          case DEVICE_ID_5784M:
1907 1976          case DEVICE_ID_5785:
1908 1977          case DEVICE_ID_5787:
↓ open down ↓ 113 lines elided ↑ open up ↑
2022 2091          cidp->tx_count_norm = bge_tx_count_norm;
2023 2092          cidp->mask_pci_int = MHCR_MASK_PCI_INT_OUTPUT;
2024 2093  
2025 2094          if (cidp->rx_rings == 0 || cidp->rx_rings > BGE_RECV_RINGS_MAX)
2026 2095                  cidp->rx_rings = BGE_RECV_RINGS_DEFAULT;
2027 2096          if (cidp->tx_rings == 0 || cidp->tx_rings > BGE_SEND_RINGS_MAX)
2028 2097                  cidp->tx_rings = BGE_SEND_RINGS_DEFAULT;
2029 2098  
2030 2099          cidp->msi_enabled = B_FALSE;
2031 2100  
     2101 +        if (MHCR_CHIP_ASIC_REV(bgep->chipid.asic_rev) >
     2102 +            MHCR_CHIP_ASIC_REV_PRODID ||
     2103 +            MHCR_CHIP_ASIC_REV(bgep->chipid.asic_rev) ==
     2104 +            MHCR_CHIP_ASIC_REV_5906 ||
     2105 +            MHCR_CHIP_ASIC_REV(bgep->chipid.asic_rev) ==
     2106 +            MHCR_CHIP_ASIC_REV_5700 ||
     2107 +            MHCR_CHIP_ASIC_REV(bgep->chipid.asic_rev) ==
     2108 +            MHCR_CHIP_ASIC_REV_5701 ||
     2109 +            MHCR_CHIP_ASIC_REV(bgep->chipid.asic_rev) ==
     2110 +            MHCR_CHIP_ASIC_REV_5750)
     2111 +                /*
     2112 +                 * Just a plain reset; the "check" code breaks these chips
     2113 +                 */
     2114 +                cidp->flags |= CHIP_FLAG_NO_CHECK_RESET;
     2115 +
2032 2116          switch (cidp->device) {
2033 2117          case DEVICE_ID_5717:
2034 2118          case DEVICE_ID_5718:
     2119 +        case DEVICE_ID_5719:
     2120 +        case DEVICE_ID_5720:
2035 2121          case DEVICE_ID_5724:
2036 2122                  if (cidp->device == DEVICE_ID_5717)
2037 2123                          cidp->chip_label = 5717;
2038 2124                  else if (cidp->device == DEVICE_ID_5718)
2039 2125                          cidp->chip_label = 5718;
     2126 +                else if (cidp->device == DEVICE_ID_5719)
     2127 +                        cidp->chip_label = 5719;
     2128 +                else if (cidp->device == DEVICE_ID_5720)
     2129 +                        cidp->chip_label = 5720;
2040 2130                  else
2041 2131                          cidp->chip_label = 5724;
2042 2132                  cidp->msi_enabled = bge_enable_msi;
2043 2133  #ifdef __sparc
2044 2134                  cidp->mask_pci_int = LE_32(MHCR_MASK_PCI_INT_OUTPUT);
2045 2135  #endif
2046 2136                  cidp->bge_dma_rwctrl = LE_32(PDRWCR_VAR_5717);
2047 2137                  cidp->pci_type = BGE_PCI_E;
2048 2138                  cidp->mbuf_lo_water_rdma = RDMA_MBUF_LOWAT_5705;
2049 2139                  cidp->mbuf_lo_water_rmac = MAC_RX_MBUF_LOWAT_5717;
2050 2140                  cidp->mbuf_hi_water = MBUF_HIWAT_5717;
2051 2141                  cidp->mbuf_base = bge_mbuf_pool_base_5705;
2052 2142                  cidp->mbuf_length = bge_mbuf_pool_len_5705;
2053      -                cidp->recv_slots = BGE_RECV_SLOTS_5705;
     2143 +                cidp->recv_slots = BGE_RECV_SLOTS_5717;
2054 2144                  cidp->bge_mlcr_default = MLCR_DEFAULT_5717;
2055 2145                  cidp->rx_rings = BGE_RECV_RINGS_MAX_5705;
2056 2146                  cidp->tx_rings = BGE_SEND_RINGS_MAX_5705;
2057 2147                  cidp->flags |= CHIP_FLAG_NO_JUMBO;
2058 2148                  cidp->statistic_type = BGE_STAT_REG;
2059 2149                  dev_ok = B_TRUE;
2060 2150                  break;
2061 2151  
2062 2152          case DEVICE_ID_5700:
2063 2153          case DEVICE_ID_5700x:
↓ open down ↓ 1360 lines elided ↑ open up ↑
3424 3514                          MHCR_CLEAR_INTERRUPT_INTA |
3425 3515                          MHCR_ENABLE_ENDIAN_WORD_SWAP |
3426 3516                          MHCR_ENABLE_ENDIAN_BYTE_SWAP;
3427 3517  
3428 3518                  if (bgep->intr_type == DDI_INTR_TYPE_FIXED)
3429 3519                          mhcr |= MHCR_MASK_PCI_INT_OUTPUT;
3430 3520  
3431 3521                  if (DEVICE_5717_SERIES_CHIPSETS(bgep))
3432 3522                          pci_config_put32(bgep->cfg_handle, PCI_CONF_BGE_MHCR,
3433 3523                                          0);
     3524 +#else
     3525 +                mhcr = MHCR_ENABLE_INDIRECT_ACCESS |
     3526 +                        MHCR_ENABLE_TAGGED_STATUS_MODE |
     3527 +                        MHCR_MASK_INTERRUPT_MODE |
     3528 +                        MHCR_MASK_PCI_INT_OUTPUT |
     3529 +                        MHCR_CLEAR_INTERRUPT_INTA;
     3530 +#endif
3434 3531                  pci_config_put32(bgep->cfg_handle, PCI_CONF_BGE_MHCR, mhcr);
3435 3532                  bge_reg_put32(bgep, MEMORY_ARBITER_MODE_REG,
3436 3533                          bge_reg_get32(bgep, MEMORY_ARBITER_MODE_REG) |
3437 3534                          MEMORY_ARBITER_ENABLE);
3438      -#endif
3439 3535                  if (asf_mode == ASF_MODE_INIT) {
3440 3536                          bge_asf_pre_reset_operations(bgep, BGE_INIT_RESET);
3441 3537                  } else if (asf_mode == ASF_MODE_SHUTDOWN) {
3442 3538                          bge_asf_pre_reset_operations(bgep, BGE_SHUTDOWN_RESET);
3443 3539                  }
3444 3540          }
3445 3541  #endif
3446 3542          /*
3447 3543           * Adapted from Broadcom document 570X-PG102-R, pp 102-116.
3448 3544           * Updated to reflect Broadcom document 570X-PG104-R, pp 146-159.
↓ open down ↓ 3 lines elided ↑ open up ↑
3452 3548           * and Misc Host Control Register as specified in step-13
3453 3549           * Step 4-5: reset Core clock & wait for completion
3454 3550           * Steps 6-8: are done by bge_chip_cfg_init()
3455 3551           * put the T3_MAGIC_NUMBER into the GENCOMM port before reset
3456 3552           */
3457 3553          if (!bge_chip_enable_engine(bgep, MEMORY_ARBITER_MODE_REG, 0))
3458 3554                  retval = DDI_FAILURE;
3459 3555  
3460 3556          mhcr = MHCR_ENABLE_INDIRECT_ACCESS |
3461 3557              MHCR_ENABLE_TAGGED_STATUS_MODE |
     3558 +            MHCR_ENABLE_PCI_STATE_WRITE |
3462 3559              MHCR_MASK_INTERRUPT_MODE |
3463 3560              MHCR_CLEAR_INTERRUPT_INTA;
3464 3561  
3465 3562          if (bgep->intr_type == DDI_INTR_TYPE_FIXED)
3466 3563                  mhcr |= MHCR_MASK_PCI_INT_OUTPUT;
3467 3564  
3468 3565  #ifdef  _BIG_ENDIAN
3469 3566          mhcr |= MHCR_ENABLE_ENDIAN_WORD_SWAP | MHCR_ENABLE_ENDIAN_BYTE_SWAP;
3470 3567  #endif  /* _BIG_ENDIAN */
3471 3568          if (DEVICE_5717_SERIES_CHIPSETS(bgep))
3472 3569                  pci_config_put32(bgep->cfg_handle, PCI_CONF_BGE_MHCR, 0);
3473 3570          pci_config_put32(bgep->cfg_handle, PCI_CONF_BGE_MHCR, mhcr);
3474 3571  #ifdef BGE_IPMI_ASF
3475 3572          if (bgep->asf_enabled)
3476 3573                  bgep->asf_wordswapped = B_FALSE;
3477 3574  #endif
     3575 +
     3576 +        if (DEVICE_IS_5755_PLUS(bgep) ||
     3577 +            MHCR_CHIP_ASIC_REV(bgep->chipid.asic_rev) ==
     3578 +            MHCR_CHIP_ASIC_REV_5752)
     3579 +                bge_reg_put32(bgep, GRC_FASTBOOT_PC, 0);
     3580 +
3478 3581          /*
3479 3582           * NVRAM Corruption Workaround
3480 3583           */
3481 3584          for (tries = 0; tries < MAX_TRY_NVMEM_ACQUIRE; tries++)
3482 3585                  if (bge_nvmem_acquire(bgep) != EAGAIN)
3483 3586                          break;
3484 3587          if (tries >= MAX_TRY_NVMEM_ACQUIRE)
3485 3588                  BGE_DEBUG(("%s: fail to acquire nvram lock",
3486 3589                          bgep->ifname));
3487 3590  
↓ open down ↓ 39 lines elided ↑ open up ↑
3527 3630           * use those features.
3528 3631           * Steps 14-15: Configure DMA endianness options.  See
3529 3632           * the comments on the setting of the MHCR above.
3530 3633           */
3531 3634  #ifdef  _BIG_ENDIAN
3532 3635          modeflags = MODE_WORD_SWAP_FRAME | MODE_BYTE_SWAP_FRAME |
3533 3636                      MODE_WORD_SWAP_NONFRAME | MODE_BYTE_SWAP_NONFRAME;
3534 3637  #else
3535 3638          modeflags = MODE_WORD_SWAP_FRAME | MODE_BYTE_SWAP_FRAME;
3536 3639  #endif  /* _BIG_ENDIAN */
     3640 +        if (MHCR_CHIP_ASIC_REV(bgep->chipid.asic_rev) ==
     3641 +            MHCR_CHIP_ASIC_REV_5720)
     3642 +                modeflags |=
     3643 +                    MODE_BYTE_SWAP_B2HRX_DATA | MODE_WORD_SWAP_B2HRX_DATA |
     3644 +                    MODE_B2HRX_ENABLE | MODE_HTX2B_ENABLE;
3537 3645  #ifdef BGE_IPMI_ASF
3538 3646          if (bgep->asf_enabled)
3539 3647                  modeflags |= MODE_HOST_STACK_UP;
3540 3648  #endif
3541 3649          bge_reg_put32(bgep, MODE_CONTROL_REG, modeflags);
3542 3650  
3543 3651  #ifdef BGE_IPMI_ASF
3544 3652          if (bgep->asf_enabled) {
3545 3653  #ifdef __sparc
3546 3654                  bge_reg_put32(bgep, MEMORY_ARBITER_MODE_REG,
↓ open down ↓ 64 lines elided ↑ open up ↑
3611 3719           */
3612 3720          bge_reg_put32(bgep, MISC_LOCAL_CONTROL_REG,
3613 3721              bgep->chipid.bge_mlcr_default);
3614 3722          bge_reg_set32(bgep, SERIAL_EEPROM_ADDRESS_REG, SEEPROM_ACCESS_INIT);
3615 3723  
3616 3724          /*
3617 3725           * Step 20: clear the Ethernet MAC mode register
3618 3726           */
3619 3727          bge_reg_put32(bgep, ETHERNET_MAC_MODE_REG, 0);
3620 3728  
     3729 +        if (MHCR_CHIP_ASIC_REV(bgep->chipid.asic_rev) ==
     3730 +            MHCR_CHIP_ASIC_REV_5720) {
     3731 +                uint32_t regval = bge_reg_get32(bgep, CPMU_CLCK_ORIDE_REG);
     3732 +                bge_reg_put32(bgep, CPMU_CLCK_ORIDE_REG,
     3733 +                    regval & ~CPMU_CLCK_ORIDE_MAC_ORIDE_EN);
     3734 +        }
     3735 +
3621 3736          /*
3622 3737           * Step 21: restore cache-line-size, latency timer, and
3623 3738           * subsystem ID registers to their original values (not
3624 3739           * those read into the local structure <chipid>, 'cos
3625 3740           * that was after they were cleared by the RESET).
3626 3741           *
3627 3742           * Note: the Subsystem Vendor/Device ID registers are not
3628 3743           * directly writable in config space, so we use the shadow
3629 3744           * copy in "Page Zero" of register space to restore them
3630 3745           * both in one go ...
↓ open down ↓ 206 lines elided ↑ open up ↑
3837 3952                  bge_reg_put32(bgep, DMAD_POOL_LOWAT_REG,
3838 3953                      bge_dmad_lo_water);
3839 3954                  bge_reg_put32(bgep, DMAD_POOL_HIWAT_REG,
3840 3955                      bge_dmad_hi_water);
3841 3956          }
3842 3957          bge_reg_put32(bgep, LOWAT_MAX_RECV_FRAMES_REG, bge_lowat_recv_frames);
3843 3958  
3844 3959          /*
3845 3960           * Steps 34-36: enable buffer manager & internal h/w queues
3846 3961           */
3847      -        if (!bge_chip_enable_engine(bgep, BUFFER_MANAGER_MODE_REG,
3848      -            STATE_MACHINE_ATTN_ENABLE_BIT))
     3962 +
     3963 +        regval = STATE_MACHINE_ATTN_ENABLE_BIT;
     3964 +        if (MHCR_CHIP_ASIC_REV(bgep->chipid.asic_rev) ==
     3965 +            MHCR_CHIP_ASIC_REV_5719)
     3966 +                regval |= BUFF_MGR_NO_TX_UNDERRUN;
     3967 +        if (MHCR_CHIP_ASIC_REV(bgep->chipid.asic_rev) ==
     3968 +            MHCR_CHIP_ASIC_REV_5717 ||
     3969 +            bgep->chipid.asic_rev == MHCR_CHIP_REV_5719_A0 ||
     3970 +            bgep->chipid.asic_rev == MHCR_CHIP_REV_5720_A0)
     3971 +                regval |= BUFF_MGR_MBUF_LOW_ATTN_ENABLE;
     3972 +        if (!bge_chip_enable_engine(bgep, BUFFER_MANAGER_MODE_REG, regval))
3849 3973                  retval = DDI_FAILURE;
3850 3974          if (!bge_chip_enable_engine(bgep, FTQ_RESET_REG, 0))
3851 3975                  retval = DDI_FAILURE;
3852 3976  
3853 3977          /*
3854 3978           * Steps 37-39: initialise Receive Buffer (Producer) RCBs
3855 3979           */
3856 3980          if (DEVICE_5717_SERIES_CHIPSETS(bgep)) {
3857 3981                  buff_ring_t *brp = &bgep->buff[BGE_STD_BUFF_RING];
3858 3982                  bge_reg_put64(bgep, STD_RCV_BD_RING_RCB_REG,
↓ open down ↓ 73 lines elided ↑ open up ↑
3932 4056  
3933 4057          /*
3934 4058           * Step 49: configure the MTU
3935 4059           */
3936 4060          mtu = bgep->chipid.ethmax_size+ETHERFCSL+VLAN_TAGSZ;
3937 4061          bge_reg_put32(bgep, MAC_RX_MTU_SIZE_REG, mtu);
3938 4062  
3939 4063          /*
3940 4064           * Step 50: configure the IPG et al
3941 4065           */
3942      -        bge_reg_put32(bgep, MAC_TX_LENGTHS_REG, MAC_TX_LENGTHS_DEFAULT);
     4066 +        regval = MAC_TX_LENGTHS_DEFAULT;
     4067 +        if (MHCR_CHIP_ASIC_REV(bgep->chipid.asic_rev)
     4068 +            == MHCR_CHIP_ASIC_REV_5720)
     4069 +                regval |= bge_reg_get32(bgep, MAC_TX_LENGTHS_REG) &
     4070 +                    (MAC_TX_LENGTHS_JMB_FRM_LEN_MSK |
     4071 +                    MAC_TX_LENGTHS_CNT_DWN_VAL_MSK);
     4072 +        bge_reg_put32(bgep, MAC_TX_LENGTHS_REG, regval);
3943 4073  
3944 4074          /*
3945 4075           * Step 51: configure the default Rx Return Ring
3946 4076           */
3947 4077          bge_reg_put32(bgep, RCV_RULES_CONFIG_REG, RCV_RULES_CONFIG_DEFAULT);
3948 4078  
3949 4079          /*
3950 4080           * Steps 52-54: configure Receive List Placement,
3951 4081           * and enable Receive List Placement Statistics
3952 4082           */
↓ open down ↓ 134 lines elided ↑ open up ↑
4087 4217           * the Receive Data Initiator Engine, the Send Data Initiator Engine,
4088 4218           * the Send BD Initiator Engine, and the Send BD Selector Engine.
4089 4219           *
4090 4220           * Beware exhaust fumes?
4091 4221           */
4092 4222          if (DEVICE_5704_SERIES_CHIPSETS(bgep))
4093 4223                  if (!bge_chip_enable_engine(bgep, DMA_COMPLETION_MODE_REG, 0))
4094 4224                          retval = DDI_FAILURE;
4095 4225          dma_wrprio = (bge_dma_wrprio << DMA_PRIORITY_SHIFT) |
4096 4226              ALL_DMA_ATTN_BITS;
4097      -        if ((MHCR_CHIP_ASIC_REV(bgep->chipid.asic_rev) ==
4098      -            MHCR_CHIP_ASIC_REV_5755) ||
4099      -            DEVICE_5723_SERIES_CHIPSETS(bgep) ||
4100      -            DEVICE_5906_SERIES_CHIPSETS(bgep)) {
     4227 +        if (DEVICE_IS_5755_PLUS(bgep))
4101 4228                  dma_wrprio |= DMA_STATUS_TAG_FIX_CQ12384;
4102      -        }
4103 4229          if (!bge_chip_enable_engine(bgep, WRITE_DMA_MODE_REG,
4104 4230              dma_wrprio))
4105 4231                  retval = DDI_FAILURE;
     4232 +        if (MHCR_CHIP_ASIC_REV(bgep->chipid.asic_rev) ==
     4233 +            MHCR_CHIP_ASIC_REV_5761 ||
     4234 +            MHCR_CHIP_ASIC_REV(bgep->chipid.asic_rev) ==
     4235 +            MHCR_CHIP_ASIC_REV_5784 ||
     4236 +            MHCR_CHIP_ASIC_REV(bgep->chipid.asic_rev) ==
     4237 +            MHCR_CHIP_ASIC_REV_5785 ||
     4238 +            MHCR_CHIP_ASIC_REV(bgep->chipid.asic_rev) ==
     4239 +            MHCR_CHIP_ASIC_REV_57780 ||
     4240 +            DEVICE_IS_57765_PLUS(bgep)) {
     4241 +                regval = bge_reg_get32(bgep, READ_DMA_RESERVED_CONTROL_REG);
     4242 +                if (MHCR_CHIP_ASIC_REV(bgep->chipid.asic_rev) ==
     4243 +                    MHCR_CHIP_ASIC_REV_5719 ||
     4244 +                    MHCR_CHIP_ASIC_REV(bgep->chipid.asic_rev) ==
     4245 +                    MHCR_CHIP_ASIC_REV_5720) {
     4246 +                        regval &= ~(RDMA_RSRVCTRL_TXMRGN_MASK |
     4247 +                            RDMA_RSRVCTRL_FIFO_LWM_MASK |
     4248 +                            RDMA_RSRVCTRL_FIFO_HWM_MASK);
     4249 +                        regval |= RDMA_RSRVCTRL_TXMRGN_320B |
     4250 +                            RDMA_RSRVCTRL_FIFO_LWM_1_5K |
     4251 +                            RDMA_RSRVCTRL_FIFO_HWM_1_5K;
     4252 +                }
     4253 +                bge_reg_put32(bgep, READ_DMA_RESERVED_CONTROL_REG,
     4254 +                    regval | RDMA_RSRVCTRL_FIFO_OFLW_FIX);
     4255 +        }
4106 4256          if (DEVICE_5723_SERIES_CHIPSETS(bgep) ||
4107 4257              DEVICE_5717_SERIES_CHIPSETS(bgep))
4108 4258                  bge_dma_rdprio = 0;
     4259 +        regval = bge_dma_rdprio << DMA_PRIORITY_SHIFT;
     4260 +        if (MHCR_CHIP_ASIC_REV(bgep->chipid.asic_rev) ==
     4261 +            MHCR_CHIP_ASIC_REV_5720)
     4262 +                regval |= bge_reg_get32(bgep, READ_DMA_MODE_REG) &
     4263 +                    DMA_H2BNC_VLAN_DET;
4109 4264          if (!bge_chip_enable_engine(bgep, READ_DMA_MODE_REG,
4110      -            (bge_dma_rdprio << DMA_PRIORITY_SHIFT) | ALL_DMA_ATTN_BITS))
     4265 +            regval | ALL_DMA_ATTN_BITS))
4111 4266                  retval = DDI_FAILURE;
4112 4267          if (!bge_chip_enable_engine(bgep, RCV_DATA_COMPLETION_MODE_REG,
4113 4268              STATE_MACHINE_ATTN_ENABLE_BIT))
4114 4269                  retval = DDI_FAILURE;
4115 4270          if (DEVICE_5704_SERIES_CHIPSETS(bgep))
4116 4271                  if (!bge_chip_enable_engine(bgep,
4117 4272                      MBUF_CLUSTER_FREE_MODE_REG, 0))
4118 4273                          retval = DDI_FAILURE;
4119 4274          if (!bge_chip_enable_engine(bgep, SEND_DATA_COMPLETION_MODE_REG, 0))
4120 4275                  retval = DDI_FAILURE;
↓ open down ↓ 12 lines elided ↑ open up ↑
4133 4288              STATE_MACHINE_ATTN_ENABLE_BIT))
4134 4289                  retval = DDI_FAILURE;
4135 4290          if (!bge_chip_enable_engine(bgep, SEND_BD_SELECTOR_MODE_REG,
4136 4291              STATE_MACHINE_ATTN_ENABLE_BIT))
4137 4292                  retval = DDI_FAILURE;
4138 4293  
4139 4294          /*
4140 4295           * Step 88: download firmware -- doesn't apply
4141 4296           * Steps 89-90: enable Transmit & Receive MAC Engines
4142 4297           */
4143      -        if (!bge_chip_enable_engine(bgep, TRANSMIT_MAC_MODE_REG, 0))
     4298 +        if (DEVICE_IS_5755_PLUS(bgep) ||
     4299 +            MHCR_CHIP_ASIC_REV(bgep->chipid.asic_rev) ==
     4300 +            MHCR_CHIP_ASIC_REV_5906) {
     4301 +                regval = bge_reg_get32(bgep, TRANSMIT_MAC_MODE_REG);
     4302 +                regval |= TRANSMIT_MODE_MBUF_LOCKUP_FIX;
     4303 +        } else {
     4304 +                regval = 0;
     4305 +        }
     4306 +        if (MHCR_CHIP_ASIC_REV(bgep->chipid.asic_rev) ==
     4307 +            MHCR_CHIP_ASIC_REV_5720) {
     4308 +                regval &= ~(TRANSMIT_MODE_HTX2B_JMB_FRM_LEN |
     4309 +                    TRANSMIT_MODE_HTX2B_CNT_DN_MODE);
     4310 +                regval |= bge_reg_get32(bgep, TRANSMIT_MAC_MODE_REG) &
     4311 +                    (TRANSMIT_MODE_HTX2B_JMB_FRM_LEN |
     4312 +                    TRANSMIT_MODE_HTX2B_CNT_DN_MODE);
     4313 +        }
     4314 +        if (!bge_chip_enable_engine(bgep, TRANSMIT_MAC_MODE_REG, regval))
4144 4315                  retval = DDI_FAILURE;
4145 4316  #ifdef BGE_IPMI_ASF
4146 4317          if (!bgep->asf_enabled) {
4147 4318                  if (!bge_chip_enable_engine(bgep, RECEIVE_MAC_MODE_REG,
4148 4319                      RECEIVE_MODE_KEEP_VLAN_TAG))
4149 4320                          retval = DDI_FAILURE;
4150 4321          } else {
4151 4322                  if (!bge_chip_enable_engine(bgep, RECEIVE_MAC_MODE_REG, 0))
4152 4323                          retval = DDI_FAILURE;
4153 4324          }
↓ open down ↓ 82 lines elided ↑ open up ↑
4236 4407  #ifdef BGE_IPMI_ASF
4237 4408          }
4238 4409  #endif
4239 4410  
4240 4411          /*
4241 4412           * Step 97: enable PCI interrupts!!!
4242 4413           */
4243 4414          if (bgep->intr_type == DDI_INTR_TYPE_FIXED)
4244 4415                  bge_cfg_clr32(bgep, PCI_CONF_BGE_MHCR,
4245 4416                      bgep->chipid.mask_pci_int);
4246      -
4247 4417          /*
4248 4418           * All done!
4249 4419           */
4250 4420          bgep->bge_chip_state = BGE_CHIP_RUNNING;
4251 4421          return (retval);
4252 4422  }
4253 4423  
4254 4424  
4255 4425  /*
4256 4426   * ========== Hardware interrupt handler ==========
↓ open down ↓ 1738 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX