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;
}
Exemple #2
0
static u32 netxen_nic_get_link(struct net_device *dev)
{
	struct netxen_port *port = netdev_priv(dev);
	struct netxen_adapter *adapter = port->adapter;
	__u32 status;

	/* read which mode */
	if (adapter->ahw.board_type == NETXEN_NIC_GBE) {
		if (adapter->phy_read
		    && adapter->phy_read(adapter, port->portnum,
					 NETXEN_NIU_GB_MII_MGMT_ADDR_PHY_STATUS,
					 &status) != 0)
			return -EIO;
		else
			return (netxen_get_phy_link(status));
	} else if (adapter->ahw.board_type == NETXEN_NIC_XGBE) {
		int val = readl(NETXEN_CRB_NORMALIZE(adapter, CRB_XG_STATE));
		return val == XG_LINK_UP;
	}
	return -EIO;
}
static u32 netxen_nic_test_link(struct net_device *dev)
{
	struct netxen_adapter *adapter = netdev_priv(dev);
	__u32 status;
	int val;

	/* read which mode */
	if (adapter->ahw.port_type == NETXEN_NIC_GBE) {
		if (adapter->phy_read
		    && adapter->phy_read(adapter,
					 NETXEN_NIU_GB_MII_MGMT_ADDR_PHY_STATUS,
					 &status) != 0)
			return -EIO;
		else {
			val = netxen_get_phy_link(status);
			return !val;
		}
	} else if (adapter->ahw.port_type == NETXEN_NIC_XGBE) {
		val = NXRD32(adapter, CRB_XG_STATE);
		return (val == XG_LINK_UP) ? 0 : 1;
	}
	return -EIO;
}