xref: /illumos-gate/usr/src/uts/common/io/ntxn/niu.c (revision 1f0a2977)
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  */
2193833965Sjing 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  */
2693833965Sjing 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 */
231*1f0a2977SToomas Soome native_t
unm_niu_enable_gbe_port(struct unm_adapter_s * adapter)232*1f0a2977SToomas Soome unm_niu_enable_gbe_port(struct unm_adapter_s *adapter)
2339a5557fdSlucy wang - Sun Microsystems - Beijing China {
2349a5557fdSlucy wang - Sun Microsystems - Beijing China 	unm_niu_gb_mac_config_0_t mac_cfg0;
2359a5557fdSlucy wang - Sun Microsystems - Beijing China 	unm_niu_gb_mac_config_1_t mac_cfg1;
2369a5557fdSlucy wang - Sun Microsystems - Beijing China 	unm_niu_gb_mii_mgmt_config_t mii_cfg;
2379a5557fdSlucy wang - Sun Microsystems - Beijing China 	native_t port = adapter->physical_port;
2389a5557fdSlucy wang - Sun Microsystems - Beijing China 	int zero = 0;
2399a5557fdSlucy wang - Sun Microsystems - Beijing China 	int one = 1;
2409a5557fdSlucy wang - Sun Microsystems - Beijing China 	u32 port_mode = 0;
2419a5557fdSlucy wang - Sun Microsystems - Beijing China 
2429a5557fdSlucy wang - Sun Microsystems - Beijing China 	if ((port < 0) || (port > UNM_NIU_MAX_GBE_PORTS)) {
2439a5557fdSlucy wang - Sun Microsystems - Beijing China 		return (-1);
2449a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
2459a5557fdSlucy wang - Sun Microsystems - Beijing China 
2469a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (adapter->link_speed != MBPS_10 &&
2479a5557fdSlucy wang - Sun Microsystems - Beijing China 	    adapter->link_speed != MBPS_100 &&
2489a5557fdSlucy wang - Sun Microsystems - Beijing China 	    adapter->link_speed != MBPS_1000) {
2499a5557fdSlucy wang - Sun Microsystems - Beijing China 
2509a5557fdSlucy wang - Sun Microsystems - Beijing China 		if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) {
251*1f0a2977SToomas Soome 			/*
252*1f0a2977SToomas Soome 			 * Do NOT fail this call because the cable is unplugged.
253*1f0a2977SToomas Soome 			 * Updated when the link comes up...
254*1f0a2977SToomas Soome 			 */
255*1f0a2977SToomas Soome 			adapter->link_speed = MBPS_1000;
2569a5557fdSlucy wang - Sun Microsystems - Beijing China 		} else {
2579a5557fdSlucy wang - Sun Microsystems - Beijing China 			return (-1);
2589a5557fdSlucy wang - Sun Microsystems - Beijing China 		}
2599a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
2609a5557fdSlucy wang - Sun Microsystems - Beijing China 
2619a5557fdSlucy wang - Sun Microsystems - Beijing China 	port_mode = adapter->unm_nic_pci_read_normalize(adapter,
2629a5557fdSlucy wang - Sun Microsystems - Beijing China 	    UNM_PORT_MODE_ADDR);
2639a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (port_mode == UNM_PORT_MODE_802_3_AP) {
2649a5557fdSlucy wang - Sun Microsystems - Beijing China 		*(unm_crbword_t *)&mac_cfg0 = 0x0000003f;
2659a5557fdSlucy wang - Sun Microsystems - Beijing China 		*(unm_crbword_t *)&mac_cfg1 = 0x0000f2df;
2669a5557fdSlucy wang - Sun Microsystems - Beijing China 		unm_crb_write_adapter(UNM_NIU_AP_MAC_CONFIG_0(port), &mac_cfg0,
2679a5557fdSlucy wang - Sun Microsystems - Beijing China 		    adapter);
2689a5557fdSlucy wang - Sun Microsystems - Beijing China 		unm_crb_write_adapter(UNM_NIU_AP_MAC_CONFIG_1(port), &mac_cfg1,
2699a5557fdSlucy wang - Sun Microsystems - Beijing China 		    adapter);
2709a5557fdSlucy wang - Sun Microsystems - Beijing China 	} else {
2719a5557fdSlucy wang - Sun Microsystems - Beijing China 		*(unm_crbword_t *)&mac_cfg0 = 0;
2729a5557fdSlucy wang - Sun Microsystems - Beijing China 		mac_cfg0.soft_reset = 1;
2739a5557fdSlucy wang - Sun Microsystems - Beijing China 		unm_crb_write_adapter(UNM_NIU_GB_MAC_CONFIG_0(port), &mac_cfg0,
2749a5557fdSlucy wang - Sun Microsystems - Beijing China 		    adapter);
2759a5557fdSlucy wang - Sun Microsystems - Beijing China 
2769a5557fdSlucy wang - Sun Microsystems - Beijing China 		*(unm_crbword_t *)&mac_cfg0 = 0;
2779a5557fdSlucy wang - Sun Microsystems - Beijing China 		mac_cfg0.tx_enable = 1;
2789a5557fdSlucy wang - Sun Microsystems - Beijing China 		mac_cfg0.rx_enable = 1;
2799a5557fdSlucy wang - Sun Microsystems - Beijing China 		mac_cfg0.rx_flowctl = 0;
2809a5557fdSlucy wang - Sun Microsystems - Beijing China 		mac_cfg0.tx_reset_pb = 1;
2819a5557fdSlucy wang - Sun Microsystems - Beijing China 		mac_cfg0.rx_reset_pb = 1;
2829a5557fdSlucy wang - Sun Microsystems - Beijing China 		mac_cfg0.tx_reset_mac = 1;
2839a5557fdSlucy wang - Sun Microsystems - Beijing China 		mac_cfg0.rx_reset_mac = 1;
2849a5557fdSlucy wang - Sun Microsystems - Beijing China 
2859a5557fdSlucy wang - Sun Microsystems - Beijing China 		unm_crb_write_adapter(UNM_NIU_GB_MAC_CONFIG_0(port), &mac_cfg0,
2869a5557fdSlucy wang - Sun Microsystems - Beijing China 		    adapter);
2879a5557fdSlucy wang - Sun Microsystems - Beijing China 
2889a5557fdSlucy wang - Sun Microsystems - Beijing China 		*(unm_crbword_t *)&mac_cfg1 = 0;
2899a5557fdSlucy wang - Sun Microsystems - Beijing China 		mac_cfg1.preamblelen = 0xf;
2909a5557fdSlucy wang - Sun Microsystems - Beijing China 		mac_cfg1.duplex = 1;
2919a5557fdSlucy wang - Sun Microsystems - Beijing China 		mac_cfg1.crc_enable = 1;
2929a5557fdSlucy wang - Sun Microsystems - Beijing China 		mac_cfg1.padshort = 1;
2939a5557fdSlucy wang - Sun Microsystems - Beijing China 		mac_cfg1.checklength = 1;
2949a5557fdSlucy wang - Sun Microsystems - Beijing China 		mac_cfg1.hugeframes = 1;
2959a5557fdSlucy wang - Sun Microsystems - Beijing China 
2969a5557fdSlucy wang - Sun Microsystems - Beijing China 		switch (adapter->link_speed) {
2979a5557fdSlucy wang - Sun Microsystems - Beijing China 			case MBPS_10:
2989a5557fdSlucy wang - Sun Microsystems - Beijing China 			case MBPS_100: /* Fall Through */
2999a5557fdSlucy wang - Sun Microsystems - Beijing China 				mac_cfg1.intfmode = 1;
3009a5557fdSlucy wang - Sun Microsystems - Beijing China 				unm_crb_write_adapter(UNM_NIU_GB_MAC_CONFIG_1
3019a5557fdSlucy wang - Sun Microsystems - Beijing China 				    (port), &mac_cfg1, adapter);
3029a5557fdSlucy wang - Sun Microsystems - Beijing China 
3039a5557fdSlucy wang - Sun Microsystems - Beijing China 				/* set mii mode */
3049a5557fdSlucy wang - Sun Microsystems - Beijing China 				unm_crb_write_adapter(
3059a5557fdSlucy wang - Sun Microsystems - Beijing China 				    UNM_NIU_GB0_GMII_MODE+(port<<3),
3069a5557fdSlucy wang - Sun Microsystems - Beijing China 				    &zero, adapter);
3079a5557fdSlucy wang - Sun Microsystems - Beijing China 				unm_crb_write_adapter(
3089a5557fdSlucy wang - Sun Microsystems - Beijing China 				    UNM_NIU_GB0_MII_MODE+(port<< 3),
3099a5557fdSlucy wang - Sun Microsystems - Beijing China 				    &one, adapter);
3109a5557fdSlucy wang - Sun Microsystems - Beijing China 				break;
3119a5557fdSlucy wang - Sun Microsystems - Beijing China 
3129a5557fdSlucy wang - Sun Microsystems - Beijing China 			case MBPS_1000:
3139a5557fdSlucy wang - Sun Microsystems - Beijing China 				mac_cfg1.intfmode = 2;
3149a5557fdSlucy wang - Sun Microsystems - Beijing China 				unm_crb_write_adapter(
3159a5557fdSlucy wang - Sun Microsystems - Beijing China 				    UNM_NIU_GB_MAC_CONFIG_1(port),
3169a5557fdSlucy wang - Sun Microsystems - Beijing China 				    &mac_cfg1, adapter);
3179a5557fdSlucy wang - Sun Microsystems - Beijing China 
3189a5557fdSlucy wang - Sun Microsystems - Beijing China 				/* set gmii mode */
3199a5557fdSlucy wang - Sun Microsystems - Beijing China 				unm_crb_write_adapter(
3209a5557fdSlucy wang - Sun Microsystems - Beijing China 				    UNM_NIU_GB0_MII_MODE+(port << 3),
3219a5557fdSlucy wang - Sun Microsystems - Beijing China 				    &zero, adapter);
3229a5557fdSlucy wang - Sun Microsystems - Beijing China 				unm_crb_write_adapter(
3239a5557fdSlucy wang - Sun Microsystems - Beijing China 				    UNM_NIU_GB0_GMII_MODE+(port << 3),
3249a5557fdSlucy wang - Sun Microsystems - Beijing China 				    &one, adapter);
3259a5557fdSlucy wang - Sun Microsystems - Beijing China 				break;
3269a5557fdSlucy wang - Sun Microsystems - Beijing China 
3279a5557fdSlucy wang - Sun Microsystems - Beijing China 			default:
3289a5557fdSlucy wang - Sun Microsystems - Beijing China 				/* Will not happen */
3299a5557fdSlucy wang - Sun Microsystems - Beijing China 				break;
3309a5557fdSlucy wang - Sun Microsystems - Beijing China 		}
3319a5557fdSlucy wang - Sun Microsystems - Beijing China 
3329a5557fdSlucy wang - Sun Microsystems - Beijing China 		*(unm_crbword_t *)&mii_cfg = 0;
3339a5557fdSlucy wang - Sun Microsystems - Beijing China 		mii_cfg.clockselect = 7;
3349a5557fdSlucy wang - Sun Microsystems - Beijing China 		unm_crb_write_adapter(UNM_NIU_GB_MII_MGMT_CONFIG(port),
3359a5557fdSlucy wang - Sun Microsystems - Beijing China 		    &mii_cfg, adapter);
3369a5557fdSlucy wang - Sun Microsystems - Beijing China 
3379a5557fdSlucy wang - Sun Microsystems - Beijing China 		*(unm_crbword_t *)&mac_cfg0 = 0;
3389a5557fdSlucy wang - Sun Microsystems - Beijing China 		mac_cfg0.tx_enable = 1;
3399a5557fdSlucy wang - Sun Microsystems - Beijing China 		mac_cfg0.rx_enable = 1;
3409a5557fdSlucy wang - Sun Microsystems - Beijing China 		mac_cfg0.tx_flowctl = 0;
3419a5557fdSlucy wang - Sun Microsystems - Beijing China 		mac_cfg0.rx_flowctl = 0;
3429a5557fdSlucy wang - Sun Microsystems - Beijing China 		unm_crb_write_adapter(UNM_NIU_GB_MAC_CONFIG_0(port),
3439a5557fdSlucy wang - Sun Microsystems - Beijing China 		    &mac_cfg0, adapter);
3449a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
3459a5557fdSlucy wang - Sun Microsystems - Beijing China 
3469a5557fdSlucy wang - Sun Microsystems - Beijing China 	return (0);
3479a5557fdSlucy wang - Sun Microsystems - Beijing China }
3489a5557fdSlucy wang - Sun Microsystems - Beijing China 
3499a5557fdSlucy wang - Sun Microsystems - Beijing China /* Disable a GbE interface */
3509a5557fdSlucy wang - Sun Microsystems - Beijing China native_t
unm_niu_disable_gbe_port(struct unm_adapter_s * adapter)3519a5557fdSlucy wang - Sun Microsystems - Beijing China unm_niu_disable_gbe_port(struct unm_adapter_s *adapter)
3529a5557fdSlucy wang - Sun Microsystems - Beijing China {
3539a5557fdSlucy wang - Sun Microsystems - Beijing China 	native_t			port = adapter->physical_port;
3549a5557fdSlucy wang - Sun Microsystems - Beijing China 	unm_niu_gb_mac_config_0_t	mac_cfg0;
3559a5557fdSlucy wang - Sun Microsystems - Beijing China 
3569a5557fdSlucy wang - Sun Microsystems - Beijing China 	if ((port < 0) || (port > UNM_NIU_MAX_GBE_PORTS))
3579a5557fdSlucy wang - Sun Microsystems - Beijing China 		return (-1);
3589a5557fdSlucy wang - Sun Microsystems - Beijing China 
3599a5557fdSlucy wang - Sun Microsystems - Beijing China 	*(unm_crbword_t *)&mac_cfg0 = 0;
3609a5557fdSlucy wang - Sun Microsystems - Beijing China 	mac_cfg0.soft_reset = 1;
3619a5557fdSlucy wang - Sun Microsystems - Beijing China 
3629a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (NX_IS_REVISION_P3(adapter->ahw.revision_id))
3639a5557fdSlucy wang - Sun Microsystems - Beijing China 		adapter->unm_nic_hw_write_wx(adapter,
3649a5557fdSlucy wang - Sun Microsystems - Beijing China 		    UNM_NIU_GB_MAC_CONFIG_0(port), &mac_cfg0, 0);
3659a5557fdSlucy wang - Sun Microsystems - Beijing China 	else
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, 4);
3689a5557fdSlucy wang - Sun Microsystems - Beijing China 	return (0);
3699a5557fdSlucy wang - Sun Microsystems - Beijing China }
3709a5557fdSlucy wang - Sun Microsystems - Beijing China 
3719a5557fdSlucy wang - Sun Microsystems - Beijing China /* Disable an XG interface */
3729a5557fdSlucy wang - Sun Microsystems - Beijing China native_t
unm_niu_disable_xg_port(struct unm_adapter_s * adapter)3739a5557fdSlucy wang - Sun Microsystems - Beijing China unm_niu_disable_xg_port(struct unm_adapter_s *adapter)
3749a5557fdSlucy wang - Sun Microsystems - Beijing China {
3759a5557fdSlucy wang - Sun Microsystems - Beijing China 	native_t			port = adapter->physical_port;
3769a5557fdSlucy wang - Sun Microsystems - Beijing China 	unm_niu_xg_mac_config_0_t	mac_cfg;
3779a5557fdSlucy wang - Sun Microsystems - Beijing China 
3789a5557fdSlucy wang - Sun Microsystems - Beijing China 	*(unm_crbword_t *)&mac_cfg = 0;
3799a5557fdSlucy wang - Sun Microsystems - Beijing China 	mac_cfg.soft_reset = 1;
3809a5557fdSlucy wang - Sun Microsystems - Beijing China 
3819a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) {
3829a5557fdSlucy wang - Sun Microsystems - Beijing China 		if (port != 0)
3839a5557fdSlucy wang - Sun Microsystems - Beijing China 			return (-1);
3849a5557fdSlucy wang - Sun Microsystems - Beijing China 		adapter->unm_nic_hw_write_wx(adapter, UNM_NIU_XGE_CONFIG_0,
3859a5557fdSlucy wang - Sun Microsystems - Beijing China 		    &mac_cfg, 4);
3869a5557fdSlucy wang - Sun Microsystems - Beijing China 	} else {
3879a5557fdSlucy wang - Sun Microsystems - Beijing China 		if ((port < 0) || (port >= UNM_NIU_MAX_XG_PORTS))
3889a5557fdSlucy wang - Sun Microsystems - Beijing China 			return (-1);
3899a5557fdSlucy wang - Sun Microsystems - Beijing China 		adapter->unm_nic_hw_write_wx(adapter, UNM_NIU_XGE_CONFIG_0 +
3909a5557fdSlucy wang - Sun Microsystems - Beijing China 		    (port * 0x10000), &mac_cfg, 4);
3919a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
3929a5557fdSlucy wang - Sun Microsystems - Beijing China 	return (0);
3939a5557fdSlucy wang - Sun Microsystems - Beijing China }
3949a5557fdSlucy wang - Sun Microsystems - Beijing China 
3959a5557fdSlucy wang - Sun Microsystems - Beijing China 
3969a5557fdSlucy wang - Sun Microsystems - Beijing China /* Set promiscuous mode for a GbE interface */
3979a5557fdSlucy wang - Sun Microsystems - Beijing China native_t
unm_niu_set_promiscuous_mode(struct unm_adapter_s * adapter,unm_niu_prom_mode_t mode)3989a5557fdSlucy wang - Sun Microsystems - Beijing China unm_niu_set_promiscuous_mode(struct unm_adapter_s *adapter,
3999a5557fdSlucy wang - Sun Microsystems - Beijing China     unm_niu_prom_mode_t mode)
4009a5557fdSlucy wang - Sun Microsystems - Beijing China {
4019a5557fdSlucy wang - Sun Microsystems - Beijing China 	native_t port = adapter->physical_port;
4029a5557fdSlucy wang - Sun Microsystems - Beijing China 	unm_niu_gb_drop_crc_t reg;
4039a5557fdSlucy wang - Sun Microsystems - Beijing China 	unm_niu_gb_mac_config_0_t mac_cfg;
4049a5557fdSlucy wang - Sun Microsystems - Beijing China 	unm_crbword_t data;
4059a5557fdSlucy wang - Sun Microsystems - Beijing China 	int cnt = 0, ret = 0;
4069a5557fdSlucy wang - Sun Microsystems - Beijing China 	ulong_t val;
4079a5557fdSlucy wang - Sun Microsystems - Beijing China 
4089a5557fdSlucy wang - Sun Microsystems - Beijing China 	if ((port < 0) || (port > UNM_NIU_MAX_GBE_PORTS))
4099a5557fdSlucy wang - Sun Microsystems - Beijing China 		return (-1);
4109a5557fdSlucy wang - Sun Microsystems - Beijing China 
4119a5557fdSlucy wang - Sun Microsystems - Beijing China 	/* Turn off mac */
4129a5557fdSlucy wang - Sun Microsystems - Beijing China 	adapter->unm_nic_hw_read_wx(adapter, UNM_NIU_GB_MAC_CONFIG_0(port),
4139a5557fdSlucy wang - Sun Microsystems - Beijing China 	    &mac_cfg, 4);
4149a5557fdSlucy wang - Sun Microsystems - Beijing China 	mac_cfg.rx_enable = 0;
4159a5557fdSlucy wang - Sun Microsystems - Beijing China 	adapter->unm_nic_hw_write_wx(adapter, UNM_NIU_GB_MAC_CONFIG_0(port),
4169a5557fdSlucy wang - Sun Microsystems - Beijing China 	    &mac_cfg, 4);
4179a5557fdSlucy wang - Sun Microsystems - Beijing China 
4189a5557fdSlucy wang - Sun Microsystems - Beijing China 	/* wait until mac is drained by sre */
4199a5557fdSlucy wang - Sun Microsystems - Beijing China 	/* Port 0 rx fifo bit 5 */
4209a5557fdSlucy wang - Sun Microsystems - Beijing China 	val = (0x20 << port);
4219a5557fdSlucy wang - Sun Microsystems - Beijing China 	adapter->unm_crb_writelit_adapter(adapter, UNM_NIU_FRAME_COUNT_SELECT,
4229a5557fdSlucy wang - Sun Microsystems - Beijing China 	    val);
4239a5557fdSlucy wang - Sun Microsystems - Beijing China 
4249a5557fdSlucy wang - Sun Microsystems - Beijing China 	do {
4259a5557fdSlucy wang - Sun Microsystems - Beijing China 		adapter->unm_nic_hw_read_wx(adapter, UNM_NIU_FRAME_COUNT,
4269a5557fdSlucy wang - Sun Microsystems - Beijing China 		    &val, 4);
4279a5557fdSlucy wang - Sun Microsystems - Beijing China 		cnt++;
4289a5557fdSlucy wang - Sun Microsystems - Beijing China 		if (cnt > 2000) {
4299a5557fdSlucy wang - Sun Microsystems - Beijing China 			ret = -1;
4309a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
4319a5557fdSlucy wang - Sun Microsystems - Beijing China 		}
4329a5557fdSlucy wang - Sun Microsystems - Beijing China 		drv_usecwait(10);
4339a5557fdSlucy wang - Sun Microsystems - Beijing China 	} while (val);
4349a5557fdSlucy wang - Sun Microsystems - Beijing China 
4359a5557fdSlucy wang - Sun Microsystems - Beijing China 	/* now set promiscuous mode */
4369a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (ret != -1) {
4379a5557fdSlucy wang - Sun Microsystems - Beijing China 		if (mode == UNM_NIU_PROMISCOUS_MODE)
4389a5557fdSlucy wang - Sun Microsystems - Beijing China 			data = 0;
4399a5557fdSlucy wang - Sun Microsystems - Beijing China 		else
4409a5557fdSlucy wang - Sun Microsystems - Beijing China 			data = 1;
4419a5557fdSlucy wang - Sun Microsystems - Beijing China 
4429a5557fdSlucy wang - Sun Microsystems - Beijing China 		adapter->unm_nic_hw_read_wx(adapter, UNM_NIU_GB_DROP_WRONGADDR,
4439a5557fdSlucy wang - Sun Microsystems - Beijing China 		    &reg, 4);
4449a5557fdSlucy wang - Sun Microsystems - Beijing China 		switch (port) {
4459a5557fdSlucy wang - Sun Microsystems - Beijing China 		case 0:
4469a5557fdSlucy wang - Sun Microsystems - Beijing China 			reg.drop_gb0 = data;
4479a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
4489a5557fdSlucy wang - Sun Microsystems - Beijing China 		case 1:
4499a5557fdSlucy wang - Sun Microsystems - Beijing China 			reg.drop_gb1 = data;
4509a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
4519a5557fdSlucy wang - Sun Microsystems - Beijing China 		case 2:
4529a5557fdSlucy wang - Sun Microsystems - Beijing China 			reg.drop_gb2 = data;
4539a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
4549a5557fdSlucy wang - Sun Microsystems - Beijing China 		case 3:
4559a5557fdSlucy wang - Sun Microsystems - Beijing China 			reg.drop_gb3 = data;
4569a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
4579a5557fdSlucy wang - Sun Microsystems - Beijing China 		default:
4589a5557fdSlucy wang - Sun Microsystems - Beijing China 			ret  = -1;
4599a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
4609a5557fdSlucy wang - Sun Microsystems - Beijing China 		}
4619a5557fdSlucy wang - Sun Microsystems - Beijing China 		adapter->unm_nic_hw_write_wx(adapter, UNM_NIU_GB_DROP_WRONGADDR,
4629a5557fdSlucy wang - Sun Microsystems - Beijing China 		    &reg, 4);
4639a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
4649a5557fdSlucy wang - Sun Microsystems - Beijing China 
4659a5557fdSlucy wang - Sun Microsystems - Beijing China 	/* turn the mac on back */
4669a5557fdSlucy wang - Sun Microsystems - Beijing China 	mac_cfg.rx_enable = 1;
4679a5557fdSlucy wang - Sun Microsystems - Beijing China 	adapter->unm_nic_hw_write_wx(adapter, UNM_NIU_GB_MAC_CONFIG_0(port),
4689a5557fdSlucy wang - Sun Microsystems - Beijing China 	    &mac_cfg, 4);
4699a5557fdSlucy wang - Sun Microsystems - Beijing China 
4709a5557fdSlucy wang - Sun Microsystems - Beijing China 	return (ret);
4719a5557fdSlucy wang - Sun Microsystems - Beijing China }
4729a5557fdSlucy wang - Sun Microsystems - Beijing China 
4739a5557fdSlucy wang - Sun Microsystems - Beijing China /*
4749a5557fdSlucy wang - Sun Microsystems - Beijing China  * Set the MAC address for an XG port
4759a5557fdSlucy wang - Sun Microsystems - Beijing China  * Note that the passed-in value must already be in network byte order.
4769a5557fdSlucy wang - Sun Microsystems - Beijing China  */
4779a5557fdSlucy wang - Sun Microsystems - Beijing China int
unm_niu_xg_macaddr_set(struct unm_adapter_s * adapter,unm_ethernet_macaddr_t addr)4789a5557fdSlucy wang - Sun Microsystems - Beijing China unm_niu_xg_macaddr_set(struct unm_adapter_s *adapter,
479*1f0a2977SToomas Soome     unm_ethernet_macaddr_t addr)
4809a5557fdSlucy wang - Sun Microsystems - Beijing China {
4819a5557fdSlucy wang - Sun Microsystems - Beijing China 	int		phy = adapter->physical_port;
4829a5557fdSlucy wang - Sun Microsystems - Beijing China 	unm_crbword_t	temp = 0;
4839a5557fdSlucy wang - Sun Microsystems - Beijing China 	u32		port_mode = 0;
4849a5557fdSlucy wang - Sun Microsystems - Beijing China 
4859a5557fdSlucy wang - Sun Microsystems - Beijing China 	if ((phy < 0) || (phy > 3))
4869a5557fdSlucy wang - Sun Microsystems - Beijing China 		return (-1);
4879a5557fdSlucy wang - Sun Microsystems - Beijing China 
4889a5557fdSlucy wang - Sun Microsystems - Beijing China 	switch (phy) {
4899a5557fdSlucy wang - Sun Microsystems - Beijing China 	case 0:
4909a5557fdSlucy wang - Sun Microsystems - Beijing China 		(void) memcpy(&temp, addr, 2);
4919a5557fdSlucy wang - Sun Microsystems - Beijing China 		temp <<= 16;
4929a5557fdSlucy wang - Sun Microsystems - Beijing China 		port_mode = adapter->unm_nic_pci_read_normalize(adapter,
4939a5557fdSlucy wang - Sun Microsystems - Beijing China 		    UNM_PORT_MODE_ADDR);
4949a5557fdSlucy wang - Sun Microsystems - Beijing China 		if (port_mode == UNM_PORT_MODE_802_3_AP) {
4959a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->unm_nic_hw_write_wx(adapter,
4969a5557fdSlucy wang - Sun Microsystems - Beijing China 			    UNM_NIU_AP_STATION_ADDR_1(phy), &temp, 4);
4979a5557fdSlucy wang - Sun Microsystems - Beijing China 			temp = 0;
4989a5557fdSlucy wang - Sun Microsystems - Beijing China 			(void) memcpy(&temp, ((__uint8_t *)addr) + 2,
4999a5557fdSlucy wang - Sun Microsystems - Beijing China 			    sizeof (unm_crbword_t));
5009a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->unm_nic_hw_write_wx(adapter,
5019a5557fdSlucy wang - Sun Microsystems - Beijing China 			    UNM_NIU_AP_STATION_ADDR_0(phy), &temp, 4);
5029a5557fdSlucy wang - Sun Microsystems - Beijing China 		} else {
5039a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->unm_nic_hw_write_wx(adapter,
5049a5557fdSlucy wang - Sun Microsystems - Beijing China 			    UNM_NIU_XGE_STATION_ADDR_0_1, &temp, 4);
5059a5557fdSlucy wang - Sun Microsystems - Beijing China 			temp = 0;
5069a5557fdSlucy wang - Sun Microsystems - Beijing China 			(void) memcpy(&temp, ((__uint8_t *)addr) + 2,
5079a5557fdSlucy wang - Sun Microsystems - Beijing China 			    sizeof (unm_crbword_t));
5089a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->unm_nic_hw_write_wx(adapter,
5099a5557fdSlucy wang - Sun Microsystems - Beijing China 			    UNM_NIU_XGE_STATION_ADDR_0_HI, &temp, 4);
5109a5557fdSlucy wang - Sun Microsystems - Beijing China 		}
5119a5557fdSlucy wang - Sun Microsystems - Beijing China 		break;
5129a5557fdSlucy wang - Sun Microsystems - Beijing China 
5139a5557fdSlucy wang - Sun Microsystems - Beijing China 	case 1:
5149a5557fdSlucy wang - Sun Microsystems - Beijing China 		(void) memcpy(&temp, addr, 2);
5159a5557fdSlucy wang - Sun Microsystems - Beijing China 		temp <<= 16;
5169a5557fdSlucy wang - Sun Microsystems - Beijing China 		port_mode = adapter->unm_nic_pci_read_normalize(adapter,
5179a5557fdSlucy wang - Sun Microsystems - Beijing China 		    UNM_PORT_MODE_ADDR);
5189a5557fdSlucy wang - Sun Microsystems - Beijing China 		if (port_mode == UNM_PORT_MODE_802_3_AP) {
5199a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->unm_nic_hw_write_wx(adapter,
5209a5557fdSlucy wang - Sun Microsystems - Beijing China 			    UNM_NIU_AP_STATION_ADDR_1(phy), &temp, 4);
5219a5557fdSlucy wang - Sun Microsystems - Beijing China 			temp = 0;
5229a5557fdSlucy wang - Sun Microsystems - Beijing China 			(void) memcpy(&temp, ((__uint8_t *)addr) + 2,
5239a5557fdSlucy wang - Sun Microsystems - Beijing China 			    sizeof (unm_crbword_t));
5249a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->unm_nic_hw_write_wx(adapter,
5259a5557fdSlucy wang - Sun Microsystems - Beijing China 			    UNM_NIU_AP_STATION_ADDR_0(phy), &temp, 4);
5269a5557fdSlucy wang - Sun Microsystems - Beijing China 		} else {
5279a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->unm_nic_hw_write_wx(adapter,
5289a5557fdSlucy wang - Sun Microsystems - Beijing China 			    UNM_NIU_XGE_STATION_ADDR_0_1, &temp, 4);
5299a5557fdSlucy wang - Sun Microsystems - Beijing China 			temp = 0;
5309a5557fdSlucy wang - Sun Microsystems - Beijing China 			(void) memcpy(&temp, ((__uint8_t *)addr) + 2,
5319a5557fdSlucy wang - Sun Microsystems - Beijing China 			    sizeof (unm_crbword_t));
5329a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->unm_nic_hw_write_wx(adapter,
5339a5557fdSlucy wang - Sun Microsystems - Beijing China 			    UNM_NIU_XGE_STATION_ADDR_0_HI, &temp, 4);
5349a5557fdSlucy wang - Sun Microsystems - Beijing China 		}
5359a5557fdSlucy wang - Sun Microsystems - Beijing China 		break;
5369a5557fdSlucy wang - Sun Microsystems - Beijing China 
5379a5557fdSlucy wang - Sun Microsystems - Beijing China 	default:
5389a5557fdSlucy wang - Sun Microsystems - Beijing China 		cmn_err(CE_WARN, "Unknown port %d\n", phy);
5399a5557fdSlucy wang - Sun Microsystems - Beijing China 		return (DDI_FAILURE);
5409a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
5419a5557fdSlucy wang - Sun Microsystems - Beijing China 
5429a5557fdSlucy wang - Sun Microsystems - Beijing China 	return (0);
5439a5557fdSlucy wang - Sun Microsystems - Beijing China }
5449a5557fdSlucy wang - Sun Microsystems - Beijing China 
5459a5557fdSlucy wang - Sun Microsystems - Beijing China native_t
unm_niu_xg_set_promiscuous_mode(struct unm_adapter_s * adapter,unm_niu_prom_mode_t mode)5469a5557fdSlucy wang - Sun Microsystems - Beijing China unm_niu_xg_set_promiscuous_mode(struct unm_adapter_s *adapter,
5479a5557fdSlucy wang - Sun Microsystems - Beijing China     unm_niu_prom_mode_t mode)
5489a5557fdSlucy wang - Sun Microsystems - Beijing China {
5499a5557fdSlucy wang - Sun Microsystems - Beijing China 	long  reg;
5509a5557fdSlucy wang - Sun Microsystems - Beijing China 	unm_niu_xg_mac_config_0_t mac_cfg;
5519a5557fdSlucy wang - Sun Microsystems - Beijing China 	native_t port = adapter->physical_port;
5529a5557fdSlucy wang - Sun Microsystems - Beijing China 	int cnt = 0;
5539a5557fdSlucy wang - Sun Microsystems - Beijing China 	int result = 0;
5549a5557fdSlucy wang - Sun Microsystems - Beijing China 	u32 port_mode = 0;
5559a5557fdSlucy wang - Sun Microsystems - Beijing China 
5569a5557fdSlucy wang - Sun Microsystems - Beijing China 	if ((port < 0) || (port > UNM_NIU_MAX_XG_PORTS))
5579a5557fdSlucy wang - Sun Microsystems - Beijing China 		return (-1);
5589a5557fdSlucy wang - Sun Microsystems - Beijing China 
5599a5557fdSlucy wang - Sun Microsystems - Beijing China 	port_mode = adapter->unm_nic_pci_read_normalize(adapter,
5609a5557fdSlucy wang - Sun Microsystems - Beijing China 	    UNM_PORT_MODE_ADDR);
5619a5557fdSlucy wang - Sun Microsystems - Beijing China 
5629a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (port_mode == UNM_PORT_MODE_802_3_AP) {
5639a5557fdSlucy wang - Sun Microsystems - Beijing China 		reg = 0;
5649a5557fdSlucy wang - Sun Microsystems - Beijing China 		adapter->unm_nic_hw_write_wx(adapter,
5659a5557fdSlucy wang - Sun Microsystems - Beijing China 		    UNM_NIU_GB_DROP_WRONGADDR, (void*)&reg, 4);
5669a5557fdSlucy wang - Sun Microsystems - Beijing China 	} else {
5679a5557fdSlucy wang - Sun Microsystems - Beijing China 		/* Turn off mac */
5689a5557fdSlucy wang - Sun Microsystems - Beijing China 		adapter->unm_nic_hw_read_wx(adapter, UNM_NIU_XGE_CONFIG_0 +
5699a5557fdSlucy wang - Sun Microsystems - Beijing China 		    (0x10000 * port), &mac_cfg, 4);
5709a5557fdSlucy wang - Sun Microsystems - Beijing China 		mac_cfg.rx_enable = 0;
5719a5557fdSlucy wang - Sun Microsystems - Beijing China 		adapter->unm_nic_hw_write_wx(adapter, UNM_NIU_XGE_CONFIG_0 +
5729a5557fdSlucy wang - Sun Microsystems - Beijing China 		    (0x10000 * port), &mac_cfg, 4);
5739a5557fdSlucy wang - Sun Microsystems - Beijing China 
5749a5557fdSlucy wang - Sun Microsystems - Beijing China 		/* wait until mac is drained by sre */
5759a5557fdSlucy wang - Sun Microsystems - Beijing China 		if ((adapter->ahw.boardcfg.board_type !=
5769a5557fdSlucy wang - Sun Microsystems - Beijing China 		    UNM_BRDTYPE_P2_SB31_10G_IMEZ) &&
5779a5557fdSlucy wang - Sun Microsystems - Beijing China 		    (adapter->ahw.boardcfg.board_type !=
5789a5557fdSlucy wang - Sun Microsystems - Beijing China 		    UNM_BRDTYPE_P2_SB31_10G_HMEZ)) {
5799a5557fdSlucy wang - Sun Microsystems - Beijing China 			/* single port case bit 9 */
5809a5557fdSlucy wang - Sun Microsystems - Beijing China 			reg = 0x0200;
5819a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->unm_crb_writelit_adapter(adapter,
5829a5557fdSlucy wang - Sun Microsystems - Beijing China 			    UNM_NIU_FRAME_COUNT_SELECT, reg);
5839a5557fdSlucy wang - Sun Microsystems - Beijing China 		} else {
5849a5557fdSlucy wang - Sun Microsystems - Beijing China 			/* Port 0 rx fifo bit 5 */
5859a5557fdSlucy wang - Sun Microsystems - Beijing China 			reg = (0x20 << port);
5869a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->unm_crb_writelit_adapter(adapter,
5879a5557fdSlucy wang - Sun Microsystems - Beijing China 			    UNM_NIU_FRAME_COUNT_SELECT, reg);
5889a5557fdSlucy wang - Sun Microsystems - Beijing China 		}
5899a5557fdSlucy wang - Sun Microsystems - Beijing China 		do {
5909a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->unm_nic_hw_read_wx(adapter,
5919a5557fdSlucy wang - Sun Microsystems - Beijing China 			    UNM_NIU_FRAME_COUNT, &reg, 4);
5929a5557fdSlucy wang - Sun Microsystems - Beijing China 			cnt++;
5939a5557fdSlucy wang - Sun Microsystems - Beijing China 			if (cnt > 2000) {
5949a5557fdSlucy wang - Sun Microsystems - Beijing China 				result = -1;
5959a5557fdSlucy wang - Sun Microsystems - Beijing China 				break;
5969a5557fdSlucy wang - Sun Microsystems - Beijing China 			}
5979a5557fdSlucy wang - Sun Microsystems - Beijing China 			drv_usecwait(10);
5989a5557fdSlucy wang - Sun Microsystems - Beijing China 		} while (reg);
5999a5557fdSlucy wang - Sun Microsystems - Beijing China 
6009a5557fdSlucy wang - Sun Microsystems - Beijing China 		/* now set promiscuous mode */
6019a5557fdSlucy wang - Sun Microsystems - Beijing China 		if (result != -1) {
6029a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->unm_nic_hw_read_wx(adapter,
6039a5557fdSlucy wang - Sun Microsystems - Beijing China 			    UNM_NIU_XGE_CONFIG_1 + (0x10000 * port), &reg, 4);
6049a5557fdSlucy wang - Sun Microsystems - Beijing China 			if (mode == UNM_NIU_PROMISCOUS_MODE) {
6059a5557fdSlucy wang - Sun Microsystems - Beijing China 				reg = (reg | 0x2000UL);
6069a5557fdSlucy wang - Sun Microsystems - Beijing China 			} else { /* FIXME  use the correct mode value here */
6079a5557fdSlucy wang - Sun Microsystems - Beijing China 				reg = (reg & ~0x2000UL);
6089a5557fdSlucy wang - Sun Microsystems - Beijing China 			}
6099a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->unm_crb_writelit_adapter(adapter,
6109a5557fdSlucy wang - Sun Microsystems - Beijing China 			    UNM_NIU_XGE_CONFIG_1 + (0x10000 * port), reg);
6119a5557fdSlucy wang - Sun Microsystems - Beijing China 		}
6129a5557fdSlucy wang - Sun Microsystems - Beijing China 
6139a5557fdSlucy wang - Sun Microsystems - Beijing China 		/* turn the mac back on */
6149a5557fdSlucy wang - Sun Microsystems - Beijing China 		mac_cfg.rx_enable = 1;
6159a5557fdSlucy wang - Sun Microsystems - Beijing China 		adapter->unm_nic_hw_write_wx(adapter, UNM_NIU_XGE_CONFIG_0 +
6169a5557fdSlucy wang - Sun Microsystems - Beijing China 		    (0x10000 * port), &mac_cfg, 4);
6179a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
6189a5557fdSlucy wang - Sun Microsystems - Beijing China 
6199a5557fdSlucy wang - Sun Microsystems - Beijing China 	return (result);
6209a5557fdSlucy wang - Sun Microsystems - Beijing China }
6219a5557fdSlucy wang - Sun Microsystems - Beijing China 
6229a5557fdSlucy wang - Sun Microsystems - Beijing China int
unm_niu_xg_set_tx_flow_ctl(struct unm_adapter_s * adapter,int enable)6239a5557fdSlucy wang - Sun Microsystems - Beijing China unm_niu_xg_set_tx_flow_ctl(struct unm_adapter_s *adapter, int enable)
6249a5557fdSlucy wang - Sun Microsystems - Beijing China {
6259a5557fdSlucy wang - Sun Microsystems - Beijing China 	int port = adapter->physical_port;
6269a5557fdSlucy wang - Sun Microsystems - Beijing China 	unm_niu_xg_pause_ctl_t reg;
6279a5557fdSlucy wang - Sun Microsystems - Beijing China 
6289a5557fdSlucy wang - Sun Microsystems - Beijing China 	if ((port < 0) || (port > UNM_NIU_MAX_XG_PORTS))
6299a5557fdSlucy wang - Sun Microsystems - Beijing China 		return (-1);
6309a5557fdSlucy wang - Sun Microsystems - Beijing China 
6319a5557fdSlucy wang - Sun Microsystems - Beijing China 	adapter->unm_nic_hw_read_wx(adapter, UNM_NIU_XG_PAUSE_CTL, &reg, 4);
6329a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (port == 0)
6339a5557fdSlucy wang - Sun Microsystems - Beijing China 		reg.xg0_mask = !enable;
6349a5557fdSlucy wang - Sun Microsystems - Beijing China 	else
6359a5557fdSlucy wang - Sun Microsystems - Beijing China 		reg.xg1_mask = !enable;
6369a5557fdSlucy wang - Sun Microsystems - Beijing China 
6379a5557fdSlucy wang - Sun Microsystems - Beijing China 	adapter->unm_nic_hw_write_wx(adapter, UNM_NIU_XG_PAUSE_CTL, &reg, 4);
6389a5557fdSlucy wang - Sun Microsystems - Beijing China 
6399a5557fdSlucy wang - Sun Microsystems - Beijing China 	return (0);
6409a5557fdSlucy wang - Sun Microsystems - Beijing China }
6419a5557fdSlucy wang - Sun Microsystems - Beijing China 
6429a5557fdSlucy wang - Sun Microsystems - Beijing China int
unm_niu_gbe_set_tx_flow_ctl(struct unm_adapter_s * adapter,int enable)6439a5557fdSlucy wang - Sun Microsystems - Beijing China unm_niu_gbe_set_tx_flow_ctl(struct unm_adapter_s *adapter, int enable)
6449a5557fdSlucy wang - Sun Microsystems - Beijing China {
6459a5557fdSlucy wang - Sun Microsystems - Beijing China 	int port = adapter->physical_port;
6469a5557fdSlucy wang - Sun Microsystems - Beijing China 	unm_niu_gb_pause_ctl_t reg;
6479a5557fdSlucy wang - Sun Microsystems - Beijing China 
6489a5557fdSlucy wang - Sun Microsystems - Beijing China 	if ((port < 0) || (port > UNM_NIU_MAX_GBE_PORTS))
6499a5557fdSlucy wang - Sun Microsystems - Beijing China 		return (-1);
6509a5557fdSlucy wang - Sun Microsystems - Beijing China 
6519a5557fdSlucy wang - Sun Microsystems - Beijing China 	adapter->unm_nic_hw_read_wx(adapter, UNM_NIU_GB_PAUSE_CTL, &reg, 4);
6529a5557fdSlucy wang - Sun Microsystems - Beijing China 	switch (port) {
6539a5557fdSlucy wang - Sun Microsystems - Beijing China 	case (0):
6549a5557fdSlucy wang - Sun Microsystems - Beijing China 		reg.gb0_mask = !enable;
6559a5557fdSlucy wang - Sun Microsystems - Beijing China 		break;
6569a5557fdSlucy wang - Sun Microsystems - Beijing China 	case (1):
6579a5557fdSlucy wang - Sun Microsystems - Beijing China 		reg.gb1_mask = !enable;
6589a5557fdSlucy wang - Sun Microsystems - Beijing China 		break;
6599a5557fdSlucy wang - Sun Microsystems - Beijing China 	case (2):
6609a5557fdSlucy wang - Sun Microsystems - Beijing China 		reg.gb2_mask = !enable;
6619a5557fdSlucy wang - Sun Microsystems - Beijing China 		break;
6629a5557fdSlucy wang - Sun Microsystems - Beijing China 	case (3):
6639a5557fdSlucy wang - Sun Microsystems - Beijing China 	default:
6649a5557fdSlucy wang - Sun Microsystems - Beijing China 		reg.gb3_mask = !enable;
6659a5557fdSlucy wang - Sun Microsystems - Beijing China 		break;
6669a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
6679a5557fdSlucy wang - Sun Microsystems - Beijing China 	adapter->unm_nic_hw_write_wx(adapter, UNM_NIU_GB_PAUSE_CTL, &reg, 4);
6689a5557fdSlucy wang - Sun Microsystems - Beijing China 
6699a5557fdSlucy wang - Sun Microsystems - Beijing China 	return (0);
6709a5557fdSlucy wang - Sun Microsystems - Beijing China }
6719a5557fdSlucy wang - Sun Microsystems - Beijing China 
6729a5557fdSlucy wang - Sun Microsystems - Beijing China int
unm_niu_gbe_set_rx_flow_ctl(struct unm_adapter_s * adapter,int enable)6739a5557fdSlucy wang - Sun Microsystems - Beijing China unm_niu_gbe_set_rx_flow_ctl(struct unm_adapter_s *adapter, int enable)
6749a5557fdSlucy wang - Sun Microsystems - Beijing China {
6759a5557fdSlucy wang - Sun Microsystems - Beijing China 	int port = adapter->physical_port;
6769a5557fdSlucy wang - Sun Microsystems - Beijing China 	unm_niu_gb_mac_config_0_t reg;
6779a5557fdSlucy wang - Sun Microsystems - Beijing China 
6789a5557fdSlucy wang - Sun Microsystems - Beijing China 	if ((port < 0) || (port > UNM_NIU_MAX_GBE_PORTS))
6799a5557fdSlucy wang - Sun Microsystems - Beijing China 		return (-1);
6809a5557fdSlucy wang - Sun Microsystems - Beijing China 
6819a5557fdSlucy wang - Sun Microsystems - Beijing China 	adapter->unm_nic_hw_read_wx(adapter, UNM_NIU_GB_MAC_CONFIG_0(port),
6829a5557fdSlucy wang - Sun Microsystems - Beijing China 	    &reg, 4);
6839a5557fdSlucy wang - Sun Microsystems - Beijing China 	reg.rx_flowctl = enable;
6849a5557fdSlucy wang - Sun Microsystems - Beijing China 	adapter->unm_nic_hw_write_wx(adapter, UNM_NIU_GB_MAC_CONFIG_0(port),
6859a5557fdSlucy wang - Sun Microsystems - Beijing China 	    &reg, 4);
6869a5557fdSlucy wang - Sun Microsystems - Beijing China 
6879a5557fdSlucy wang - Sun Microsystems - Beijing China 	return (0);
6889a5557fdSlucy wang - Sun Microsystems - Beijing China }
689