Exemplo n.º 1
0
static int
netxen_nic_set_pauseparam(struct net_device *dev,
			  struct ethtool_pauseparam *pause)
{
	struct netxen_port *port = netdev_priv(dev);
	struct netxen_adapter *adapter = port->adapter;
	__u32 val;
	unsigned int autoneg;

	/* read mode */
	if (adapter->ahw.board_type == NETXEN_NIC_GBE) {
		/* set flow control */
		netxen_nic_read_w0(adapter,
				   NETXEN_NIU_GB_MAC_CONFIG_0(port->portnum),
				   (u32 *) & val);
		if (pause->tx_pause)
			netxen_gb_tx_flowctl(val);
		else
			netxen_gb_unset_tx_flowctl(val);
		if (pause->rx_pause)
			netxen_gb_rx_flowctl(val);
		else
			netxen_gb_unset_rx_flowctl(val);

		netxen_nic_write_w0(adapter,
				    NETXEN_NIU_GB_MAC_CONFIG_0(port->portnum),
				    *&val);
		/* set autoneg */
		autoneg = pause->autoneg;
		if (adapter->phy_write
		    && adapter->phy_write(adapter, port->portnum,
					  NETXEN_NIU_GB_MII_MGMT_ADDR_AUTONEG,
					  autoneg) != 0)
			return -EIO;
		else {
			port->link_autoneg = pause->autoneg;
			return 0;
		}
	} else
		return -EOPNOTSUPP;
}
Exemplo n.º 2
0
/* Enable a GbE interface */
int netxen_niu_enable_gbe_port(struct netxen_adapter *adapter,
                               int port, netxen_niu_gbe_ifmode_t mode)
{
    __u32 mac_cfg0;
    __u32 mac_cfg1;
    __u32 mii_cfg;

    if ((port < 0) || (port > NETXEN_NIU_MAX_GBE_PORTS))
        return -EINVAL;

    mac_cfg0 = 0;
    netxen_gb_soft_reset(mac_cfg0);
    if (netxen_nic_hw_write_wx(adapter, NETXEN_NIU_GB_MAC_CONFIG_0(port),
                               &mac_cfg0, 4))
        return -EIO;
    mac_cfg0 = 0;
    netxen_gb_enable_tx(mac_cfg0);
    netxen_gb_enable_rx(mac_cfg0);
    netxen_gb_unset_rx_flowctl(mac_cfg0);
    netxen_gb_tx_reset_pb(mac_cfg0);
    netxen_gb_rx_reset_pb(mac_cfg0);
    netxen_gb_tx_reset_mac(mac_cfg0);
    netxen_gb_rx_reset_mac(mac_cfg0);

    if (netxen_nic_hw_write_wx(adapter, NETXEN_NIU_GB_MAC_CONFIG_0(port),
                               &mac_cfg0, 4))
        return -EIO;
    mac_cfg1 = 0;
    netxen_gb_set_preamblelen(mac_cfg1, 0xf);
    netxen_gb_set_duplex(mac_cfg1);
    netxen_gb_set_crc_enable(mac_cfg1);
    netxen_gb_set_padshort(mac_cfg1);
    netxen_gb_set_checklength(mac_cfg1);
    netxen_gb_set_hugeframes(mac_cfg1);

    if (mode == NETXEN_NIU_10_100_MB) {
        netxen_gb_set_intfmode(mac_cfg1, 1);
        if (netxen_nic_hw_write_wx(adapter,
                                   NETXEN_NIU_GB_MAC_CONFIG_1(port),
                                   &mac_cfg1, 4))
            return -EIO;

        /* set mii mode */
        netxen_crb_writelit_adapter(adapter, NETXEN_NIU_GB0_GMII_MODE +
                                    (port << 3), 0);
        netxen_crb_writelit_adapter(adapter, NETXEN_NIU_GB0_MII_MODE +
                                    (port << 3), 1);

    } else if (mode == NETXEN_NIU_1000_MB) {
        netxen_gb_set_intfmode(mac_cfg1, 2);
        if (netxen_nic_hw_write_wx(adapter,
                                   NETXEN_NIU_GB_MAC_CONFIG_1(port),
                                   &mac_cfg1, 4))
            return -EIO;
        /* set gmii mode */
        netxen_crb_writelit_adapter(adapter, NETXEN_NIU_GB0_MII_MODE +
                                    (port << 3), 0);
        netxen_crb_writelit_adapter(adapter, NETXEN_NIU_GB0_GMII_MODE +
                                    (port << 3), 1);
    }
    mii_cfg = 0;
    netxen_gb_set_mii_mgmt_clockselect(mii_cfg, 7);
    if (netxen_nic_hw_write_wx(adapter, NETXEN_NIU_GB_MII_MGMT_CONFIG(port),
                               &mii_cfg, 4))
        return -EIO;
    mac_cfg0 = 0;
    netxen_gb_enable_tx(mac_cfg0);
    netxen_gb_enable_rx(mac_cfg0);
    netxen_gb_unset_rx_flowctl(mac_cfg0);
    netxen_gb_unset_tx_flowctl(mac_cfg0);

    if (netxen_nic_hw_write_wx(adapter, NETXEN_NIU_GB_MAC_CONFIG_0(port),
                               &mac_cfg0, 4))
        return -EIO;
    return 0;
}