xref: /titanic_50/usr/src/uts/common/io/ntxn/niu.c (revision 93833965647072e8fb234b6f0cd4060544c6dc4a)
19a5557fdSlucy wang - Sun Microsystems - Beijing China /*
29a5557fdSlucy wang - Sun Microsystems - Beijing China  * CDDL HEADER START
39a5557fdSlucy wang - Sun Microsystems - Beijing China  *
49a5557fdSlucy wang - Sun Microsystems - Beijing China  * The contents of this file are subject to the terms of the
59a5557fdSlucy wang - Sun Microsystems - Beijing China  * Common Development and Distribution License (the "License").
69a5557fdSlucy wang - Sun Microsystems - Beijing China  * You may not use this file except in compliance with the License.
79a5557fdSlucy wang - Sun Microsystems - Beijing China  *
89a5557fdSlucy wang - Sun Microsystems - Beijing China  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
99a5557fdSlucy wang - Sun Microsystems - Beijing China  * or http://www.opensolaris.org/os/licensing.
109a5557fdSlucy wang - Sun Microsystems - Beijing China  * See the License for the specific language governing permissions
119a5557fdSlucy wang - Sun Microsystems - Beijing China  * and limitations under the License.
129a5557fdSlucy wang - Sun Microsystems - Beijing China  *
139a5557fdSlucy wang - Sun Microsystems - Beijing China  * When distributing Covered Code, include this CDDL HEADER in each
149a5557fdSlucy wang - Sun Microsystems - Beijing China  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
159a5557fdSlucy wang - Sun Microsystems - Beijing China  * If applicable, add the following below this CDDL HEADER, with the
169a5557fdSlucy wang - Sun Microsystems - Beijing China  * fields enclosed by brackets "[]" replaced with your own identifying
179a5557fdSlucy wang - Sun Microsystems - Beijing China  * information: Portions Copyright [yyyy] [name of copyright owner]
189a5557fdSlucy wang - Sun Microsystems - Beijing China  *
199a5557fdSlucy wang - Sun Microsystems - Beijing China  * CDDL HEADER END
209a5557fdSlucy wang - Sun Microsystems - Beijing China  */
21*93833965Sjing xiong ERI-SUN 
229a5557fdSlucy wang - Sun Microsystems - Beijing China /*
239a5557fdSlucy wang - Sun Microsystems - Beijing China  * Copyright 2008 NetXen, Inc.  All rights reserved.
249a5557fdSlucy wang - Sun Microsystems - Beijing China  * Use is subject to license terms.
259a5557fdSlucy wang - Sun Microsystems - Beijing China  */
26*93833965Sjing xiong ERI-SUN 
279a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/types.h>
289a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/conf.h>
299a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/debug.h>
309a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/stropts.h>
319a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/stream.h>
329a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/strlog.h>
339a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/kmem.h>
349a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/stat.h>
359a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/kstat.h>
369a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/vtrace.h>
379a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/dlpi.h>
389a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/strsun.h>
399a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/ethernet.h>
409a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/modctl.h>
419a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/errno.h>
429a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/dditypes.h>
439a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/ddi.h>
449a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/sunddi.h>
459a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/sysmacros.h>
469a5557fdSlucy wang - Sun Microsystems - Beijing China 
479a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/pci.h>
489a5557fdSlucy wang - Sun Microsystems - Beijing China 
499a5557fdSlucy wang - Sun Microsystems - Beijing China #include "unm_inc.h"
509a5557fdSlucy wang - Sun Microsystems - Beijing China #include "unm_nic.h"
519a5557fdSlucy wang - Sun Microsystems - Beijing China 
529a5557fdSlucy wang - Sun Microsystems - Beijing China static long phy_lock_timeout = 100000000;
539a5557fdSlucy wang - Sun Microsystems - Beijing China 
phy_lock(struct unm_adapter_s * adapter)549a5557fdSlucy wang - Sun Microsystems - Beijing China static int phy_lock(struct unm_adapter_s *adapter)
559a5557fdSlucy wang - Sun Microsystems - Beijing China {
569a5557fdSlucy wang - Sun Microsystems - Beijing China 	u32	done = 0;
579a5557fdSlucy wang - Sun Microsystems - Beijing China 	int	timeout = 0;
589a5557fdSlucy wang - Sun Microsystems - Beijing China 
599a5557fdSlucy wang - Sun Microsystems - Beijing China 	while (!done) {
609a5557fdSlucy wang - Sun Microsystems - Beijing China 		/* acquire semaphore3 from PCI HW block */
619a5557fdSlucy wang - Sun Microsystems - Beijing China 		adapter->unm_nic_pci_read_immediate(adapter,
629a5557fdSlucy wang - Sun Microsystems - Beijing China 		    UNM_PCIE_REG(PCIE_SEM3_LOCK), &done);
639a5557fdSlucy wang - Sun Microsystems - Beijing China 		if (done == 1)
649a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
659a5557fdSlucy wang - Sun Microsystems - Beijing China 		if (timeout >= phy_lock_timeout)
669a5557fdSlucy wang - Sun Microsystems - Beijing China 			return (-1);
679a5557fdSlucy wang - Sun Microsystems - Beijing China 		timeout++;
689a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
699a5557fdSlucy wang - Sun Microsystems - Beijing China 
709a5557fdSlucy wang - Sun Microsystems - Beijing China 	adapter->unm_crb_writelit_adapter(adapter, UNM_PHY_LOCK_ID,
719a5557fdSlucy wang - Sun Microsystems - Beijing China 	    PHY_LOCK_DRIVER);
729a5557fdSlucy wang - Sun Microsystems - Beijing China 	return (0);
739a5557fdSlucy wang - Sun Microsystems - Beijing China }
749a5557fdSlucy wang - Sun Microsystems - Beijing China 
759a5557fdSlucy wang - Sun Microsystems - Beijing China static void
phy_unlock(struct unm_adapter_s * adapter)769a5557fdSlucy wang - Sun Microsystems - Beijing China phy_unlock(struct unm_adapter_s *adapter)
779a5557fdSlucy wang - Sun Microsystems - Beijing China {
789a5557fdSlucy wang - Sun Microsystems - Beijing China 	u32	val;
799a5557fdSlucy wang - Sun Microsystems - Beijing China 
809a5557fdSlucy wang - Sun Microsystems - Beijing China 	/* release semaphore3 */
819a5557fdSlucy wang - Sun Microsystems - Beijing China 	adapter->unm_nic_pci_read_immediate(adapter,
829a5557fdSlucy wang - Sun Microsystems - Beijing China 	    UNM_PCIE_REG(PCIE_SEM3_UNLOCK), &val);
839a5557fdSlucy wang - Sun Microsystems - Beijing China }
849a5557fdSlucy wang - Sun Microsystems - Beijing China 
859a5557fdSlucy wang - Sun Microsystems - Beijing China /*
869a5557fdSlucy wang - Sun Microsystems - Beijing China  * unm_niu_gbe_phy_read - read a register from the GbE PHY via
879a5557fdSlucy wang - Sun Microsystems - Beijing China  * mii management interface.
889a5557fdSlucy wang - Sun Microsystems - Beijing China  *
899a5557fdSlucy wang - Sun Microsystems - Beijing China  * Note: The MII management interface goes through port 0.
909a5557fdSlucy wang - Sun Microsystems - Beijing China  *	   Individual phys are addressed as follows:
919a5557fdSlucy wang - Sun Microsystems - Beijing China  *	   [15:8]  phy id
929a5557fdSlucy wang - Sun Microsystems - Beijing China  *	   [7:0]   register number
939a5557fdSlucy wang - Sun Microsystems - Beijing China  *
949a5557fdSlucy wang - Sun Microsystems - Beijing China  * Returns:  0 success
959a5557fdSlucy wang - Sun Microsystems - Beijing China  *	  -1 error
969a5557fdSlucy wang - Sun Microsystems - Beijing China  *
979a5557fdSlucy wang - Sun Microsystems - Beijing China  */
989a5557fdSlucy wang - Sun Microsystems - Beijing China long
unm_niu_gbe_phy_read(struct unm_adapter_s * adapter,long reg,unm_crbword_t * readval)999a5557fdSlucy wang - Sun Microsystems - Beijing China unm_niu_gbe_phy_read(struct unm_adapter_s *adapter, long reg,
1009a5557fdSlucy wang - Sun Microsystems - Beijing China     unm_crbword_t *readval)
1019a5557fdSlucy wang - Sun Microsystems - Beijing China {
1029a5557fdSlucy wang - Sun Microsystems - Beijing China 	long phy = adapter->physical_port;
1039a5557fdSlucy wang - Sun Microsystems - Beijing China 	unm_niu_gb_mii_mgmt_address_t address;
1049a5557fdSlucy wang - Sun Microsystems - Beijing China 	unm_niu_gb_mii_mgmt_command_t command;
1059a5557fdSlucy wang - Sun Microsystems - Beijing China 	unm_niu_gb_mii_mgmt_indicators_t status;
1069a5557fdSlucy wang - Sun Microsystems - Beijing China 
1079a5557fdSlucy wang - Sun Microsystems - Beijing China 	long timeout = 0;
1089a5557fdSlucy wang - Sun Microsystems - Beijing China 	long result = 0;
1099a5557fdSlucy wang - Sun Microsystems - Beijing China 	long restore = 0;
1109a5557fdSlucy wang - Sun Microsystems - Beijing China 	unm_niu_gb_mac_config_0_t mac_cfg0;
1119a5557fdSlucy wang - Sun Microsystems - Beijing China 
1129a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (phy_lock(adapter) != 0)
1139a5557fdSlucy wang - Sun Microsystems - Beijing China 		return (-1);
1149a5557fdSlucy wang - Sun Microsystems - Beijing China 
1159a5557fdSlucy wang - Sun Microsystems - Beijing China 	/*
1169a5557fdSlucy wang - Sun Microsystems - Beijing China 	 * MII mgmt all goes through port 0 MAC interface, so it cannot be
1179a5557fdSlucy wang - Sun Microsystems - Beijing China 	 * in reset
1189a5557fdSlucy wang - Sun Microsystems - Beijing China 	 */
1199a5557fdSlucy wang - Sun Microsystems - Beijing China 	adapter->unm_nic_hw_read_wx(adapter, UNM_NIU_GB_MAC_CONFIG_0(0),
1209a5557fdSlucy wang - Sun Microsystems - Beijing China 	    &mac_cfg0, 4);
1219a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (mac_cfg0.soft_reset) {
1229a5557fdSlucy wang - Sun Microsystems - Beijing China 		unm_niu_gb_mac_config_0_t temp;
1239a5557fdSlucy wang - Sun Microsystems - Beijing China 		*(unm_crbword_t *)&temp = 0;
1249a5557fdSlucy wang - Sun Microsystems - Beijing China 		temp.tx_reset_pb = 1;
1259a5557fdSlucy wang - Sun Microsystems - Beijing China 		temp.rx_reset_pb = 1;
1269a5557fdSlucy wang - Sun Microsystems - Beijing China 		temp.tx_reset_mac = 1;
1279a5557fdSlucy wang - Sun Microsystems - Beijing China 		temp.rx_reset_mac = 1;
1289a5557fdSlucy wang - Sun Microsystems - Beijing China 		adapter->unm_nic_hw_write_wx(adapter,
1299a5557fdSlucy wang - Sun Microsystems - Beijing China 		    UNM_NIU_GB_MAC_CONFIG_0(0), &temp, 4);
1309a5557fdSlucy wang - Sun Microsystems - Beijing China 		restore = 1;
1319a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
1329a5557fdSlucy wang - Sun Microsystems - Beijing China 
1339a5557fdSlucy wang - Sun Microsystems - Beijing China 	*(unm_crbword_t *)&address = 0;
1349a5557fdSlucy wang - Sun Microsystems - Beijing China 	address.reg_addr = (unm_crbword_t)reg;
1359a5557fdSlucy wang - Sun Microsystems - Beijing China 	address.phy_addr = (unm_crbword_t)phy;
1369a5557fdSlucy wang - Sun Microsystems - Beijing China 	adapter->unm_nic_hw_write_wx(adapter, UNM_NIU_GB_MII_MGMT_ADDR(0),
1379a5557fdSlucy wang - Sun Microsystems - Beijing China 	    &address, 4);
1389a5557fdSlucy wang - Sun Microsystems - Beijing China 
1399a5557fdSlucy wang - Sun Microsystems - Beijing China 	*(unm_crbword_t *)&command = 0;	/* turn off any prior activity */
1409a5557fdSlucy wang - Sun Microsystems - Beijing China 	adapter->unm_nic_hw_write_wx(adapter, UNM_NIU_GB_MII_MGMT_COMMAND(0),
1419a5557fdSlucy wang - Sun Microsystems - Beijing China 	    &command, 4);
1429a5557fdSlucy wang - Sun Microsystems - Beijing China 
1439a5557fdSlucy wang - Sun Microsystems - Beijing China 	/* send read command */
1449a5557fdSlucy wang - Sun Microsystems - Beijing China 	command.read_cycle = 1;
1459a5557fdSlucy wang - Sun Microsystems - Beijing China 	adapter->unm_nic_hw_write_wx(adapter, UNM_NIU_GB_MII_MGMT_COMMAND(0),
1469a5557fdSlucy wang - Sun Microsystems - Beijing China 	    &command, 4);
1479a5557fdSlucy wang - Sun Microsystems - Beijing China 
1489a5557fdSlucy wang - Sun Microsystems - Beijing China 	*(unm_crbword_t *)&status = 0;
1499a5557fdSlucy wang - Sun Microsystems - Beijing China 	do {
1509a5557fdSlucy wang - Sun Microsystems - Beijing China 		adapter->unm_nic_hw_read_wx(adapter,
1519a5557fdSlucy wang - Sun Microsystems - Beijing China 		    UNM_NIU_GB_MII_MGMT_INDICATE(0), &status, 4);
1529a5557fdSlucy wang - Sun Microsystems - Beijing China 		timeout++;
1539a5557fdSlucy wang - Sun Microsystems - Beijing China 	} while ((status.busy || status.notvalid) &&
1549a5557fdSlucy wang - Sun Microsystems - Beijing China 	    (timeout++ < UNM_NIU_PHY_WAITMAX));
1559a5557fdSlucy wang - Sun Microsystems - Beijing China 
1569a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (timeout < UNM_NIU_PHY_WAITMAX) {
1579a5557fdSlucy wang - Sun Microsystems - Beijing China 		adapter->unm_nic_hw_read_wx(adapter,
1589a5557fdSlucy wang - Sun Microsystems - Beijing China 		    UNM_NIU_GB_MII_MGMT_STATUS(0), readval, 4);
1599a5557fdSlucy wang - Sun Microsystems - Beijing China 		result = 0;
1609a5557fdSlucy wang - Sun Microsystems - Beijing China 	} else
1619a5557fdSlucy wang - Sun Microsystems - Beijing China 		result = -1;
1629a5557fdSlucy wang - Sun Microsystems - Beijing China 
1639a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (restore)
1649a5557fdSlucy wang - Sun Microsystems - Beijing China 		adapter->unm_nic_hw_write_wx(adapter,
1659a5557fdSlucy wang - Sun Microsystems - Beijing China 		    UNM_NIU_GB_MAC_CONFIG_0(0), &mac_cfg0, 4);
1669a5557fdSlucy wang - Sun Microsystems - Beijing China 
1679a5557fdSlucy wang - Sun Microsystems - Beijing China 	phy_unlock(adapter);
1689a5557fdSlucy wang - Sun Microsystems - Beijing China 
1699a5557fdSlucy wang - Sun Microsystems - Beijing China 	return (result);
1709a5557fdSlucy wang - Sun Microsystems - Beijing China }
1719a5557fdSlucy wang - Sun Microsystems - Beijing China 
1729a5557fdSlucy wang - Sun Microsystems - Beijing China /*
1739a5557fdSlucy wang - Sun Microsystems - Beijing China  * Return the current station MAC address.
1749a5557fdSlucy wang - Sun Microsystems - Beijing China  * Note that the passed-in value must already be in network byte order.
1759a5557fdSlucy wang - Sun Microsystems - Beijing China  */
1769a5557fdSlucy wang - Sun Microsystems - Beijing China int
unm_niu_macaddr_get(struct unm_adapter_s * adapter,unsigned char * addr)1779a5557fdSlucy wang - Sun Microsystems - Beijing China unm_niu_macaddr_get(struct unm_adapter_s *adapter, unsigned char *addr)
1789a5557fdSlucy wang - Sun Microsystems - Beijing China {
1799a5557fdSlucy wang - Sun Microsystems - Beijing China 	__uint64_t result;
1809a5557fdSlucy wang - Sun Microsystems - Beijing China 	int phy = adapter->physical_port;
1819a5557fdSlucy wang - Sun Microsystems - Beijing China 
1829a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (addr == NULL)
1839a5557fdSlucy wang - Sun Microsystems - Beijing China 		return (-1);
1849a5557fdSlucy wang - Sun Microsystems - Beijing China 	if ((phy < 0) || (phy > 3))
1859a5557fdSlucy wang - Sun Microsystems - Beijing China 		return (-1);
1869a5557fdSlucy wang - Sun Microsystems - Beijing China 
1879a5557fdSlucy wang - Sun Microsystems - Beijing China 	UNM_WRITE_LOCK_IRQS(&adapter->adapter_lock, flags);
1889a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (adapter->curr_window != 0) {
1899a5557fdSlucy wang - Sun Microsystems - Beijing China 		adapter->unm_nic_pci_change_crbwindow(adapter, 0);
1909a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
1919a5557fdSlucy wang - Sun Microsystems - Beijing China 
1929a5557fdSlucy wang - Sun Microsystems - Beijing China 	result = UNM_NIC_PCI_READ_32((void *)pci_base_offset(adapter,
1939a5557fdSlucy wang - Sun Microsystems - Beijing China 	    UNM_NIU_GB_STATION_ADDR_1(phy))) >> 16;
1949a5557fdSlucy wang - Sun Microsystems - Beijing China 	result |= ((uint64_t)UNM_NIC_PCI_READ_32((void *)pci_base_offset(
1959a5557fdSlucy wang - Sun Microsystems - Beijing China 	    adapter, UNM_NIU_GB_STATION_ADDR_0(phy)))) << 16;
1969a5557fdSlucy wang - Sun Microsystems - Beijing China 
1979a5557fdSlucy wang - Sun Microsystems - Beijing China 	(void) memcpy(addr, &result, sizeof (unm_ethernet_macaddr_t));
1989a5557fdSlucy wang - Sun Microsystems - Beijing China 
1999a5557fdSlucy wang - Sun Microsystems - Beijing China 	adapter->unm_nic_pci_change_crbwindow(adapter, 1);
2009a5557fdSlucy wang - Sun Microsystems - Beijing China 
2019a5557fdSlucy wang - Sun Microsystems - Beijing China 	UNM_WRITE_UNLOCK_IRQR(&adapter->adapter_lock, flags);
2029a5557fdSlucy wang - Sun Microsystems - Beijing China 
2039a5557fdSlucy wang - Sun Microsystems - Beijing China 	return (0);
2049a5557fdSlucy wang - Sun Microsystems - Beijing China }
2059a5557fdSlucy wang - Sun Microsystems - Beijing China 
2069a5557fdSlucy wang - Sun Microsystems - Beijing China /*
2079a5557fdSlucy wang - Sun Microsystems - Beijing China  * Set the station MAC address.
2089a5557fdSlucy wang - Sun Microsystems - Beijing China  * Note that the passed-in value must already be in network byte order.
2099a5557fdSlucy wang - Sun Microsystems - Beijing China  */
2109a5557fdSlucy wang - Sun Microsystems - Beijing China int
unm_niu_macaddr_set(struct unm_adapter_s * adapter,unm_ethernet_macaddr_t addr)2119a5557fdSlucy wang - Sun Microsystems - Beijing China unm_niu_macaddr_set(struct unm_adapter_s *adapter, unm_ethernet_macaddr_t addr)
2129a5557fdSlucy wang - Sun Microsystems - Beijing China {
2139a5557fdSlucy wang - Sun Microsystems - Beijing China 	unm_crbword_t temp = 0;
2149a5557fdSlucy wang - Sun Microsystems - Beijing China 	int phy = adapter->physical_port;
2159a5557fdSlucy wang - Sun Microsystems - Beijing China 
2169a5557fdSlucy wang - Sun Microsystems - Beijing China 	if ((phy < 0) || (phy > 3))
2179a5557fdSlucy wang - Sun Microsystems - Beijing China 		return (-1);
2189a5557fdSlucy wang - Sun Microsystems - Beijing China 
2199a5557fdSlucy wang - Sun Microsystems - Beijing China 	(void) memcpy(&temp, addr, 2);
2209a5557fdSlucy wang - Sun Microsystems - Beijing China 	temp <<= 16;
2219a5557fdSlucy wang - Sun Microsystems - Beijing China 	adapter->unm_nic_hw_write_wx(adapter, UNM_NIU_GB_STATION_ADDR_1(phy),
2229a5557fdSlucy wang - Sun Microsystems - Beijing China 	    &temp, 4);
2239a5557fdSlucy wang - Sun Microsystems - Beijing China 	temp = 0;
2249a5557fdSlucy wang - Sun Microsystems - Beijing China 	(void) memcpy(&temp, ((__uint8_t *)addr)+2, sizeof (unm_crbword_t));
2259a5557fdSlucy wang - Sun Microsystems - Beijing China 	adapter->unm_nic_hw_write_wx(adapter, UNM_NIU_GB_STATION_ADDR_0(phy),
2269a5557fdSlucy wang - Sun Microsystems - Beijing China 	    &temp, 4);
2279a5557fdSlucy wang - Sun Microsystems - Beijing China 	return (0);
2289a5557fdSlucy wang - Sun Microsystems - Beijing China }
2299a5557fdSlucy wang - Sun Microsystems - Beijing China 
2309a5557fdSlucy wang - Sun Microsystems - Beijing China /* Enable a GbE interface */
2319a5557fdSlucy wang - Sun Microsystems - Beijing China /* ARGSUSED */
unm_niu_enable_gbe_port(struct unm_adapter_s * adapter,unm_niu_gbe_ifmode_t mode_dont_care)2329a5557fdSlucy wang - Sun Microsystems - Beijing China native_t unm_niu_enable_gbe_port(struct unm_adapter_s *adapter,
2339a5557fdSlucy wang - Sun Microsystems - Beijing China 		unm_niu_gbe_ifmode_t mode_dont_care)
2349a5557fdSlucy wang - Sun Microsystems - Beijing China {
2359a5557fdSlucy wang - Sun Microsystems - Beijing China 	unm_niu_gb_mac_config_0_t mac_cfg0;
2369a5557fdSlucy wang - Sun Microsystems - Beijing China 	unm_niu_gb_mac_config_1_t mac_cfg1;
2379a5557fdSlucy wang - Sun Microsystems - Beijing China 	unm_niu_gb_mii_mgmt_config_t mii_cfg;
2389a5557fdSlucy wang - Sun Microsystems - Beijing China 	native_t port = adapter->physical_port;
2399a5557fdSlucy wang - Sun Microsystems - Beijing China 	int zero = 0;
2409a5557fdSlucy wang - Sun Microsystems - Beijing China 	int one = 1;
2419a5557fdSlucy wang - Sun Microsystems - Beijing China 	u32 port_mode = 0;
2429a5557fdSlucy wang - Sun Microsystems - Beijing China 
2439a5557fdSlucy wang - Sun Microsystems - Beijing China 	mode_dont_care = 0;
2449a5557fdSlucy wang - Sun Microsystems - Beijing China 
2459a5557fdSlucy wang - Sun Microsystems - Beijing China 	if ((port < 0) || (port > UNM_NIU_MAX_GBE_PORTS)) {
2469a5557fdSlucy wang - Sun Microsystems - Beijing China 		return (-1);
2479a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
2489a5557fdSlucy wang - Sun Microsystems - Beijing China 
2499a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (adapter->link_speed != MBPS_10 &&
2509a5557fdSlucy wang - Sun Microsystems - Beijing China 	    adapter->link_speed != MBPS_100 &&
2519a5557fdSlucy wang - Sun Microsystems - Beijing China 	    adapter->link_speed != MBPS_1000) {
2529a5557fdSlucy wang - Sun Microsystems - Beijing China 
2539a5557fdSlucy wang - Sun Microsystems - Beijing China 		if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) {
2549a5557fdSlucy wang - Sun Microsystems - Beijing China /*
2559a5557fdSlucy wang - Sun Microsystems - Beijing China  * Do NOT fail this call because the cable is unplugged.
2569a5557fdSlucy wang - Sun Microsystems - Beijing China  * Updated when the link comes up...
2579a5557fdSlucy wang - Sun Microsystems - Beijing China  */
2589a5557fdSlucy wang - Sun Microsystems - Beijing China 		adapter->link_speed = MBPS_1000;
2599a5557fdSlucy wang - Sun Microsystems - Beijing China 		} else {
2609a5557fdSlucy wang - Sun Microsystems - Beijing China 			return (-1);
2619a5557fdSlucy wang - Sun Microsystems - Beijing China 		}
2629a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
2639a5557fdSlucy wang - Sun Microsystems - Beijing China 
2649a5557fdSlucy wang - Sun Microsystems - Beijing China 	port_mode = adapter->unm_nic_pci_read_normalize(adapter,
2659a5557fdSlucy wang - Sun Microsystems - Beijing China 	    UNM_PORT_MODE_ADDR);
2669a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (port_mode == UNM_PORT_MODE_802_3_AP) {
2679a5557fdSlucy wang - Sun Microsystems - Beijing China 		*(unm_crbword_t *)&mac_cfg0 = 0x0000003f;
2689a5557fdSlucy wang - Sun Microsystems - Beijing China 		*(unm_crbword_t *)&mac_cfg1 = 0x0000f2df;
2699a5557fdSlucy wang - Sun Microsystems - Beijing China 		unm_crb_write_adapter(UNM_NIU_AP_MAC_CONFIG_0(port), &mac_cfg0,
2709a5557fdSlucy wang - Sun Microsystems - Beijing China 		    adapter);
2719a5557fdSlucy wang - Sun Microsystems - Beijing China 		unm_crb_write_adapter(UNM_NIU_AP_MAC_CONFIG_1(port), &mac_cfg1,
2729a5557fdSlucy wang - Sun Microsystems - Beijing China 		    adapter);
2739a5557fdSlucy wang - Sun Microsystems - Beijing China 	} else {
2749a5557fdSlucy wang - Sun Microsystems - Beijing China 		*(unm_crbword_t *)&mac_cfg0 = 0;
2759a5557fdSlucy wang - Sun Microsystems - Beijing China 		mac_cfg0.soft_reset = 1;
2769a5557fdSlucy wang - Sun Microsystems - Beijing China 		unm_crb_write_adapter(UNM_NIU_GB_MAC_CONFIG_0(port), &mac_cfg0,
2779a5557fdSlucy wang - Sun Microsystems - Beijing China 		    adapter);
2789a5557fdSlucy wang - Sun Microsystems - Beijing China 
2799a5557fdSlucy wang - Sun Microsystems - Beijing China 		*(unm_crbword_t *)&mac_cfg0 = 0;
2809a5557fdSlucy wang - Sun Microsystems - Beijing China 		mac_cfg0.tx_enable = 1;
2819a5557fdSlucy wang - Sun Microsystems - Beijing China 		mac_cfg0.rx_enable = 1;
2829a5557fdSlucy wang - Sun Microsystems - Beijing China 		mac_cfg0.rx_flowctl = 0;
2839a5557fdSlucy wang - Sun Microsystems - Beijing China 		mac_cfg0.tx_reset_pb = 1;
2849a5557fdSlucy wang - Sun Microsystems - Beijing China 		mac_cfg0.rx_reset_pb = 1;
2859a5557fdSlucy wang - Sun Microsystems - Beijing China 		mac_cfg0.tx_reset_mac = 1;
2869a5557fdSlucy wang - Sun Microsystems - Beijing China 		mac_cfg0.rx_reset_mac = 1;
2879a5557fdSlucy wang - Sun Microsystems - Beijing China 
2889a5557fdSlucy wang - Sun Microsystems - Beijing China 		unm_crb_write_adapter(UNM_NIU_GB_MAC_CONFIG_0(port), &mac_cfg0,
2899a5557fdSlucy wang - Sun Microsystems - Beijing China 		    adapter);
2909a5557fdSlucy wang - Sun Microsystems - Beijing China 
2919a5557fdSlucy wang - Sun Microsystems - Beijing China 		*(unm_crbword_t *)&mac_cfg1 = 0;
2929a5557fdSlucy wang - Sun Microsystems - Beijing China 		mac_cfg1.preamblelen = 0xf;
2939a5557fdSlucy wang - Sun Microsystems - Beijing China 		mac_cfg1.duplex = 1;
2949a5557fdSlucy wang - Sun Microsystems - Beijing China 		mac_cfg1.crc_enable = 1;
2959a5557fdSlucy wang - Sun Microsystems - Beijing China 		mac_cfg1.padshort = 1;
2969a5557fdSlucy wang - Sun Microsystems - Beijing China 		mac_cfg1.checklength = 1;
2979a5557fdSlucy wang - Sun Microsystems - Beijing China 		mac_cfg1.hugeframes = 1;
2989a5557fdSlucy wang - Sun Microsystems - Beijing China 
2999a5557fdSlucy wang - Sun Microsystems - Beijing China 		switch (adapter->link_speed) {
3009a5557fdSlucy wang - Sun Microsystems - Beijing China 			case MBPS_10:
3019a5557fdSlucy wang - Sun Microsystems - Beijing China 			case MBPS_100: /* Fall Through */
3029a5557fdSlucy wang - Sun Microsystems - Beijing China 				mac_cfg1.intfmode = 1;
3039a5557fdSlucy wang - Sun Microsystems - Beijing China 				unm_crb_write_adapter(UNM_NIU_GB_MAC_CONFIG_1
3049a5557fdSlucy wang - Sun Microsystems - Beijing China 				    (port), &mac_cfg1, adapter);
3059a5557fdSlucy wang - Sun Microsystems - Beijing China 
3069a5557fdSlucy wang - Sun Microsystems - Beijing China 				/* set mii mode */
3079a5557fdSlucy wang - Sun Microsystems - Beijing China 				unm_crb_write_adapter(
3089a5557fdSlucy wang - Sun Microsystems - Beijing China 				    UNM_NIU_GB0_GMII_MODE+(port<<3),
3099a5557fdSlucy wang - Sun Microsystems - Beijing China 				    &zero, adapter);
3109a5557fdSlucy wang - Sun Microsystems - Beijing China 				unm_crb_write_adapter(
3119a5557fdSlucy wang - Sun Microsystems - Beijing China 				    UNM_NIU_GB0_MII_MODE+(port<< 3),
3129a5557fdSlucy wang - Sun Microsystems - Beijing China 				    &one, adapter);
3139a5557fdSlucy wang - Sun Microsystems - Beijing China 				break;
3149a5557fdSlucy wang - Sun Microsystems - Beijing China 
3159a5557fdSlucy wang - Sun Microsystems - Beijing China 			case MBPS_1000:
3169a5557fdSlucy wang - Sun Microsystems - Beijing China 				mac_cfg1.intfmode = 2;
3179a5557fdSlucy wang - Sun Microsystems - Beijing China 				unm_crb_write_adapter(
3189a5557fdSlucy wang - Sun Microsystems - Beijing China 				    UNM_NIU_GB_MAC_CONFIG_1(port),
3199a5557fdSlucy wang - Sun Microsystems - Beijing China 				    &mac_cfg1, adapter);
3209a5557fdSlucy wang - Sun Microsystems - Beijing China 
3219a5557fdSlucy wang - Sun Microsystems - Beijing China 				/* set gmii mode */
3229a5557fdSlucy wang - Sun Microsystems - Beijing China 				unm_crb_write_adapter(
3239a5557fdSlucy wang - Sun Microsystems - Beijing China 				    UNM_NIU_GB0_MII_MODE+(port << 3),
3249a5557fdSlucy wang - Sun Microsystems - Beijing China 				    &zero, adapter);
3259a5557fdSlucy wang - Sun Microsystems - Beijing China 				unm_crb_write_adapter(
3269a5557fdSlucy wang - Sun Microsystems - Beijing China 				    UNM_NIU_GB0_GMII_MODE+(port << 3),
3279a5557fdSlucy wang - Sun Microsystems - Beijing China 				    &one, adapter);
3289a5557fdSlucy wang - Sun Microsystems - Beijing China 				break;
3299a5557fdSlucy wang - Sun Microsystems - Beijing China 
3309a5557fdSlucy wang - Sun Microsystems - Beijing China 			default:
3319a5557fdSlucy wang - Sun Microsystems - Beijing China 				/* Will not happen */
3329a5557fdSlucy wang - Sun Microsystems - Beijing China 				break;
3339a5557fdSlucy wang - Sun Microsystems - Beijing China 		}
3349a5557fdSlucy wang - Sun Microsystems - Beijing China 
3359a5557fdSlucy wang - Sun Microsystems - Beijing China 		*(unm_crbword_t *)&mii_cfg = 0;
3369a5557fdSlucy wang - Sun Microsystems - Beijing China 		mii_cfg.clockselect = 7;
3379a5557fdSlucy wang - Sun Microsystems - Beijing China 		unm_crb_write_adapter(UNM_NIU_GB_MII_MGMT_CONFIG(port),
3389a5557fdSlucy wang - Sun Microsystems - Beijing China 		    &mii_cfg, adapter);
3399a5557fdSlucy wang - Sun Microsystems - Beijing China 
3409a5557fdSlucy wang - Sun Microsystems - Beijing China 		*(unm_crbword_t *)&mac_cfg0 = 0;
3419a5557fdSlucy wang - Sun Microsystems - Beijing China 		mac_cfg0.tx_enable = 1;
3429a5557fdSlucy wang - Sun Microsystems - Beijing China 		mac_cfg0.rx_enable = 1;
3439a5557fdSlucy wang - Sun Microsystems - Beijing China 		mac_cfg0.tx_flowctl = 0;
3449a5557fdSlucy wang - Sun Microsystems - Beijing China 		mac_cfg0.rx_flowctl = 0;
3459a5557fdSlucy wang - Sun Microsystems - Beijing China 		unm_crb_write_adapter(UNM_NIU_GB_MAC_CONFIG_0(port),
3469a5557fdSlucy wang - Sun Microsystems - Beijing China 		    &mac_cfg0, adapter);
3479a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
3489a5557fdSlucy wang - Sun Microsystems - Beijing China 
3499a5557fdSlucy wang - Sun Microsystems - Beijing China 	return (0);
3509a5557fdSlucy wang - Sun Microsystems - Beijing China }
3519a5557fdSlucy wang - Sun Microsystems - Beijing China 
3529a5557fdSlucy wang - Sun Microsystems - Beijing China /* Disable a GbE interface */
3539a5557fdSlucy wang - Sun Microsystems - Beijing China native_t
unm_niu_disable_gbe_port(struct unm_adapter_s * adapter)3549a5557fdSlucy wang - Sun Microsystems - Beijing China unm_niu_disable_gbe_port(struct unm_adapter_s *adapter)
3559a5557fdSlucy wang - Sun Microsystems - Beijing China {
3569a5557fdSlucy wang - Sun Microsystems - Beijing China 	native_t			port = adapter->physical_port;
3579a5557fdSlucy wang - Sun Microsystems - Beijing China 	unm_niu_gb_mac_config_0_t	mac_cfg0;
3589a5557fdSlucy wang - Sun Microsystems - Beijing China 
3599a5557fdSlucy wang - Sun Microsystems - Beijing China 	if ((port < 0) || (port > UNM_NIU_MAX_GBE_PORTS))
3609a5557fdSlucy wang - Sun Microsystems - Beijing China 		return (-1);
3619a5557fdSlucy wang - Sun Microsystems - Beijing China 
3629a5557fdSlucy wang - Sun Microsystems - Beijing China 	*(unm_crbword_t *)&mac_cfg0 = 0;
3639a5557fdSlucy wang - Sun Microsystems - Beijing China 	mac_cfg0.soft_reset = 1;
3649a5557fdSlucy wang - Sun Microsystems - Beijing China 
3659a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (NX_IS_REVISION_P3(adapter->ahw.revision_id))
3669a5557fdSlucy wang - Sun Microsystems - Beijing China 		adapter->unm_nic_hw_write_wx(adapter,
3679a5557fdSlucy wang - Sun Microsystems - Beijing China 		    UNM_NIU_GB_MAC_CONFIG_0(port), &mac_cfg0, 0);
3689a5557fdSlucy wang - Sun Microsystems - Beijing China 	else
3699a5557fdSlucy wang - Sun Microsystems - Beijing China 		adapter->unm_nic_hw_write_wx(adapter,
3709a5557fdSlucy wang - Sun Microsystems - Beijing China 		    UNM_NIU_GB_MAC_CONFIG_0(port), &mac_cfg0, 4);
3719a5557fdSlucy wang - Sun Microsystems - Beijing China 	return (0);
3729a5557fdSlucy wang - Sun Microsystems - Beijing China }
3739a5557fdSlucy wang - Sun Microsystems - Beijing China 
3749a5557fdSlucy wang - Sun Microsystems - Beijing China /* Disable an XG interface */
3759a5557fdSlucy wang - Sun Microsystems - Beijing China native_t
unm_niu_disable_xg_port(struct unm_adapter_s * adapter)3769a5557fdSlucy wang - Sun Microsystems - Beijing China unm_niu_disable_xg_port(struct unm_adapter_s *adapter)
3779a5557fdSlucy wang - Sun Microsystems - Beijing China {
3789a5557fdSlucy wang - Sun Microsystems - Beijing China 	native_t			port = adapter->physical_port;
3799a5557fdSlucy wang - Sun Microsystems - Beijing China 	unm_niu_xg_mac_config_0_t	mac_cfg;
3809a5557fdSlucy wang - Sun Microsystems - Beijing China 
3819a5557fdSlucy wang - Sun Microsystems - Beijing China 	*(unm_crbword_t *)&mac_cfg = 0;
3829a5557fdSlucy wang - Sun Microsystems - Beijing China 	mac_cfg.soft_reset = 1;
3839a5557fdSlucy wang - Sun Microsystems - Beijing China 
3849a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) {
3859a5557fdSlucy wang - Sun Microsystems - Beijing China 		if (port != 0)
3869a5557fdSlucy wang - Sun Microsystems - Beijing China 			return (-1);
3879a5557fdSlucy wang - Sun Microsystems - Beijing China 		adapter->unm_nic_hw_write_wx(adapter, UNM_NIU_XGE_CONFIG_0,
3889a5557fdSlucy wang - Sun Microsystems - Beijing China 		    &mac_cfg, 4);
3899a5557fdSlucy wang - Sun Microsystems - Beijing China 	} else {
3909a5557fdSlucy wang - Sun Microsystems - Beijing China 		if ((port < 0) || (port >= UNM_NIU_MAX_XG_PORTS))
3919a5557fdSlucy wang - Sun Microsystems - Beijing China 			return (-1);
3929a5557fdSlucy wang - Sun Microsystems - Beijing China 		adapter->unm_nic_hw_write_wx(adapter, UNM_NIU_XGE_CONFIG_0 +
3939a5557fdSlucy wang - Sun Microsystems - Beijing China 		    (port * 0x10000), &mac_cfg, 4);
3949a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
3959a5557fdSlucy wang - Sun Microsystems - Beijing China 	return (0);
3969a5557fdSlucy wang - Sun Microsystems - Beijing China }
3979a5557fdSlucy wang - Sun Microsystems - Beijing China 
3989a5557fdSlucy wang - Sun Microsystems - Beijing China 
3999a5557fdSlucy wang - Sun Microsystems - Beijing China /* Set promiscuous mode for a GbE interface */
4009a5557fdSlucy wang - Sun Microsystems - Beijing China native_t
unm_niu_set_promiscuous_mode(struct unm_adapter_s * adapter,unm_niu_prom_mode_t mode)4019a5557fdSlucy wang - Sun Microsystems - Beijing China unm_niu_set_promiscuous_mode(struct unm_adapter_s *adapter,
4029a5557fdSlucy wang - Sun Microsystems - Beijing China     unm_niu_prom_mode_t mode)
4039a5557fdSlucy wang - Sun Microsystems - Beijing China {
4049a5557fdSlucy wang - Sun Microsystems - Beijing China 	native_t port = adapter->physical_port;
4059a5557fdSlucy wang - Sun Microsystems - Beijing China 	unm_niu_gb_drop_crc_t reg;
4069a5557fdSlucy wang - Sun Microsystems - Beijing China 	unm_niu_gb_mac_config_0_t mac_cfg;
4079a5557fdSlucy wang - Sun Microsystems - Beijing China 	unm_crbword_t data;
4089a5557fdSlucy wang - Sun Microsystems - Beijing China 	int cnt = 0, ret = 0;
4099a5557fdSlucy wang - Sun Microsystems - Beijing China 	ulong_t val;
4109a5557fdSlucy wang - Sun Microsystems - Beijing China 
4119a5557fdSlucy wang - Sun Microsystems - Beijing China 	if ((port < 0) || (port > UNM_NIU_MAX_GBE_PORTS))
4129a5557fdSlucy wang - Sun Microsystems - Beijing China 		return (-1);
4139a5557fdSlucy wang - Sun Microsystems - Beijing China 
4149a5557fdSlucy wang - Sun Microsystems - Beijing China 	/* Turn off mac */
4159a5557fdSlucy wang - Sun Microsystems - Beijing China 	adapter->unm_nic_hw_read_wx(adapter, UNM_NIU_GB_MAC_CONFIG_0(port),
4169a5557fdSlucy wang - Sun Microsystems - Beijing China 	    &mac_cfg, 4);
4179a5557fdSlucy wang - Sun Microsystems - Beijing China 	mac_cfg.rx_enable = 0;
4189a5557fdSlucy wang - Sun Microsystems - Beijing China 	adapter->unm_nic_hw_write_wx(adapter, UNM_NIU_GB_MAC_CONFIG_0(port),
4199a5557fdSlucy wang - Sun Microsystems - Beijing China 	    &mac_cfg, 4);
4209a5557fdSlucy wang - Sun Microsystems - Beijing China 
4219a5557fdSlucy wang - Sun Microsystems - Beijing China 	/* wait until mac is drained by sre */
4229a5557fdSlucy wang - Sun Microsystems - Beijing China 	/* Port 0 rx fifo bit 5 */
4239a5557fdSlucy wang - Sun Microsystems - Beijing China 	val = (0x20 << port);
4249a5557fdSlucy wang - Sun Microsystems - Beijing China 	adapter->unm_crb_writelit_adapter(adapter, UNM_NIU_FRAME_COUNT_SELECT,
4259a5557fdSlucy wang - Sun Microsystems - Beijing China 	    val);
4269a5557fdSlucy wang - Sun Microsystems - Beijing China 
4279a5557fdSlucy wang - Sun Microsystems - Beijing China 	do {
4289a5557fdSlucy wang - Sun Microsystems - Beijing China 		adapter->unm_nic_hw_read_wx(adapter, UNM_NIU_FRAME_COUNT,
4299a5557fdSlucy wang - Sun Microsystems - Beijing China 		    &val, 4);
4309a5557fdSlucy wang - Sun Microsystems - Beijing China 		cnt++;
4319a5557fdSlucy wang - Sun Microsystems - Beijing China 		if (cnt > 2000) {
4329a5557fdSlucy wang - Sun Microsystems - Beijing China 			ret = -1;
4339a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
4349a5557fdSlucy wang - Sun Microsystems - Beijing China 		}
4359a5557fdSlucy wang - Sun Microsystems - Beijing China 		drv_usecwait(10);
4369a5557fdSlucy wang - Sun Microsystems - Beijing China 	} while (val);
4379a5557fdSlucy wang - Sun Microsystems - Beijing China 
4389a5557fdSlucy wang - Sun Microsystems - Beijing China 	/* now set promiscuous mode */
4399a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (ret != -1) {
4409a5557fdSlucy wang - Sun Microsystems - Beijing China 		if (mode == UNM_NIU_PROMISCOUS_MODE)
4419a5557fdSlucy wang - Sun Microsystems - Beijing China 			data = 0;
4429a5557fdSlucy wang - Sun Microsystems - Beijing China 		else
4439a5557fdSlucy wang - Sun Microsystems - Beijing China 			data = 1;
4449a5557fdSlucy wang - Sun Microsystems - Beijing China 
4459a5557fdSlucy wang - Sun Microsystems - Beijing China 		adapter->unm_nic_hw_read_wx(adapter, UNM_NIU_GB_DROP_WRONGADDR,
4469a5557fdSlucy wang - Sun Microsystems - Beijing China 		    &reg, 4);
4479a5557fdSlucy wang - Sun Microsystems - Beijing China 		switch (port) {
4489a5557fdSlucy wang - Sun Microsystems - Beijing China 		case 0:
4499a5557fdSlucy wang - Sun Microsystems - Beijing China 			reg.drop_gb0 = data;
4509a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
4519a5557fdSlucy wang - Sun Microsystems - Beijing China 		case 1:
4529a5557fdSlucy wang - Sun Microsystems - Beijing China 			reg.drop_gb1 = data;
4539a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
4549a5557fdSlucy wang - Sun Microsystems - Beijing China 		case 2:
4559a5557fdSlucy wang - Sun Microsystems - Beijing China 			reg.drop_gb2 = data;
4569a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
4579a5557fdSlucy wang - Sun Microsystems - Beijing China 		case 3:
4589a5557fdSlucy wang - Sun Microsystems - Beijing China 			reg.drop_gb3 = data;
4599a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
4609a5557fdSlucy wang - Sun Microsystems - Beijing China 		default:
4619a5557fdSlucy wang - Sun Microsystems - Beijing China 			ret  = -1;
4629a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
4639a5557fdSlucy wang - Sun Microsystems - Beijing China 		}
4649a5557fdSlucy wang - Sun Microsystems - Beijing China 		adapter->unm_nic_hw_write_wx(adapter, UNM_NIU_GB_DROP_WRONGADDR,
4659a5557fdSlucy wang - Sun Microsystems - Beijing China 		    &reg, 4);
4669a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
4679a5557fdSlucy wang - Sun Microsystems - Beijing China 
4689a5557fdSlucy wang - Sun Microsystems - Beijing China 	/* turn the mac on back */
4699a5557fdSlucy wang - Sun Microsystems - Beijing China 	mac_cfg.rx_enable = 1;
4709a5557fdSlucy wang - Sun Microsystems - Beijing China 	adapter->unm_nic_hw_write_wx(adapter, UNM_NIU_GB_MAC_CONFIG_0(port),
4719a5557fdSlucy wang - Sun Microsystems - Beijing China 	    &mac_cfg, 4);
4729a5557fdSlucy wang - Sun Microsystems - Beijing China 
4739a5557fdSlucy wang - Sun Microsystems - Beijing China 	return (ret);
4749a5557fdSlucy wang - Sun Microsystems - Beijing China }
4759a5557fdSlucy wang - Sun Microsystems - Beijing China 
4769a5557fdSlucy wang - Sun Microsystems - Beijing China /*
4779a5557fdSlucy wang - Sun Microsystems - Beijing China  * Set the MAC address for an XG port
4789a5557fdSlucy wang - Sun Microsystems - Beijing China  * Note that the passed-in value must already be in network byte order.
4799a5557fdSlucy wang - Sun Microsystems - Beijing China  */
4809a5557fdSlucy wang - Sun Microsystems - Beijing China int
unm_niu_xg_macaddr_set(struct unm_adapter_s * adapter,unm_ethernet_macaddr_t addr)4819a5557fdSlucy wang - Sun Microsystems - Beijing China unm_niu_xg_macaddr_set(struct unm_adapter_s *adapter,
4829a5557fdSlucy wang - Sun Microsystems - Beijing China 		unm_ethernet_macaddr_t addr)
4839a5557fdSlucy wang - Sun Microsystems - Beijing China {
4849a5557fdSlucy wang - Sun Microsystems - Beijing China 	int		phy = adapter->physical_port;
4859a5557fdSlucy wang - Sun Microsystems - Beijing China 	unm_crbword_t	temp = 0;
4869a5557fdSlucy wang - Sun Microsystems - Beijing China 	u32		port_mode = 0;
4879a5557fdSlucy wang - Sun Microsystems - Beijing China 
4889a5557fdSlucy wang - Sun Microsystems - Beijing China 	if ((phy < 0) || (phy > 3))
4899a5557fdSlucy wang - Sun Microsystems - Beijing China 		return (-1);
4909a5557fdSlucy wang - Sun Microsystems - Beijing China 
4919a5557fdSlucy wang - Sun Microsystems - Beijing China 	switch (phy) {
4929a5557fdSlucy wang - Sun Microsystems - Beijing China 	case 0:
4939a5557fdSlucy wang - Sun Microsystems - Beijing China 		(void) memcpy(&temp, addr, 2);
4949a5557fdSlucy wang - Sun Microsystems - Beijing China 		temp <<= 16;
4959a5557fdSlucy wang - Sun Microsystems - Beijing China 		port_mode = adapter->unm_nic_pci_read_normalize(adapter,
4969a5557fdSlucy wang - Sun Microsystems - Beijing China 		    UNM_PORT_MODE_ADDR);
4979a5557fdSlucy wang - Sun Microsystems - Beijing China 		if (port_mode == UNM_PORT_MODE_802_3_AP) {
4989a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->unm_nic_hw_write_wx(adapter,
4999a5557fdSlucy wang - Sun Microsystems - Beijing China 			    UNM_NIU_AP_STATION_ADDR_1(phy), &temp, 4);
5009a5557fdSlucy wang - Sun Microsystems - Beijing China 			temp = 0;
5019a5557fdSlucy wang - Sun Microsystems - Beijing China 			(void) memcpy(&temp, ((__uint8_t *)addr) + 2,
5029a5557fdSlucy wang - Sun Microsystems - Beijing China 			    sizeof (unm_crbword_t));
5039a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->unm_nic_hw_write_wx(adapter,
5049a5557fdSlucy wang - Sun Microsystems - Beijing China 			    UNM_NIU_AP_STATION_ADDR_0(phy), &temp, 4);
5059a5557fdSlucy wang - Sun Microsystems - Beijing China 		} else {
5069a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->unm_nic_hw_write_wx(adapter,
5079a5557fdSlucy wang - Sun Microsystems - Beijing China 			    UNM_NIU_XGE_STATION_ADDR_0_1, &temp, 4);
5089a5557fdSlucy wang - Sun Microsystems - Beijing China 			temp = 0;
5099a5557fdSlucy wang - Sun Microsystems - Beijing China 			(void) memcpy(&temp, ((__uint8_t *)addr) + 2,
5109a5557fdSlucy wang - Sun Microsystems - Beijing China 			    sizeof (unm_crbword_t));
5119a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->unm_nic_hw_write_wx(adapter,
5129a5557fdSlucy wang - Sun Microsystems - Beijing China 			    UNM_NIU_XGE_STATION_ADDR_0_HI, &temp, 4);
5139a5557fdSlucy wang - Sun Microsystems - Beijing China 		}
5149a5557fdSlucy wang - Sun Microsystems - Beijing China 		break;
5159a5557fdSlucy wang - Sun Microsystems - Beijing China 
5169a5557fdSlucy wang - Sun Microsystems - Beijing China 	case 1:
5179a5557fdSlucy wang - Sun Microsystems - Beijing China 		(void) memcpy(&temp, addr, 2);
5189a5557fdSlucy wang - Sun Microsystems - Beijing China 		temp <<= 16;
5199a5557fdSlucy wang - Sun Microsystems - Beijing China 		port_mode = adapter->unm_nic_pci_read_normalize(adapter,
5209a5557fdSlucy wang - Sun Microsystems - Beijing China 		    UNM_PORT_MODE_ADDR);
5219a5557fdSlucy wang - Sun Microsystems - Beijing China 		if (port_mode == UNM_PORT_MODE_802_3_AP) {
5229a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->unm_nic_hw_write_wx(adapter,
5239a5557fdSlucy wang - Sun Microsystems - Beijing China 			    UNM_NIU_AP_STATION_ADDR_1(phy), &temp, 4);
5249a5557fdSlucy wang - Sun Microsystems - Beijing China 			temp = 0;
5259a5557fdSlucy wang - Sun Microsystems - Beijing China 			(void) memcpy(&temp, ((__uint8_t *)addr) + 2,
5269a5557fdSlucy wang - Sun Microsystems - Beijing China 			    sizeof (unm_crbword_t));
5279a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->unm_nic_hw_write_wx(adapter,
5289a5557fdSlucy wang - Sun Microsystems - Beijing China 			    UNM_NIU_AP_STATION_ADDR_0(phy), &temp, 4);
5299a5557fdSlucy wang - Sun Microsystems - Beijing China 		} else {
5309a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->unm_nic_hw_write_wx(adapter,
5319a5557fdSlucy wang - Sun Microsystems - Beijing China 			    UNM_NIU_XGE_STATION_ADDR_0_1, &temp, 4);
5329a5557fdSlucy wang - Sun Microsystems - Beijing China 			temp = 0;
5339a5557fdSlucy wang - Sun Microsystems - Beijing China 			(void) memcpy(&temp, ((__uint8_t *)addr) + 2,
5349a5557fdSlucy wang - Sun Microsystems - Beijing China 			    sizeof (unm_crbword_t));
5359a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->unm_nic_hw_write_wx(adapter,
5369a5557fdSlucy wang - Sun Microsystems - Beijing China 			    UNM_NIU_XGE_STATION_ADDR_0_HI, &temp, 4);
5379a5557fdSlucy wang - Sun Microsystems - Beijing China 		}
5389a5557fdSlucy wang - Sun Microsystems - Beijing China 		break;
5399a5557fdSlucy wang - Sun Microsystems - Beijing China 
5409a5557fdSlucy wang - Sun Microsystems - Beijing China 	default:
5419a5557fdSlucy wang - Sun Microsystems - Beijing China 		cmn_err(CE_WARN, "Unknown port %d\n", phy);
5429a5557fdSlucy wang - Sun Microsystems - Beijing China 		return (DDI_FAILURE);
5439a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
5449a5557fdSlucy wang - Sun Microsystems - Beijing China 
5459a5557fdSlucy wang - Sun Microsystems - Beijing China 	return (0);
5469a5557fdSlucy wang - Sun Microsystems - Beijing China }
5479a5557fdSlucy wang - Sun Microsystems - Beijing China 
5489a5557fdSlucy wang - Sun Microsystems - Beijing China native_t
unm_niu_xg_set_promiscuous_mode(struct unm_adapter_s * adapter,unm_niu_prom_mode_t mode)5499a5557fdSlucy wang - Sun Microsystems - Beijing China unm_niu_xg_set_promiscuous_mode(struct unm_adapter_s *adapter,
5509a5557fdSlucy wang - Sun Microsystems - Beijing China     unm_niu_prom_mode_t mode)
5519a5557fdSlucy wang - Sun Microsystems - Beijing China {
5529a5557fdSlucy wang - Sun Microsystems - Beijing China 	long  reg;
5539a5557fdSlucy wang - Sun Microsystems - Beijing China 	unm_niu_xg_mac_config_0_t mac_cfg;
5549a5557fdSlucy wang - Sun Microsystems - Beijing China 	native_t port = adapter->physical_port;
5559a5557fdSlucy wang - Sun Microsystems - Beijing China 	int cnt = 0;
5569a5557fdSlucy wang - Sun Microsystems - Beijing China 	int result = 0;
5579a5557fdSlucy wang - Sun Microsystems - Beijing China 	u32 port_mode = 0;
5589a5557fdSlucy wang - Sun Microsystems - Beijing China 
5599a5557fdSlucy wang - Sun Microsystems - Beijing China 	if ((port < 0) || (port > UNM_NIU_MAX_XG_PORTS))
5609a5557fdSlucy wang - Sun Microsystems - Beijing China 		return (-1);
5619a5557fdSlucy wang - Sun Microsystems - Beijing China 
5629a5557fdSlucy wang - Sun Microsystems - Beijing China 	port_mode = adapter->unm_nic_pci_read_normalize(adapter,
5639a5557fdSlucy wang - Sun Microsystems - Beijing China 	    UNM_PORT_MODE_ADDR);
5649a5557fdSlucy wang - Sun Microsystems - Beijing China 
5659a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (port_mode == UNM_PORT_MODE_802_3_AP) {
5669a5557fdSlucy wang - Sun Microsystems - Beijing China 		reg = 0;
5679a5557fdSlucy wang - Sun Microsystems - Beijing China 		adapter->unm_nic_hw_write_wx(adapter,
5689a5557fdSlucy wang - Sun Microsystems - Beijing China 		    UNM_NIU_GB_DROP_WRONGADDR, (void*)&reg, 4);
5699a5557fdSlucy wang - Sun Microsystems - Beijing China 	} else {
5709a5557fdSlucy wang - Sun Microsystems - Beijing China 		/* Turn off mac */
5719a5557fdSlucy wang - Sun Microsystems - Beijing China 		adapter->unm_nic_hw_read_wx(adapter, UNM_NIU_XGE_CONFIG_0 +
5729a5557fdSlucy wang - Sun Microsystems - Beijing China 		    (0x10000 * port), &mac_cfg, 4);
5739a5557fdSlucy wang - Sun Microsystems - Beijing China 		mac_cfg.rx_enable = 0;
5749a5557fdSlucy wang - Sun Microsystems - Beijing China 		adapter->unm_nic_hw_write_wx(adapter, UNM_NIU_XGE_CONFIG_0 +
5759a5557fdSlucy wang - Sun Microsystems - Beijing China 		    (0x10000 * port), &mac_cfg, 4);
5769a5557fdSlucy wang - Sun Microsystems - Beijing China 
5779a5557fdSlucy wang - Sun Microsystems - Beijing China 		/* wait until mac is drained by sre */
5789a5557fdSlucy wang - Sun Microsystems - Beijing China 		if ((adapter->ahw.boardcfg.board_type !=
5799a5557fdSlucy wang - Sun Microsystems - Beijing China 		    UNM_BRDTYPE_P2_SB31_10G_IMEZ) &&
5809a5557fdSlucy wang - Sun Microsystems - Beijing China 		    (adapter->ahw.boardcfg.board_type !=
5819a5557fdSlucy wang - Sun Microsystems - Beijing China 		    UNM_BRDTYPE_P2_SB31_10G_HMEZ)) {
5829a5557fdSlucy wang - Sun Microsystems - Beijing China 			/* single port case bit 9 */
5839a5557fdSlucy wang - Sun Microsystems - Beijing China 			reg = 0x0200;
5849a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->unm_crb_writelit_adapter(adapter,
5859a5557fdSlucy wang - Sun Microsystems - Beijing China 			    UNM_NIU_FRAME_COUNT_SELECT, reg);
5869a5557fdSlucy wang - Sun Microsystems - Beijing China 		} else {
5879a5557fdSlucy wang - Sun Microsystems - Beijing China 			/* Port 0 rx fifo bit 5 */
5889a5557fdSlucy wang - Sun Microsystems - Beijing China 			reg = (0x20 << port);
5899a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->unm_crb_writelit_adapter(adapter,
5909a5557fdSlucy wang - Sun Microsystems - Beijing China 			    UNM_NIU_FRAME_COUNT_SELECT, reg);
5919a5557fdSlucy wang - Sun Microsystems - Beijing China 		}
5929a5557fdSlucy wang - Sun Microsystems - Beijing China 		do {
5939a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->unm_nic_hw_read_wx(adapter,
5949a5557fdSlucy wang - Sun Microsystems - Beijing China 			    UNM_NIU_FRAME_COUNT, &reg, 4);
5959a5557fdSlucy wang - Sun Microsystems - Beijing China 			cnt++;
5969a5557fdSlucy wang - Sun Microsystems - Beijing China 			if (cnt > 2000) {
5979a5557fdSlucy wang - Sun Microsystems - Beijing China 				result = -1;
5989a5557fdSlucy wang - Sun Microsystems - Beijing China 				break;
5999a5557fdSlucy wang - Sun Microsystems - Beijing China 			}
6009a5557fdSlucy wang - Sun Microsystems - Beijing China 			drv_usecwait(10);
6019a5557fdSlucy wang - Sun Microsystems - Beijing China 		} while (reg);
6029a5557fdSlucy wang - Sun Microsystems - Beijing China 
6039a5557fdSlucy wang - Sun Microsystems - Beijing China 		/* now set promiscuous mode */
6049a5557fdSlucy wang - Sun Microsystems - Beijing China 		if (result != -1) {
6059a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->unm_nic_hw_read_wx(adapter,
6069a5557fdSlucy wang - Sun Microsystems - Beijing China 			    UNM_NIU_XGE_CONFIG_1 + (0x10000 * port), &reg, 4);
6079a5557fdSlucy wang - Sun Microsystems - Beijing China 			if (mode == UNM_NIU_PROMISCOUS_MODE) {
6089a5557fdSlucy wang - Sun Microsystems - Beijing China 				reg = (reg | 0x2000UL);
6099a5557fdSlucy wang - Sun Microsystems - Beijing China 			} else { /* FIXME  use the correct mode value here */
6109a5557fdSlucy wang - Sun Microsystems - Beijing China 				reg = (reg & ~0x2000UL);
6119a5557fdSlucy wang - Sun Microsystems - Beijing China 			}
6129a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->unm_crb_writelit_adapter(adapter,
6139a5557fdSlucy wang - Sun Microsystems - Beijing China 			    UNM_NIU_XGE_CONFIG_1 + (0x10000 * port), reg);
6149a5557fdSlucy wang - Sun Microsystems - Beijing China 		}
6159a5557fdSlucy wang - Sun Microsystems - Beijing China 
6169a5557fdSlucy wang - Sun Microsystems - Beijing China 		/* turn the mac back on */
6179a5557fdSlucy wang - Sun Microsystems - Beijing China 		mac_cfg.rx_enable = 1;
6189a5557fdSlucy wang - Sun Microsystems - Beijing China 		adapter->unm_nic_hw_write_wx(adapter, UNM_NIU_XGE_CONFIG_0 +
6199a5557fdSlucy wang - Sun Microsystems - Beijing China 		    (0x10000 * port), &mac_cfg, 4);
6209a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
6219a5557fdSlucy wang - Sun Microsystems - Beijing China 
6229a5557fdSlucy wang - Sun Microsystems - Beijing China 	return (result);
6239a5557fdSlucy wang - Sun Microsystems - Beijing China }
6249a5557fdSlucy wang - Sun Microsystems - Beijing China 
6259a5557fdSlucy wang - Sun Microsystems - Beijing China int
unm_niu_xg_set_tx_flow_ctl(struct unm_adapter_s * adapter,int enable)6269a5557fdSlucy wang - Sun Microsystems - Beijing China unm_niu_xg_set_tx_flow_ctl(struct unm_adapter_s *adapter, int enable)
6279a5557fdSlucy wang - Sun Microsystems - Beijing China {
6289a5557fdSlucy wang - Sun Microsystems - Beijing China 	int port = adapter->physical_port;
6299a5557fdSlucy wang - Sun Microsystems - Beijing China 	unm_niu_xg_pause_ctl_t reg;
6309a5557fdSlucy wang - Sun Microsystems - Beijing China 
6319a5557fdSlucy wang - Sun Microsystems - Beijing China 	if ((port < 0) || (port > UNM_NIU_MAX_XG_PORTS))
6329a5557fdSlucy wang - Sun Microsystems - Beijing China 		return (-1);
6339a5557fdSlucy wang - Sun Microsystems - Beijing China 
6349a5557fdSlucy wang - Sun Microsystems - Beijing China 	adapter->unm_nic_hw_read_wx(adapter, UNM_NIU_XG_PAUSE_CTL, &reg, 4);
6359a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (port == 0)
6369a5557fdSlucy wang - Sun Microsystems - Beijing China 		reg.xg0_mask = !enable;
6379a5557fdSlucy wang - Sun Microsystems - Beijing China 	else
6389a5557fdSlucy wang - Sun Microsystems - Beijing China 		reg.xg1_mask = !enable;
6399a5557fdSlucy wang - Sun Microsystems - Beijing China 
6409a5557fdSlucy wang - Sun Microsystems - Beijing China 	adapter->unm_nic_hw_write_wx(adapter, UNM_NIU_XG_PAUSE_CTL, &reg, 4);
6419a5557fdSlucy wang - Sun Microsystems - Beijing China 
6429a5557fdSlucy wang - Sun Microsystems - Beijing China 	return (0);
6439a5557fdSlucy wang - Sun Microsystems - Beijing China }
6449a5557fdSlucy wang - Sun Microsystems - Beijing China 
6459a5557fdSlucy wang - Sun Microsystems - Beijing China int
unm_niu_gbe_set_tx_flow_ctl(struct unm_adapter_s * adapter,int enable)6469a5557fdSlucy wang - Sun Microsystems - Beijing China unm_niu_gbe_set_tx_flow_ctl(struct unm_adapter_s *adapter, int enable)
6479a5557fdSlucy wang - Sun Microsystems - Beijing China {
6489a5557fdSlucy wang - Sun Microsystems - Beijing China 	int port = adapter->physical_port;
6499a5557fdSlucy wang - Sun Microsystems - Beijing China 	unm_niu_gb_pause_ctl_t reg;
6509a5557fdSlucy wang - Sun Microsystems - Beijing China 
6519a5557fdSlucy wang - Sun Microsystems - Beijing China 	if ((port < 0) || (port > UNM_NIU_MAX_GBE_PORTS))
6529a5557fdSlucy wang - Sun Microsystems - Beijing China 		return (-1);
6539a5557fdSlucy wang - Sun Microsystems - Beijing China 
6549a5557fdSlucy wang - Sun Microsystems - Beijing China 	adapter->unm_nic_hw_read_wx(adapter, UNM_NIU_GB_PAUSE_CTL, &reg, 4);
6559a5557fdSlucy wang - Sun Microsystems - Beijing China 	switch (port) {
6569a5557fdSlucy wang - Sun Microsystems - Beijing China 	case (0):
6579a5557fdSlucy wang - Sun Microsystems - Beijing China 		reg.gb0_mask = !enable;
6589a5557fdSlucy wang - Sun Microsystems - Beijing China 		break;
6599a5557fdSlucy wang - Sun Microsystems - Beijing China 	case (1):
6609a5557fdSlucy wang - Sun Microsystems - Beijing China 		reg.gb1_mask = !enable;
6619a5557fdSlucy wang - Sun Microsystems - Beijing China 		break;
6629a5557fdSlucy wang - Sun Microsystems - Beijing China 	case (2):
6639a5557fdSlucy wang - Sun Microsystems - Beijing China 		reg.gb2_mask = !enable;
6649a5557fdSlucy wang - Sun Microsystems - Beijing China 		break;
6659a5557fdSlucy wang - Sun Microsystems - Beijing China 	case (3):
6669a5557fdSlucy wang - Sun Microsystems - Beijing China 	default:
6679a5557fdSlucy wang - Sun Microsystems - Beijing China 		reg.gb3_mask = !enable;
6689a5557fdSlucy wang - Sun Microsystems - Beijing China 		break;
6699a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
6709a5557fdSlucy wang - Sun Microsystems - Beijing China 	adapter->unm_nic_hw_write_wx(adapter, UNM_NIU_GB_PAUSE_CTL, &reg, 4);
6719a5557fdSlucy wang - Sun Microsystems - Beijing China 
6729a5557fdSlucy wang - Sun Microsystems - Beijing China 	return (0);
6739a5557fdSlucy wang - Sun Microsystems - Beijing China }
6749a5557fdSlucy wang - Sun Microsystems - Beijing China 
6759a5557fdSlucy wang - Sun Microsystems - Beijing China int
unm_niu_gbe_set_rx_flow_ctl(struct unm_adapter_s * adapter,int enable)6769a5557fdSlucy wang - Sun Microsystems - Beijing China unm_niu_gbe_set_rx_flow_ctl(struct unm_adapter_s *adapter, int enable)
6779a5557fdSlucy wang - Sun Microsystems - Beijing China {
6789a5557fdSlucy wang - Sun Microsystems - Beijing China 	int port = adapter->physical_port;
6799a5557fdSlucy wang - Sun Microsystems - Beijing China 	unm_niu_gb_mac_config_0_t reg;
6809a5557fdSlucy wang - Sun Microsystems - Beijing China 
6819a5557fdSlucy wang - Sun Microsystems - Beijing China 	if ((port < 0) || (port > UNM_NIU_MAX_GBE_PORTS))
6829a5557fdSlucy wang - Sun Microsystems - Beijing China 		return (-1);
6839a5557fdSlucy wang - Sun Microsystems - Beijing China 
6849a5557fdSlucy wang - Sun Microsystems - Beijing China 	adapter->unm_nic_hw_read_wx(adapter, UNM_NIU_GB_MAC_CONFIG_0(port),
6859a5557fdSlucy wang - Sun Microsystems - Beijing China 	    &reg, 4);
6869a5557fdSlucy wang - Sun Microsystems - Beijing China 	reg.rx_flowctl = enable;
6879a5557fdSlucy wang - Sun Microsystems - Beijing China 	adapter->unm_nic_hw_write_wx(adapter, UNM_NIU_GB_MAC_CONFIG_0(port),
6889a5557fdSlucy wang - Sun Microsystems - Beijing China 	    &reg, 4);
6899a5557fdSlucy wang - Sun Microsystems - Beijing China 
6909a5557fdSlucy wang - Sun Microsystems - Beijing China 	return (0);
6919a5557fdSlucy wang - Sun Microsystems - Beijing China }
692