Пример #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;
}
Пример #2
0
static int
netxen_nic_set_pauseparam(struct net_device *dev,
			  struct ethtool_pauseparam *pause)
{
	struct netxen_adapter *adapter = netdev_priv(dev);
	__u32 val;
	int port = adapter->physical_port;
	/* read mode */
	if (adapter->ahw.port_type == NETXEN_NIC_GBE) {
		if ((port < 0) || (port > NETXEN_NIU_MAX_GBE_PORTS))
			return -EIO;
		/* set flow control */
		val = NXRD32(adapter, NETXEN_NIU_GB_MAC_CONFIG_0(port));

		if (pause->rx_pause)
			netxen_gb_rx_flowctl(val);
		else
			netxen_gb_unset_rx_flowctl(val);

		NXWR32(adapter, NETXEN_NIU_GB_MAC_CONFIG_0(port),
				val);
		/* set autoneg */
		val = NXRD32(adapter, NETXEN_NIU_GB_PAUSE_CTL);
		switch (port) {
			case 0:
				if (pause->tx_pause)
					netxen_gb_unset_gb0_mask(val);
				else
					netxen_gb_set_gb0_mask(val);
				break;
			case 1:
				if (pause->tx_pause)
					netxen_gb_unset_gb1_mask(val);
				else
					netxen_gb_set_gb1_mask(val);
				break;
			case 2:
				if (pause->tx_pause)
					netxen_gb_unset_gb2_mask(val);
				else
					netxen_gb_set_gb2_mask(val);
				break;
			case 3:
			default:
				if (pause->tx_pause)
					netxen_gb_unset_gb3_mask(val);
				else
					netxen_gb_set_gb3_mask(val);
				break;
		}
		NXWR32(adapter, NETXEN_NIU_GB_PAUSE_CTL, val);
	} else if (adapter->ahw.port_type == NETXEN_NIC_XGBE) {
		if ((port < 0) || (port > NETXEN_NIU_MAX_XG_PORTS))
			return -EIO;
		val = NXRD32(adapter, NETXEN_NIU_XG_PAUSE_CTL);
		if (port == 0) {
			if (pause->tx_pause)
				netxen_xg_unset_xg0_mask(val);
			else
				netxen_xg_set_xg0_mask(val);
		} else {
			if (pause->tx_pause)
				netxen_xg_unset_xg1_mask(val);
			else
				netxen_xg_set_xg1_mask(val);
		}
		NXWR32(adapter, NETXEN_NIU_XG_PAUSE_CTL, val);
	} else {
		printk(KERN_ERR "%s: Unknown board type: %x\n",
				netxen_nic_driver_name,
				adapter->ahw.port_type);
	}
	return 0;
}
Пример #3
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;
}