// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "dwmac.h"

namespace eth {

void DWMacDevice::DumpRegisters() {
  uint32_t val;
  for (uint32_t i = 0; i < 31; i++) {
    if (EthMacMdioRead(i, &val) == ZX_OK) {
      zxlogf(INFO, "MII%02u = %08x", i, val);
    } else {
      zxlogf(INFO, "MDIO READ TIMEOUT%u", i);
    }
  }
  zxlogf(INFO, "mac addr hi -> %08x", mmio_->Read32(DW_MAC_MAC_MACADDR0HI));
  zxlogf(INFO, "mac addr lo -> %08x", mmio_->Read32(DW_MAC_MAC_MACADDR0LO));
  zxlogf(INFO, "mac version -> %08x", mmio_->Read32(DW_MAC_MAC_VERSION));

  zxlogf(INFO, "\ndma hwfeature -> %08x", mmio_->Read32(DW_MAC_DMA_HWFEATURE));
  zxlogf(INFO, "dma busmode   -> %08x", mmio_->Read32(DW_MAC_DMA_BUSMODE));
  zxlogf(INFO, "dma status    -> %08x", mmio_->Read32(DW_MAC_DMA_STATUS));
  uint32_t temp;
  EthMacMdioRead(1, &temp);
  zxlogf(INFO, "MII Status = %08x", temp);
  EthMacMdioRead(1, &temp);
  zxlogf(INFO, "MII Status = %08x", temp);
}

void DWMacDevice::DumpStatus(uint32_t status) {
  uint32_t tx_state = (status >> 20) & 0x07;
  uint32_t rx_state = (status >> 17) & 0x07;

  zxlogf(INFO, "TX:%3u RX:%3u ---%s %s %s %s %s %s %s %s %s", tx_state, rx_state,
         status & (1 << 13) ? "FBI" : " ", status & (1 << 10) ? "ETI" : " ",
         status & (1 << 9) ? "RWT" : " ", status & (1 << 8) ? "RPS" : " ",
         status & (1 << 7) ? "RBU" : " ", status & (1 << 5) ? "TBU" : " ",
         status & (1 << 4) ? "RBO" : " ", status & (1 << 3) ? "TJT" : " ",
         status & (1 << 1) ? "TPS" : " ");
}
}  // namespace eth
