Home | History | Annotate | Download | only in MarvellYukonDxe
      1 /**  <at> file
      2 *  Support for PCIe Marvell Yukon gigabit ethernet adapter product family
      3 *
      4 *  Copyright (c) 2011-2016, ARM Limited. All rights reserved.
      5 *
      6 *  This program and the accompanying materials
      7 *  are licensed and made available under the terms and conditions of the BSD License
      8 *  which accompanies this distribution.  The full text of the license may be found at
      9 *  http://opensource.org/licenses/bsd-license.php
     10 *
     11 *  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     12 *  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     13 *
     14 **/
     15 
     16 /******************************************************************************
     17  *
     18  *  LICENSE:
     19  *  Copyright (C) Marvell International Ltd. and/or its affiliates
     20  *
     21  *  The computer program files contained in this folder ("Files")
     22  *  are provided to you under the BSD-type license terms provided
     23  *  below, and any use of such Files and any derivative works
     24  *  thereof created by you shall be governed by the following terms
     25  *  and conditions:
     26  *
     27  *  - Redistributions of source code must retain the above copyright
     28  *    notice, this list of conditions and the following disclaimer.
     29  *  - Redistributions in binary form must reproduce the above
     30  *    copyright notice, this list of conditions and the following
     31  *    disclaimer in the documentation and/or other materials provided
     32  *    with the distribution.
     33  *  - Neither the name of Marvell nor the names of its contributors
     34  *    may be used to endorse or promote products derived from this
     35  *    software without specific prior written permission.
     36  *
     37  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     38  *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     39  *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
     40  *  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
     41  *  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
     42  *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
     43  *  BUT NOT LIMITED TO, PROCUREMENT OF  SUBSTITUTE GOODS OR SERVICES;
     44  *  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     45  *  HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     46  *  STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     47  *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
     48  *  OF THE POSSIBILITY OF SUCH DAMAGE.
     49  *  /LICENSE
     50  *
     51  *****************************************************************************/
     52 
     53 /*-
     54  * Copyright (c) 1997, 1998, 1999, 2000
     55  *  Bill Paul <wpaul <at> ctr.columbia.edu>.  All rights reserved.
     56  *
     57  * Redistribution and use in source and binary forms, with or without
     58  * modification, are permitted provided that the following conditions
     59  * are met:
     60  * 1. Redistributions of source code must retain the above copyright
     61  *    notice, this list of conditions and the following disclaimer.
     62  * 2. Redistributions in binary form must reproduce the above copyright
     63  *    notice, this list of conditions and the following disclaimer in the
     64  *    documentation and/or other materials provided with the distribution.
     65  * 3. All advertising materials mentioning features or use of this software
     66  *    must display the following acknowledgement:
     67  *  This product includes software developed by Bill Paul.
     68  * 4. Neither the name of the author nor the names of any co-contributors
     69  *    may be used to endorse or promote products derived from this software
     70  *    without specific prior written permission.
     71  *
     72  * THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``AS IS'' AND
     73  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     74  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     75  * ARE DISCLAIMED.  IN NO EVENT SHALL Bill Paul OR THE VOICES IN HIS HEAD
     76  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     77  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     78  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     79  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     80  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     81  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
     82  * THE POSSIBILITY OF SUCH DAMAGE.
     83  */
     84 /*-
     85  * Copyright (c) 2003 Nathan L. Binkert <binkertn <at> umich.edu>
     86  *
     87  * Permission to use, copy, modify, and distribute this software for any
     88  * purpose with or without fee is hereby granted, provided that the above
     89  * copyright notice and this permission notice appear in all copies.
     90  *
     91  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
     92  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
     93  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
     94  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
     95  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
     96  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
     97  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
     98  */
     99 
    100 /*
    101  * Device driver for the Marvell Yukon II Ethernet controller.
    102  * Due to lack of documentation, this driver is based on the code from
    103  * sk (4) and Marvell's myk (4) driver for FreeBSD 5.x.
    104  */
    105 
    106 #include <Base.h>
    107 #include <Library/IoLib.h>
    108 #include <Library/MemoryAllocationLib.h>
    109 #include <Library/BaseMemoryLib.h>
    110 #include <Library/DebugLib.h>
    111 #include <Library/NetLib.h>
    112 #include <Library/PcdLib.h>
    113 #include <Library/BaseLib.h>
    114 #include <Library/TimerLib.h>
    115 #include <Library/UefiBootServicesTableLib.h>
    116 #include <Protocol/PciIo.h>
    117 #include <IndustryStandard/Pci.h>
    118 #include <IndustryStandard/Acpi.h>
    119 #include "miivar.h"
    120 #include "if_media.h"
    121 #include "if_mskreg.h"
    122 #include "if_msk.h"
    123 
    124 #define MSK_CSUM_FEATURES  (CSUM_TCP | CSUM_UDP)
    125 
    126 /*
    127  * Devices supported by this driver.
    128  */
    129 static struct msk_product {
    130   UINT16  msk_vendorid;
    131   UINT16  msk_deviceid;
    132   const CHAR8  *msk_name;
    133 } msk_products[] = {
    134 { VENDORID_SK,      DEVICEID_SK_YUKON2,       "SK-9Sxx Gigabit Ethernet" },
    135 { VENDORID_SK,      DEVICEID_SK_YUKON2_EXPR,  "SK-9Exx Gigabit Ethernet"},
    136 { VENDORID_MARVELL, DEVICEID_MRVL_8021CU,     "Marvell Yukon 88E8021CU Gigabit Ethernet" },
    137 { VENDORID_MARVELL, DEVICEID_MRVL_8021X,      "Marvell Yukon 88E8021 SX/LX Gigabit Ethernet" },
    138 { VENDORID_MARVELL, DEVICEID_MRVL_8022CU,     "Marvell Yukon 88E8022CU Gigabit Ethernet" },
    139 { VENDORID_MARVELL, DEVICEID_MRVL_8022X,      "Marvell Yukon 88E8022 SX/LX Gigabit Ethernet" },
    140 { VENDORID_MARVELL, DEVICEID_MRVL_8061CU,     "Marvell Yukon 88E8061CU Gigabit Ethernet" },
    141 { VENDORID_MARVELL, DEVICEID_MRVL_8061X,      "Marvell Yukon 88E8061 SX/LX Gigabit Ethernet" },
    142 { VENDORID_MARVELL, DEVICEID_MRVL_8062CU,     "Marvell Yukon 88E8062CU Gigabit Ethernet" },
    143 { VENDORID_MARVELL, DEVICEID_MRVL_8062X,      "Marvell Yukon 88E8062 SX/LX Gigabit Ethernet" },
    144 { VENDORID_MARVELL, DEVICEID_MRVL_8035,       "Marvell Yukon 88E8035 Fast Ethernet" },
    145 { VENDORID_MARVELL, DEVICEID_MRVL_8036,       "Marvell Yukon 88E8036 Fast Ethernet" },
    146 { VENDORID_MARVELL, DEVICEID_MRVL_8038,       "Marvell Yukon 88E8038 Fast Ethernet" },
    147 { VENDORID_MARVELL, DEVICEID_MRVL_8039,       "Marvell Yukon 88E8039 Fast Ethernet" },
    148 { VENDORID_MARVELL, DEVICEID_MRVL_8040,       "Marvell Yukon 88E8040 Fast Ethernet" },
    149 { VENDORID_MARVELL, DEVICEID_MRVL_8040T,      "Marvell Yukon 88E8040T Fast Ethernet" },
    150 { VENDORID_MARVELL, DEVICEID_MRVL_8042,       "Marvell Yukon 88E8042 Fast Ethernet" },
    151 { VENDORID_MARVELL, DEVICEID_MRVL_8048,       "Marvell Yukon 88E8048 Fast Ethernet" },
    152 { VENDORID_MARVELL, DEVICEID_MRVL_4361,       "Marvell Yukon 88E8050 Gigabit Ethernet" },
    153 { VENDORID_MARVELL, DEVICEID_MRVL_4360,       "Marvell Yukon 88E8052 Gigabit Ethernet" },
    154 { VENDORID_MARVELL, DEVICEID_MRVL_4362,       "Marvell Yukon 88E8053 Gigabit Ethernet" },
    155 { VENDORID_MARVELL, DEVICEID_MRVL_4363,       "Marvell Yukon 88E8055 Gigabit Ethernet" },
    156 { VENDORID_MARVELL, DEVICEID_MRVL_4364,       "Marvell Yukon 88E8056 Gigabit Ethernet" },
    157 { VENDORID_MARVELL, DEVICEID_MRVL_4365,       "Marvell Yukon 88E8070 Gigabit Ethernet" },
    158 { VENDORID_MARVELL, DEVICEID_MRVL_436A,       "Marvell Yukon 88E8058 Gigabit Ethernet" },
    159 { VENDORID_MARVELL, DEVICEID_MRVL_436B,       "Marvell Yukon 88E8071 Gigabit Ethernet" },
    160 { VENDORID_MARVELL, DEVICEID_MRVL_436C,       "Marvell Yukon 88E8072 Gigabit Ethernet" },
    161 { VENDORID_MARVELL, DEVICEID_MRVL_4380,       "Marvell Yukon 88E8057 Gigabit Ethernet" },
    162 { VENDORID_MARVELL, DEVICEID_MRVL_4381,       "Marvell Yukon 88E8059 Gigabit Ethernet" },
    163 { VENDORID_DLINK,   DEVICEID_DLINK_DGE550SX,  "D-Link 550SX Gigabit Ethernet" },
    164 { VENDORID_DLINK,   DEVICEID_DLINK_DGE560SX,  "D-Link 560SX Gigabit Ethernet" },
    165 { VENDORID_DLINK,   DEVICEID_DLINK_DGE560T,   "D-Link 560T Gigabit Ethernet" }
    166 };
    167 
    168 #ifndef MDEPKG_NDEBUG
    169 static const CHAR8 *model_name[] = {
    170   "Yukon XL",
    171   "Yukon EC Ultra",
    172   "Yukon EX",
    173   "Yukon EC",
    174   "Yukon FE",
    175   "Yukon FE+",
    176   "Yukon Supreme",
    177   "Yukon Ultra 2",
    178   "Yukon Unknown",
    179   "Yukon Optima",
    180 };
    181 #endif
    182 
    183 //
    184 // Forward declarations
    185 //
    186 STATIC VOID mskc_setup_rambuffer (struct msk_softc *);
    187 STATIC VOID mskc_reset (struct msk_softc *);
    188 
    189 EFI_STATUS mskc_attach_if (struct msk_if_softc *, UINTN);
    190 VOID mskc_detach_if (struct msk_if_softc *);
    191 
    192 static VOID mskc_tick (IN EFI_EVENT, IN VOID*);
    193 STATIC VOID msk_intr (struct msk_softc *);
    194 static VOID msk_intr_phy (struct msk_if_softc *);
    195 static VOID msk_intr_gmac (struct msk_if_softc *);
    196 static __inline VOID msk_rxput (struct msk_if_softc *);
    197 STATIC INTN msk_handle_events (struct msk_softc *);
    198 static VOID msk_handle_hwerr (struct msk_if_softc *, UINT32);
    199 STATIC VOID msk_intr_hwerr (struct msk_softc *);
    200 static VOID msk_rxeof (struct msk_if_softc *, UINT32, UINT32, INTN);
    201 static VOID msk_txeof (struct msk_if_softc *, INTN);
    202 static EFI_STATUS msk_encap (struct msk_if_softc *, MSK_SYSTEM_BUF *);
    203 STATIC VOID msk_start (struct msk_if_softc *);
    204 STATIC VOID msk_set_prefetch (struct msk_if_softc *, INTN, EFI_PHYSICAL_ADDRESS, UINT32);
    205 static VOID msk_set_rambuffer (struct msk_if_softc *);
    206 static VOID msk_set_tx_stfwd (struct msk_if_softc *);
    207 static EFI_STATUS msk_init (struct msk_if_softc *);
    208 VOID mskc_stop_if (struct msk_if_softc *);
    209 static VOID msk_phy_power (struct msk_softc *, INTN);
    210 INTN msk_phy_readreg (struct msk_if_softc *, INTN);
    211 INTN msk_phy_writereg (struct msk_if_softc *, INTN, INTN);
    212 STATIC EFI_STATUS msk_status_dma_alloc (struct msk_softc *);
    213 STATIC VOID msk_status_dma_free (struct msk_softc *);
    214 static EFI_STATUS msk_txrx_dma_alloc (struct msk_if_softc *);
    215 static VOID msk_txrx_dma_free (struct msk_if_softc *);
    216 static EFI_STATUS msk_init_rx_ring (struct msk_if_softc *);
    217 static VOID msk_init_tx_ring (struct msk_if_softc *);
    218 static __inline VOID msk_discard_rxbuf (struct msk_if_softc *, INTN);
    219 static EFI_STATUS msk_newbuf (struct msk_if_softc *, INTN);
    220 
    221 static VOID msk_rxfilter (
    222     struct msk_if_softc         *sc_if,
    223     UINT32                      FilterFlags,
    224     UINTN                       MCastFilterCnt,
    225     EFI_MAC_ADDRESS             *MCastFilter
    226     );
    227 static VOID msk_setvlan (struct msk_if_softc *);
    228 
    229 static VOID msk_stats_clear (struct msk_if_softc *);
    230 static VOID msk_stats_update (struct msk_if_softc *);
    231 STATIC VOID clear_pci_errors (struct msk_softc *);
    232 
    233 EFI_STATUS e1000_probe_and_attach (struct mii_data *, const struct msk_mii_data *, VOID *, VOID **);
    234 VOID e1000phy_tick (VOID *);
    235 VOID e1000phy_mediachg (VOID *);
    236 EFI_STATUS e1000phy_detach (VOID *);
    237 
    238 //
    239 // Functions
    240 //
    241 
    242 INTN
    243 msk_phy_readreg (
    244     struct msk_if_softc  *sc_if,
    245     INTN                 reg
    246     )
    247 {
    248   INTN  i;
    249   INTN  val;
    250   INTN              port;
    251   struct msk_softc  *sc;
    252 
    253   sc = sc_if->msk_softc;
    254   port = sc_if->msk_md.port;
    255 
    256   GMAC_WRITE_2 (sc, port, GM_SMI_CTRL, GM_SMI_CT_PHY_AD (PHY_ADDR_MARV) | GM_SMI_CT_REG_AD (reg) | GM_SMI_CT_OP_RD);
    257 
    258   for (i = 0; i < MSK_TIMEOUT; i++) {
    259     gBS->Stall (1);
    260     val = GMAC_READ_2 (sc, port, GM_SMI_CTRL);
    261     if ((val & GM_SMI_CT_RD_VAL) != 0) {
    262       val = GMAC_READ_2 (sc, port, GM_SMI_DATA);
    263       break;
    264     }
    265   }
    266 
    267   if (i == MSK_TIMEOUT) {
    268     DEBUG ((EFI_D_NET, "Marvell Yukon: phy failed to come ready\n"));
    269     val = 0;
    270   }
    271 
    272   return (val);
    273 }
    274 
    275 INTN
    276 msk_phy_writereg (
    277     struct msk_if_softc  *sc_if,
    278     INTN  reg,
    279     INTN  val
    280     )
    281 {
    282   INTN i;
    283   INTN              port;
    284   struct msk_softc  *sc;
    285 
    286   sc = sc_if->msk_softc;
    287   port = sc_if->msk_md.port;
    288 
    289   GMAC_WRITE_2 (sc, port, GM_SMI_DATA, val);
    290   GMAC_WRITE_2 (sc, port, GM_SMI_CTRL, GM_SMI_CT_PHY_AD (PHY_ADDR_MARV) | GM_SMI_CT_REG_AD (reg));
    291   for (i = 0; i < MSK_TIMEOUT; i++) {
    292     gBS->Stall (1);
    293     if ((GMAC_READ_2 (sc, port, GM_SMI_CTRL) & GM_SMI_CT_BUSY) == 0) {
    294       break;
    295     }
    296   }
    297   if (i == MSK_TIMEOUT) {
    298     DEBUG ((EFI_D_NET, "Marvell Yukon: phy write timeout\n"));
    299   }
    300 
    301   return (0);
    302 }
    303 
    304 VOID
    305 msk_miibus_statchg (
    306     struct msk_if_softc  *sc_if
    307     )
    308 {
    309   struct mii_data       *mii;
    310   UINT32                gmac;
    311   UINTN                 port;
    312   struct msk_softc      *sc;
    313 
    314   sc = sc_if->msk_softc;
    315   port = sc_if->msk_md.port;
    316   mii = &sc_if->mii_d;
    317   sc_if->msk_flags &= ~MSK_FLAG_LINK;
    318 
    319   if ((mii->mii_media_status & (IFM_AVALID | IFM_ACTIVE)) == (IFM_AVALID | IFM_ACTIVE)) {
    320 
    321     DEBUG ((EFI_D_NET, "Marvell Yukon: msk_miibus_statchg, phy is active\n"));
    322     switch (IFM_SUBTYPE (mii->mii_media_active)) {
    323       case IFM_10_T:
    324       case IFM_100_TX:
    325         sc_if->msk_flags |= MSK_FLAG_LINK;
    326         break;
    327       case IFM_1000_T:
    328       case IFM_1000_SX:
    329       case IFM_1000_LX:
    330       case IFM_1000_CX:
    331         if ((sc_if->msk_flags & MSK_FLAG_FASTETHER) == 0) {
    332           sc_if->msk_flags |= MSK_FLAG_LINK;
    333         }
    334         break;
    335       default:
    336         break;
    337     }
    338   }
    339 
    340   if ((sc_if->msk_flags & MSK_FLAG_LINK) != 0) {
    341     // Enable Tx FIFO Underrun
    342     DEBUG ((EFI_D_NET, "Marvell Yukon: msk_miibus_statchg, link up\n"));
    343 
    344     CSR_WRITE_1 (sc, MR_ADDR (port, GMAC_IRQ_MSK), GM_IS_TX_FF_UR | GM_IS_RX_FF_OR);
    345     //
    346     // Because mii(4) notify msk (4) that it detected link status
    347     // change, there is no need to enable automatic
    348     // speed/flow-control/duplex updates.
    349     //
    350     gmac = GM_GPCR_AU_ALL_DIS;
    351     switch (IFM_SUBTYPE (mii->mii_media_active)) {
    352       case IFM_1000_SX:
    353       case IFM_1000_T:
    354         gmac |= GM_GPCR_SPEED_1000;
    355         break;
    356       case IFM_100_TX:
    357         gmac |= GM_GPCR_SPEED_100;
    358         break;
    359       case IFM_10_T:
    360         break;
    361     }
    362 
    363     // Disable Rx flow control
    364     if ((IFM_OPTIONS (mii->mii_media_active) & IFM_FLAG0) == 0) {
    365       gmac |= GM_GPCR_FC_RX_DIS;
    366     }
    367     // Disable Tx flow control
    368     if ((IFM_OPTIONS (mii->mii_media_active) & IFM_FLAG1) == 0) {
    369       gmac |= GM_GPCR_FC_TX_DIS;
    370     }
    371     if ((IFM_OPTIONS (mii->mii_media_active) & IFM_FDX) != 0) {
    372       gmac |= GM_GPCR_DUP_FULL;
    373     } else {
    374       gmac |= GM_GPCR_FC_RX_DIS | GM_GPCR_FC_TX_DIS;
    375     }
    376     gmac |= GM_GPCR_RX_ENA | GM_GPCR_TX_ENA;
    377     GMAC_WRITE_2 (sc, port, GM_GP_CTRL, gmac);
    378     // Read again to ensure writing
    379     GMAC_READ_2 (sc, port, GM_GP_CTRL);
    380     gmac = GMC_PAUSE_OFF;
    381     if ((IFM_OPTIONS (mii->mii_media_active) & IFM_FDX) != 0) {
    382       if ((IFM_OPTIONS (mii->mii_media_active) & IFM_FLAG0) != 0) {
    383         gmac = GMC_PAUSE_ON;
    384       }
    385     }
    386     CSR_WRITE_4 (sc, MR_ADDR (port, GMAC_CTRL), gmac);
    387 
    388     // Enable PHY interrupt for FIFO underrun/overflow
    389     msk_phy_writereg (sc_if, PHY_MARV_INT_MASK, PHY_M_IS_FIFO_ERROR);
    390   } else {
    391     //
    392     // Link state changed to down.
    393     // Disable PHY interrupts.
    394     //
    395     DEBUG ((EFI_D_NET, "Marvell Yukon: msk_miibus_statchg, link down\n"));
    396     msk_phy_writereg (sc_if, PHY_MARV_INT_MASK, 0);
    397     // Disable Rx/Tx MAC
    398     gmac = GMAC_READ_2 (sc, port, GM_GP_CTRL);
    399     if ((GM_GPCR_RX_ENA | GM_GPCR_TX_ENA) != 0) {
    400       gmac &= ~(GM_GPCR_RX_ENA | GM_GPCR_TX_ENA);
    401       GMAC_WRITE_2 (sc, port, GM_GP_CTRL, gmac);
    402       // Read again to ensure writing
    403       GMAC_READ_2 (sc, port, GM_GP_CTRL);
    404     }
    405   }
    406 }
    407 
    408 UINT32
    409 ether_crc32_be (
    410     const UINT8   *buf,
    411     UINTN         len
    412     )
    413 {
    414   UINTN     i;
    415   UINT32    crc;
    416   UINT32    carry;
    417   INTN      bit;
    418   UINT8     data;
    419 
    420   crc = 0xffffffff; // initial value
    421 
    422   for (i = 0; i < len; i++) {
    423     for (data = *buf++, bit = 0; bit < 8; bit++, data >>= 1) {
    424       carry = ((crc & 0x80000000) ? 1 : 0) ^ (data & 0x01);
    425       crc <<= 1;
    426       if (carry) {
    427         crc = (crc ^ ETHER_CRC_POLY_BE) | carry;
    428       }
    429     }
    430   }
    431 
    432   return crc;
    433 }
    434 
    435 VOID
    436 mskc_rxfilter (
    437     struct msk_if_softc         *sc_if,
    438     UINT32                      FilterFlags,
    439     UINTN                       MCastFilterCnt,
    440     EFI_MAC_ADDRESS             *MCastFilter
    441     )
    442 {
    443   msk_rxfilter (sc_if, FilterFlags, MCastFilterCnt, MCastFilter);
    444 }
    445 
    446 static VOID
    447 msk_rxfilter (
    448     struct msk_if_softc         *sc_if,
    449     UINT32                      FilterFlags,
    450     UINTN                       MCastFilterCnt,
    451     EFI_MAC_ADDRESS             *MCastFilter
    452     )
    453 {
    454   UINT32  mchash[2];
    455   UINT32  crc;
    456   UINT16  mode;
    457   INTN              port;
    458   struct msk_softc  *sc;
    459 
    460   sc = sc_if->msk_softc;
    461   port = sc_if->msk_md.port;
    462 
    463   gBS->SetMem (mchash, sizeof (mchash), 0);
    464   mode = GMAC_READ_2 (sc, port, GM_RX_CTRL);
    465   if ((FilterFlags & EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS) != 0) {
    466     mode &= ~(GM_RXCR_UCF_ENA | GM_RXCR_MCF_ENA);
    467   }
    468   else if ((FilterFlags & EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS_MULTICAST) != 0) {
    469     mode |= GM_RXCR_UCF_ENA | GM_RXCR_MCF_ENA;
    470     mchash[0] = 0xffff;
    471     mchash[1] = 0xffff;
    472   } else {
    473     mode |= GM_RXCR_UCF_ENA;
    474     while (MCastFilterCnt-- > 0) {
    475       crc = ether_crc32_be (MCastFilter[MCastFilterCnt].Addr, NET_ETHER_ADDR_LEN);
    476       /* Just want the 6 least significant bits. */
    477       crc &= 0x3f;
    478       /* Set the corresponding bit in the hash table. */
    479       mchash[crc >> 5] |= 1 << (crc & 0x1f);
    480     }
    481     if (mchash[0] != 0 || mchash[1] != 0) {
    482       mode |= GM_RXCR_MCF_ENA;
    483     }
    484   }
    485 
    486   GMAC_WRITE_2 (sc, port, GM_MC_ADDR_H1,  mchash[0]        & 0xffff  );
    487   GMAC_WRITE_2 (sc, port, GM_MC_ADDR_H2, (mchash[0] >> 16) & 0xffff  );
    488   GMAC_WRITE_2 (sc, port, GM_MC_ADDR_H3,  mchash[1]        & 0xffff  );
    489   GMAC_WRITE_2 (sc, port, GM_MC_ADDR_H4, (mchash[1] >> 16) & 0xffff  );
    490   GMAC_WRITE_2 (sc, port, GM_RX_CTRL,    mode                        );
    491 }
    492 
    493 static
    494 VOID
    495 msk_setvlan (
    496     struct msk_if_softc   *sc_if
    497     )
    498 {
    499   //
    500   // Disable automatic VLAN tagging/stripping
    501   //
    502   CSR_WRITE_4 (sc_if->msk_softc, MR_ADDR (sc_if->msk_md.port, RX_GMF_CTRL_T), RX_VLAN_STRIP_OFF);
    503   CSR_WRITE_4 (sc_if->msk_softc, MR_ADDR (sc_if->msk_md.port, TX_GMF_CTRL_T), TX_VLAN_TAG_OFF);
    504 }
    505 
    506 static
    507 EFI_STATUS
    508 msk_init_rx_ring (
    509     struct msk_if_softc   *sc_if
    510     )
    511 {
    512   struct msk_ring_data  *rd;
    513   struct msk_rxdesc     *rxd;
    514   INTN                  i;
    515   INTN                  prod;
    516   INTN                  nbuf;
    517   EFI_STATUS            Status;
    518 
    519   sc_if->msk_cdata.msk_rx_cons = 0;
    520   sc_if->msk_cdata.msk_rx_prod = 0;
    521   sc_if->msk_cdata.msk_rx_putwm = MSK_PUT_WM;
    522 
    523   rd = &sc_if->msk_rdata;
    524   gBS->SetMem (rd->msk_rx_ring, MSK_RX_RING_SZ, 0);
    525   for (i = prod = 0; i < MSK_RX_RING_CNT; i++) {
    526     rxd = &sc_if->msk_cdata.msk_rxdesc[prod];
    527     gBS->SetMem (&rxd->rx_m, sizeof (MSK_DMA_BUF), 0);
    528     rxd->rx_le = &rd->msk_rx_ring[prod];
    529     MSK_INC (prod, MSK_RX_RING_CNT);
    530   }
    531   nbuf = MSK_RX_BUF_CNT;
    532   prod = 0;
    533 
    534   for (i = 0; i < nbuf; i++) {
    535      Status = msk_newbuf (sc_if, prod);
    536      if (EFI_ERROR (Status)) {
    537        return Status;
    538      }
    539      MSK_RX_INC(prod, MSK_RX_RING_CNT);
    540    }
    541 
    542   // Update prefetch unit.
    543   sc_if->msk_cdata.msk_rx_prod = MSK_RX_RING_CNT - 1;
    544   CSR_WRITE_2 (sc_if->msk_softc, Y2_PREF_Q_ADDR (sc_if->msk_rxq, PREF_UNIT_PUT_IDX_REG), sc_if->msk_cdata.msk_rx_prod);
    545 
    546   return EFI_SUCCESS;
    547 }
    548 
    549 STATIC
    550 VOID
    551 msk_init_tx_ring (
    552     struct msk_if_softc   *sc_if
    553     )
    554 {
    555   struct msk_ring_data  *rd;
    556   struct msk_txdesc     *txd;
    557   INTN                  i;
    558 
    559   sc_if->msk_cdata.msk_tx_prod = 0;
    560   sc_if->msk_cdata.msk_tx_cons = 0;
    561   sc_if->msk_cdata.msk_tx_cnt = 0;
    562   sc_if->msk_cdata.msk_tx_high_addr = 0;
    563 
    564   rd = &sc_if->msk_rdata;
    565   gBS->SetMem (rd->msk_tx_ring, sizeof (struct msk_tx_desc) * MSK_TX_RING_CNT, 0);
    566   for (i = 0; i < MSK_TX_RING_CNT; i++) {
    567     txd = &sc_if->msk_cdata.msk_txdesc[i];
    568     gBS->SetMem (&(txd->tx_m), sizeof (MSK_DMA_BUF), 0);
    569     txd->tx_le = &rd->msk_tx_ring[i];
    570   }
    571 }
    572 
    573 static
    574 __inline
    575 VOID
    576 msk_discard_rxbuf (
    577     struct msk_if_softc   *sc_if,
    578     INTN                  idx
    579     )
    580 {
    581   struct msk_rx_desc  *rx_le;
    582   struct msk_rxdesc   *rxd;
    583   MSK_DMA_BUF         *DmaBuffer;
    584 
    585   DEBUG ((EFI_D_NET, "Marvell Yukon: discard rxbuf\n"));
    586 
    587 #ifdef MSK_64BIT_DMA
    588   rxd = &sc_if->msk_cdata.msk_rxdesc[idx];
    589   rx_le = rxd->rx_le;
    590   rx_le->msk_control = htole32(OP_ADDR64 | HW_OWNER);
    591   MSK_INC(idx, MSK_RX_RING_CNT);
    592 #endif
    593 
    594   rxd = &sc_if->msk_cdata.msk_rxdesc[idx];
    595   DmaBuffer = &rxd->rx_m;
    596   rx_le = rxd->rx_le;
    597   rx_le->msk_control = htole32 (DmaBuffer->Length | OP_PACKET | HW_OWNER);
    598 }
    599 
    600 static
    601 EFI_STATUS
    602 msk_newbuf (
    603     IN struct msk_if_softc    *sc_if,
    604     IN INTN                   idx
    605     )
    606 {
    607   struct msk_rx_desc    *rx_le;
    608   struct msk_rxdesc     *rxd;
    609   UINTN                 Length;
    610   VOID                  *Buffer;
    611   VOID                  *Mapping;
    612   EFI_PHYSICAL_ADDRESS  PhysAddr;
    613   EFI_PCI_IO_PROTOCOL   *PciIo;
    614   EFI_STATUS            Status;
    615 
    616   PciIo = sc_if->msk_softc->PciIo;
    617   Length = MAX_SUPPORTED_PACKET_SIZE;
    618 
    619   rxd = &sc_if->msk_cdata.msk_rxdesc[idx];
    620 
    621   Status = gBS->AllocatePool (EfiBootServicesData, Length, &Buffer);
    622   if (EFI_ERROR (Status)) {
    623     return Status;
    624   }
    625   gBS->SetMem (Buffer, Length, 0);
    626 
    627   Status = PciIo->Map (PciIo, EfiPciIoOperationBusMasterWrite, Buffer, &Length, &PhysAddr, &Mapping);
    628   if (EFI_ERROR (Status)) {
    629     gBS->FreePool (Buffer);
    630     return Status;
    631   }
    632 
    633 #ifdef MSK_64BIT_DMA
    634   rx_le = rxd->rx_le;
    635   rx_le->msk_addr = htole32(MSK_ADDR_HI(PhysAddr));
    636   rx_le->msk_control = htole32(OP_ADDR64 | HW_OWNER);
    637   MSK_INC(idx, MSK_RX_RING_CNT);
    638   rxd = &sc_if->msk_cdata.msk_rxdesc[idx];
    639 #endif
    640 
    641   rxd->rx_m.DmaMapping = Mapping;
    642   rxd->rx_m.Buf = Buffer;
    643   rxd->rx_m.Length = Length;
    644   rx_le = rxd->rx_le;
    645   rx_le->msk_addr = htole32 (MSK_ADDR_LO (PhysAddr));
    646   rx_le->msk_control = htole32 (Length | OP_PACKET | HW_OWNER);
    647 
    648   return EFI_SUCCESS;
    649 }
    650 
    651 EFI_STATUS
    652 mskc_probe (
    653     EFI_PCI_IO_PROTOCOL *PciIo
    654     )
    655 {
    656   struct msk_product  *mp;
    657   UINT16              vendor;
    658   UINT16              devid;
    659   UINT32              PciID;
    660   INTN                i;
    661   EFI_STATUS          Status;
    662 
    663   Status = PciIo->Pci.Read (
    664         PciIo,
    665         EfiPciIoWidthUint32,
    666         PCI_VENDOR_ID_OFFSET,
    667         1,
    668         &PciID
    669         );
    670   if (EFI_ERROR (Status)) {
    671     return EFI_UNSUPPORTED;
    672   }
    673 
    674   vendor = PciID & 0xFFFF;
    675   devid = PciID >> 16;
    676   mp = msk_products;
    677   for (i = 0; i < sizeof (msk_products)/sizeof (msk_products[0]); i++, mp++) {
    678     if (vendor == mp->msk_vendorid && devid == mp->msk_deviceid) {
    679       DEBUG ((EFI_D_NET, "Marvell Yukon: Probe found device %a\n", mp->msk_name));
    680       return EFI_SUCCESS;
    681     }
    682   }
    683   return EFI_UNSUPPORTED;
    684 }
    685 
    686 static
    687 VOID
    688 mskc_setup_rambuffer (
    689     struct msk_softc  *sc
    690     )
    691 {
    692   INTN next;
    693   INTN i;
    694 
    695   /* Get adapter SRAM size. */
    696   sc->msk_ramsize = CSR_READ_1 (sc, B2_E_0) * 4;
    697   DEBUG ((DEBUG_NET, "Marvell Yukon: RAM buffer size : %dKB\n", sc->msk_ramsize));
    698   if (sc->msk_ramsize == 0) {
    699     return;
    700   }
    701 
    702   sc->msk_pflags |= MSK_FLAG_RAMBUF;
    703   /*
    704    * Give receiver 2/3 of memory and round down to the multiple
    705    * of 1024. Tx/Rx RAM buffer size of Yukon II shoud be multiple
    706    * of 1024.
    707    */
    708   sc->msk_rxqsize = (((sc->msk_ramsize * 1024 * 2) / 3) / 1024) * 1024;
    709   sc->msk_txqsize = (sc->msk_ramsize * 1024) - sc->msk_rxqsize;
    710   for (i = 0, next = 0; i < sc->msk_num_port; i++) {
    711     sc->msk_rxqstart[i] = next;
    712     sc->msk_rxqend[i] = next + sc->msk_rxqsize - 1;
    713     next = sc->msk_rxqend[i] + 1;
    714     sc->msk_txqstart[i] = next;
    715     sc->msk_txqend[i] = next + sc->msk_txqsize - 1;
    716     next = sc->msk_txqend[i] + 1;
    717     DEBUG ((EFI_D_NET, "Marvell Yukon: Port %d : Rx Queue %dKB(0x%08x:0x%08x)\n", i,
    718             sc->msk_rxqsize / 1024, sc->msk_rxqstart[i], sc->msk_rxqend[i]));
    719     DEBUG ((EFI_D_NET, "Marvell Yukon: Port %d : Tx Queue %dKB(0x%08x:0x%08x)\n", i,
    720             sc->msk_txqsize / 1024, sc->msk_txqstart[i], sc->msk_txqend[i]));
    721   }
    722 }
    723 
    724 static
    725 VOID
    726 msk_phy_power (
    727     struct msk_softc  *sc,
    728     INTN              mode
    729     )
    730 {
    731   UINT32  our;
    732   UINT32  val;
    733   INTN    i;
    734 
    735   switch (mode) {
    736     case MSK_PHY_POWERUP:
    737       // Switch power to VCC (WA for VAUX problem)
    738       CSR_WRITE_1 (sc, B0_POWER_CTRL, PC_VAUX_ENA | PC_VCC_ENA | PC_VAUX_OFF | PC_VCC_ON);
    739 
    740       // Disable Core Clock Division, set Clock Select to 0
    741       CSR_WRITE_4 (sc, B2_Y2_CLK_CTRL, Y2_CLK_DIV_DIS);
    742 
    743       val = 0;
    744       if (sc->msk_hw_id == CHIP_ID_YUKON_XL && sc->msk_hw_rev > CHIP_REV_YU_XL_A1) {
    745         // Enable bits are inverted
    746         val = Y2_PCI_CLK_LNK1_DIS | Y2_COR_CLK_LNK1_DIS |
    747             Y2_CLK_GAT_LNK1_DIS | Y2_PCI_CLK_LNK2_DIS |
    748             Y2_COR_CLK_LNK2_DIS | Y2_CLK_GAT_LNK2_DIS;
    749       }
    750       //
    751       // Enable PCI & Core Clock, enable clock gating for both Links.
    752       //
    753       CSR_WRITE_1 (sc, B2_Y2_CLK_GATE, val);
    754 
    755       val = CSR_PCI_READ_4 (sc, PCI_OUR_REG_1);
    756       val &= ~(PCI_Y2_PHY1_POWD | PCI_Y2_PHY2_POWD);
    757       if (sc->msk_hw_id == CHIP_ID_YUKON_XL) {
    758         if (sc->msk_hw_rev > CHIP_REV_YU_XL_A1) {
    759           // Deassert Low Power for 1st PHY
    760           val |= PCI_Y2_PHY1_COMA;
    761           if (sc->msk_num_port > 1) {
    762             val |= PCI_Y2_PHY2_COMA;
    763           }
    764         }
    765       }
    766       // Release PHY from PowerDown/COMA mode
    767       CSR_PCI_WRITE_4 (sc, PCI_OUR_REG_1, val);
    768 
    769       switch (sc->msk_hw_id) {
    770         case CHIP_ID_YUKON_EC_U:
    771         case CHIP_ID_YUKON_EX:
    772         case CHIP_ID_YUKON_FE_P:
    773         case CHIP_ID_YUKON_UL_2:
    774         case CHIP_ID_YUKON_OPT:
    775           CSR_WRITE_2 (sc, B0_CTST, Y2_HW_WOL_OFF);
    776 
    777           // Enable all clocks
    778           CSR_PCI_WRITE_4 (sc, PCI_OUR_REG_3, 0);
    779           our = CSR_PCI_READ_4 (sc, PCI_OUR_REG_4);
    780           our &= (PCI_FORCE_ASPM_REQUEST | PCI_ASPM_GPHY_LINK_DOWN | PCI_ASPM_INT_FIFO_EMPTY | PCI_ASPM_CLKRUN_REQUEST);
    781           // Set all bits to 0 except bits 15..12
    782           CSR_PCI_WRITE_4 (sc, PCI_OUR_REG_4, our);
    783           our = CSR_PCI_READ_4 (sc, PCI_OUR_REG_5);
    784           our &= PCI_CTL_TIM_VMAIN_AV_MSK;
    785           CSR_PCI_WRITE_4 (sc, PCI_OUR_REG_5, our);
    786           CSR_PCI_WRITE_4 (sc, PCI_CFG_REG_1, 0);
    787           //
    788           // Disable status race, workaround for
    789           // Yukon EC Ultra & Yukon EX.
    790           //
    791           val = CSR_READ_4 (sc, B2_GP_IO);
    792           val |= GLB_GPIO_STAT_RACE_DIS;
    793           CSR_WRITE_4 (sc, B2_GP_IO, val);
    794           CSR_READ_4 (sc, B2_GP_IO);
    795           break;
    796         default:
    797           break;
    798       }
    799       for (i = 0; i < sc->msk_num_port; i++) {
    800         CSR_WRITE_2 (sc, MR_ADDR (i, GMAC_LINK_CTRL), GMLC_RST_SET);
    801         CSR_WRITE_2 (sc, MR_ADDR (i, GMAC_LINK_CTRL), GMLC_RST_CLR);
    802       }
    803       break;
    804     case MSK_PHY_POWERDOWN:
    805       val = CSR_PCI_READ_4 (sc, PCI_OUR_REG_1);
    806       val |= PCI_Y2_PHY1_POWD | PCI_Y2_PHY2_POWD;
    807       if (sc->msk_hw_id == CHIP_ID_YUKON_XL && sc->msk_hw_rev > CHIP_REV_YU_XL_A1) {
    808         val &= ~PCI_Y2_PHY1_COMA;
    809         if (sc->msk_num_port > 1) {
    810           val &= ~PCI_Y2_PHY2_COMA;
    811         }
    812       }
    813       CSR_PCI_WRITE_4 (sc, PCI_OUR_REG_1, val);
    814 
    815       val = Y2_PCI_CLK_LNK1_DIS | Y2_COR_CLK_LNK1_DIS |
    816           Y2_CLK_GAT_LNK1_DIS | Y2_PCI_CLK_LNK2_DIS |
    817           Y2_COR_CLK_LNK2_DIS | Y2_CLK_GAT_LNK2_DIS;
    818       if (sc->msk_hw_id == CHIP_ID_YUKON_XL && sc->msk_hw_rev > CHIP_REV_YU_XL_A1) {
    819         // Enable bits are inverted
    820         val = 0;
    821       }
    822       //
    823       // Disable PCI & Core Clock, disable clock gating for
    824       // both Links.
    825       //
    826       CSR_WRITE_1 (sc, B2_Y2_CLK_GATE, val);
    827       CSR_WRITE_1 (sc, B0_POWER_CTRL, PC_VAUX_ENA | PC_VCC_ENA | PC_VAUX_ON | PC_VCC_OFF);
    828       break;
    829     default:
    830       break;
    831   }
    832 }
    833 
    834 static
    835 VOID
    836 clear_pci_errors (
    837     struct msk_softc  *sc
    838     )
    839 {
    840   EFI_STATUS  Status;
    841   UINT16      val;
    842   EFI_PCI_IO_PROTOCOL  *PciIo;
    843 
    844   PciIo = sc->PciIo;
    845 
    846   // Clear all error bits in the PCI status register.
    847   Status = PciIo->Pci.Read (
    848         PciIo,
    849         EfiPciIoWidthUint16,
    850         PCI_PRIMARY_STATUS_OFFSET,
    851         1,
    852         &val
    853         );
    854   if (EFI_ERROR (Status)) {
    855     DEBUG ((EFI_D_ERROR, "Marvell Yukon: Warning - Reading PCI Status failed: %r", Status));
    856   }
    857   CSR_WRITE_1 (sc, B2_TST_CTRL1, TST_CFG_WRITE_ON);
    858   val |= PCIM_STATUS_PERR | PCIM_STATUS_SERR | PCIM_STATUS_RMABORT |
    859       PCIM_STATUS_RTABORT | PCIM_STATUS_PERRREPORT;
    860   Status = PciIo->Pci.Write (
    861         PciIo,
    862         EfiPciIoWidthUint16,
    863         PCI_PRIMARY_STATUS_OFFSET,
    864         1,
    865         &val
    866         );
    867   if (EFI_ERROR (Status)) {
    868     DEBUG ((EFI_D_ERROR, "Marvell Yukon: Warning - Writing PCI Status failed: %r", Status));
    869   }
    870   CSR_WRITE_2 (sc, B0_CTST, CS_MRST_CLR);
    871 }
    872 
    873 static
    874 VOID
    875 mskc_reset (
    876     struct msk_softc  *sc
    877     )
    878 {
    879   EFI_STATUS            Status;
    880   EFI_PHYSICAL_ADDRESS  PhysAddr;
    881   UINT16                status;
    882   UINT32                val;
    883   INTN                  i;
    884   EFI_PCI_IO_PROTOCOL   *PciIo;
    885 
    886   PciIo = sc->PciIo;
    887 
    888   CSR_WRITE_2 (sc, B0_CTST, CS_RST_CLR);
    889 
    890   // Disable ASF
    891   if (sc->msk_hw_id == CHIP_ID_YUKON_EX) {
    892     status = CSR_READ_2 (sc, B28_Y2_ASF_HCU_CCSR);
    893     // Clear AHB bridge & microcontroller reset
    894     status &= ~(Y2_ASF_HCU_CCSR_AHB_RST | Y2_ASF_HCU_CCSR_CPU_RST_MODE);
    895     // Clear ASF microcontroller state
    896     status &= ~ Y2_ASF_HCU_CCSR_UC_STATE_MSK;
    897     CSR_WRITE_2 (sc, B28_Y2_ASF_HCU_CCSR, status);
    898   } else {
    899     CSR_WRITE_1 (sc, B28_Y2_ASF_STAT_CMD, Y2_ASF_RESET);
    900   }
    901   CSR_WRITE_2 (sc, B0_CTST, Y2_ASF_DISABLE);
    902 
    903   //
    904   // Since we disabled ASF, S/W reset is required for Power Management.
    905   //
    906   CSR_WRITE_2 (sc, B0_CTST, CS_RST_SET);
    907   CSR_WRITE_2 (sc, B0_CTST, CS_RST_CLR);
    908 
    909   clear_pci_errors (sc);
    910   switch (sc->msk_bustype) {
    911     case MSK_PEX_BUS:
    912       // Clear all PEX errors
    913       CSR_PCI_WRITE_4 (sc, PEX_UNC_ERR_STAT, 0xffffffff);
    914       val = CSR_PCI_READ_4 (sc, PEX_UNC_ERR_STAT);
    915       if ((val & PEX_RX_OV) != 0) {
    916         sc->msk_intrmask &= ~Y2_IS_HW_ERR;
    917         sc->msk_intrhwemask &= ~Y2_IS_PCI_EXP;
    918       }
    919       break;
    920     case MSK_PCI_BUS:
    921     case MSK_PCIX_BUS:
    922       // Set Cache Line Size to 2 (8bytes) if configured to 0
    923       Status = PciIo->Pci.Read (
    924             PciIo,
    925             EfiPciIoWidthUint8,
    926             PCI_CACHELINE_SIZE_OFFSET,
    927             1,
    928             &val
    929             );
    930       if (EFI_ERROR (Status)) {
    931         DEBUG ((EFI_D_ERROR, "Marvell Yukon: Warning - Reading PCI cache line size failed: %r", Status));
    932       }
    933       if (val == 0) {
    934         val = 2;
    935         Status = PciIo->Pci.Write (
    936               PciIo,
    937               EfiPciIoWidthUint8,
    938               PCI_CACHELINE_SIZE_OFFSET,
    939               1,
    940               &val
    941               );
    942         if (EFI_ERROR (Status)) {
    943           DEBUG ((EFI_D_ERROR, "Marvell Yukon: Warning - Writing PCI cache line size failed: %r", Status));
    944         }
    945       }
    946       if (sc->msk_bustype == MSK_PCIX_BUS) {
    947         Status = PciIo->Pci.Read (
    948               PciIo,
    949               EfiPciIoWidthUint32,
    950               PCI_OUR_REG_1,
    951               1,
    952               &val
    953               );
    954         if (EFI_ERROR (Status)) {
    955           DEBUG ((EFI_D_ERROR, "Marvell Yukon: Warning - Reading Our Reg 1 failed: %r", Status));
    956         }
    957         val |= PCI_CLS_OPT;
    958         Status = PciIo->Pci.Write (
    959               PciIo,
    960               EfiPciIoWidthUint32,
    961               PCI_OUR_REG_1,
    962               1,
    963               &val
    964               );
    965         if (EFI_ERROR (Status)) {
    966           DEBUG ((EFI_D_ERROR, "Marvell Yukon: Warning - Writing Our Reg 1 failed: %r", Status));
    967         }
    968       }
    969       break;
    970   }
    971 
    972   // Set PHY power state
    973   msk_phy_power (sc, MSK_PHY_POWERUP);
    974 
    975   // Reset GPHY/GMAC Control
    976   for (i = 0; i < sc->msk_num_port; i++) {
    977     // GPHY Control reset
    978     CSR_WRITE_4 (sc, MR_ADDR (i, GPHY_CTRL), GPC_RST_SET);
    979     CSR_WRITE_4 (sc, MR_ADDR (i, GPHY_CTRL), GPC_RST_CLR);
    980     if (sc->msk_hw_id == CHIP_ID_YUKON_UL_2) {
    981       // Magic value observed under Linux.
    982       CSR_WRITE_4 (sc, MR_ADDR (i, GPHY_CTRL), 0x00105226);
    983     }
    984     // GMAC Control reset
    985     CSR_WRITE_4 (sc, MR_ADDR (i, GMAC_CTRL), GMC_RST_SET);
    986     CSR_WRITE_4 (sc, MR_ADDR (i, GMAC_CTRL), GMC_RST_CLR);
    987     CSR_WRITE_4 (sc, MR_ADDR (i, GMAC_CTRL), GMC_F_LOOPB_OFF);
    988     if (sc->msk_hw_id == CHIP_ID_YUKON_EX) {
    989       CSR_WRITE_4 (sc, MR_ADDR (i, GMAC_CTRL), GMC_BYP_MACSECRX_ON | GMC_BYP_MACSECTX_ON | GMC_BYP_RETR_ON);
    990     }
    991   }
    992   if ((sc->msk_hw_id == CHIP_ID_YUKON_OPT) && (sc->msk_hw_rev == 0)) {
    993     // Disable PCIe PHY powerdown (reg 0x80, bit7)
    994     CSR_WRITE_4 (sc, Y2_PEX_PHY_DATA, (0x0080 << 16) | 0x0080);
    995   }
    996   CSR_WRITE_1 (sc, B2_TST_CTRL1, TST_CFG_WRITE_OFF);
    997 
    998   // LED On
    999   CSR_WRITE_2 (sc, B0_CTST, Y2_LED_STAT_ON);
   1000 
   1001   // Enable plug in go
   1002   CSR_WRITE_2 (sc, B0_CTST, Y_ULTRA_2_PLUG_IN_GO_EN);
   1003 
   1004   // Clear TWSI IRQ
   1005   CSR_WRITE_4 (sc, B2_I2C_IRQ, I2C_CLR_IRQ);
   1006 
   1007   // Turn off hardware timer
   1008   CSR_WRITE_1 (sc, B2_TI_CTRL, TIM_STOP);
   1009   CSR_WRITE_1 (sc, B2_TI_CTRL, TIM_CLR_IRQ);
   1010 
   1011   // Turn off descriptor polling
   1012   CSR_WRITE_1 (sc, B28_DPT_CTRL, DPT_STOP);
   1013 
   1014   // Turn off time stamps
   1015   CSR_WRITE_1 (sc, GMAC_TI_ST_CTRL, GMT_ST_STOP);
   1016   CSR_WRITE_1 (sc, GMAC_TI_ST_CTRL, GMT_ST_CLR_IRQ);
   1017 
   1018   // Configure timeout values
   1019   for (i = 0; i < sc->msk_num_port; i++) {
   1020     CSR_WRITE_2 (sc, SELECT_RAM_BUFFER (i, B3_RI_CTRL),    RI_RST_SET);
   1021     CSR_WRITE_2 (sc, SELECT_RAM_BUFFER (i, B3_RI_CTRL),    RI_RST_CLR);
   1022     CSR_WRITE_1 (sc, SELECT_RAM_BUFFER (i, B3_RI_WTO_R1),  MSK_RI_TO_53);
   1023     CSR_WRITE_1 (sc, SELECT_RAM_BUFFER (i, B3_RI_WTO_XA1), MSK_RI_TO_53);
   1024     CSR_WRITE_1 (sc, SELECT_RAM_BUFFER (i, B3_RI_WTO_XS1), MSK_RI_TO_53);
   1025     CSR_WRITE_1 (sc, SELECT_RAM_BUFFER (i, B3_RI_RTO_R1),  MSK_RI_TO_53);
   1026     CSR_WRITE_1 (sc, SELECT_RAM_BUFFER (i, B3_RI_RTO_XA1), MSK_RI_TO_53);
   1027     CSR_WRITE_1 (sc, SELECT_RAM_BUFFER (i, B3_RI_RTO_XS1), MSK_RI_TO_53);
   1028     CSR_WRITE_1 (sc, SELECT_RAM_BUFFER (i, B3_RI_WTO_R2),  MSK_RI_TO_53);
   1029     CSR_WRITE_1 (sc, SELECT_RAM_BUFFER (i, B3_RI_WTO_XA2), MSK_RI_TO_53);
   1030     CSR_WRITE_1 (sc, SELECT_RAM_BUFFER (i, B3_RI_WTO_XS2), MSK_RI_TO_53);
   1031     CSR_WRITE_1 (sc, SELECT_RAM_BUFFER (i, B3_RI_RTO_R2),  MSK_RI_TO_53);
   1032     CSR_WRITE_1 (sc, SELECT_RAM_BUFFER (i, B3_RI_RTO_XA2), MSK_RI_TO_53);
   1033     CSR_WRITE_1 (sc, SELECT_RAM_BUFFER (i, B3_RI_RTO_XS2), MSK_RI_TO_53);
   1034   }
   1035 
   1036   // Disable all interrupts
   1037   CSR_WRITE_4 (sc, B0_HWE_IMSK, 0);
   1038   CSR_READ_4 (sc, B0_HWE_IMSK);
   1039   CSR_WRITE_4 (sc, B0_IMSK, 0);
   1040   CSR_READ_4 (sc, B0_IMSK);
   1041 
   1042   // Clear status list
   1043   gBS->SetMem (sc->msk_stat_ring, sizeof (struct msk_stat_desc) * MSK_STAT_RING_CNT, 0);
   1044   sc->msk_stat_cons = 0;
   1045   CSR_WRITE_4 (sc, STAT_CTRL, SC_STAT_RST_SET);
   1046   CSR_WRITE_4 (sc, STAT_CTRL, SC_STAT_RST_CLR);
   1047 
   1048   // Set the status list base address
   1049   PhysAddr = sc->msk_stat_ring_paddr;
   1050   CSR_WRITE_4 (sc, STAT_LIST_ADDR_LO, MSK_ADDR_LO (PhysAddr));
   1051   CSR_WRITE_4 (sc, STAT_LIST_ADDR_HI, MSK_ADDR_HI (PhysAddr));
   1052 
   1053   // Set the status list last index
   1054   CSR_WRITE_2 (sc, STAT_LAST_IDX, MSK_STAT_RING_CNT - 1);
   1055   if ((sc->msk_hw_id == CHIP_ID_YUKON_EC) && (sc->msk_hw_rev == CHIP_REV_YU_EC_A1)) {
   1056     // WA for dev. #4.3
   1057     CSR_WRITE_2 (sc, STAT_TX_IDX_TH, ST_TXTH_IDX_MASK);
   1058     // WA for dev. #4.18
   1059     CSR_WRITE_1 (sc, STAT_FIFO_WM, 0x21);
   1060     CSR_WRITE_1 (sc, STAT_FIFO_ISR_WM, 0x07);
   1061   } else {
   1062     CSR_WRITE_2 (sc, STAT_TX_IDX_TH, 0x0a);
   1063     CSR_WRITE_1 (sc, STAT_FIFO_WM, 0x10);
   1064     if ((sc->msk_hw_id == CHIP_ID_YUKON_XL) && (sc->msk_hw_rev == CHIP_REV_YU_XL_A0)) {
   1065       CSR_WRITE_1 (sc, STAT_FIFO_ISR_WM, 0x04);
   1066     } else {
   1067       CSR_WRITE_1 (sc, STAT_FIFO_ISR_WM, 0x10);
   1068     }
   1069     CSR_WRITE_4 (sc, STAT_ISR_TIMER_INI, 0x0190);
   1070   }
   1071   //
   1072   // Use default value for STAT_ISR_TIMER_INI, STAT_LEV_TIMER_INI.
   1073   //
   1074   CSR_WRITE_4 (sc, STAT_TX_TIMER_INI, MSK_USECS (sc, 1000));
   1075 
   1076   // Enable status unit
   1077   CSR_WRITE_4 (sc, STAT_CTRL, SC_STAT_OP_ON);
   1078 
   1079   CSR_WRITE_1 (sc, STAT_TX_TIMER_CTRL, TIM_START);
   1080   CSR_WRITE_1 (sc, STAT_LEV_TIMER_CTRL, TIM_START);
   1081   CSR_WRITE_1 (sc, STAT_ISR_TIMER_CTRL, TIM_START);
   1082 }
   1083 
   1084 EFI_STATUS
   1085 mskc_attach_if (
   1086     struct msk_if_softc   *sc_if,
   1087     UINTN                 Port
   1088     )
   1089 {
   1090   INTN                  i;
   1091   EFI_STATUS            Status;
   1092 
   1093   sc_if->msk_md.port = Port;
   1094   sc_if->msk_flags = sc_if->msk_softc->msk_pflags;
   1095 
   1096   // Setup Tx/Rx queue register offsets
   1097   if (Port == MSK_PORT_A) {
   1098     sc_if->msk_txq = Q_XA1;
   1099     sc_if->msk_txsq = Q_XS1;
   1100     sc_if->msk_rxq = Q_R1;
   1101   } else {
   1102     sc_if->msk_txq = Q_XA2;
   1103     sc_if->msk_txsq = Q_XS2;
   1104     sc_if->msk_rxq = Q_R2;
   1105   }
   1106 
   1107   Status = msk_txrx_dma_alloc (sc_if);
   1108   if (EFI_ERROR (Status)) {
   1109     return Status;
   1110   }
   1111 
   1112   /*
   1113    * Get station address for this interface. Note that
   1114    * dual port cards actually come with three station
   1115    * addresses: one for each port, plus an extra. The
   1116    * extra one is used by the SysKonnect driver software
   1117    * as a 'virtual' station address for when both ports
   1118    * are operating in failover mode. Currently we don't
   1119    * use this extra address.
   1120    */
   1121   for (i = 0; i < NET_ETHER_ADDR_LEN; i++) {
   1122     sc_if->MacAddress.Addr[i] = CSR_READ_1 (sc_if->msk_softc, B2_MAC_1 + (Port * 8) + i);
   1123   }
   1124 
   1125   DEBUG ((EFI_D_NET,"Marvell Yukon: Mac Address %02x:%02x:%02x:%02x:%02x:%02x\n",
   1126           sc_if->MacAddress.Addr[0], sc_if->MacAddress.Addr[1], sc_if->MacAddress.Addr[2],
   1127       sc_if->MacAddress.Addr[3], sc_if->MacAddress.Addr[4], sc_if->MacAddress.Addr[5]));
   1128 
   1129   Status = e1000_probe_and_attach (&sc_if->mii_d, &sc_if->msk_md, sc_if, &sc_if->phy_softc);
   1130   if (EFI_ERROR (Status)) {
   1131     return Status;
   1132   }
   1133 
   1134   InitializeListHead (&sc_if->TransmitQueueHead);
   1135   InitializeListHead (&sc_if->TransmitFreeQueueHead);
   1136   InitializeListHead (&sc_if->ReceiveQueueHead);
   1137   sc_if->active = TRUE;
   1138 
   1139   return (Status);
   1140 }
   1141 
   1142 /*
   1143  * Attach the interface. Allocate softc structures, do ifmedia
   1144  * setup and ethernet/BPF attach.
   1145  */
   1146 EFI_STATUS
   1147 mskc_attach (
   1148     IN  EFI_PCI_IO_PROTOCOL   *PciIo,
   1149     OUT struct msk_softc      **ScData
   1150     )
   1151 {
   1152   struct msk_mii_data   *mmd;
   1153   UINT64                Supports;
   1154   UINT8                 *PciBarResources;
   1155   EFI_STATUS            Status;
   1156   struct msk_if_softc   *ScIf;
   1157   struct msk_softc      *sc;
   1158 
   1159   Status = gBS->AllocatePool (EfiBootServicesData,
   1160                               sizeof (struct msk_softc),
   1161                               (VOID**) &sc);
   1162   if (EFI_ERROR (Status)) {
   1163     return Status;
   1164   }
   1165 
   1166   //
   1167   // Save original PCI attributes
   1168   //
   1169   gBS->SetMem (sc, sizeof (struct msk_softc), 0);
   1170   sc->PciIo = PciIo;
   1171   Status = PciIo->Attributes (
   1172         PciIo,
   1173         EfiPciIoAttributeOperationGet,
   1174         0,
   1175         &sc->OriginalPciAttributes
   1176         );
   1177   if (EFI_ERROR (Status)) {
   1178     gBS->FreePool (sc);
   1179     return Status;
   1180   }
   1181 
   1182   Status = PciIo->Attributes (
   1183         PciIo,
   1184         EfiPciIoAttributeOperationSupported,
   1185         0,
   1186         &Supports
   1187         );
   1188   if (!EFI_ERROR (Status)) {
   1189     Supports &= EFI_PCI_DEVICE_ENABLE;
   1190     Status = PciIo->Attributes (
   1191           PciIo,
   1192           EfiPciIoAttributeOperationEnable,
   1193           Supports | EFI_PCI_IO_ATTRIBUTE_DUAL_ADDRESS_CYCLE,
   1194           NULL
   1195           );
   1196   }
   1197   if (EFI_ERROR (Status)) {
   1198     DEBUG ((EFI_D_ERROR, "Marvell Yukon: Failed to enable NIC controller\n"));
   1199     goto RESTORE_PCI_ATTRIBS;
   1200   }
   1201 
   1202   Status = PciIo->GetBarAttributes (PciIo, 0, &Supports, (VOID**)&PciBarResources);
   1203   if (!EFI_ERROR (Status) && (((EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *)PciBarResources)->Desc == ACPI_ADDRESS_SPACE_DESCRIPTOR)) {
   1204     if (((EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *)PciBarResources)->ResType == ACPI_ADDRESS_SPACE_TYPE_MEM) {
   1205       if (!(((EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *)PciBarResources)->SpecificFlag & ACPI_SPECFLAG_PREFETCHABLE)) {
   1206         sc->RegBase = ((EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *)PciBarResources)->AddrRangeMin;
   1207         // Should assert that Bar is 32 bits wide
   1208         DEBUG ((DEBUG_NET, "Marvell Yukon: GlobalRegistersBase = 0x%x\n", sc->RegBase));
   1209       } else {
   1210         Status = EFI_NOT_FOUND;
   1211       }
   1212     } else {
   1213       Status = EFI_NOT_FOUND;
   1214     }
   1215   }
   1216   if (EFI_ERROR (Status)) {
   1217     goto RESTORE_PCI_ATTRIBS;
   1218   }
   1219 
   1220   // Clear Software Reset
   1221   CSR_WRITE_2 (sc, B0_CTST, CS_RST_CLR);
   1222 
   1223   // Get Hardware ID & Revision
   1224   sc->msk_hw_id = CSR_READ_1 (sc, B2_CHIP_ID);
   1225   sc->msk_hw_rev = (CSR_READ_1 (sc, B2_MAC_CFG) >> 4) & 0x0f;
   1226 
   1227   // Bail out if chip is not recognized
   1228   if (sc->msk_hw_id < CHIP_ID_YUKON_XL ||
   1229       sc->msk_hw_id > CHIP_ID_YUKON_OPT ||
   1230       sc->msk_hw_id == CHIP_ID_YUKON_SUPR ||
   1231       sc->msk_hw_id == CHIP_ID_YUKON_UNKNOWN) {
   1232     DEBUG ((DEBUG_NET, "Marvell Yukon: unknown device: id=0x%02x, rev=0x%02x\n", sc->msk_hw_id, sc->msk_hw_rev));
   1233     Status = EFI_DEVICE_ERROR;
   1234     goto RESTORE_PCI_ATTRIBS;
   1235   }
   1236   DEBUG ((EFI_D_NET, "Marvell Yukon: Marvell Technology Group Ltd. %a Id:0x%02x Rev:0x%02x\n",
   1237           model_name[sc->msk_hw_id - CHIP_ID_YUKON_XL], sc->msk_hw_id, sc->msk_hw_rev));
   1238 
   1239   sc->msk_process_limit = MSK_PROC_DEFAULT;
   1240   sc->msk_int_holdoff = MSK_INT_HOLDOFF_DEFAULT;
   1241 
   1242   // Check if MAC address is valid
   1243   if ((CSR_READ_4 (sc, B2_MAC_1) == 0) && (CSR_READ_4 (sc, B2_MAC_1+4) == 0)) {
   1244     DEBUG ((EFI_D_NET, "Marvell Yukon: MAC address is invalid (00:00:00:00:00:00)\n"));
   1245   }
   1246 
   1247   // Soft reset
   1248   CSR_WRITE_2 (sc, B0_CTST, CS_RST_SET);
   1249   CSR_WRITE_2 (sc, B0_CTST, CS_RST_CLR);
   1250   sc->msk_pmd = CSR_READ_1 (sc, B2_PMD_TYP);
   1251 
   1252   // Check number of MACs
   1253   sc->msk_num_port = 1;
   1254   if ((CSR_READ_1 (sc, B2_Y2_HW_RES) & CFG_DUAL_MAC_MSK) == CFG_DUAL_MAC_MSK) {
   1255     if (!(CSR_READ_1 (sc, B2_Y2_CLK_GATE) & Y2_STATUS_LNK2_INAC)) {
   1256       sc->msk_num_port++;
   1257     }
   1258   }
   1259 
   1260   /* Check bus type. */
   1261   sc->msk_bustype = MSK_PEX_BUS; /* Only support PCI Express */
   1262   sc->msk_expcap = 1;
   1263 
   1264   switch (sc->msk_hw_id) {
   1265     case CHIP_ID_YUKON_EC:
   1266       sc->msk_clock = 125;  /* 125 MHz */
   1267       sc->msk_pflags |= MSK_FLAG_JUMBO;
   1268       break;
   1269     case CHIP_ID_YUKON_EC_U:
   1270       sc->msk_clock = 125;  /* 125 MHz */
   1271       sc->msk_pflags |= MSK_FLAG_JUMBO | MSK_FLAG_JUMBO_NOCSUM;
   1272       break;
   1273     case CHIP_ID_YUKON_EX:
   1274       sc->msk_clock = 125;  /* 125 MHz */
   1275       sc->msk_pflags |= MSK_FLAG_JUMBO | MSK_FLAG_DESCV2 | MSK_FLAG_AUTOTX_CSUM;
   1276       /*
   1277      * Yukon Extreme seems to have silicon bug for
   1278      * automatic Tx checksum calculation capability.
   1279      */
   1280       if (sc->msk_hw_rev == CHIP_REV_YU_EX_B0) {
   1281         sc->msk_pflags &= ~MSK_FLAG_AUTOTX_CSUM;
   1282       }
   1283       /*
   1284      * Yukon Extreme A0 could not use store-and-forward
   1285      * for jumbo frames, so disable Tx checksum
   1286      * offloading for jumbo frames.
   1287      */
   1288       if (sc->msk_hw_rev == CHIP_REV_YU_EX_A0) {
   1289         sc->msk_pflags |= MSK_FLAG_JUMBO_NOCSUM;
   1290       }
   1291       break;
   1292     case CHIP_ID_YUKON_FE:
   1293       sc->msk_clock = 100;  /* 100 MHz */
   1294       sc->msk_pflags |= MSK_FLAG_FASTETHER;
   1295       break;
   1296     case CHIP_ID_YUKON_FE_P:
   1297       sc->msk_clock = 50;  /* 50 MHz */
   1298       sc->msk_pflags |= MSK_FLAG_FASTETHER | MSK_FLAG_DESCV2 | MSK_FLAG_AUTOTX_CSUM;
   1299       if (sc->msk_hw_rev == CHIP_REV_YU_FE_P_A0) {
   1300         /*
   1301        * XXX
   1302        * FE+ A0 has status LE writeback bug so msk (4)
   1303        * does not rely on status word of received frame
   1304        * in msk_rxeof () which in turn disables all
   1305        * hardware assistance bits reported by the status
   1306        * word as well as validity of the recevied frame.
   1307        * Just pass received frames to upper stack with
   1308        * minimal test and let upper stack handle them.
   1309        */
   1310         sc->msk_pflags |= MSK_FLAG_NOHWVLAN | MSK_FLAG_NORXCHK | MSK_FLAG_NORX_CSUM;
   1311       }
   1312       break;
   1313     case CHIP_ID_YUKON_XL:
   1314       sc->msk_clock = 156;  /* 156 MHz */
   1315       sc->msk_pflags |= MSK_FLAG_JUMBO;
   1316       break;
   1317     case CHIP_ID_YUKON_UL_2:
   1318       sc->msk_clock = 125;  /* 125 MHz */
   1319       sc->msk_pflags |= MSK_FLAG_JUMBO;
   1320       break;
   1321     case CHIP_ID_YUKON_OPT:
   1322       sc->msk_clock = 125;  /* 125 MHz */
   1323       sc->msk_pflags |= MSK_FLAG_JUMBO | MSK_FLAG_DESCV2;
   1324       break;
   1325     default:
   1326       sc->msk_clock = 156;  /* 156 MHz */
   1327       break;
   1328   }
   1329 
   1330   Status = msk_status_dma_alloc (sc);
   1331   if (EFI_ERROR (Status)) {
   1332     goto fail;
   1333   }
   1334 
   1335   // Set base interrupt mask
   1336   sc->msk_intrmask = Y2_IS_HW_ERR | Y2_IS_STAT_BMU;
   1337   sc->msk_intrhwemask = Y2_IS_TIST_OV | Y2_IS_MST_ERR | Y2_IS_IRQ_STAT | Y2_IS_PCI_EXP | Y2_IS_PCI_NEXP;
   1338 
   1339   // Reset the adapter
   1340   mskc_reset (sc);
   1341 
   1342   mskc_setup_rambuffer (sc);
   1343 
   1344   Status = gBS->AllocatePool (EfiBootServicesData,
   1345                               sizeof (struct msk_if_softc),
   1346                               (VOID**) &ScIf);
   1347   if (EFI_ERROR (Status)) {
   1348     goto fail;
   1349   }
   1350   gBS->SetMem (ScIf, sizeof (struct msk_if_softc), 0);
   1351   ScIf->msk_softc = sc;
   1352   sc->msk_if[MSK_PORT_A] = ScIf;
   1353   Status = mskc_attach_if (sc->msk_if[MSK_PORT_A], MSK_PORT_A);
   1354   if (EFI_ERROR (Status)) {
   1355     goto fail;
   1356   }
   1357 
   1358   mmd = &ScIf->msk_md;
   1359   mmd->port = MSK_PORT_A;
   1360   mmd->pmd = sc->msk_pmd;
   1361   if (sc->msk_pmd == 'L' || sc->msk_pmd == 'S' || sc->msk_pmd == 'P') {
   1362     mmd->mii_flags |= MIIF_HAVEFIBER;
   1363   }
   1364 
   1365   if (sc->msk_num_port > 1) {
   1366     Status = gBS->AllocatePool (EfiBootServicesData,
   1367                                 sizeof (struct msk_if_softc),
   1368                                 (VOID**) &ScIf);
   1369     if (EFI_ERROR (Status)) {
   1370       goto fail;
   1371     }
   1372     gBS->SetMem (ScIf, sizeof (struct msk_if_softc), 0);
   1373     ScIf->msk_softc = sc;
   1374     sc->msk_if[MSK_PORT_B] = ScIf;
   1375     Status = mskc_attach_if (sc->msk_if[MSK_PORT_B], MSK_PORT_B);
   1376     if (EFI_ERROR (Status)) {
   1377       goto fail;
   1378     }
   1379 
   1380     mmd = &ScIf->msk_md;
   1381     mmd->port = MSK_PORT_B;
   1382     mmd->pmd = sc->msk_pmd;
   1383     if (sc->msk_pmd == 'L' || sc->msk_pmd == 'S' || sc->msk_pmd == 'P') {
   1384       mmd->mii_flags |= MIIF_HAVEFIBER;
   1385     }
   1386   }
   1387 
   1388   // Return new msk_softc structure
   1389   *ScData = sc;
   1390 
   1391   // Create timer for tick
   1392   Status = gBS->CreateEvent (
   1393         EVT_NOTIFY_SIGNAL | EVT_TIMER,
   1394         TPL_CALLBACK,
   1395         mskc_tick,
   1396         (VOID *)sc,
   1397         &sc->Timer
   1398         );
   1399   if (EFI_ERROR (Status)) {
   1400     goto fail;
   1401   }
   1402 
   1403   Status = gBS->SetTimer (sc->Timer, TimerPeriodic, TICKS_PER_SECOND);
   1404   if (EFI_ERROR (Status)) {
   1405     goto fail;
   1406   }
   1407 
   1408 fail:
   1409   if (EFI_ERROR (Status)) {
   1410     mskc_detach (sc);
   1411   }
   1412 
   1413   return (Status);
   1414 
   1415 RESTORE_PCI_ATTRIBS:
   1416   //
   1417   // Restore original PCI attributes
   1418   //
   1419   PciIo->Attributes (
   1420         PciIo,
   1421         EfiPciIoAttributeOperationSet,
   1422         sc->OriginalPciAttributes,
   1423         NULL
   1424         );
   1425   gBS->FreePool (sc);
   1426   return Status;
   1427 }
   1428 
   1429 /*
   1430  * Shutdown hardware and free up resources. This can be called any
   1431  * time after the mutex has been initialized. It is called in both
   1432  * the error case in attach and the normal detach case so it needs
   1433  * to be careful about only freeing resources that have actually been
   1434  * allocated.
   1435  */
   1436 VOID
   1437 mskc_detach_if (
   1438     struct msk_if_softc  *sc_if
   1439     )
   1440 {
   1441   if (sc_if->active) {
   1442     mskc_stop_if (sc_if);
   1443     msk_txrx_dma_free (sc_if);
   1444     e1000phy_detach (sc_if->phy_softc);
   1445     sc_if->phy_softc = NULL;
   1446     sc_if->active = FALSE;
   1447   }
   1448 }
   1449 
   1450 VOID
   1451 mskc_detach (
   1452     struct msk_softc  *sc
   1453     )
   1454 {
   1455   EFI_TPL OldTpl;
   1456   EFI_PCI_IO_PROTOCOL *PciIo;
   1457 
   1458   if (sc == NULL) {
   1459     return;
   1460   }
   1461 
   1462   OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
   1463 
   1464   PciIo = sc->PciIo;
   1465 
   1466   if (sc->msk_if[MSK_PORT_A] != NULL) {
   1467     mskc_detach_if (sc->msk_if[MSK_PORT_A]);
   1468     gBS->FreePool (sc->msk_if[MSK_PORT_A]);
   1469     sc->msk_if[MSK_PORT_A] = NULL;
   1470   }
   1471   if (sc->msk_if[MSK_PORT_B] != NULL) {
   1472     mskc_detach_if (sc->msk_if[MSK_PORT_B]);
   1473     gBS->FreePool (sc->msk_if[MSK_PORT_B]);
   1474     sc->msk_if[MSK_PORT_B] = NULL;
   1475   }
   1476 
   1477   /* Disable all interrupts. */
   1478   CSR_WRITE_4 (sc, B0_IMSK, 0);
   1479   CSR_READ_4 (sc, B0_IMSK);
   1480   CSR_WRITE_4 (sc, B0_HWE_IMSK, 0);
   1481   CSR_READ_4 (sc, B0_HWE_IMSK);
   1482 
   1483   // LED Off.
   1484   CSR_WRITE_2 (sc, B0_CTST, Y2_LED_STAT_OFF);
   1485 
   1486   // Put hardware reset.
   1487   CSR_WRITE_2 (sc, B0_CTST, CS_RST_SET);
   1488 
   1489   msk_status_dma_free (sc);
   1490 
   1491   if (sc->Timer != NULL) {
   1492     gBS->SetTimer (sc->Timer, TimerCancel, 0);
   1493     gBS->CloseEvent (sc->Timer);
   1494 
   1495     sc->Timer = NULL;
   1496   }
   1497   //
   1498   // Restore original PCI attributes
   1499   //
   1500   PciIo->Attributes (
   1501         PciIo,
   1502         EfiPciIoAttributeOperationSet,
   1503         sc->OriginalPciAttributes,
   1504         NULL
   1505         );
   1506 
   1507   gBS->RestoreTPL (OldTpl);
   1508 }
   1509 
   1510 /* Create status DMA region. */
   1511 static
   1512 EFI_STATUS
   1513 msk_status_dma_alloc (
   1514     struct msk_softc  *sc
   1515     )
   1516 {
   1517   EFI_STATUS  Status;
   1518   UINTN       Length;
   1519   EFI_PCI_IO_PROTOCOL *PciIo;
   1520 
   1521   PciIo = sc->PciIo;
   1522 
   1523   Status = PciIo->AllocateBuffer (PciIo, AllocateAnyPages, EfiBootServicesData,
   1524                                    EFI_SIZE_TO_PAGES (MSK_STAT_RING_SZ), (VOID**)&sc->msk_stat_ring, 0);
   1525 
   1526   if (EFI_ERROR (Status)) {
   1527     DEBUG ((EFI_D_ERROR, "Marvell Yukon: failed to allocate DMA'able memory for status ring\n"));
   1528     return Status;
   1529   }
   1530   ASSERT (sc->msk_stat_ring != NULL);
   1531 
   1532   Length = MSK_STAT_RING_SZ;
   1533   Status = PciIo->Map (PciIo, EfiPciIoOperationBusMasterCommonBuffer, sc->msk_stat_ring,
   1534                         &Length, &sc->msk_stat_ring_paddr, &sc->msk_stat_map);
   1535   ASSERT (Length == MSK_STAT_RING_SZ);
   1536 
   1537   if (EFI_ERROR (Status)) {
   1538     DEBUG ((EFI_D_ERROR, "Marvell Yukon: failed to map DMA'able memory for status ring\n"));
   1539   }
   1540 
   1541   return Status;
   1542 }
   1543 
   1544 static
   1545 VOID
   1546 msk_status_dma_free (
   1547     struct msk_softc  *sc
   1548     )
   1549 {
   1550   EFI_PCI_IO_PROTOCOL *PciIo;
   1551 
   1552   PciIo = sc->PciIo;
   1553 
   1554   if (sc->msk_stat_map) {
   1555     PciIo->Unmap (PciIo, sc->msk_stat_map);
   1556     if (sc->msk_stat_ring) {
   1557       PciIo->FreeBuffer (PciIo, EFI_SIZE_TO_PAGES (MSK_STAT_RING_SZ), sc->msk_stat_ring);
   1558       sc->msk_stat_ring = NULL;
   1559     }
   1560     sc->msk_stat_map = NULL;
   1561   }
   1562 }
   1563 
   1564 static
   1565 EFI_STATUS
   1566 msk_txrx_dma_alloc (
   1567     struct msk_if_softc   *sc_if
   1568     )
   1569 {
   1570   struct msk_txdesc   *txd;
   1571   struct msk_rxdesc   *rxd;
   1572   INTN                i;
   1573   UINTN               Length;
   1574   EFI_STATUS          Status;
   1575   EFI_PCI_IO_PROTOCOL *PciIo;
   1576 
   1577   PciIo = sc_if->msk_softc->PciIo;
   1578 
   1579   Status = PciIo->AllocateBuffer (PciIo, AllocateAnyPages, EfiBootServicesData,
   1580                                    EFI_SIZE_TO_PAGES (MSK_TX_RING_SZ), (VOID**)&sc_if->msk_rdata.msk_tx_ring, 0);
   1581 
   1582   if (EFI_ERROR (Status)) {
   1583     DEBUG ((EFI_D_ERROR, "Marvell Yukon: failed to allocate DMA'able memory for Tx ring\n"));
   1584     goto fail;
   1585   }
   1586   ASSERT (sc_if->msk_rdata.msk_tx_ring != NULL);
   1587 
   1588   Length = MSK_TX_RING_SZ;
   1589   Status = PciIo->Map (PciIo, EfiPciIoOperationBusMasterCommonBuffer, sc_if->msk_rdata.msk_tx_ring,
   1590                         &Length, &sc_if->msk_rdata.msk_tx_ring_paddr, &sc_if->msk_cdata.msk_tx_ring_map);
   1591 
   1592   if (EFI_ERROR (Status)) {
   1593     DEBUG ((EFI_D_ERROR, "Marvell Yukon: failed to map DMA'able memory for Tx ring\n"));
   1594     goto fail;
   1595   }
   1596   ASSERT (Length == MSK_TX_RING_SZ);
   1597 
   1598   Status = PciIo->AllocateBuffer (PciIo, AllocateAnyPages, EfiBootServicesData,
   1599                                    EFI_SIZE_TO_PAGES (MSK_RX_RING_SZ), (VOID**)&sc_if->msk_rdata.msk_rx_ring, 0);
   1600 
   1601   if (EFI_ERROR (Status)) {
   1602     DEBUG ((EFI_D_ERROR, "Marvell Yukon: failed to allocate DMA'able memory for Rx ring\n"));
   1603     goto fail;
   1604   }
   1605   ASSERT (sc_if->msk_rdata.msk_rx_ring != NULL);
   1606 
   1607   Length = MSK_RX_RING_SZ;
   1608   Status = PciIo->Map (PciIo, EfiPciIoOperationBusMasterCommonBuffer, sc_if->msk_rdata.msk_rx_ring,
   1609                         &Length, &sc_if->msk_rdata.msk_rx_ring_paddr, &sc_if->msk_cdata.msk_rx_ring_map);
   1610 
   1611   if (EFI_ERROR (Status)) {
   1612     DEBUG ((EFI_D_ERROR, "Marvell Yukon: failed to map DMA'able memory for Rx ring\n"));
   1613     goto fail;
   1614   }
   1615   ASSERT (Length == MSK_RX_RING_SZ);
   1616 
   1617   // Create DMA maps for Tx buffers.
   1618   for (i = 0; i < MSK_TX_RING_CNT; i++) {
   1619     txd = &sc_if->msk_cdata.msk_txdesc[i];
   1620     gBS->SetMem (&(txd->tx_m), sizeof (MSK_DMA_BUF), 0);
   1621   }
   1622   // Create DMA maps for Rx buffers.
   1623   for (i = 0; i < MSK_RX_RING_CNT; i++) {
   1624     rxd = &sc_if->msk_cdata.msk_rxdesc[i];
   1625     gBS->SetMem (&(rxd->rx_m), sizeof (MSK_DMA_BUF), 0);
   1626   }
   1627 
   1628 fail:
   1629   return (Status);
   1630 }
   1631 
   1632 static
   1633 VOID
   1634 msk_txrx_dma_free (
   1635     struct msk_if_softc *sc_if
   1636     )
   1637 {
   1638   struct msk_txdesc   *txd;
   1639   struct msk_rxdesc   *rxd;
   1640   INTN                i;
   1641   EFI_PCI_IO_PROTOCOL *PciIo;
   1642 
   1643   PciIo = sc_if->msk_softc->PciIo;
   1644 
   1645   // Tx ring
   1646   if (sc_if->msk_cdata.msk_tx_ring_map) {
   1647     PciIo->Unmap (PciIo, sc_if->msk_cdata.msk_tx_ring_map);
   1648     if (sc_if->msk_rdata.msk_tx_ring) {
   1649       PciIo->FreeBuffer (PciIo, EFI_SIZE_TO_PAGES (MSK_TX_RING_SZ), sc_if->msk_rdata.msk_tx_ring);
   1650       sc_if->msk_rdata.msk_tx_ring = NULL;
   1651     }
   1652     sc_if->msk_cdata.msk_tx_ring_map = NULL;
   1653   }
   1654 
   1655   // Rx ring
   1656   if (sc_if->msk_cdata.msk_rx_ring_map) {
   1657     PciIo->Unmap (PciIo, sc_if->msk_cdata.msk_rx_ring_map);
   1658     if (sc_if->msk_rdata.msk_rx_ring) {
   1659       PciIo->FreeBuffer (PciIo, EFI_SIZE_TO_PAGES (MSK_RX_RING_SZ), sc_if->msk_rdata.msk_rx_ring);
   1660       sc_if->msk_rdata.msk_rx_ring = NULL;
   1661     }
   1662     sc_if->msk_cdata.msk_rx_ring_map = NULL;
   1663   }
   1664 
   1665   // Tx buffers
   1666   for (i = 0; i < MSK_TX_RING_CNT; i++) {
   1667     txd = &sc_if->msk_cdata.msk_txdesc[i];
   1668     if (txd->tx_m.DmaMapping) {
   1669       PciIo->Unmap (PciIo, txd->tx_m.DmaMapping);
   1670       gBS->SetMem (&(txd->tx_m), sizeof (MSK_DMA_BUF), 0);
   1671       // We don't own the transmit buffers so don't free them
   1672     }
   1673   }
   1674   // Rx buffers
   1675   for (i = 0; i < MSK_RX_RING_CNT; i++) {
   1676     rxd = &sc_if->msk_cdata.msk_rxdesc[i];
   1677     if (rxd->rx_m.DmaMapping) {
   1678       PciIo->Unmap (PciIo, rxd->rx_m.DmaMapping);
   1679       // Free Rx buffers as we own these
   1680       if(rxd->rx_m.Buf != NULL) {
   1681         gBS->FreePool (rxd->rx_m.Buf);
   1682         rxd->rx_m.Buf = NULL;
   1683       }
   1684       gBS->SetMem (&(rxd->rx_m), sizeof (MSK_DMA_BUF), 0);
   1685     }
   1686   }
   1687 }
   1688 
   1689 static
   1690 EFI_STATUS
   1691 msk_encap (
   1692     struct msk_if_softc   *sc_if,
   1693     MSK_SYSTEM_BUF        *m_head
   1694     )
   1695 {
   1696   struct msk_txdesc     *txd;
   1697   struct msk_txdesc     *txd_last;
   1698   struct msk_tx_desc    *tx_le;
   1699   VOID                  *Mapping;
   1700   EFI_PHYSICAL_ADDRESS  BusPhysAddr;
   1701   UINTN                 BusLength;
   1702   UINT32                control;
   1703   UINT32                prod;
   1704   UINT32                si;
   1705   EFI_STATUS            Status;
   1706   EFI_PCI_IO_PROTOCOL   *PciIo;
   1707 
   1708   PciIo = sc_if->msk_softc->PciIo;
   1709   prod = sc_if->msk_cdata.msk_tx_prod;
   1710   txd = &sc_if->msk_cdata.msk_txdesc[prod];
   1711   txd_last = txd;
   1712   BusLength = m_head->Length;
   1713   Status = PciIo->Map (PciIo, EfiPciIoOperationBusMasterRead, m_head->Buf,
   1714                         &BusLength, &BusPhysAddr, &txd->tx_m.DmaMapping);
   1715 
   1716   if (EFI_ERROR (Status)) {
   1717     DEBUG ((EFI_D_ERROR, "Marvell Yukon: failed to map DMA'able memory for Tx buffer\n"));
   1718     return Status;
   1719   }
   1720   ASSERT (BusLength == m_head->Length);
   1721 
   1722   control = 0;
   1723 
   1724 #ifdef MSK_64BIT_DMA
   1725   if (MSK_ADDR_HI(BusPhysAddr) !=
   1726     sc_if->msk_cdata.msk_tx_high_addr) {
   1727       sc_if->msk_cdata.msk_tx_high_addr =
   1728           MSK_ADDR_HI(BusPhysAddr);
   1729       tx_le = &sc_if->msk_rdata.msk_tx_ring[prod];
   1730       tx_le->msk_addr = htole32(MSK_ADDR_HI(BusPhysAddr));
   1731       tx_le->msk_control = htole32(OP_ADDR64 | HW_OWNER);
   1732       sc_if->msk_cdata.msk_tx_cnt++;
   1733       MSK_INC(prod, MSK_TX_RING_CNT);
   1734   }
   1735 #endif
   1736 
   1737   si = prod;
   1738   tx_le = &sc_if->msk_rdata.msk_tx_ring[prod];
   1739   tx_le->msk_addr = htole32 (MSK_ADDR_LO (BusPhysAddr));
   1740   tx_le->msk_control = htole32 (BusLength | control | OP_PACKET);
   1741   sc_if->msk_cdata.msk_tx_cnt++;
   1742   MSK_INC (prod, MSK_TX_RING_CNT);
   1743 
   1744   // Update producer index
   1745   sc_if->msk_cdata.msk_tx_prod = prod;
   1746 
   1747   // Set EOP on the last descriptor
   1748   prod = (prod + MSK_TX_RING_CNT - 1) % MSK_TX_RING_CNT;
   1749   tx_le = &sc_if->msk_rdata.msk_tx_ring[prod];
   1750   tx_le->msk_control |= htole32 (EOP);
   1751 
   1752   // Turn the first descriptor ownership to hardware
   1753   tx_le = &sc_if->msk_rdata.msk_tx_ring[si];
   1754   tx_le->msk_control |= htole32 (HW_OWNER);
   1755 
   1756   txd = &sc_if->msk_cdata.msk_txdesc[prod];
   1757   Mapping = txd_last->tx_m.DmaMapping;
   1758   txd_last->tx_m.DmaMapping = txd->tx_m.DmaMapping;
   1759   txd->tx_m.DmaMapping = Mapping;
   1760   txd->tx_m.Buf = m_head->Buf;
   1761   txd->tx_m.Length = m_head->Length;
   1762 
   1763   return EFI_SUCCESS;
   1764 }
   1765 
   1766 EFI_STATUS
   1767 mskc_transmit (
   1768     struct msk_if_softc  *sc_if,
   1769     UINTN   BufferSize,
   1770     VOID    *Buffer
   1771     )
   1772 {
   1773   MSK_LINKED_SYSTEM_BUF   *LinkedSystemBuf;
   1774   EFI_STATUS               Status;
   1775 
   1776   Status = gBS->AllocatePool (EfiBootServicesData,
   1777                               sizeof (MSK_LINKED_SYSTEM_BUF),
   1778                               (VOID**) &LinkedSystemBuf);
   1779   if (EFI_ERROR (Status)) {
   1780     return Status;
   1781   }
   1782   gBS->SetMem (LinkedSystemBuf, sizeof (MSK_LINKED_SYSTEM_BUF), 0);
   1783   LinkedSystemBuf->Signature = TX_MBUF_SIGNATURE;
   1784   //
   1785   // Add the passed Buffer to the transmit queue. Don't copy.
   1786   //
   1787   LinkedSystemBuf->SystemBuf.Buf = Buffer;
   1788   LinkedSystemBuf->SystemBuf.Length = BufferSize;
   1789   InsertTailList (&sc_if->TransmitQueueHead, &LinkedSystemBuf->Link);
   1790   msk_start (sc_if);
   1791   return EFI_SUCCESS;
   1792 }
   1793 
   1794 void
   1795 mskc_getstatus (
   1796     struct msk_if_softc  *sc_if,
   1797     OUT UINT32                     *InterruptStatus, OPTIONAL
   1798     OUT VOID                       **TxBuf           OPTIONAL
   1799     )
   1800 {
   1801   MSK_LINKED_SYSTEM_BUF *m_head;
   1802 
   1803   // Interrupt status is not read from the device when InterruptStatus is NULL
   1804   if (InterruptStatus != NULL) {
   1805     // Check the interrupt lines
   1806     msk_intr (sc_if->msk_softc);
   1807   }
   1808 
   1809   // The transmit buffer status is not read when TxBuf is NULL
   1810   if (TxBuf != NULL) {
   1811     *((UINT8 **) TxBuf) = (UINT8 *) 0;
   1812     if (!IsListEmpty (&sc_if->TransmitFreeQueueHead))
   1813     {
   1814       m_head = CR (GetFirstNode (&sc_if->TransmitFreeQueueHead), MSK_LINKED_SYSTEM_BUF, Link, TX_MBUF_SIGNATURE);
   1815       if(m_head != NULL) {
   1816         *TxBuf = m_head->SystemBuf.Buf;
   1817         RemoveEntryList (&m_head->Link);
   1818         gBS->FreePool (m_head);
   1819       }
   1820     }
   1821   }
   1822 }
   1823 
   1824 static
   1825 VOID
   1826 msk_start (
   1827     struct msk_if_softc  *sc_if
   1828     )
   1829 {
   1830   EFI_STATUS            Status;
   1831   MSK_LINKED_SYSTEM_BUF *m_head;
   1832   INTN                  enq;
   1833 
   1834   for (enq = 0; !IsListEmpty (&sc_if->TransmitQueueHead) &&
   1835        sc_if->msk_cdata.msk_tx_cnt < (MSK_TX_RING_CNT - MSK_RESERVED_TX_DESC_CNT); )
   1836   {
   1837 
   1838     m_head = CR (GetFirstNode (&sc_if->TransmitQueueHead), MSK_LINKED_SYSTEM_BUF, Link, TX_MBUF_SIGNATURE);
   1839     if (m_head == NULL) {
   1840       break;
   1841     }
   1842     //
   1843     // Pack the data into the transmit ring. If we
   1844     // don't have room, set the OACTIVE flag and wait
   1845     // for the NIC to drain the ring.
   1846     //
   1847     Status = msk_encap (sc_if, &m_head->SystemBuf);
   1848     if (EFI_ERROR (Status)) {
   1849       break;
   1850     }
   1851 
   1852     RemoveEntryList (&m_head->Link);
   1853     InsertTailList (&sc_if->TransmitFreeQueueHead, &m_head->Link);
   1854     enq++;
   1855   }
   1856 
   1857   if (enq > 0) {
   1858     // Transmit
   1859     CSR_WRITE_2 (sc_if->msk_softc, Y2_PREF_Q_ADDR (sc_if->msk_txq, PREF_UNIT_PUT_IDX_REG),
   1860                  sc_if->msk_cdata.msk_tx_prod);
   1861   }
   1862 }
   1863 
   1864 VOID
   1865 mskc_shutdown (
   1866     struct msk_softc  *sc
   1867     )
   1868 {
   1869   INTN i;
   1870   EFI_TPL OldTpl;
   1871 
   1872   OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
   1873 
   1874   for (i = 0; i < sc->msk_num_port; i++) {
   1875     if (sc->msk_if[i] != NULL) {
   1876       mskc_stop_if (sc->msk_if[i]);
   1877     }
   1878   }
   1879   gBS->SetTimer (sc->Timer, TimerCancel, 0);
   1880 
   1881   /* Put hardware reset. */
   1882   CSR_WRITE_2 (sc, B0_CTST, CS_RST_SET);
   1883 
   1884   gBS->RestoreTPL (OldTpl);
   1885 }
   1886 
   1887 EFI_STATUS
   1888 mskc_receive (
   1889     struct msk_if_softc  *sc_if,
   1890     IN OUT UINTN  *BufferSize,
   1891     OUT    VOID   *Buffer
   1892     )
   1893 {
   1894   MSK_LINKED_SYSTEM_BUF   *mBuf;
   1895 
   1896   msk_intr (sc_if->msk_softc); // check the interrupt lines
   1897 
   1898   if (IsListEmpty (&sc_if->ReceiveQueueHead)) {
   1899     *BufferSize = 0;
   1900     return EFI_NOT_READY;
   1901   }
   1902 
   1903   mBuf = CR (GetFirstNode (&sc_if->ReceiveQueueHead), MSK_LINKED_SYSTEM_BUF, Link, RX_MBUF_SIGNATURE);
   1904   if (mBuf->SystemBuf.Length > *BufferSize) {
   1905     *BufferSize = mBuf->SystemBuf.Length;
   1906     DEBUG ((EFI_D_NET, "Marvell Yukon: Receive buffer is too small: Provided = %d, Received = %d\n",
   1907             *BufferSize, mBuf->SystemBuf.Length));
   1908     return EFI_BUFFER_TOO_SMALL;
   1909   }
   1910   *BufferSize = mBuf->SystemBuf.Length;
   1911   RemoveEntryList (&mBuf->Link);
   1912   gBS->CopyMem (Buffer, mBuf->SystemBuf.Buf, *BufferSize);
   1913   gBS->FreePool(mBuf->SystemBuf.Buf);
   1914   gBS->FreePool (mBuf);
   1915   return EFI_SUCCESS;
   1916 }
   1917 
   1918 static VOID
   1919 msk_rxeof (
   1920     struct msk_if_softc   *sc_if,
   1921     UINT32                status,
   1922     UINT32                control,
   1923     INTN                  len
   1924     )
   1925 {
   1926   EFI_STATUS            Status;
   1927   MSK_LINKED_SYSTEM_BUF *m_link;
   1928   struct msk_rxdesc     *rxd;
   1929   INTN                  cons;
   1930   INTN                  rxlen;
   1931   MSK_DMA_BUF           m;
   1932   EFI_PCI_IO_PROTOCOL    *PciIo;
   1933 
   1934   DEBUG ((EFI_D_NET, "Marvell Yukon: rxeof\n"));
   1935 
   1936   PciIo = sc_if->msk_softc->PciIo;
   1937   cons = sc_if->msk_cdata.msk_rx_cons;
   1938   do {
   1939     rxlen = status >> 16;
   1940     if ((sc_if->msk_flags & MSK_FLAG_NORXCHK) != 0) {
   1941       //
   1942       // For controllers that returns bogus status code
   1943       // just do minimal check and let upper stack
   1944       // handle this frame.
   1945       //
   1946       if (len > MAX_SUPPORTED_PACKET_SIZE || len < NET_ETHER_ADDR_LEN) {
   1947         msk_discard_rxbuf (sc_if, cons);
   1948         break;
   1949       }
   1950     } else if (len > sc_if->msk_framesize ||
   1951                ((status & GMR_FS_ANY_ERR) != 0) ||
   1952                ((status & GMR_FS_RX_OK) == 0) || (rxlen != len)) {
   1953       msk_discard_rxbuf (sc_if, cons);
   1954       break;
   1955     }
   1956 
   1957 #ifdef MSK_64BIT_DMA
   1958     rxd = &sc_if->msk_cdata.msk_rxdesc[(cons + 1) % MSK_RX_RING_CNT];
   1959 #else
   1960     rxd = &sc_if->msk_cdata.msk_rxdesc[cons];
   1961 #endif
   1962 
   1963     m.Buf = rxd->rx_m.Buf;
   1964     m.DmaMapping = rxd->rx_m.DmaMapping;
   1965     m.Length = rxd->rx_m.Length;
   1966 
   1967     Status = msk_newbuf (sc_if, cons);
   1968     if (EFI_ERROR (Status)) {
   1969       // This is a dropped packet, but we aren't counting drops
   1970       // Reuse old buffer
   1971       msk_discard_rxbuf (sc_if, cons);
   1972       break;
   1973     }
   1974 
   1975     Status = PciIo->Flush (PciIo);
   1976     if (EFI_ERROR (Status)) {
   1977       DEBUG ((EFI_D_NET, "Marvell Yukon: failed to Flush DMA\n"));
   1978     }
   1979 
   1980     Status = PciIo->Unmap (PciIo, rxd->rx_m.DmaMapping);
   1981     if (EFI_ERROR (Status)) {
   1982       DEBUG ((EFI_D_NET, "Marvell Yukon: failed to Unmap DMA\n"));
   1983     }
   1984 
   1985     Status = gBS->AllocatePool (EfiBootServicesData,
   1986                                 sizeof (MSK_LINKED_SYSTEM_BUF),
   1987                                 (VOID**) &m_link);
   1988     if (!EFI_ERROR (Status)) {
   1989       gBS->SetMem (m_link, sizeof (MSK_LINKED_SYSTEM_BUF), 0);
   1990       m_link->Signature = RX_MBUF_SIGNATURE;
   1991       m_link->SystemBuf.Buf = m.Buf;
   1992       m_link->SystemBuf.Length = len;
   1993 
   1994       InsertTailList (&sc_if->ReceiveQueueHead, &m_link->Link);
   1995     } else {
   1996       DEBUG ((EFI_D_NET, "Marvell Yukon: failed to allocate receive buffer link. Dropping Frame\n"));
   1997       gBS->FreePool (m.Buf);
   1998     }
   1999   } while (0);
   2000 
   2001   MSK_RX_INC (sc_if->msk_cdata.msk_rx_cons, MSK_RX_RING_CNT);
   2002   MSK_RX_INC (sc_if->msk_cdata.msk_rx_prod, MSK_RX_RING_CNT);
   2003 }
   2004 
   2005 static
   2006 VOID
   2007 msk_txeof (
   2008     struct msk_if_softc   *sc_if,
   2009     INTN                  idx
   2010     )
   2011 {
   2012   struct msk_txdesc   *txd;
   2013   struct msk_tx_desc  *cur_tx;
   2014   UINT32              control;
   2015   INTN                cons;
   2016   INTN                prog;
   2017   EFI_PCI_IO_PROTOCOL  *PciIo;
   2018 
   2019   DEBUG ((EFI_D_NET, "Marvell Yukon: txeof\n"));
   2020 
   2021   PciIo = sc_if->msk_softc->PciIo;
   2022 
   2023   //
   2024   // Go through our tx ring and free mbufs for those
   2025   // frames that have been sent.
   2026   //
   2027   cons = sc_if->msk_cdata.msk_tx_cons;
   2028   prog = 0;
   2029   for (; cons != idx; MSK_INC (cons, MSK_TX_RING_CNT)) {
   2030     if (sc_if->msk_cdata.msk_tx_cnt <= 0) {
   2031       break;
   2032     }
   2033     prog++;
   2034     cur_tx = &sc_if->msk_rdata.msk_tx_ring[cons];
   2035     control = le32toh (cur_tx->msk_control);
   2036     sc_if->msk_cdata.msk_tx_cnt--;
   2037     if ((control & EOP) == 0) {
   2038       continue;
   2039     }
   2040     txd = &sc_if->msk_cdata.msk_txdesc[cons];
   2041     PciIo->Unmap (PciIo, txd->tx_m.DmaMapping);
   2042     gBS->SetMem (&(txd->tx_m), sizeof (MSK_DMA_BUF), 0);
   2043     // We don't own the transmit buffers so don't free them
   2044   }
   2045 
   2046   if (prog > 0) {
   2047     sc_if->msk_cdata.msk_tx_cons = cons;
   2048     // No need to sync LEs as we didn't update LEs.
   2049   }
   2050 }
   2051 
   2052 VOID
   2053 mskc_tick (
   2054     IN EFI_EVENT  Event,
   2055     IN VOID       *Context
   2056     )
   2057 {
   2058   EFI_TPL OldTpl;
   2059   struct msk_softc    *sc;
   2060 
   2061   OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
   2062 
   2063   sc = (struct msk_softc *)Context;
   2064 
   2065   if (sc->msk_if[MSK_PORT_A] != NULL && sc->msk_if[MSK_PORT_A]->active) {
   2066     e1000phy_tick (sc->msk_if[MSK_PORT_A]->phy_softc);
   2067   }
   2068   if (sc->msk_if[MSK_PORT_B] != NULL && sc->msk_if[MSK_PORT_B]->active) {
   2069     e1000phy_tick (sc->msk_if[MSK_PORT_B]->phy_softc);
   2070   }
   2071 
   2072   msk_handle_events (sc);
   2073 
   2074   gBS->RestoreTPL (OldTpl);
   2075 }
   2076 
   2077 static
   2078 VOID
   2079 msk_intr_phy (
   2080     struct msk_if_softc   *sc_if
   2081     )
   2082 {
   2083   UINT16  status;
   2084 
   2085   msk_phy_readreg (sc_if, PHY_MARV_INT_STAT);
   2086   status = msk_phy_readreg (sc_if, PHY_MARV_INT_STAT);
   2087 
   2088   // Handle FIFO Underrun/Overflow ?
   2089   if ((status & PHY_M_IS_FIFO_ERROR)) {
   2090     DEBUG ((EFI_D_NET, "Marvell Yukon: PHY FIFO underrun/overflow.\n"));
   2091   }
   2092 }
   2093 
   2094 static
   2095 VOID
   2096 msk_intr_gmac (
   2097     struct msk_if_softc   *sc_if
   2098     )
   2099 {
   2100   UINT8   status;
   2101   struct msk_softc  *sc;
   2102 
   2103   sc = sc_if->msk_softc;
   2104 
   2105   status = CSR_READ_1 (sc, MR_ADDR (sc_if->msk_md.port, GMAC_IRQ_SRC));
   2106 
   2107   // GMAC Rx FIFO overrun.
   2108   if ((status & GM_IS_RX_FF_OR) != 0) {
   2109     CSR_WRITE_4 (sc, MR_ADDR (sc_if->msk_md.port, RX_GMF_CTRL_T), GMF_CLI_RX_FO);
   2110   }
   2111   // GMAC Tx FIFO underrun.
   2112   if ((status & GM_IS_TX_FF_UR) != 0) {
   2113     CSR_WRITE_4 (sc, MR_ADDR (sc_if->msk_md.port, TX_GMF_CTRL_T), GMF_CLI_TX_FU);
   2114     //device_printf (sc_if->msk_if_dev, "Tx FIFO underrun!\n");*/
   2115     DEBUG ((EFI_D_NET, "Marvell Yukon: Tx FIFO underrun!\n"));
   2116     /*
   2117      * XXX
   2118      * In case of Tx underrun, we may need to flush/reset
   2119      * Tx MAC but that would also require resynchronization
   2120      * with status LEs. Reintializing status LEs would
   2121      * affect other port in dual MAC configuration so it
   2122      * should be aVOIDed as possible as we can.
   2123      * Due to lack of documentation it's all vague guess but
   2124      * it needs more investigation.
   2125      */
   2126   }
   2127 }
   2128 
   2129 static
   2130 VOID
   2131 msk_handle_hwerr (
   2132     struct msk_if_softc   *sc_if,
   2133     UINT32                status
   2134     )
   2135 {
   2136   struct msk_softc  *sc;
   2137 
   2138   sc = sc_if->msk_softc;
   2139 
   2140   if ((status & Y2_IS_PAR_RD1) != 0) {
   2141     DEBUG ((EFI_D_NET, "Marvell Yukon: RAM buffer read parity error\n"));
   2142     // Clear IRQ.
   2143     CSR_WRITE_2 (sc, SELECT_RAM_BUFFER (sc_if->msk_md.port, B3_RI_CTRL), RI_CLR_RD_PERR);
   2144   }
   2145   if ((status & Y2_IS_PAR_WR1) != 0) {
   2146     DEBUG ((EFI_D_NET, "Marvell Yukon: RAM buffer write parity error\n"));
   2147     // Clear IRQ
   2148     CSR_WRITE_2 (sc, SELECT_RAM_BUFFER (sc_if->msk_md.port, B3_RI_CTRL), RI_CLR_WR_PERR);
   2149   }
   2150   if ((status & Y2_IS_PAR_MAC1) != 0) {
   2151     DEBUG ((EFI_D_NET, "Marvell Yukon: Tx MAC parity error\n"));
   2152     // Clear IRQ
   2153     CSR_WRITE_4 (sc, MR_ADDR (sc_if->msk_md.port, TX_GMF_CTRL_T), GMF_CLI_TX_PE);
   2154   }
   2155   if ((status & Y2_IS_PAR_RX1) != 0) {
   2156     DEBUG ((EFI_D_NET, "Marvell Yukon: Rx parity error\n"));
   2157     // Clear IRQ
   2158     CSR_WRITE_4 (sc, Q_ADDR (sc_if->msk_rxq, Q_CSR), BMU_CLR_IRQ_PAR);
   2159   }
   2160   if ((status & (Y2_IS_TCP_TXS1 | Y2_IS_TCP_TXA1)) != 0) {
   2161     DEBUG ((EFI_D_NET, "Marvell Yukon: TCP segmentation error\n"));
   2162     // Clear IRQ
   2163     CSR_WRITE_4 (sc, Q_ADDR (sc_if->msk_txq, Q_CSR), BMU_CLR_IRQ_TCP);
   2164   }
   2165 }
   2166 
   2167 static
   2168 VOID
   2169 msk_intr_hwerr (
   2170     struct msk_softc    *sc
   2171     )
   2172 {
   2173   UINT32  status;
   2174   UINT32  tlphead[4];
   2175 
   2176   status = CSR_READ_4 (sc, B0_HWE_ISRC);
   2177 
   2178   // Time Stamp timer overflow.
   2179   if ((status & Y2_IS_TIST_OV) != 0) {
   2180     CSR_WRITE_1 (sc, GMAC_TI_ST_CTRL, GMT_ST_CLR_IRQ);
   2181   }
   2182   if ((status & Y2_IS_PCI_NEXP) != 0) {
   2183     /*
   2184      * PCI Express Error occured which is not described in PEX
   2185      * spec.
   2186      * This error is also mapped either to Master Abort (
   2187      * Y2_IS_MST_ERR) or Target Abort (Y2_IS_IRQ_STAT) bit and
   2188      * can only be cleared there.
   2189      */
   2190     DEBUG ((EFI_D_NET, "Marvell Yukon: PCI Express protocol violation error\n"));
   2191   }
   2192 
   2193   if ((status & (Y2_IS_MST_ERR | Y2_IS_IRQ_STAT)) != 0) {
   2194 
   2195     if ((status & Y2_IS_MST_ERR) != 0) {
   2196       DEBUG ((EFI_D_NET, "Marvell Yukon: unexpected IRQ Status error\n"));
   2197     } else {
   2198       DEBUG ((EFI_D_NET, "Marvell Yukon: unexpected IRQ Master error\n"));
   2199     }
   2200     // Reset all bits in the PCI status register
   2201     clear_pci_errors (sc);
   2202   }
   2203 
   2204   // Check for PCI Express Uncorrectable Error.
   2205   if ((status & Y2_IS_PCI_EXP) != 0) {
   2206     UINT32 v32;
   2207 
   2208     /*
   2209      * On PCI Express bus bridges are called root complexes (RC).
   2210      * PCI Express errors are recognized by the root complex too,
   2211      * which requests the system to handle the problem. After
   2212      * error occurrence it may be that no access to the adapter
   2213      * may be performed any longer.
   2214      */
   2215 
   2216     v32 = CSR_PCI_READ_4 (sc, PEX_UNC_ERR_STAT);
   2217     if ((v32 & PEX_UNSUP_REQ) != 0) {
   2218       // Ignore unsupported request error.
   2219       DEBUG ((EFI_D_NET, "Marvell Yukon: Uncorrectable PCI Express error\n"));
   2220     }
   2221     if ((v32 & (PEX_FATAL_ERRORS | PEX_POIS_TLP)) != 0) {
   2222       INTN i;
   2223 
   2224       // Get TLP header form Log Registers.
   2225       for (i = 0; i < 4; i++) {
   2226         tlphead[i] = CSR_PCI_READ_4 (sc, PEX_HEADER_LOG + i * 4);
   2227       }
   2228       // Check for vendor defined broadcast message.
   2229       if (!(tlphead[0] == 0x73004001 && tlphead[1] == 0x7f)) {
   2230         sc->msk_intrhwemask &= ~Y2_IS_PCI_EXP;
   2231         CSR_WRITE_4 (sc, B0_HWE_IMSK, sc->msk_intrhwemask);
   2232         CSR_READ_4 (sc, B0_HWE_IMSK);
   2233       }
   2234     }
   2235     // Clear the interrupt
   2236     CSR_WRITE_1 (sc, B2_TST_CTRL1, TST_CFG_WRITE_ON);
   2237     CSR_PCI_WRITE_4 (sc, PEX_UNC_ERR_STAT, 0xffffffff);
   2238     CSR_WRITE_1 (sc, B2_TST_CTRL1, TST_CFG_WRITE_OFF);
   2239   }
   2240 
   2241   if ((status & Y2_HWE_L1_MASK) != 0 && sc->msk_if[MSK_PORT_A] != NULL) {
   2242     msk_handle_hwerr (sc->msk_if[MSK_PORT_A], status);
   2243   }
   2244   if ((status & Y2_HWE_L2_MASK) != 0 && sc->msk_if[MSK_PORT_B] != NULL) {
   2245     msk_handle_hwerr (sc->msk_if[MSK_PORT_B], status >> 8);
   2246   }
   2247 }
   2248 
   2249 static
   2250 __inline
   2251 VOID
   2252 msk_rxput (
   2253     struct msk_if_softc   *sc_if
   2254     )
   2255 {
   2256   CSR_WRITE_2 (sc_if->msk_softc, Y2_PREF_Q_ADDR (sc_if->msk_rxq, PREF_UNIT_PUT_IDX_REG), sc_if->msk_cdata.msk_rx_prod);
   2257 }
   2258 
   2259 static
   2260 INTN
   2261 msk_handle_events (
   2262     struct msk_softc  *sc
   2263     )
   2264 {
   2265   INTN                  rxput[2];
   2266   struct msk_stat_desc  *sd;
   2267   UINT32                control;
   2268   UINT32                status;
   2269   INTN                  cons;
   2270   INTN                  len;
   2271   INTN                  port;
   2272   INTN                  rxprog;
   2273   struct msk_if_softc   *sc_if;
   2274 
   2275   if (sc->msk_stat_cons == CSR_READ_2 (sc, STAT_PUT_IDX)) {
   2276     return (0);
   2277   }
   2278 
   2279   rxput[MSK_PORT_A] = rxput[MSK_PORT_B] = 0;
   2280   rxprog = 0;
   2281   cons = sc->msk_stat_cons;
   2282   for (;;) {
   2283     sd = &sc->msk_stat_ring[cons];
   2284     control = le32toh (sd->msk_control);
   2285     if ((control & HW_OWNER) == 0) {
   2286       break;
   2287     }
   2288     control &= ~HW_OWNER;
   2289     sd->msk_control = htole32 (control);
   2290     status = le32toh (sd->msk_status);
   2291     len = control & STLE_LEN_MASK;
   2292     port = (control >> 16) & 0x01;
   2293     sc_if = sc->msk_if[port];
   2294     if (sc_if == NULL) {
   2295       DEBUG ((EFI_D_NET, "Marvell Yukon: invalid port opcode 0x%08x\n", control & STLE_OP_MASK));
   2296       continue;
   2297     }
   2298 
   2299     switch (control & STLE_OP_MASK) {
   2300       case OP_RXSTAT:
   2301         msk_rxeof (sc_if, status, control, len);
   2302         rxprog++;
   2303         //
   2304         // Because there is no way to sync single Rx LE
   2305         // put the DMA sync operation off until the end of
   2306         // event processing.
   2307         //
   2308         rxput[port]++;
   2309         // Update prefetch unit if we've passed water mark
   2310         if (rxput[port] >= sc_if->msk_cdata.msk_rx_putwm) {
   2311           msk_rxput (sc_if);
   2312           rxput[port] = 0;
   2313         }
   2314         break;
   2315       case OP_TXINDEXLE:
   2316         if (sc->msk_if[MSK_PORT_A] != NULL) {
   2317           msk_txeof (sc->msk_if[MSK_PORT_A], status & STLE_TXA1_MSKL);
   2318         }
   2319         if (sc->msk_if[MSK_PORT_B] != NULL) {
   2320           msk_txeof (sc->msk_if[MSK_PORT_B],
   2321                      ((status & STLE_TXA2_MSKL) >>
   2322                       STLE_TXA2_SHIFTL) |
   2323                      ((len & STLE_TXA2_MSKH) <<
   2324                       STLE_TXA2_SHIFTH));
   2325         }
   2326         break;
   2327       default:
   2328         DEBUG ((EFI_D_NET, "Marvell Yukon: unhandled opcode 0x%08x\n", control & STLE_OP_MASK));
   2329         break;
   2330     }
   2331     MSK_INC (cons, MSK_STAT_RING_CNT);
   2332     if (rxprog > sc->msk_process_limit) {
   2333       break;
   2334     }
   2335   }
   2336 
   2337   sc->msk_stat_cons = cons;
   2338 
   2339   if (rxput[MSK_PORT_A] > 0) {
   2340     msk_rxput (sc->msk_if[MSK_PORT_A]);
   2341   }
   2342   if (rxput[MSK_PORT_B] > 0) {
   2343     msk_rxput (sc->msk_if[MSK_PORT_B]);
   2344   }
   2345 
   2346   return (sc->msk_stat_cons != CSR_READ_2 (sc, STAT_PUT_IDX));
   2347 }
   2348 
   2349 STATIC
   2350 VOID
   2351 msk_intr (
   2352     struct msk_softc  *sc
   2353     )
   2354 {
   2355   struct msk_if_softc   *sc_if0;
   2356   struct msk_if_softc   *sc_if1;
   2357   UINT32                Status;
   2358   INTN                  domore;
   2359 
   2360   // Reading B0_Y2_SP_ISRC2 masks further interrupts
   2361   Status = CSR_READ_4 (sc, B0_Y2_SP_ISRC2);
   2362   if (Status == 0 || Status == 0xffffffff ||
   2363       (sc->msk_pflags & MSK_FLAG_SUSPEND) != 0 ||
   2364       (Status & sc->msk_intrmask) == 0)
   2365   {
   2366     // Leave ISR - Reenable interrupts
   2367     CSR_WRITE_4 (sc, B0_Y2_SP_ICR, 2);
   2368     return;
   2369   }
   2370 
   2371   sc_if0 = sc->msk_if[MSK_PORT_A];
   2372   sc_if1 = sc->msk_if[MSK_PORT_B];
   2373 
   2374   if ((Status & Y2_IS_IRQ_PHY1) != 0 && sc_if0 != NULL) {
   2375     msk_intr_phy (sc_if0);
   2376   }
   2377   if ((Status & Y2_IS_IRQ_PHY2) != 0 && sc_if1 != NULL) {
   2378     msk_intr_phy (sc_if1);
   2379   }
   2380   if ((Status & Y2_IS_IRQ_MAC1) != 0 && sc_if0 != NULL) {
   2381     msk_intr_gmac (sc_if0);
   2382   }
   2383   if ((Status & Y2_IS_IRQ_MAC2) != 0 && sc_if1 != NULL) {
   2384     msk_intr_gmac (sc_if1);
   2385   }
   2386   if ((Status & (Y2_IS_CHK_RX1 | Y2_IS_CHK_RX2)) != 0) {
   2387     DEBUG ((EFI_D_NET, "Marvell Yukon: Rx descriptor error\n"));
   2388     sc->msk_intrmask &= ~(Y2_IS_CHK_RX1 | Y2_IS_CHK_RX2);
   2389     CSR_WRITE_4 (sc, B0_IMSK, sc->msk_intrmask);
   2390     CSR_READ_4 (sc, B0_IMSK);
   2391   }
   2392   if ((Status & (Y2_IS_CHK_TXA1 | Y2_IS_CHK_TXA2)) != 0) {
   2393     DEBUG ((EFI_D_NET, "Marvell Yukon: Tx descriptor error\n"));
   2394     sc->msk_intrmask &= ~(Y2_IS_CHK_TXA1 | Y2_IS_CHK_TXA2);
   2395     CSR_WRITE_4 (sc, B0_IMSK, sc->msk_intrmask);
   2396     CSR_READ_4 (sc, B0_IMSK);
   2397   }
   2398   if ((Status & Y2_IS_HW_ERR) != 0) {
   2399     msk_intr_hwerr (sc);
   2400   }
   2401 
   2402   domore = msk_handle_events (sc);
   2403   if ((Status & Y2_IS_STAT_BMU) != 0 && domore == 0) {
   2404     CSR_WRITE_4 (sc, STAT_CTRL, SC_STAT_CLR_IRQ);
   2405   }
   2406 
   2407   // Leave ISR - Reenable interrupts
   2408   CSR_WRITE_4 (sc, B0_Y2_SP_ICR, 2);
   2409 }
   2410 
   2411 static
   2412 VOID
   2413 msk_set_tx_stfwd (
   2414     struct msk_if_softc   *sc_if
   2415     )
   2416 {
   2417   // Disable jumbo frames for Tx
   2418   CSR_WRITE_4 (sc_if->msk_softc, MR_ADDR (sc_if->msk_md.port, TX_GMF_CTRL_T), TX_JUMBO_DIS | TX_STFW_ENA);
   2419 }
   2420 
   2421 EFI_STATUS
   2422 mskc_init (
   2423     struct msk_if_softc  *sc_if
   2424     )
   2425 {
   2426   EFI_STATUS  Status;
   2427 
   2428   Status = msk_init (sc_if);
   2429   if (EFI_ERROR (Status)) {
   2430     return Status;
   2431   }
   2432 
   2433   return Status;
   2434 }
   2435 
   2436 static
   2437 EFI_STATUS
   2438 msk_init (
   2439     IN struct msk_if_softc  *sc_if
   2440     )
   2441 {
   2442   UINT8       *eaddr;
   2443   UINT16      gmac;
   2444   UINT32      reg;
   2445   EFI_STATUS  Status;
   2446   INTN                 port;
   2447   IN struct msk_softc  *sc;
   2448 
   2449   sc = sc_if->msk_softc;
   2450   port = sc_if->msk_md.port;
   2451 
   2452   // Cancel pending I/O and free all Rx/Tx buffers.
   2453   mskc_stop_if (sc_if);
   2454 
   2455   sc_if->msk_framesize = MAX_SUPPORTED_PACKET_SIZE;
   2456 
   2457   // GMAC Control reset.
   2458   CSR_WRITE_4 (sc, MR_ADDR (port, GMAC_CTRL), GMC_RST_SET);
   2459   CSR_WRITE_4 (sc, MR_ADDR (port, GMAC_CTRL), GMC_RST_CLR);
   2460   CSR_WRITE_4 (sc, MR_ADDR (port, GMAC_CTRL), GMC_F_LOOPB_OFF);
   2461   if (sc->msk_hw_id == CHIP_ID_YUKON_EX) {
   2462     CSR_WRITE_4 (sc, MR_ADDR (port, GMAC_CTRL), GMC_BYP_MACSECRX_ON | GMC_BYP_MACSECTX_ON | GMC_BYP_RETR_ON);
   2463   }
   2464 
   2465   //
   2466   // Initialize GMAC first such that speed/duplex/flow-control
   2467   // parameters are renegotiated when interface is brought up.
   2468   //
   2469   GMAC_WRITE_2 (sc, port, GM_GP_CTRL, 0);
   2470 
   2471   // Dummy read the Interrupt Source Register
   2472   CSR_READ_1 (sc, MR_ADDR (port, GMAC_IRQ_SRC));
   2473 
   2474   // Clear MIB stats
   2475   msk_stats_clear (sc_if);
   2476 
   2477   // Disable FCS
   2478   GMAC_WRITE_2 (sc, port, GM_RX_CTRL, GM_RXCR_CRC_DIS);
   2479 
   2480   // Setup Transmit Control Register
   2481   GMAC_WRITE_2 (sc, port, GM_TX_CTRL, TX_COL_THR (TX_COL_DEF));
   2482 
   2483   // Setup Transmit Flow Control Register
   2484   GMAC_WRITE_2 (sc, port, GM_TX_FLOW_CTRL, 0xffff);
   2485 
   2486   // Setup Transmit Parameter Register
   2487   GMAC_WRITE_2 (sc, port, GM_TX_PARAM,
   2488                 TX_JAM_LEN_VAL (TX_JAM_LEN_DEF) | TX_JAM_IPG_VAL (TX_JAM_IPG_DEF) |
   2489                 TX_IPG_JAM_DATA(TX_IPG_JAM_DEF) | TX_BACK_OFF_LIM(TX_BOF_LIM_DEF));
   2490 
   2491   gmac = DATA_BLIND_VAL (DATA_BLIND_DEF) | GM_SMOD_VLAN_ENA | IPG_DATA_VAL (IPG_DATA_DEF);
   2492 
   2493   GMAC_WRITE_2 (sc, port, GM_SERIAL_MODE, gmac);
   2494 
   2495   // Set station address
   2496   eaddr = sc_if->MacAddress.Addr;
   2497   GMAC_WRITE_2 (sc, port, GM_SRC_ADDR_1L, eaddr[0] | (eaddr[1] << 8));
   2498   GMAC_WRITE_2 (sc, port, GM_SRC_ADDR_1M, eaddr[2] | (eaddr[3] << 8));
   2499   GMAC_WRITE_2 (sc, port, GM_SRC_ADDR_1H, eaddr[4] | (eaddr[5] << 8));
   2500   GMAC_WRITE_2 (sc, port, GM_SRC_ADDR_2L, eaddr[0] | (eaddr[1] << 8));
   2501   GMAC_WRITE_2 (sc, port, GM_SRC_ADDR_2M, eaddr[2] | (eaddr[3] << 8));
   2502   GMAC_WRITE_2 (sc, port, GM_SRC_ADDR_2H, eaddr[4] | (eaddr[5] << 8));
   2503 
   2504   // Disable interrupts for counter overflows
   2505   GMAC_WRITE_2 (sc, port, GM_TX_IRQ_MSK, 0);
   2506   GMAC_WRITE_2 (sc, port, GM_RX_IRQ_MSK, 0);
   2507   GMAC_WRITE_2 (sc, port, GM_TR_IRQ_MSK, 0);
   2508 
   2509   // Configure Rx MAC FIFO
   2510   CSR_WRITE_4 (sc, MR_ADDR (port, RX_GMF_CTRL_T), GMF_RST_SET);
   2511   CSR_WRITE_4 (sc, MR_ADDR (port, RX_GMF_CTRL_T), GMF_RST_CLR);
   2512   reg = GMF_OPER_ON | GMF_RX_F_FL_ON;
   2513   if (sc->msk_hw_id == CHIP_ID_YUKON_FE_P || sc->msk_hw_id == CHIP_ID_YUKON_EX) {
   2514     reg |= GMF_RX_OVER_ON;
   2515   }
   2516   CSR_WRITE_4 (sc, MR_ADDR (port, RX_GMF_CTRL_T), reg);
   2517 
   2518   if (sc->msk_hw_id == CHIP_ID_YUKON_XL) {
   2519     // Clear flush mask - HW bug
   2520     CSR_WRITE_4 (sc, MR_ADDR (port, RX_GMF_FL_MSK), 0);
   2521   } else {
   2522     // Flush Rx MAC FIFO on any flow control or error
   2523     CSR_WRITE_4 (sc, MR_ADDR (port, RX_GMF_FL_MSK), GMR_FS_ANY_ERR);
   2524   }
   2525 
   2526   //
   2527   // Set Rx FIFO flush threshold to 64 bytes + 1 FIFO word
   2528   // due to hardware hang on receipt of pause frames.
   2529   //
   2530   reg = RX_GMF_FL_THR_DEF + 1;
   2531   // Another magic for Yukon FE+ - From Linux
   2532   if (sc->msk_hw_id == CHIP_ID_YUKON_FE_P && sc->msk_hw_rev == CHIP_REV_YU_FE_P_A0) {
   2533     reg = 0x178;
   2534   }
   2535   CSR_WRITE_2 (sc, MR_ADDR (port, RX_GMF_FL_THR), reg);
   2536 
   2537   // Configure Tx MAC FIFO
   2538   CSR_WRITE_4 (sc, MR_ADDR (port, TX_GMF_CTRL_T), GMF_RST_SET);
   2539   CSR_WRITE_4 (sc, MR_ADDR (port, TX_GMF_CTRL_T), GMF_RST_CLR);
   2540   CSR_WRITE_4 (sc, MR_ADDR (port, TX_GMF_CTRL_T), GMF_OPER_ON);
   2541 
   2542   // Configure hardware VLAN tag insertion/stripping
   2543   msk_setvlan (sc_if);
   2544 
   2545   if ((sc_if->msk_flags & MSK_FLAG_RAMBUF) == 0) {
   2546     // Set Rx Pause threshould.
   2547     CSR_WRITE_2 (sc, MR_ADDR (port, RX_GMF_LP_THR), MSK_ECU_LLPP);
   2548     CSR_WRITE_2 (sc, MR_ADDR (port, RX_GMF_UP_THR), MSK_ECU_ULPP);
   2549     // Configure store-and-forward for Tx.
   2550     msk_set_tx_stfwd (sc_if);
   2551   }
   2552 
   2553   if (sc->msk_hw_id == CHIP_ID_YUKON_FE_P && sc->msk_hw_rev == CHIP_REV_YU_FE_P_A0) {
   2554     // Disable dynamic watermark - from Linux
   2555     reg = CSR_READ_4 (sc, MR_ADDR (port, TX_GMF_EA));
   2556     reg &= ~0x03;
   2557     CSR_WRITE_4 (sc, MR_ADDR (port, TX_GMF_EA), reg);
   2558   }
   2559 
   2560   //
   2561   // Disable Force Sync bit and Alloc bit in Tx RAM interface
   2562   // arbiter as we don't use Sync Tx queue.
   2563   //
   2564   CSR_WRITE_1 (sc, MR_ADDR (port, TXA_CTRL), TXA_DIS_FSYNC | TXA_DIS_ALLOC | TXA_STOP_RC);
   2565   // Enable the RAM Interface Arbiter
   2566   CSR_WRITE_1 (sc, MR_ADDR (port, TXA_CTRL), TXA_ENA_ARB);
   2567 
   2568   // Setup RAM buffer
   2569   msk_set_rambuffer (sc_if);
   2570 
   2571   // Disable Tx sync Queue
   2572   CSR_WRITE_1 (sc, RB_ADDR (sc_if->msk_txsq, RB_CTRL), RB_RST_SET);
   2573 
   2574   // Setup Tx Queue Bus Memory Interface
   2575   CSR_WRITE_4 (sc, Q_ADDR (sc_if->msk_txq, Q_CSR), BMU_CLR_RESET);
   2576   CSR_WRITE_4 (sc, Q_ADDR (sc_if->msk_txq, Q_CSR), BMU_OPER_INIT);
   2577   CSR_WRITE_4 (sc, Q_ADDR (sc_if->msk_txq, Q_CSR), BMU_FIFO_OP_ON);
   2578   CSR_WRITE_2 (sc, Q_ADDR (sc_if->msk_txq, Q_WM),  MSK_BMU_TX_WM);
   2579   switch (sc->msk_hw_id) {
   2580     case CHIP_ID_YUKON_EC_U:
   2581       if (sc->msk_hw_rev == CHIP_REV_YU_EC_U_A0) {
   2582         // Fix for Yukon-EC Ultra: set BMU FIFO level
   2583         CSR_WRITE_2 (sc, Q_ADDR (sc_if->msk_txq, Q_AL), MSK_ECU_TXFF_LEV);
   2584       }
   2585       break;
   2586     case CHIP_ID_YUKON_EX:
   2587       //
   2588       // Yukon Extreme seems to have silicon bug for
   2589       // automatic Tx checksum calculation capability.
   2590       //
   2591       if (sc->msk_hw_rev == CHIP_REV_YU_EX_B0) {
   2592         CSR_WRITE_4 (sc, Q_ADDR (sc_if->msk_txq, Q_F), F_TX_CHK_AUTO_OFF);
   2593       }
   2594       break;
   2595   }
   2596 
   2597   // Setup Rx Queue Bus Memory Interface
   2598   CSR_WRITE_4 (sc, Q_ADDR (sc_if->msk_rxq, Q_CSR), BMU_CLR_RESET);
   2599   CSR_WRITE_4 (sc, Q_ADDR (sc_if->msk_rxq, Q_CSR), BMU_OPER_INIT);
   2600   CSR_WRITE_4 (sc, Q_ADDR (sc_if->msk_rxq, Q_CSR), BMU_FIFO_OP_ON);
   2601   CSR_WRITE_2 (sc, Q_ADDR (sc_if->msk_rxq, Q_WM),  MSK_BMU_RX_WM);
   2602   if (sc->msk_hw_id == CHIP_ID_YUKON_EC_U && sc->msk_hw_rev >= CHIP_REV_YU_EC_U_A1) {
   2603     // MAC Rx RAM Read is controlled by hardware
   2604     CSR_WRITE_4 (sc, Q_ADDR (sc_if->msk_rxq, Q_F), F_M_RX_RAM_DIS);
   2605   }
   2606 
   2607   // truncate too-large frames - from linux
   2608   CSR_WRITE_4 (sc, MR_ADDR (port, RX_GMF_TR_THR), 0x17a);
   2609   CSR_WRITE_4 (sc, MR_ADDR (port, RX_GMF_CTRL_T), RX_TRUNC_ON);
   2610 
   2611   msk_set_prefetch (sc_if, sc_if->msk_txq, sc_if->msk_rdata.msk_tx_ring_paddr, MSK_TX_RING_CNT - 1);
   2612   msk_init_tx_ring (sc_if);
   2613 
   2614   // Disable Rx checksum offload and RSS hash
   2615   CSR_WRITE_4 (sc, Q_ADDR (sc_if->msk_rxq, Q_CSR), BMU_DIS_RX_CHKSUM | BMU_DIS_RX_RSS_HASH);
   2616   msk_set_prefetch (sc_if, sc_if->msk_rxq, sc_if->msk_rdata.msk_rx_ring_paddr, MSK_RX_RING_CNT - 1);
   2617   Status = msk_init_rx_ring (sc_if);
   2618   if (EFI_ERROR (Status)) {
   2619     DEBUG ((EFI_D_ERROR, "Marvell Yukon: Initialization failed: no memory for Rx buffers\n"));
   2620     mskc_stop_if (sc_if);
   2621     return Status;
   2622   }
   2623 
   2624   if (sc->msk_hw_id == CHIP_ID_YUKON_EX) {
   2625     // Disable flushing of non-ASF packets
   2626     CSR_WRITE_4 (sc, MR_ADDR (port, RX_GMF_CTRL_T), GMF_RX_MACSEC_FLUSH_OFF);
   2627   }
   2628 
   2629   // Configure interrupt handling
   2630   if (port == MSK_PORT_A) {
   2631     sc->msk_intrmask |= Y2_IS_PORT_A;
   2632     sc->msk_intrhwemask |= Y2_HWE_L1_MASK;
   2633   } else {
   2634     sc->msk_intrmask |= Y2_IS_PORT_B;
   2635     sc->msk_intrhwemask |= Y2_HWE_L2_MASK;
   2636   }
   2637   // Configure IRQ moderation mask.
   2638   CSR_WRITE_4 (sc, B2_IRQM_MSK, sc->msk_intrmask);
   2639   if (sc->msk_int_holdoff > 0) {
   2640     // Configure initial IRQ moderation timer value.
   2641     CSR_WRITE_4 (sc, B2_IRQM_INI, MSK_USECS (sc, sc->msk_int_holdoff));
   2642     CSR_WRITE_4 (sc, B2_IRQM_VAL, MSK_USECS (sc, sc->msk_int_holdoff));
   2643     // Start IRQ moderation.
   2644     CSR_WRITE_1 (sc, B2_IRQM_CTRL, TIM_START);
   2645   }
   2646   CSR_WRITE_4 (sc, B0_HWE_IMSK, sc->msk_intrhwemask);
   2647   CSR_READ_4 (sc, B0_HWE_IMSK);
   2648   CSR_WRITE_4 (sc, B0_IMSK, sc->msk_intrmask);
   2649   CSR_READ_4 (sc, B0_IMSK);
   2650 
   2651   sc_if->msk_flags &= ~MSK_FLAG_LINK;
   2652   e1000phy_mediachg (sc_if->phy_softc);
   2653 
   2654   return Status;
   2655 }
   2656 
   2657 STATIC
   2658 VOID
   2659 msk_set_rambuffer (
   2660     struct msk_if_softc *sc_if
   2661     )
   2662 {
   2663   INTN ltpp, utpp;
   2664   INTN              port;
   2665   struct msk_softc  *sc;
   2666 
   2667   sc = sc_if->msk_softc;
   2668   port = sc_if->msk_md.port;
   2669 
   2670   if ((sc_if->msk_flags & MSK_FLAG_RAMBUF) == 0)
   2671     return;
   2672 
   2673   // Setup Rx Queue
   2674   CSR_WRITE_1 (sc, RB_ADDR (sc_if->msk_rxq, RB_CTRL), RB_RST_CLR);
   2675   CSR_WRITE_4 (sc, RB_ADDR (sc_if->msk_rxq, RB_START), sc->msk_rxqstart[port] / 8);
   2676   CSR_WRITE_4 (sc, RB_ADDR (sc_if->msk_rxq, RB_END), sc->msk_rxqend[port] / 8);
   2677   CSR_WRITE_4 (sc, RB_ADDR (sc_if->msk_rxq, RB_WP), sc->msk_rxqstart[port] / 8);
   2678   CSR_WRITE_4 (sc, RB_ADDR (sc_if->msk_rxq, RB_RP), sc->msk_rxqstart[port] / 8);
   2679 
   2680   utpp = (sc->msk_rxqend[port] + 1 - sc->msk_rxqstart[port] - MSK_RB_ULPP) / 8;
   2681   ltpp = (sc->msk_rxqend[port] + 1 - sc->msk_rxqstart[port] - MSK_RB_LLPP_B) / 8;
   2682   if (sc->msk_rxqsize < MSK_MIN_RXQ_SIZE) {
   2683     ltpp += (MSK_RB_LLPP_B - MSK_RB_LLPP_S) / 8;
   2684   }
   2685   CSR_WRITE_4 (sc, RB_ADDR (sc_if->msk_rxq, RB_RX_UTPP), utpp);
   2686   CSR_WRITE_4 (sc, RB_ADDR (sc_if->msk_rxq, RB_RX_LTPP), ltpp);
   2687   // Set Rx priority (RB_RX_UTHP/RB_RX_LTHP) thresholds?
   2688 
   2689   CSR_WRITE_1 (sc, RB_ADDR (sc_if->msk_rxq, RB_CTRL), RB_ENA_OP_MD);
   2690   CSR_READ_1 (sc, RB_ADDR (sc_if->msk_rxq, RB_CTRL));
   2691 
   2692   // Setup Tx Queue.
   2693   CSR_WRITE_1 (sc, RB_ADDR (sc_if->msk_txq, RB_CTRL), RB_RST_CLR);
   2694   CSR_WRITE_4 (sc, RB_ADDR (sc_if->msk_txq, RB_START), sc->msk_txqstart[port] / 8);
   2695   CSR_WRITE_4 (sc, RB_ADDR (sc_if->msk_txq, RB_END), sc->msk_txqend[port] / 8);
   2696   CSR_WRITE_4 (sc, RB_ADDR (sc_if->msk_txq, RB_WP), sc->msk_txqstart[port] / 8);
   2697   CSR_WRITE_4 (sc, RB_ADDR (sc_if->msk_txq, RB_RP), sc->msk_txqstart[port] / 8);
   2698 
   2699   // Enable Store & Forward for Tx side
   2700   CSR_WRITE_1 (sc, RB_ADDR (sc_if->msk_txq, RB_CTRL), RB_ENA_STFWD);
   2701   CSR_WRITE_1 (sc, RB_ADDR (sc_if->msk_txq, RB_CTRL), RB_ENA_OP_MD);
   2702   CSR_READ_1 (sc, RB_ADDR (sc_if->msk_txq, RB_CTRL));
   2703 }
   2704 
   2705 STATIC
   2706 VOID
   2707 msk_set_prefetch (
   2708     struct msk_if_softc   *sc_if,
   2709     INTN qaddr,
   2710     EFI_PHYSICAL_ADDRESS addr,
   2711     UINT32 count
   2712     )
   2713 {
   2714   struct msk_softc     *sc;
   2715 
   2716   sc = sc_if->msk_softc;
   2717 
   2718   // Reset the prefetch unit
   2719   CSR_WRITE_4 (sc, Y2_PREF_Q_ADDR (qaddr, PREF_UNIT_CTRL_REG), PREF_UNIT_RST_SET);
   2720   CSR_WRITE_4 (sc, Y2_PREF_Q_ADDR (qaddr, PREF_UNIT_CTRL_REG), PREF_UNIT_RST_CLR);
   2721   // Set LE base address
   2722   CSR_WRITE_4 (sc, Y2_PREF_Q_ADDR (qaddr, PREF_UNIT_ADDR_LOW_REG), MSK_ADDR_LO (addr));
   2723   CSR_WRITE_4 (sc, Y2_PREF_Q_ADDR (qaddr, PREF_UNIT_ADDR_HI_REG), MSK_ADDR_HI (addr));
   2724 
   2725   // Set the list last index
   2726   CSR_WRITE_2 (sc, Y2_PREF_Q_ADDR (qaddr, PREF_UNIT_LAST_IDX_REG), count);
   2727   // Turn on prefetch unit
   2728   CSR_WRITE_4 (sc, Y2_PREF_Q_ADDR (qaddr, PREF_UNIT_CTRL_REG), PREF_UNIT_OP_ON);
   2729   // Dummy read to ensure write
   2730   CSR_READ_4 (sc, Y2_PREF_Q_ADDR (qaddr, PREF_UNIT_CTRL_REG));
   2731 }
   2732 
   2733 VOID
   2734 mskc_stop_if (
   2735     struct msk_if_softc  *sc_if
   2736     )
   2737 {
   2738   struct msk_txdesc   *txd;
   2739   struct msk_rxdesc   *rxd;
   2740   UINT32              val;
   2741   INTN                i;
   2742   INTN                 port;
   2743   EFI_PCI_IO_PROTOCOL  *PciIo;
   2744   struct msk_softc     *sc;
   2745 
   2746   sc = sc_if->msk_softc;
   2747   PciIo = sc->PciIo;
   2748   port = sc_if->msk_md.port;
   2749 
   2750   // Disable interrupts
   2751   if (port == MSK_PORT_A) {
   2752     sc->msk_intrmask &= ~Y2_IS_PORT_A;
   2753     sc->msk_intrhwemask &= ~Y2_HWE_L1_MASK;
   2754   } else {
   2755     sc->msk_intrmask &= ~Y2_IS_PORT_B;
   2756     sc->msk_intrhwemask &= ~Y2_HWE_L2_MASK;
   2757   }
   2758   CSR_WRITE_4 (sc, B0_HWE_IMSK, sc->msk_intrhwemask);
   2759   CSR_READ_4 (sc, B0_HWE_IMSK);
   2760   CSR_WRITE_4 (sc, B0_IMSK, sc->msk_intrmask);
   2761   CSR_READ_4 (sc, B0_IMSK);
   2762 
   2763   // Disable Tx/Rx MAC.
   2764   val = GMAC_READ_2 (sc, port, GM_GP_CTRL);
   2765   val &= ~(GM_GPCR_RX_ENA | GM_GPCR_TX_ENA);
   2766   GMAC_WRITE_2 (sc, port, GM_GP_CTRL, val);
   2767   // Read again to ensure writing.
   2768   GMAC_READ_2 (sc, port, GM_GP_CTRL);
   2769   // Update stats and clear counters
   2770   msk_stats_update (sc_if);
   2771 
   2772   // Stop Tx BMU
   2773   CSR_WRITE_4 (sc, Q_ADDR (sc_if->msk_txq, Q_CSR), BMU_STOP);
   2774   val = CSR_READ_4 (sc, Q_ADDR (sc_if->msk_txq, Q_CSR));
   2775   for (i = 0; i < MSK_TIMEOUT; i++) {
   2776     if ((val & (BMU_STOP | BMU_IDLE)) == 0) {
   2777       CSR_WRITE_4 (sc, Q_ADDR (sc_if->msk_txq, Q_CSR), BMU_STOP);
   2778       val = CSR_READ_4 (sc, Q_ADDR (sc_if->msk_txq, Q_CSR));
   2779     } else {
   2780       break;
   2781     }
   2782     gBS->Stall (1);
   2783   }
   2784   if (i == MSK_TIMEOUT) {
   2785     DEBUG ((EFI_D_NET, "Marvell Yukon: Tx BMU stop failed\n"));
   2786   }
   2787   CSR_WRITE_1 (sc, RB_ADDR (sc_if->msk_txq, RB_CTRL), RB_RST_SET | RB_DIS_OP_MD);
   2788 
   2789   // Disable all GMAC interrupt.
   2790   CSR_WRITE_1 (sc, MR_ADDR (port, GMAC_IRQ_MSK), 0);
   2791   // Disable PHY interrupt. */
   2792   msk_phy_writereg (sc_if, PHY_MARV_INT_MASK, 0);
   2793 
   2794   // Disable the RAM Interface Arbiter.
   2795   CSR_WRITE_1 (sc, MR_ADDR (port, TXA_CTRL), TXA_DIS_ARB);
   2796 
   2797   // Reset the PCI FIFO of the async Tx queue
   2798   CSR_WRITE_4 (sc, Q_ADDR (sc_if->msk_txq, Q_CSR), BMU_RST_SET | BMU_FIFO_RST);
   2799 
   2800   // Reset the Tx prefetch units
   2801   CSR_WRITE_4 (sc, Y2_PREF_Q_ADDR (sc_if->msk_txq, PREF_UNIT_CTRL_REG), PREF_UNIT_RST_SET);
   2802 
   2803   // Reset the RAM Buffer async Tx queue
   2804   CSR_WRITE_1 (sc, RB_ADDR (sc_if->msk_txq, RB_CTRL), RB_RST_SET);
   2805 
   2806   // Reset Tx MAC FIFO.
   2807   CSR_WRITE_4 (sc, MR_ADDR (port, TX_GMF_CTRL_T), GMF_RST_SET);
   2808   // Set Pause Off.
   2809   CSR_WRITE_4 (sc, MR_ADDR (port, GMAC_CTRL), GMC_PAUSE_OFF);
   2810 
   2811   /*
   2812    * The Rx Stop command will not work for Yukon-2 if the BMU does not
   2813    * reach the end of packet and since we can't make sure that we have
   2814    * incoming data, we must reset the BMU while it is not during a DMA
   2815    * transfer. Since it is possible that the Rx path is still active,
   2816    * the Rx RAM buffer will be stopped first, so any possible incoming
   2817    * data will not trigger a DMA. After the RAM buffer is stopped, the
   2818    * BMU is polled until any DMA in progress is ended and only then it
   2819    * will be reset.
   2820    */
   2821 
   2822   // Disable the RAM Buffer receive queue
   2823   CSR_WRITE_1 (sc, RB_ADDR (sc_if->msk_rxq, RB_CTRL), RB_DIS_OP_MD);
   2824   for (i = 0; i < MSK_TIMEOUT; i++) {
   2825     if (CSR_READ_1 (sc, RB_ADDR (sc_if->msk_rxq, Q_RSL)) == CSR_READ_1 (sc, RB_ADDR (sc_if->msk_rxq, Q_RL))) {
   2826       break;
   2827     }
   2828     gBS->Stall (1);
   2829   }
   2830   if (i == MSK_TIMEOUT) {
   2831     DEBUG ((EFI_D_NET, "Marvell Yukon: Rx BMU stop failed\n"));
   2832   }
   2833   CSR_WRITE_4 (sc, Q_ADDR (sc_if->msk_rxq, Q_CSR), BMU_RST_SET | BMU_FIFO_RST);
   2834   // Reset the Rx prefetch unit.
   2835   CSR_WRITE_4 (sc, Y2_PREF_Q_ADDR (sc_if->msk_rxq, PREF_UNIT_CTRL_REG), PREF_UNIT_RST_SET);
   2836   // Reset the RAM Buffer receive queue.
   2837   CSR_WRITE_1 (sc, RB_ADDR (sc_if->msk_rxq, RB_CTRL), RB_RST_SET);
   2838   // Reset Rx MAC FIFO.
   2839   CSR_WRITE_4 (sc, MR_ADDR (port, RX_GMF_CTRL_T), GMF_RST_SET);
   2840 
   2841   // Free Rx and Tx mbufs still in the queues
   2842   for (i = 0; i < MSK_RX_RING_CNT; i++) {
   2843     rxd = &sc_if->msk_cdata.msk_rxdesc[i];
   2844     if (rxd->rx_m.Buf != NULL) {
   2845       PciIo->Unmap (PciIo, rxd->rx_m.DmaMapping);
   2846       if(rxd->rx_m.Buf != NULL) {
   2847         gBS->FreePool (rxd->rx_m.Buf);
   2848         rxd->rx_m.Buf = NULL;
   2849       }
   2850       gBS->SetMem (&(rxd->rx_m), sizeof (MSK_DMA_BUF), 0);
   2851     }
   2852   }
   2853 
   2854   for (i = 0; i < MSK_TX_RING_CNT; i++) {
   2855     txd = &sc_if->msk_cdata.msk_txdesc[i];
   2856     if (txd->tx_m.Buf != NULL) {
   2857       PciIo->Unmap (PciIo, txd->tx_m.DmaMapping);
   2858       gBS->SetMem (&(txd->tx_m), sizeof (MSK_DMA_BUF), 0);
   2859       // We don't own the transmit buffers so don't free them
   2860     }
   2861   }
   2862 
   2863   /*
   2864    * Mark the interface down.
   2865    */
   2866   sc_if->msk_flags &= ~MSK_FLAG_LINK;
   2867 }
   2868 
   2869 /*
   2870  * When GM_PAR_MIB_CLR bit of GM_PHY_ADDR is set, reading lower
   2871  * counter clears high 16 bits of the counter such that accessing
   2872  * lower 16 bits should be the last operation.
   2873  */
   2874 #define  MSK_READ_MIB32(x, y)    (((UINT32)GMAC_READ_2 (sc, x, (y) + 4)) << 16) +  (UINT32)GMAC_READ_2 (sc, x, y)
   2875 #define  MSK_READ_MIB64(x, y)    (((UINT64)MSK_READ_MIB32 (x, (y) + 8)) << 32) + (UINT64)MSK_READ_MIB32 (x, y)
   2876 
   2877 static
   2878 VOID
   2879 msk_stats_clear (
   2880     struct msk_if_softc   *sc_if
   2881     )
   2882 {
   2883   UINT16      gmac;
   2884   INTN        val;
   2885   INTN        i;
   2886   INTN              port;
   2887   struct msk_softc  *sc;
   2888 
   2889   sc = sc_if->msk_softc;
   2890   port = sc_if->msk_md.port;
   2891 
   2892   // Set MIB Clear Counter Mode.
   2893   gmac = GMAC_READ_2 (sc, port, GM_PHY_ADDR);
   2894   GMAC_WRITE_2 (sc, port, GM_PHY_ADDR, gmac | GM_PAR_MIB_CLR);
   2895   // Read all MIB Counters with Clear Mode set
   2896   for (i = GM_RXF_UC_OK; i <= GM_TXE_FIFO_UR; i += sizeof (UINT32)) {
   2897     val = MSK_READ_MIB32 (port, i);
   2898     if (val); //Workaround: to prevent the GCC error: 'value computed is not used'
   2899   }
   2900   // Clear MIB Clear Counter Mode
   2901   gmac &= ~GM_PAR_MIB_CLR;
   2902   GMAC_WRITE_2 (sc, port, GM_PHY_ADDR, gmac);
   2903 }
   2904 
   2905 static
   2906 VOID
   2907 msk_stats_update (
   2908     struct msk_if_softc   *sc_if
   2909     )
   2910 {
   2911   struct msk_hw_stats   *stats;
   2912   UINT16                gmac;
   2913   INTN                  val;
   2914   INTN                 port;
   2915   struct msk_softc     *sc;
   2916 
   2917   sc = sc_if->msk_softc;
   2918   port = sc_if->msk_md.port;
   2919   stats = &sc_if->msk_stats;
   2920   /* Set MIB Clear Counter Mode. */
   2921   gmac = GMAC_READ_2 (sc, port, GM_PHY_ADDR);
   2922   GMAC_WRITE_2 (sc, port, GM_PHY_ADDR, gmac | GM_PAR_MIB_CLR);
   2923 
   2924   /* Rx stats. */
   2925   stats->rx_ucast_frames    += MSK_READ_MIB32 (port, GM_RXF_UC_OK);
   2926   stats->rx_bcast_frames    += MSK_READ_MIB32 (port, GM_RXF_BC_OK);
   2927   stats->rx_pause_frames    += MSK_READ_MIB32 (port, GM_RXF_MPAUSE);
   2928   stats->rx_mcast_frames    += MSK_READ_MIB32 (port, GM_RXF_MC_OK);
   2929   stats->rx_crc_errs        += MSK_READ_MIB32 (port, GM_RXF_FCS_ERR);
   2930   val = MSK_READ_MIB32 (port, GM_RXF_SPARE1);
   2931   stats->rx_good_octets     += MSK_READ_MIB64 (port, GM_RXO_OK_LO);
   2932   stats->rx_bad_octets      += MSK_READ_MIB64 (port, GM_RXO_ERR_LO);
   2933   stats->rx_runts           += MSK_READ_MIB32 (port, GM_RXF_SHT);
   2934   stats->rx_runt_errs       += MSK_READ_MIB32 (port, GM_RXE_FRAG);
   2935   stats->rx_pkts_64         += MSK_READ_MIB32 (port, GM_RXF_64B);
   2936   stats->rx_pkts_65_127     += MSK_READ_MIB32 (port, GM_RXF_127B);
   2937   stats->rx_pkts_128_255    += MSK_READ_MIB32 (port, GM_RXF_255B);
   2938   stats->rx_pkts_256_511    += MSK_READ_MIB32 (port, GM_RXF_511B);
   2939   stats->rx_pkts_512_1023   += MSK_READ_MIB32 (port, GM_RXF_1023B);
   2940   stats->rx_pkts_1024_1518  += MSK_READ_MIB32 (port, GM_RXF_1518B);
   2941   stats->rx_pkts_1519_max   += MSK_READ_MIB32 (port, GM_RXF_MAX_SZ);
   2942   stats->rx_pkts_too_long   += MSK_READ_MIB32 (port, GM_RXF_LNG_ERR);
   2943   stats->rx_pkts_jabbers    += MSK_READ_MIB32 (port, GM_RXF_JAB_PKT);
   2944   val = MSK_READ_MIB32 (port, GM_RXF_SPARE2);
   2945   stats->rx_fifo_oflows     += MSK_READ_MIB32 (port, GM_RXE_FIFO_OV);
   2946   val = MSK_READ_MIB32 (port, GM_RXF_SPARE3);
   2947 
   2948   /* Tx stats. */
   2949   stats->tx_ucast_frames    += MSK_READ_MIB32 (port, GM_TXF_UC_OK);
   2950   stats->tx_bcast_frames    += MSK_READ_MIB32 (port, GM_TXF_BC_OK);
   2951   stats->tx_pause_frames    += MSK_READ_MIB32 (port, GM_TXF_MPAUSE);
   2952   stats->tx_mcast_frames    += MSK_READ_MIB32 (port, GM_TXF_MC_OK);
   2953   stats->tx_octets          += MSK_READ_MIB64 (port, GM_TXO_OK_LO);
   2954   stats->tx_pkts_64         += MSK_READ_MIB32 (port, GM_TXF_64B);
   2955   stats->tx_pkts_65_127     += MSK_READ_MIB32 (port, GM_TXF_127B);
   2956   stats->tx_pkts_128_255    += MSK_READ_MIB32 (port, GM_TXF_255B);
   2957   stats->tx_pkts_256_511    += MSK_READ_MIB32 (port, GM_TXF_511B);
   2958   stats->tx_pkts_512_1023   += MSK_READ_MIB32 (port, GM_TXF_1023B);
   2959   stats->tx_pkts_1024_1518  += MSK_READ_MIB32 (port, GM_TXF_1518B);
   2960   stats->tx_pkts_1519_max   += MSK_READ_MIB32 (port, GM_TXF_MAX_SZ);
   2961   val = MSK_READ_MIB32 (port, GM_TXF_SPARE1);
   2962   stats->tx_colls           += MSK_READ_MIB32 (port, GM_TXF_COL);
   2963   stats->tx_late_colls      += MSK_READ_MIB32 (port, GM_TXF_LAT_COL);
   2964   stats->tx_excess_colls    += MSK_READ_MIB32 (port, GM_TXF_ABO_COL);
   2965   stats->tx_multi_colls     += MSK_READ_MIB32 (port, GM_TXF_MUL_COL);
   2966   stats->tx_single_colls    += MSK_READ_MIB32 (port, GM_TXF_SNG_COL);
   2967   stats->tx_underflows      += MSK_READ_MIB32 (port, GM_TXE_FIFO_UR);
   2968 
   2969   if (val); //Workaround: to prevent the GCC error: 'value computed is not used'
   2970 
   2971   /* Clear MIB Clear Counter Mode. */
   2972   gmac &= ~GM_PAR_MIB_CLR;
   2973   GMAC_WRITE_2 (sc, port, GM_PHY_ADDR, gmac);
   2974 }
   2975 
   2976 #undef MSK_READ_MIB32
   2977 #undef MSK_READ_MIB64
   2978