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 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 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 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 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 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 */ 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 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 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 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 ®, 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 ®, 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 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 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*)®, 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, ®, 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), ®, 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 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, ®, 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, ®, 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 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, ®, 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, ®, 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 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 ®, 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 ®, 4); 6899a5557fdSlucy wang - Sun Microsystems - Beijing China 6909a5557fdSlucy wang - Sun Microsystems - Beijing China return (0); 6919a5557fdSlucy wang - Sun Microsystems - Beijing China } 692