123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747 |
- --- a/Embedded/src/GbE/iegbe_oem_phy.c
- +++ b/Embedded/src/GbE/iegbe_oem_phy.c
- @@ -65,6 +65,10 @@ static int32_t iegbe_oem_link_m88_setup(
- static int32_t iegbe_oem_set_phy_mode(struct iegbe_hw *hw);
- static int32_t iegbe_oem_detect_phy(struct iegbe_hw *hw);
-
- +static int32_t iegbe_oem_link_bcm5481_setup(struct iegbe_hw *hw);
- +static int32_t bcm5481_read_18sv (struct iegbe_hw *hw, int sv, uint16_t *data);
- +static int32_t oi_phy_setup (struct iegbe_hw *hw);
- +
- /**
- * iegbe_oem_setup_link
- * @hw: iegbe_hw struct containing device specific information
- @@ -114,6 +118,10 @@ iegbe_oem_setup_link(struct iegbe_hw *hw
- }
-
- switch (hw->phy_id) {
- + case BCM5395S_PHY_ID:
- + return E1000_SUCCESS;
- + break;
- +
- case M88E1000_I_PHY_ID:
- case M88E1141_E_PHY_ID:
- ret_val = iegbe_oem_link_m88_setup(hw);
- @@ -121,6 +129,12 @@ iegbe_oem_setup_link(struct iegbe_hw *hw
- return ret_val;
- }
- break;
- + case BCM5481_PHY_ID:
- + ret_val = iegbe_oem_link_bcm5481_setup(hw);
- + if(ret_val) {
- + return ret_val;
- + }
- + break;
- default:
- DEBUGOUT("Invalid PHY ID\n");
- return -E1000_ERR_PHY_TYPE;
- @@ -179,6 +193,51 @@ iegbe_oem_setup_link(struct iegbe_hw *hw
- #endif /* ifdef EXTERNAL_MDIO */
- }
-
- +/**
- + * iegbe_oem_link_bcm5481_setup
- + * @hw: iegbe_hw struct containing device specific information
- + *
- + * Returns E1000_SUCCESS, negative E1000 error code on failure
- + *
- + * copied verbatim from iegbe_oem_link_m88_setup
- + **/
- +static int32_t
- +iegbe_oem_link_bcm5481_setup(struct iegbe_hw *hw)
- +{
- + int32_t ret_val;
- + uint16_t phy_data;
- +
- + //DEBUGFUNC(__func__);
- +
- + if(!hw)
- + return -1;
- +
- + /* phy_reset_disable is set in iegbe_oem_set_phy_mode */
- + if(hw->phy_reset_disable)
- + return E1000_SUCCESS;
- +
- + // Enable MDIX in extended control reg.
- + ret_val = iegbe_oem_read_phy_reg_ex(hw, BCM5481_ECTRL, &phy_data);
- + if(ret_val)
- + {
- + DEBUGOUT("Unable to read BCM5481_ECTRL register\n");
- + return ret_val;
- + }
- +
- + phy_data &= ~BCM5481_ECTRL_DISMDIX;
- + ret_val = iegbe_oem_write_phy_reg_ex(hw, BCM5481_ECTRL, phy_data);
- + if(ret_val)
- + {
- + DEBUGOUT("Unable to write BCM5481_ECTRL register\n");
- + return ret_val;
- + }
- +
- + ret_val = oi_phy_setup (hw);
- + if (ret_val)
- + return ret_val;
- +
- + return E1000_SUCCESS;
- +}
-
- /**
- * iegbe_oem_link_m88_setup
- @@ -340,6 +399,11 @@ iegbe_oem_force_mdi(struct iegbe_hw *hw,
- * see iegbe_phy_force_speed_duplex, which does the following for M88
- */
- switch (hw->phy_id) {
- + case BCM5395S_PHY_ID:
- + case BCM5481_PHY_ID:
- + DEBUGOUT("WARNING: An empty iegbe_oem_force_mdi() has been called!\n");
- + break;
- +
- case M88E1000_I_PHY_ID:
- case M88E1141_E_PHY_ID:
- ret_val = iegbe_oem_read_phy_reg_ex(hw,
- @@ -415,6 +479,8 @@ iegbe_oem_phy_reset_dsp(struct iegbe_hw
- switch (hw->phy_id) {
- case M88E1000_I_PHY_ID:
- case M88E1141_E_PHY_ID:
- + case BCM5481_PHY_ID:
- + case BCM5395S_PHY_ID:
- DEBUGOUT("No DSP to reset on OEM PHY\n");
- break;
- default:
- @@ -460,6 +526,11 @@ iegbe_oem_cleanup_after_phy_reset(struct
- * see iegbe_phy_force_speed_duplex, which does the following for M88
- */
- switch (hw->phy_id) {
- + case BCM5395S_PHY_ID:
- + case BCM5481_PHY_ID:
- + DEBUGOUT("WARNING: An empty iegbe_oem_cleanup_after_phy_reset() has been called!\n");
- + break;
- +
- case M88E1000_I_PHY_ID:
- case M88E1141_E_PHY_ID:
- /*
- @@ -573,6 +644,11 @@ iegbe_oem_set_phy_mode(struct iegbe_hw *
- * use iegbe_set_phy_mode as example
- */
- switch (hw->phy_id) {
- + case BCM5395S_PHY_ID:
- + case BCM5481_PHY_ID:
- + DEBUGOUT("WARNING: An empty iegbe_oem_set_phy_mode() has been called!\n");
- + break;
- +
- case M88E1000_I_PHY_ID:
- case M88E1141_E_PHY_ID:
- ret_val = iegbe_read_eeprom(hw,
- @@ -641,6 +717,19 @@ iegbe_oem_detect_phy(struct iegbe_hw *hw
- }
- hw->phy_type = iegbe_phy_oem;
-
- +{
- + // If MAC2 (BCM5395 switch), manually detect the phy
- + struct iegbe_adapter *adapter;
- + uint32_t device_number;
- + adapter = (struct iegbe_adapter *) hw->back;
- + device_number = PCI_SLOT(adapter->pdev->devfn);
- + if (device_number == ICP_XXXX_MAC_2) {
- + hw->phy_id = BCM5395S_PHY_ID;
- + hw->phy_revision = 0;
- + return E1000_SUCCESS;
- + }
- +}
- +
- ret_val = iegbe_oem_read_phy_reg_ex(hw, PHY_ID1, &phy_id_high);
- if(ret_val) {
- DEBUGOUT("Unable to read PHY register PHY_ID1\n");
- @@ -690,6 +779,8 @@ iegbe_oem_get_tipg(struct iegbe_hw *hw)
- switch (hw->phy_id) {
- case M88E1000_I_PHY_ID:
- case M88E1141_E_PHY_ID:
- + case BCM5481_PHY_ID:
- + case BCM5395S_PHY_ID:
- phy_num = DEFAULT_ICP_XXXX_TIPG_IPGT;
- break;
- default:
- @@ -738,6 +829,8 @@ iegbe_oem_phy_is_copper(struct iegbe_hw
- switch (hw->phy_id) {
- case M88E1000_I_PHY_ID:
- case M88E1141_E_PHY_ID:
- + case BCM5481_PHY_ID:
- + case BCM5395S_PHY_ID:
- isCopper = TRUE;
- break;
- default:
- @@ -796,13 +889,13 @@ iegbe_oem_get_phy_dev_number(struct iegb
- switch(device_number)
- {
- case ICP_XXXX_MAC_0:
- - hw->phy_addr = 0x00;
- + hw->phy_addr = 0x01;
- break;
- case ICP_XXXX_MAC_1:
- - hw->phy_addr = 0x01;
- + hw->phy_addr = 0x02;
- break;
- case ICP_XXXX_MAC_2:
- - hw->phy_addr = 0x02;
- + hw->phy_addr = 0x00;
- break;
- default: hw->phy_addr = 0x00;
- }
- @@ -851,6 +944,12 @@ iegbe_oem_mii_ioctl(struct iegbe_adapter
- if(!adapter || !ifr) {
- return -1;
- }
- +
- + // If MAC2 (BCM5395 switch) then leave now
- + if ((PCI_SLOT(adapter->pdev->devfn)) == ICP_XXXX_MAC_2) {
- + return -1;
- + }
- +
- switch (data->reg_num) {
- case PHY_CTRL:
- if(mii_reg & MII_CR_POWER_DOWN) {
- @@ -987,6 +1086,11 @@ void iegbe_oem_get_phy_regs(struct iegbe
- * [10] = mdix mode
- */
- switch (adapter->hw.phy_id) {
- + case BCM5395S_PHY_ID:
- + case BCM5481_PHY_ID:
- + DEBUGOUT("WARNING: An empty iegbe_oem_get_phy_regs() has been called!\n");
- + break;
- +
- case M88E1000_I_PHY_ID:
- case M88E1141_E_PHY_ID:
- if(corrected_len > 0) {
- @@ -1068,8 +1172,13 @@ iegbe_oem_phy_loopback(struct iegbe_adap
- * Loopback configuration is the same for each of the supported PHYs.
- */
- switch (adapter->hw.phy_id) {
- + case BCM5395S_PHY_ID:
- + DEBUGOUT("WARNING: An empty iegbe_oem_phy_loopback() has been called!\n");
- + break;
- +
- case M88E1000_I_PHY_ID:
- case M88E1141_E_PHY_ID:
- + case BCM5481_PHY_ID:
-
- adapter->hw.autoneg = FALSE;
-
- @@ -1182,8 +1291,14 @@ iegbe_oem_loopback_cleanup(struct iegbe_
- }
-
- switch (adapter->hw.phy_id) {
- + case BCM5395S_PHY_ID:
- + DEBUGOUT("WARNING: An empty iegbe_oem_loopback_cleanup() has been called!\n");
- + return;
- + break;
- +
- case M88E1000_I_PHY_ID:
- case M88E1141_E_PHY_ID:
- + case BCM5481_PHY_ID:
- default:
- adapter->hw.autoneg = TRUE;
-
- @@ -1243,6 +1358,11 @@ iegbe_oem_phy_speed_downgraded(struct ie
- */
-
- switch (hw->phy_id) {
- + case BCM5395S_PHY_ID:
- + case BCM5481_PHY_ID:
- + *isDowngraded = 0;
- + break;
- +
- case M88E1000_I_PHY_ID:
- case M88E1141_E_PHY_ID:
- ret_val = iegbe_oem_read_phy_reg_ex(hw, M88E1000_PHY_SPEC_STATUS,
- @@ -1305,6 +1425,11 @@ iegbe_oem_check_polarity(struct iegbe_hw
- */
-
- switch (hw->phy_id) {
- + case BCM5395S_PHY_ID:
- + case BCM5481_PHY_ID:
- + *polarity = 0;
- + break;
- +
- case M88E1000_I_PHY_ID:
- case M88E1141_E_PHY_ID:
- /* return the Polarity bit in the Status register. */
- @@ -1367,6 +1492,25 @@ iegbe_oem_phy_is_full_duplex(struct iegb
- */
-
- switch (hw->phy_id) {
- + case BCM5395S_PHY_ID:
- + /* Always full duplex */
- + *isFD = 1;
- + break;
- +
- + case BCM5481_PHY_ID:
- + ret_val = iegbe_read_phy_reg(hw, BCM5481_ASTAT, &phy_data);
- + if(ret_val) return ret_val;
- +
- + switch (BCM5481_ASTAT_HCD(phy_data)) {
- + case BCM5481_ASTAT_1KBTFD:
- + case BCM5481_ASTAT_100BTXFD:
- + *isFD = 1;
- + break;
- + default:
- + *isFD = 0;
- + }
- + break;
- +
- case M88E1000_I_PHY_ID:
- case M88E1141_E_PHY_ID:
- ret_val = iegbe_oem_read_phy_reg_ex(hw, M88E1000_PHY_SPEC_STATUS,
- @@ -1423,6 +1567,25 @@ iegbe_oem_phy_is_speed_1000(struct iegbe
- */
-
- switch (hw->phy_id) {
- + case BCM5395S_PHY_ID:
- + /* Always 1000mb */
- + *is1000 = 1;
- + break;
- +
- + case BCM5481_PHY_ID:
- + ret_val = iegbe_read_phy_reg(hw, BCM5481_ASTAT, &phy_data);
- + if(ret_val) return ret_val;
- +
- + switch (BCM5481_ASTAT_HCD(phy_data)) {
- + case BCM5481_ASTAT_1KBTFD:
- + case BCM5481_ASTAT_1KBTHD:
- + *is1000 = 1;
- + break;
- + default:
- + *is1000 = 0;
- + }
- + break;
- +
- case M88E1000_I_PHY_ID:
- case M88E1141_E_PHY_ID:
- ret_val = iegbe_oem_read_phy_reg_ex(hw, M88E1000_PHY_SPEC_STATUS,
- @@ -1478,6 +1641,25 @@ iegbe_oem_phy_is_speed_100(struct iegbe_
- * see iegbe_config_mac_to_phy
- */
- switch (hw->phy_id) {
- + case BCM5395S_PHY_ID:
- + /* Always 1000Mb, never 100mb */
- + *is100 = 0;
- + break;
- +
- + case BCM5481_PHY_ID:
- + ret_val = iegbe_read_phy_reg(hw, BCM5481_ASTAT, &phy_data);
- + if(ret_val) return ret_val;
- +
- + switch (BCM5481_ASTAT_HCD(phy_data)) {
- + case BCM5481_ASTAT_100BTXFD:
- + case BCM5481_ASTAT_100BTXHD:
- + *is100 = 1;
- + break;
- + default:
- + *is100 = 0;
- + }
- + break;
- +
- case M88E1000_I_PHY_ID:
- case M88E1141_E_PHY_ID:
- ret_val = iegbe_oem_read_phy_reg_ex(hw,
- @@ -1535,6 +1717,11 @@ iegbe_oem_phy_get_info(struct iegbe_hw *
- * see iegbe_phy_m88_get_info
- */
- switch (hw->phy_id) {
- + case BCM5395S_PHY_ID:
- + case BCM5481_PHY_ID:
- + DEBUGOUT("WARNING: An empty iegbe_oem_phy_get_info() has been called!\n");
- + break;
- +
- case M88E1000_I_PHY_ID:
- case M88E1141_E_PHY_ID:
- /* The downshift status is checked only once, after link is
- @@ -1636,8 +1823,13 @@ iegbe_oem_phy_hw_reset(struct iegbe_hw *
- * the M88 used in truxton.
- */
- switch (hw->phy_id) {
- + case BCM5395S_PHY_ID:
- + DEBUGOUT("WARNING: An empty iegbe_oem_phy_hw_reset() has been called!\n");
- + break;
- +
- case M88E1000_I_PHY_ID:
- case M88E1141_E_PHY_ID:
- + case BCM5481_PHY_ID:
- ret_val = iegbe_oem_read_phy_reg_ex(hw, PHY_CTRL, &phy_data);
- if(ret_val) {
- DEBUGOUT("Unable to read register PHY_CTRL\n");
- @@ -1699,6 +1891,8 @@ iegbe_oem_phy_init_script(struct iegbe_h
- switch (hw->phy_id) {
- case M88E1000_I_PHY_ID:
- case M88E1141_E_PHY_ID:
- + case BCM5481_PHY_ID:
- + case BCM5395S_PHY_ID:
- DEBUGOUT("Nothing to do for OEM PHY Init");
- break;
- default:
- @@ -1735,6 +1929,11 @@ iegbe_oem_read_phy_reg_ex(struct iegbe_h
- return -1;
- }
-
- + if (hw->phy_id == BCM5395S_PHY_ID) {
- + DEBUGOUT("WARNING: iegbe_oem_read_phy_reg_ex() has been unexpectedly called!\n");
- + return -1;
- + }
- +
- /* call the GCU func that will read the phy
- *
- * Make note that the M88 phy is what'll be used on Truxton.
- @@ -1782,6 +1981,11 @@ iegbe_oem_set_trans_gasket(struct iegbe_
- }
-
- switch (hw->phy_id) {
- + case BCM5395S_PHY_ID:
- + case BCM5481_PHY_ID:
- + DEBUGOUT("WARNING: An empty iegbe_oem_set_trans_gasket() has been called!\n");
- + break;
- +
- case M88E1000_I_PHY_ID:
- case M88E1141_E_PHY_ID:
- /* Gasket set correctly for Marvell Phys, so nothing to do */
- @@ -1886,6 +2090,8 @@ iegbe_oem_phy_needs_reset_with_mac(struc
- switch (hw->phy_id) {
- case M88E1000_I_PHY_ID:
- case M88E1141_E_PHY_ID:
- + case BCM5481_PHY_ID:
- + case BCM5395S_PHY_ID:
- ret_val = FALSE;
- break;
- default:
- @@ -1935,6 +2141,8 @@ iegbe_oem_config_dsp_after_link_change(s
- switch (hw->phy_id) {
- case M88E1000_I_PHY_ID:
- case M88E1141_E_PHY_ID:
- + case BCM5481_PHY_ID:
- + case BCM5395S_PHY_ID:
- DEBUGOUT("No DSP to configure on OEM PHY");
- break;
- default:
- @@ -1978,6 +2186,12 @@ iegbe_oem_get_cable_length(struct iegbe_
- }
-
- switch (hw->phy_id) {
- + case BCM5395S_PHY_ID:
- + case BCM5481_PHY_ID:
- + *min_length = 0;
- + *max_length = iegbe_igp_cable_length_150;
- + break;
- +
- case M88E1000_I_PHY_ID:
- case M88E1141_E_PHY_ID:
- ret_val = iegbe_oem_read_phy_reg_ex(hw,
- @@ -2061,6 +2275,23 @@ iegbe_oem_phy_is_link_up(struct iegbe_hw
- */
-
- switch (hw->phy_id) {
- + case BCM5395S_PHY_ID:
- + /* Link always up */
- + *isUp = TRUE;
- + return E1000_SUCCESS;
- + break;
- +
- + case BCM5481_PHY_ID:
- + iegbe_oem_read_phy_reg_ex(hw, BCM5481_ESTAT, &phy_data);
- + ret_val = iegbe_oem_read_phy_reg_ex(hw, BCM5481_ESTAT, &phy_data);
- + if(ret_val)
- + {
- + DEBUGOUT("Unable to read PHY register BCM5481_ESTAT\n");
- + return ret_val;
- + }
- + statusMask = BCM5481_ESTAT_LINK;
- + break;
- +
- case M88E1000_I_PHY_ID:
- case M88E1141_E_PHY_ID:
- iegbe_oem_read_phy_reg_ex(hw, M88E1000_PHY_SPEC_STATUS, &phy_data);
- @@ -2092,3 +2323,210 @@ iegbe_oem_phy_is_link_up(struct iegbe_hw
- #endif /* ifdef EXTERNAL_MDIO */
- }
-
- +
- +
- +//-----
- +// Read BCM5481 expansion register
- +//
- +int32_t
- +bcm5481_read_ex (struct iegbe_hw *hw, uint16_t reg, uint16_t *data)
- +{
- + int ret;
- + uint16_t selector;
- + uint16_t reg_data;
- +
- + // Get the current value of bits 15:12
- + ret = iegbe_oem_read_phy_reg_ex (hw, 0x15, &selector);
- + if (ret)
- + return ret;
- +
- + // Select the expansion register
- + selector &= 0xf000;
- + selector |= (0xf << 8) | (reg);
- + iegbe_oem_write_phy_reg_ex (hw, 0x17, selector);
- +
- + // Read the expansion register
- + ret = iegbe_oem_read_phy_reg_ex (hw, 0x15, ®_data);
- +
- + // De-select the expansion registers.
- + selector &= 0xf000;
- + iegbe_oem_write_phy_reg_ex (hw, 0x17, selector);
- +
- + if (ret)
- + return ret;
- +
- + *data = reg_data;
- + return ret;
- +}
- +
- +//-----
- +// Read reg 0x18 sub-register
- +//
- +static int32_t
- +bcm5481_read_18sv (struct iegbe_hw *hw, int sv, uint16_t *data)
- +{
- + int ret;
- + uint16_t tmp_data;
- +
- + // Select reg 0x18, sv
- + tmp_data = ((sv & BCM5481_R18H_SV_MASK) << 12) | BCM5481_R18H_SV_MCTRL;
- + ret = iegbe_oem_write_phy_reg_ex (hw, BCM5481_R18H, tmp_data);
- + if(ret)
- + return ret;
- +
- + // Read reg 0x18, sv
- + ret = iegbe_oem_read_phy_reg_ex (hw, BCM5481_R18H, &tmp_data);
- + if(ret)
- + return ret;
- +
- + *data = tmp_data;
- + return ret;
- +}
- +
- +//-----
- +// Read reg 0x1C sub-register
- +//
- +int32_t
- +bcm5481_read_1csv (struct iegbe_hw *hw, int sv, uint16_t *data)
- +{
- + int ret;
- + uint16_t tmp_data;
- +
- + // Select reg 0x1c, sv
- + tmp_data = ((sv & BCM5481_R1CH_SV_MASK) << BCM5481_R1CH_SV_SHIFT);
- +
- + ret = iegbe_oem_write_phy_reg_ex (hw, BCM5481_R1CH, tmp_data);
- + if(ret)
- + return ret;
- +
- + // Read reg 0x1c, sv
- + ret = iegbe_oem_read_phy_reg_ex (hw, BCM5481_R1CH, &tmp_data);
- + if(ret)
- + return ret;
- +
- + *data = tmp_data;
- + return ret;
- +}
- +
- +//-----
- +// Read-modify-write a 0x1C register.
- +//
- +// hw - hardware access info.
- +// reg - 0x1C register to modify.
- +// data - bits which should be set.
- +// mask - the '1' bits in this argument will be cleared in the data
- +// read from 'reg' then 'data' will be or'd in and the result
- +// will be written to 'reg'.
- +
- +int32_t
- +bcm5481_rmw_1csv (struct iegbe_hw *hw, uint16_t reg, uint16_t data, uint16_t mask)
- +{
- + int32_t ret;
- + uint16_t reg_data;
- +
- + ret = 0;
- +
- + ret = bcm5481_read_1csv (hw, reg, ®_data);
- + if (ret)
- + {
- + DEBUGOUT("Unable to read BCM5481 1CH register\n");
- + printk (KERN_ERR "Unable to read BCM5481 1CH register [0x%x]\n", reg);
- + return ret;
- + }
- +
- + reg_data &= ~mask;
- + reg_data |= (BCM5481_R1CH_WE | data);
- +
- + ret = iegbe_oem_write_phy_reg_ex (hw, BCM5481_R1CH, reg_data);
- + if(ret)
- + {
- + DEBUGOUT("Unable to write BCM5481 1CH register\n");
- + printk (KERN_ERR "Unable to write BCM5481 1CH register\n");
- + return ret;
- + }
- +
- + return ret;
- +}
- +
- +int32_t
- +oi_phy_setup (struct iegbe_hw *hw)
- +{
- + int ret;
- + uint16_t pmii_data;
- + uint16_t mctrl_data;
- + uint16_t cacr_data;
- +
- + ret = 0;
- +
- + // Set low power mode via reg 0x18, sv010, bit 6
- + // Do a read-modify-write on reg 0x18, sv010 register to preserve existing bits.
- + ret = bcm5481_read_18sv (hw, BCM5481_R18H_SV_PMII, &pmii_data);
- + if (ret)
- + {
- + DEBUGOUT("Unable to read BCM5481_R18H_SV_PMII register\n");
- + printk (KERN_ERR "Unable to read BCM5481_R18H_SV_PMII register\n");
- + return ret;
- + }
- +
- + // Set the LPM bit in the data just read and write back to sv010
- + // The shadow register select bits [2:0] are set by reading the sv010
- + // register.
- + pmii_data |= BCM5481_R18H_SV010_LPM;
- + ret = iegbe_oem_write_phy_reg_ex (hw, BCM5481_R18H, pmii_data);
- + if(ret)
- + {
- + DEBUGOUT("Unable to write BCM5481_R18H register\n");
- + printk (KERN_ERR "Unable to write BCM5481_R18H register\n");
- + return ret;
- + }
- +
- +
- + // Set the RGMII RXD to RXC skew bit in reg 0x18, sv111
- +
- + if (bcm5481_read_18sv (hw, BCM5481_R18H_SV_MCTRL, &mctrl_data))
- + {
- + DEBUGOUT("Unable to read BCM5481_R18H_SV_MCTRL register\n");
- + printk (KERN_ERR "Unable to read BCM5481_R18H_SV_MCTRL register\n");
- + return ret;
- + }
- + mctrl_data |= (BCM5481_R18H_WE | BCM5481_R18H_SV111_SKEW);
- +
- + ret = iegbe_oem_write_phy_reg_ex (hw, BCM5481_R18H, mctrl_data);
- + if(ret)
- + {
- + DEBUGOUT("Unable to write BCM5481_R18H register\n");
- + printk (KERN_ERR "Unable to write BCM5481_R18H register\n");
- + return ret;
- + }
- +
- + // Enable RGMII transmit clock delay in reg 0x1c, sv00011
- + ret = bcm5481_read_1csv (hw, BCM5481_R1CH_CACR, &cacr_data);
- + if (ret)
- + {
- + DEBUGOUT("Unable to read BCM5481_R1CH_CACR register\n");
- + printk (KERN_ERR "Unable to read BCM5481_R1CH_CACR register\n");
- + return ret;
- + }
- +
- + cacr_data |= (BCM5481_R1CH_WE | BCM5481_R1CH_CACR_TCD);
- +
- + ret = iegbe_oem_write_phy_reg_ex (hw, BCM5481_R1CH, cacr_data);
- + if(ret)
- + {
- + DEBUGOUT("Unable to write BCM5481_R1CH register\n");
- + printk (KERN_ERR "Unable to write BCM5481_R1CH register\n");
- + return ret;
- + }
- +
- + // Enable dual link speed indication (0x1c, sv 00010, bit 2)
- + ret = bcm5481_rmw_1csv (hw, BCM5481_R1CH_SC1, BCM5481_R1CH_SC1_LINK, BCM5481_R1CH_SC1_LINK);
- + if (ret)
- + return ret;
- +
- + // Enable link and activity on ACTIVITY LED (0x1c, sv 01001, bit 4=1, bit 3=0)
- + ret = bcm5481_rmw_1csv (hw, BCM5481_R1CH_LCTRL, BCM5481_R1CH_LCTRL_ALEN, BCM5481_R1CH_LCTRL_ALEN | BCM5481_R1CH_LCTRL_AEN);
- + if (ret)
- + return ret;
- +
- + return ret;
- +}
- --- a/Embedded/src/GbE/iegbe_oem_phy.h
- +++ b/Embedded/src/GbE/iegbe_oem_phy.h
- @@ -95,6 +95,8 @@ int32_t iegbe_oem_phy_is_link_up(struct
-
- #define DEFAULT_ICP_XXXX_TIPG_IPGT 8 /* Inter Packet Gap Transmit Time */
- #define ICP_XXXX_TIPG_IPGT_MASK 0x000003FFUL
- +#define BCM5481_PHY_ID 0x0143BCA0
- +#define BCM5395S_PHY_ID 0x0143BCF0
-
- /* Miscellaneous defines */
- #ifdef IEGBE_10_100_ONLY
- @@ -103,5 +105,65 @@ int32_t iegbe_oem_phy_is_link_up(struct
- #define ICP_XXXX_AUTONEG_ADV_DEFAULT 0x2F
- #endif
-
- +/* BCM5481 specifics */
- +
- +#define BCM5481_ECTRL (0x10)
- +#define BCM5481_ESTAT (0x11)
- +#define BCM5481_RXERR (0x12)
- +#define BCM5481_EXPRW (0x15)
- +#define BCM5481_EXPACC (0x17)
- +#define BCM5481_ASTAT (0x19)
- +#define BCM5481_R18H (0x18)
- +#define BCM5481_R1CH (0x1c)
- +
- +/* indirect register access via register 18h */
- +
- +#define BCM5481_R18H_SV_MASK (7) // Mask for SV bits.
- +#define BCM5481_R18H_SV_ACTRL (0) // SV000 Aux. control
- +#define BCM5481_R18H_SV_10BT (1) // SV001 10Base-T
- +#define BCM5481_R18H_SV_PMII (2) // SV010 Power/MII control
- +#define BCM5481_R18H_SV_MTEST (4) // SV100 Misc. test
- +#define BCM5481_R18H_SV_MCTRL (7) // SV111 Misc. control
- +
- +#define BCM5481_R18H_SV001_POL (1 << 13) // Polarity
- +#define BCM5481_R18H_SV010_LPM (1 << 6)
- +#define BCM5481_R18H_SV111_SKEW (1 << 8)
- +#define BCM5481_R18H_WE (1 << 15) // Write enable
- +
- +// 0x1c registers
- +#define BCM5481_R1CH_SV_SHIFT (10)
- +#define BCM5481_R1CH_SV_MASK (0x1f)
- +#define BCM5481_R1CH_SC1 (0x02) // sv00010 Spare control 1
- +#define BCM5481_R1CH_CACR (0x03) // sv00011 Clock alignment control
- +#define BCM5481_R1CH_LCTRL (0x09) // sv01001 LED control
- +#define BCM5481_R1CH_LEDS1 (0x0d) // sv01101 LED selector 1
- +
- +// 0x1c common
- +#define BCM5481_R1CH_WE (1 << 15) // Write enable
- +
- +// 0x1c, sv 00010
- +#define BCM5481_R1CH_SC1_LINK (1 << 2) // sv00010 Linkspeed
- +
- +// 0x1c, sv 00011
- +#define BCM5481_R1CH_CACR_TCD (1 << 9) // sv00011 RGMII tx clock delay
- +
- +// 0x1c, sv 01001
- +#define BCM5481_R1CH_LCTRL_ALEN (1 << 4) // Activity/Link enable on ACTIVITY LED
- +#define BCM5481_R1CH_LCTRL_AEN (1 << 3) // Activity enable on ACTIVITY LED
- +
- +#define BCM5481_ECTRL_DISMDIX (1 <<14)
- +
- +#define BCM5481_MCTRL_AUTOMDIX (1 <<9)
- +
- +#define BCM5481_ESTAT_LINK (1 << 8)
- +
- +#define BCM5481_ASTAT_ANC (1 << 15)
- +#define BCM5481_ASTAT_ANHCD (7 << 8)
- +#define BCM5481_ASTAT_HCD(x) ((x >> 8) & 7)
- +#define BCM5481_ASTAT_1KBTFD (0x7)
- +#define BCM5481_ASTAT_1KBTHD (0x6)
- +#define BCM5481_ASTAT_100BTXFD (0x5)
- +#define BCM5481_ASTAT_100BTXHD (0x3)
- +
- #endif /* ifndef _IEGBE_OEM_PHY_H_ */
-
|