627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync/* $Id$ */
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync/** @file
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync * PHY MDIO unit tests.
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync */
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync/*
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync * Copyright (C) 2007-2010 Oracle Corporation
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync *
ebadd079ca810bb81e096f06de95a734a500cef6vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
ebadd079ca810bb81e096f06de95a734a500cef6vboxsync * available from http://www.virtualbox.org. This file is free software;
ebadd079ca810bb81e096f06de95a734a500cef6vboxsync * you can redistribute it and/or modify it under the terms of the GNU
ebadd079ca810bb81e096f06de95a734a500cef6vboxsync * General Public License (GPL) as published by the Free Software
ebadd079ca810bb81e096f06de95a734a500cef6vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
ebadd079ca810bb81e096f06de95a734a500cef6vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
ebadd079ca810bb81e096f06de95a734a500cef6vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync */
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync#include <cppunit/ui/text/TestRunner.h>
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync#include <cppunit/extensions/HelperMacros.h>
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync#include "../DevE1000Phy.h"
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync/**
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync * Test fixture for PHY MDIO/MDC interface emulation.
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync */
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsyncclass PhyTest : public CppUnit::TestFixture {
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync CPPUNIT_TEST_SUITE( PhyTest );
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync CPPUNIT_TEST(testSize);
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync CPPUNIT_TEST(testReadPID);
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync CPPUNIT_TEST(testReadEPID);
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync CPPUNIT_TEST(testWriteANA);
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync CPPUNIT_TEST_SUITE_END();
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsyncprivate:
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync enum Op
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync {
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync WRITE_OP = 0x1,
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync READ_OP = 0x2
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync };
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync#define PHYADR_VAL (uint16_t)0
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync#define ST_VAL (uint16_t)1
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync#define TA_VAL (uint16_t)2
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync#define PREAMBLE_VAL 0xFFFFFFFF
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync enum BitWidths {
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync ST_BITS = 2,
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync OP_BITS = 2,
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync PHYADR_BITS = 5,
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync REGADR_BITS = 5,
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync TA_BITS = 2,
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync DATA_BITS = 16,
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync PREAMBLE_BITS = 32
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync };
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync PPHY phy;
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync // Helper methods
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync void shiftOutBits(uint32_t data, uint16_t count);
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync uint16_t shiftInBits(uint16_t count);
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync int readAt(uint16_t addr);
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync void writeTo(uint16_t addr, uint32_t value);
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsyncpublic:
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync void setUp()
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync {
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync phy = new PHY;
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync Phy::init(phy, 0, PHY_EPID_M881000);
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync }
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync void tearDown()
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync {
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync delete phy;
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync }
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync void testSize()
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync {
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync CPPUNIT_ASSERT_EQUAL(32, ST_BITS+OP_BITS+PHYADR_BITS+REGADR_BITS+TA_BITS+DATA_BITS);
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync }
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync void testReadPID()
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync {
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync CPPUNIT_ASSERT_EQUAL(0x0141, readAt(2));
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync }
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync void testReadEPID()
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync {
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync CPPUNIT_ASSERT_EQUAL(0x0141, readAt(2));
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync CPPUNIT_ASSERT_EQUAL(PHY_EPID_M881000, readAt(3));
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync }
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync void testWriteANA()
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync {
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync writeTo(4, 0xBEEF);
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync CPPUNIT_ASSERT_EQUAL(0xBEEF, readAt(4));
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync }
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync};
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync/**
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync * shiftOutBits - Shift data bits our to MDIO
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync **/
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsyncvoid PhyTest::shiftOutBits(uint32_t data, uint16_t count) {
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync uint32_t mask = 0x01 << (count - 1);
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync do {
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync Phy::writeMDIO(phy, data & mask);
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync mask >>= 1;
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync } while (mask);
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync}
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync/**
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync * shiftInBits - Shift data bits in from MDIO
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync **/
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsyncuint16_t PhyTest::shiftInBits(uint16_t count)
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync{
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync uint16_t data = 0;
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync while (count--)
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync {
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync data <<= 1;
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync data |= Phy::readMDIO(phy) ? 1 : 0;
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync }
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync return data;
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync}
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsyncint PhyTest::readAt(uint16_t addr)
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync{
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync shiftOutBits(PREAMBLE_VAL, PREAMBLE_BITS);
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync shiftOutBits(ST_VAL, ST_BITS);
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync shiftOutBits(READ_OP, OP_BITS);
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync shiftOutBits(PHYADR_VAL, PHYADR_BITS);
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync shiftOutBits(addr, REGADR_BITS);
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync CPPUNIT_ASSERT_EQUAL((uint16_t)0, shiftInBits(1));
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync uint16_t u16Data = shiftInBits(DATA_BITS);
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync shiftInBits(1);
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync return u16Data;
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync}
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsyncvoid PhyTest::writeTo(uint16_t addr, uint32_t value)
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync{
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync shiftOutBits(PREAMBLE_VAL, PREAMBLE_BITS);
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync shiftOutBits(ST_VAL, ST_BITS);
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync shiftOutBits(WRITE_OP, OP_BITS);
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync shiftOutBits(PHYADR_VAL, PHYADR_BITS);
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync shiftOutBits(addr, REGADR_BITS);
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync shiftOutBits(TA_VAL, TA_BITS);
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync shiftOutBits(value, DATA_BITS);
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync}
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync// Create text test runner and run all tests.
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsyncint main( int argc, char **argv)
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync{
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync CppUnit::TextUi::TestRunner runner;
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync runner.addTest( PhyTest::suite() );
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync return runner.run() ? 0 : 1;
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync}
627bf68711ac042ab548c6085bc0c7e5c8b91c41vboxsync