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 }