Bug fix - added endian swap for MDIO parameters
[keystone-rtos/ibl.git] / src / hw / sgmii / sgmii.c
1 /**
2  *  @file sgmii.c
3  *
4  *  @brief
5  *              The sgmii driver for the ibl
6  *
7  */
9 #include "types.h"
10 #include "ibl.h"
11 #include "sgmii.h"
12 #include "target.h"
14 #define SGMII_ACCESS(port,reg)   *((volatile unsigned int *)(sgmiis[port] + reg))
16 /**
17  *  @brief
18  *      Configure the sgmii
19  */
20 int32 hwSgmiiConfig (int32 port, iblSgmii_t *iblSgmii)
21 {
22     unsigned int sgmiis[] = TARGET_SGMII_BASE_ADDRESSES;
23     int32 v;
25     if (port >= TARGET_EMAC_N_PORTS)
26         return (-1);
29     SGMII_ACCESS(port, TARGET_SGMII_SOFT_RESET) = 1;
31     do  {
33         v = SGMII_ACCESS(port, TARGET_SGMII_SOFT_RESET);
35     } while (v & 1);
37     /* Bit 1 holds tx/rx in reset. Used during loopback state change in 
38      * the control register */
39     SGMII_ACCESS(port, TARGET_SGMII_SOFT_RESET) = 2;
42     SGMII_ACCESS(port, TARGET_SGMII_CONTROL) = iblSgmii->control;
43     SGMII_ACCESS(port, TARGET_SGMII_SOFT_RESET) = 0;
45     SGMII_ACCESS(port, TARGET_SGMII_MR_ADV_ABILITY) = iblSgmii->adviseAbility;
47     /* Serdes configuration */
48     SGMII_ACCESS(port, TARGET_SGMII_TX_CFG) = iblSgmii->txConfig;
49     SGMII_ACCESS(port, TARGET_SGMII_RX_CFG) = iblSgmii->rxConfig;
50     SGMII_ACCESS(port, TARGET_SGMII_AUX_CFG) = iblSgmii->auxConfig;
52     return (0);
54 }
56