/* * netxen_niu_gbe_phy_read - read a register from the GbE PHY via * mii management interface. * * Note: The MII management interface goes through port 0. * Individual phys are addressed as follows: * @param phy [15:8] phy id * @param reg [7:0] register number * * @returns 0 on success * -1 on error * */ int netxen_niu_gbe_phy_read(struct netxen_adapter *adapter, long phy, long reg, __u32 * readval) { long timeout = 0; long result = 0; long restore = 0; __u32 address; __u32 command; __u32 status; __u32 mac_cfg0; if (phy_lock(adapter) != 0) { return -1; } /* * MII mgmt all goes through port 0 MAC interface, * so it cannot be in reset */ if (netxen_nic_hw_read_wx(adapter, NETXEN_NIU_GB_MAC_CONFIG_0(0), &mac_cfg0, 4)) return -EIO; if (netxen_gb_get_soft_reset(mac_cfg0)) { __u32 temp; temp = 0; netxen_gb_tx_reset_pb(temp); netxen_gb_rx_reset_pb(temp); netxen_gb_tx_reset_mac(temp); netxen_gb_rx_reset_mac(temp); if (netxen_nic_hw_write_wx(adapter, NETXEN_NIU_GB_MAC_CONFIG_0(0), &temp, 4)) return -EIO; restore = 1; } address = 0; netxen_gb_mii_mgmt_reg_addr(address, reg); netxen_gb_mii_mgmt_phy_addr(address, phy); if (netxen_nic_hw_write_wx(adapter, NETXEN_NIU_GB_MII_MGMT_ADDR(0), &address, 4)) return -EIO; command = 0; /* turn off any prior activity */ if (netxen_nic_hw_write_wx(adapter, NETXEN_NIU_GB_MII_MGMT_COMMAND(0), &command, 4)) return -EIO; /* send read command */ netxen_gb_mii_mgmt_set_read_cycle(command); if (netxen_nic_hw_write_wx(adapter, NETXEN_NIU_GB_MII_MGMT_COMMAND(0), &command, 4)) return -EIO; status = 0; do { if (netxen_nic_hw_read_wx(adapter, NETXEN_NIU_GB_MII_MGMT_INDICATE(0), &status, 4)) return -EIO; timeout++; } while ((netxen_get_gb_mii_mgmt_busy(status) || netxen_get_gb_mii_mgmt_notvalid(status)) && (timeout++ < NETXEN_NIU_PHY_WAITMAX)); if (timeout < NETXEN_NIU_PHY_WAITMAX) { if (netxen_nic_hw_read_wx(adapter, NETXEN_NIU_GB_MII_MGMT_STATUS(0), readval, 4)) return -EIO; result = 0; } else result = -1; if (restore) if (netxen_nic_hw_write_wx(adapter, NETXEN_NIU_GB_MAC_CONFIG_0(0), &mac_cfg0, 4)) return -EIO; phy_unlock(adapter); return result; }
NETXEN_NIU_REMOTE_LOOPBACK, NETXEN_NIU_GB0_HALF_DUPLEX, NETXEN_NIU_GB1_HALF_DUPLEX, NETXEN_NIU_RESET_SYS_FIFOS, NETXEN_NIU_GB_CRC_DROP, NETXEN_NIU_GB_DROP_WRONGADDR, NETXEN_NIU_TEST_MUX_CTL, NETXEN_NIU_GB_MAC_CONFIG_0(0), NETXEN_NIU_GB_MAC_CONFIG_1(0), NETXEN_NIU_GB_HALF_DUPLEX_CTRL(0), NETXEN_NIU_GB_MAX_FRAME_SIZE(0), NETXEN_NIU_GB_TEST_REG(0), NETXEN_NIU_GB_MII_MGMT_CONFIG(0), NETXEN_NIU_GB_MII_MGMT_COMMAND(0), NETXEN_NIU_GB_MII_MGMT_ADDR(0), NETXEN_NIU_GB_MII_MGMT_CTRL(0), NETXEN_NIU_GB_MII_MGMT_STATUS(0), NETXEN_NIU_GB_MII_MGMT_INDICATE(0), NETXEN_NIU_GB_INTERFACE_CTRL(0), NETXEN_NIU_GB_INTERFACE_STATUS(0), NETXEN_NIU_GB_STATION_ADDR_0(0), NETXEN_NIU_GB_STATION_ADDR_1(0), -1, } }, { /* XG Mode */ { NETXEN_NIU_XG_SINGLE_TERM, NETXEN_NIU_XG_DRIVE_HI,
/* * netxen_niu_gbe_phy_write - write a register to the GbE PHY via * mii management interface. * * Note: The MII management interface goes through port 0. * Individual phys are addressed as follows: * @param phy [15:8] phy id * @param reg [7:0] register number * * @returns 0 on success * -1 on error * */ int netxen_niu_gbe_phy_write(struct netxen_adapter *adapter, long phy, long reg, __u32 val) { long timeout = 0; long result = 0; long restore = 0; __u32 address; __u32 command; __u32 status; __u32 mac_cfg0; /* * MII mgmt all goes through port 0 MAC interface, so it * cannot be in reset */ if (netxen_nic_hw_read_wx(adapter, NETXEN_NIU_GB_MAC_CONFIG_0(0), &mac_cfg0, 4)) return -EIO; if (netxen_gb_get_soft_reset(mac_cfg0)) { __u32 temp; temp = 0; netxen_gb_tx_reset_pb(temp); netxen_gb_rx_reset_pb(temp); netxen_gb_tx_reset_mac(temp); netxen_gb_rx_reset_mac(temp); if (netxen_nic_hw_write_wx(adapter, NETXEN_NIU_GB_MAC_CONFIG_0(0), &temp, 4)) return -EIO; restore = 1; } command = 0; /* turn off any prior activity */ if (netxen_nic_hw_write_wx(adapter, NETXEN_NIU_GB_MII_MGMT_COMMAND(0), &command, 4)) return -EIO; address = 0; netxen_gb_mii_mgmt_reg_addr(address, reg); netxen_gb_mii_mgmt_phy_addr(address, phy); if (netxen_nic_hw_write_wx(adapter, NETXEN_NIU_GB_MII_MGMT_ADDR(0), &address, 4)) return -EIO; if (netxen_nic_hw_write_wx(adapter, NETXEN_NIU_GB_MII_MGMT_CTRL(0), &val, 4)) return -EIO; status = 0; do { if (netxen_nic_hw_read_wx(adapter, NETXEN_NIU_GB_MII_MGMT_INDICATE(0), &status, 4)) return -EIO; timeout++; } while ((netxen_get_gb_mii_mgmt_busy(status)) && (timeout++ < NETXEN_NIU_PHY_WAITMAX)); if (timeout < NETXEN_NIU_PHY_WAITMAX) result = 0; else result = -EIO; /* restore the state of port 0 MAC in case we tampered with it */ if (restore) if (netxen_nic_hw_write_wx(adapter, NETXEN_NIU_GB_MAC_CONFIG_0(0), &mac_cfg0, 4)) return -EIO; return result; }