예제 #1
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;
}
예제 #2
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");
}
예제 #3
0
int netxen_niu_xg_init_port(struct netxen_adapter *adapter, int port)
{
	u32 portnum = adapter->physical_port;

	netxen_crb_writelit_adapter(adapter,
		NETXEN_NIU_XGE_CONFIG_1+(0x10000*portnum), 0x1447);
	netxen_crb_writelit_adapter(adapter,
		NETXEN_NIU_XGE_CONFIG_0+(0x10000*portnum), 0x5);

	return 0;
}
예제 #4
0
int netxen_niu_xg_init_port(struct netxen_adapter *adapter, int port)
{
    u32 reg = 0, ret = 0;

    if (adapter->ahw.boardcfg.board_type == NETXEN_BRDTYPE_P2_SB31_10G_IMEZ) {
        netxen_crb_writelit_adapter(adapter,
                                    NETXEN_NIU_XG1_CONFIG_0, 0x5);
        /* XXX hack for Mez cards: both ports in promisc mode */
        netxen_nic_hw_read_wx(adapter,
                              NETXEN_NIU_XGE_CONFIG_1, &reg, 4);
        reg = (reg | 0x2000UL);
        netxen_crb_writelit_adapter(adapter,
                                    NETXEN_NIU_XGE_CONFIG_1, reg);
        reg = 0;
        netxen_nic_hw_read_wx(adapter,
                              NETXEN_NIU_XG1_CONFIG_1, &reg, 4);
        reg = (reg | 0x2000UL);
        netxen_crb_writelit_adapter(adapter,
                                    NETXEN_NIU_XG1_CONFIG_1, reg);
    }

    return ret;
}
예제 #5
0
int netxen_niu_xg_set_promiscuous_mode(struct netxen_adapter *adapter,
                                       int port, netxen_niu_prom_mode_t mode)
{
    __u32 reg;

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

    if (netxen_nic_hw_read_wx(adapter, NETXEN_NIU_XGE_CONFIG_1, &reg, 4))
        return -EIO;
    if (mode == NETXEN_NIU_PROMISC_MODE)
        reg = (reg | 0x2000UL);
    else
        reg = (reg & ~0x2000UL);

    netxen_crb_writelit_adapter(adapter, NETXEN_NIU_XGE_CONFIG_1, reg);

    return 0;
}
예제 #6
0
int netxen_niu_xg_set_promiscuous_mode(struct netxen_adapter *adapter,
				       netxen_niu_prom_mode_t mode)
{
	__u32 reg;
	u32 port = adapter->physical_port;

	if (port > NETXEN_NIU_MAX_XG_PORTS)
		return -EINVAL;

	if (netxen_nic_hw_read_wx(adapter,
		NETXEN_NIU_XGE_CONFIG_1 + (0x10000 * port), &reg, 4))
			return -EIO;
	if (mode == NETXEN_NIU_PROMISC_MODE)
		reg = (reg | 0x2000UL);
	else
		reg = (reg & ~0x2000UL);

	netxen_crb_writelit_adapter(adapter,
		NETXEN_NIU_XGE_CONFIG_1 + (0x10000 * port), reg);

	return 0;
}
예제 #7
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;
}
예제 #8
0
int netxen_niu_xgbe_clear_phy_interrupts(struct netxen_adapter *adapter,
        int port)
{
    netxen_crb_writelit_adapter(adapter, NETXEN_NIU_ACTIVE_INT, -1);
    return 0;
}
예제 #9
0
int netxen_niu_xgbe_disable_phy_interrupts(struct netxen_adapter *adapter,
        int port)
{
    netxen_crb_writelit_adapter(adapter, NETXEN_NIU_INT_MASK, 0x7f);
    return 0;
}