コード例 #1
0
/*
 * 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;
}
コード例 #2
0
	  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,
コード例 #3
0
ファイル: netxen_nic_ethtool.c プロジェクト: ivucica/linux
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;
}