/* * 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_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_XG_DRIVE_LO, NETXEN_NIU_XG_DTX,
static int netxen_nic_reg_test(struct net_device *dev) { struct netxen_port *port = netdev_priv(dev); struct netxen_adapter *adapter = port->adapter; u32 data_read, data_written, save; __u32 mode; /* * first test the "Read Only" registers by writing which mode */ netxen_nic_read_w0(adapter, NETXEN_NIU_MODE, &mode); if (netxen_get_niu_enable_ge(mode)) { /* GB Mode */ netxen_nic_read_w0(adapter, NETXEN_NIU_GB_MII_MGMT_STATUS(port->portnum), &data_read); save = data_read; if (data_read) data_written = data_read & NETXEN_NIC_INVALID_DATA; else data_written = NETXEN_NIC_INVALID_DATA; netxen_nic_write_w0(adapter, NETXEN_NIU_GB_MII_MGMT_STATUS(port-> portnum), data_written); netxen_nic_read_w0(adapter, NETXEN_NIU_GB_MII_MGMT_STATUS(port->portnum), &data_read); if (data_written == data_read) { netxen_nic_write_w0(adapter, NETXEN_NIU_GB_MII_MGMT_STATUS(port-> portnum), save); return 0; } /* netxen_niu_gb_mii_mgmt_indicators is read only */ netxen_nic_read_w0(adapter, NETXEN_NIU_GB_MII_MGMT_INDICATE(port-> portnum), &data_read); save = data_read; if (data_read) data_written = data_read & NETXEN_NIC_INVALID_DATA; else data_written = NETXEN_NIC_INVALID_DATA; netxen_nic_write_w0(adapter, NETXEN_NIU_GB_MII_MGMT_INDICATE(port-> portnum), data_written); netxen_nic_read_w0(adapter, NETXEN_NIU_GB_MII_MGMT_INDICATE(port-> portnum), &data_read); if (data_written == data_read) { netxen_nic_write_w0(adapter, NETXEN_NIU_GB_MII_MGMT_INDICATE (port->portnum), save); return 0; } /* netxen_niu_gb_interface_status is read only */ netxen_nic_read_w0(adapter, NETXEN_NIU_GB_INTERFACE_STATUS(port-> portnum), &data_read); save = data_read; if (data_read) data_written = data_read & NETXEN_NIC_INVALID_DATA; else data_written = NETXEN_NIC_INVALID_DATA; netxen_nic_write_w0(adapter, NETXEN_NIU_GB_INTERFACE_STATUS(port-> portnum), data_written); netxen_nic_read_w0(adapter, NETXEN_NIU_GB_INTERFACE_STATUS(port-> portnum), &data_read); if (data_written == data_read) { netxen_nic_write_w0(adapter, NETXEN_NIU_GB_INTERFACE_STATUS (port->portnum), save); return 0; } } /* GB Mode */ return 1; }