示例#1
0
/*
 * netxen_niu_gbe_set_gmii_mode- Set GbE Mode for GbE MAC
 */
void netxen_niu_gbe_set_gmii_mode(struct netxen_adapter *adapter,
                                  int port, long enable)
{
    netxen_crb_writelit_adapter(adapter, NETXEN_NIU_MODE, 0x2);
    netxen_crb_writelit_adapter(adapter, NETXEN_NIU_GB_MAC_CONFIG_0(port),
                                0x80000000);
    netxen_crb_writelit_adapter(adapter, NETXEN_NIU_GB_MAC_CONFIG_0(port),
                                0x0000f0025);
    netxen_crb_writelit_adapter(adapter, NETXEN_NIU_GB_MAC_CONFIG_1(port),
                                0xf2ff);
    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);
    netxen_crb_writelit_adapter(adapter,
                                (NETXEN_NIU_GB0_HALF_DUPLEX + port * 4), 0);
    netxen_crb_writelit_adapter(adapter,
                                NETXEN_NIU_GB_MII_MGMT_CONFIG(port), 0x7);

    if (enable) {
        /*
         * Do NOT enable flow control until a suitable solution for
         *  shutting down pause frames is found.
         */
        netxen_crb_writelit_adapter(adapter,
                                    NETXEN_NIU_GB_MAC_CONFIG_0(port),
                                    0x5);
    }

    if (netxen_niu_gbe_enable_phy_interrupts(adapter, port))
        printk(KERN_ERR PFX "ERROR enabling PHY interrupts\n");
    if (netxen_niu_gbe_clear_phy_interrupts(adapter, port))
        printk(KERN_ERR PFX "ERROR clearing PHY interrupts\n");
}
示例#2
0
int netxen_niu_gbe_init_port(struct netxen_adapter *adapter, int port)
{
    int result = 0;
    __u32 status;
    if (adapter->disable_phy_interrupts)
        adapter->disable_phy_interrupts(adapter, port);
    mdelay(2);

    if (0 ==
            netxen_niu_gbe_phy_read(adapter, port,
                                    NETXEN_NIU_GB_MII_MGMT_ADDR_PHY_STATUS,
                                    &status)) {
        if (netxen_get_phy_link(status)) {
            if (netxen_get_phy_speed(status) == 2) {
                netxen_niu_gbe_set_gmii_mode(adapter, port, 1);
            } else if ((netxen_get_phy_speed(status) == 1)
                       || (netxen_get_phy_speed(status) == 0)) {
                netxen_niu_gbe_set_mii_mode(adapter, port, 1);
            } else {
                result = -1;
            }

        } else {
            /*
             * We don't have link. Cable  must be unconnected.
             * Enable phy interrupts so we take action when
             * plugged in.
             */

            netxen_crb_writelit_adapter(adapter,
                                        NETXEN_NIU_GB_MAC_CONFIG_0
                                        (port),
                                        NETXEN_GB_MAC_SOFT_RESET);
            netxen_crb_writelit_adapter(adapter,
                                        NETXEN_NIU_GB_MAC_CONFIG_0
                                        (port),
                                        NETXEN_GB_MAC_RESET_PROT_BLK
                                        | NETXEN_GB_MAC_ENABLE_TX_RX
                                        |
                                        NETXEN_GB_MAC_PAUSED_FRMS);
            if (netxen_niu_gbe_clear_phy_interrupts(adapter, port))
                printk(KERN_ERR PFX
                       "ERROR clearing PHY interrupts\n");
            if (netxen_niu_gbe_enable_phy_interrupts(adapter, port))
                printk(KERN_ERR PFX
                       "ERROR enabling PHY interrupts\n");
            if (netxen_niu_gbe_clear_phy_interrupts(adapter, port))
                printk(KERN_ERR PFX
                       "ERROR clearing PHY interrupts\n");
            result = -1;
        }
    } else {
        result = -EIO;
    }
    return result;
}
示例#3
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;
}
示例#4
0
/* Disable a GbE interface */
int netxen_niu_disable_gbe_port(struct netxen_adapter *adapter, int port)
{
    __u32 mac_cfg0;

    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;
    return 0;
}
示例#5
0
static void
netxen_nic_get_pauseparam(struct net_device *dev,
			  struct ethtool_pauseparam *pause)
{
	struct netxen_adapter *adapter = netdev_priv(dev);
	__u32 val;
	int port = adapter->physical_port;

	if (adapter->ahw.board_type == NETXEN_NIC_GBE) {
		if ((port < 0) || (port > NETXEN_NIU_MAX_GBE_PORTS))
			return;
		/* get flow control settings */
		netxen_nic_read_w0(adapter,NETXEN_NIU_GB_MAC_CONFIG_0(port),
				&val);
		pause->rx_pause = netxen_gb_get_rx_flowctl(val);
		netxen_nic_read_w0(adapter, NETXEN_NIU_GB_PAUSE_CTL, &val);
		switch (port) {
			case 0:
				pause->tx_pause = !(netxen_gb_get_gb0_mask(val));
				break;
			case 1:
				pause->tx_pause = !(netxen_gb_get_gb1_mask(val));
				break;
			case 2:
				pause->tx_pause = !(netxen_gb_get_gb2_mask(val));
				break;
			case 3:
			default:
				pause->tx_pause = !(netxen_gb_get_gb3_mask(val));
				break;
		}
	} else if (adapter->ahw.board_type == NETXEN_NIC_XGBE) {
		if ((port < 0) || (port > NETXEN_NIU_MAX_XG_PORTS))
			return;
		pause->rx_pause = 1;
		netxen_nic_read_w0(adapter, NETXEN_NIU_XG_PAUSE_CTL, &val);
		if (port == 0)
			pause->tx_pause = !(netxen_xg_get_xg0_mask(val));
		else
			pause->tx_pause = !(netxen_xg_get_xg1_mask(val));
	} else {
		printk(KERN_ERR"%s: Unknown board type: %x\n",
				netxen_nic_driver_name, adapter->ahw.board_type);
	}
}
示例#6
0
static void
netxen_nic_get_pauseparam(struct net_device *dev,
			  struct ethtool_pauseparam *pause)
{
	struct netxen_port *port = netdev_priv(dev);
	struct netxen_adapter *adapter = port->adapter;
	__u32 val;

	if (adapter->ahw.board_type == NETXEN_NIC_GBE) {
		/* get flow control settings */
		netxen_nic_read_w0(adapter,
				   NETXEN_NIU_GB_MAC_CONFIG_0(port->portnum),
				   &val);
		pause->rx_pause = netxen_gb_get_rx_flowctl(val);
		pause->tx_pause = netxen_gb_get_tx_flowctl(val);
		/* get autoneg settings */
		pause->autoneg = port->link_autoneg;
	}
}
示例#7
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;
}
示例#8
0
	  NETXEN_NIU_GB1_MII_MODE,
	  NETXEN_NIU_GB2_MII_MODE,
	  NETXEN_NIU_GB3_MII_MODE,
	  NETXEN_NIU_GB0_GMII_MODE,
	  NETXEN_NIU_GB1_GMII_MODE,
	  NETXEN_NIU_GB2_GMII_MODE,
	  NETXEN_NIU_GB3_GMII_MODE,
	  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,
示例#9
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;
}
示例#10
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;
}
示例#11
0
/*
 * 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;
}