xref: /illumos-gate/usr/src/uts/common/io/ntxn/unm_nic_hw.c (revision 44bf619d328827ce5eca6833fcd5c69f1592e578)
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 
2715c07adcSJohn Levon /*
28*44bf619dSJohn Levon  * Copyright 2019 Joyent, Inc.
2915c07adcSJohn Levon  */
3015c07adcSJohn Levon 
319a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/types.h>
329a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/conf.h>
339a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/debug.h>
349a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/stropts.h>
359a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/stream.h>
369a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/strlog.h>
379a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/kmem.h>
389a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/stat.h>
399a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/kstat.h>
409a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/vtrace.h>
419a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/dlpi.h>
429a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/strsun.h>
439a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/ethernet.h>
449a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/modctl.h>
459a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/errno.h>
469a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/dditypes.h>
479a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/ddi.h>
489a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/sunddi.h>
499a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/sysmacros.h>
509a5557fdSlucy wang - Sun Microsystems - Beijing China 
519a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/pci.h>
529a5557fdSlucy wang - Sun Microsystems - Beijing China 
539a5557fdSlucy wang - Sun Microsystems - Beijing China #include "unm_nic.h"
549a5557fdSlucy wang - Sun Microsystems - Beijing China #include "unm_nic_hw.h"
559a5557fdSlucy wang - Sun Microsystems - Beijing China #include "nic_cmn.h"
569a5557fdSlucy wang - Sun Microsystems - Beijing China #include "unm_brdcfg.h"
579a5557fdSlucy wang - Sun Microsystems - Beijing China #include "driver_info.h"
589a5557fdSlucy wang - Sun Microsystems - Beijing China 
599a5557fdSlucy wang - Sun Microsystems - Beijing China long unm_niu_gbe_phy_read(struct unm_adapter_s *,
609a5557fdSlucy wang - Sun Microsystems - Beijing China 		long reg, unm_crbword_t *readval);
619a5557fdSlucy wang - Sun Microsystems - Beijing China 
629a5557fdSlucy wang - Sun Microsystems - Beijing China #define	MASK(n)			((1ULL<<(n))-1)
639a5557fdSlucy wang - Sun Microsystems - Beijing China #define	MN_WIN(addr) (((addr & 0x1fc0000) >> 1) | ((addr >> 25) & 0x3ff))
649a5557fdSlucy wang - Sun Microsystems - Beijing China #define	OCM_WIN(addr) (((addr & 0x1ff0000) >> 1) |	\
659a5557fdSlucy wang - Sun Microsystems - Beijing China 		((addr >> 25) & 0x3ff)) // 64K?
669a5557fdSlucy wang - Sun Microsystems - Beijing China #define	MS_WIN(addr) (addr & 0x0ffc0000)
679a5557fdSlucy wang - Sun Microsystems - Beijing China #define	UNM_PCI_MN_2M   (0)
689a5557fdSlucy wang - Sun Microsystems - Beijing China #define	UNM_PCI_MS_2M   (0x80000)
699a5557fdSlucy wang - Sun Microsystems - Beijing China #define	UNM_PCI_OCM0_2M (0xc0000)
709a5557fdSlucy wang - Sun Microsystems - Beijing China #define	VALID_OCM_ADDR(addr) (((addr) & 0x3f800) != 0x3f800)
719a5557fdSlucy wang - Sun Microsystems - Beijing China #define	GET_MEM_OFFS_2M(addr) (addr & MASK(18))
729a5557fdSlucy wang - Sun Microsystems - Beijing China 
739a5557fdSlucy wang - Sun Microsystems - Beijing China #define	CRB_BLK(off)	((off >> 20) & 0x3f)
749a5557fdSlucy wang - Sun Microsystems - Beijing China #define	CRB_SUBBLK(off)	((off >> 16) & 0xf)
759a5557fdSlucy wang - Sun Microsystems - Beijing China #define	CRB_WINDOW_2M	(0x130060)
769a5557fdSlucy wang - Sun Microsystems - Beijing China #define	UNM_PCI_CAMQM_2M_END	(0x04800800UL)
779a5557fdSlucy wang - Sun Microsystems - Beijing China #define	CRB_HI(off)	((crb_hub_agt[CRB_BLK(off)] << 20) | ((off) & 0xf0000))
789a5557fdSlucy wang - Sun Microsystems - Beijing China #define	UNM_PCI_CAMQM_2M_BASE	(0x000ff800UL)
799a5557fdSlucy wang - Sun Microsystems - Beijing China #define	CRB_INDIRECT_2M	(0x1e0000UL)
809a5557fdSlucy wang - Sun Microsystems - Beijing China 
819a5557fdSlucy wang - Sun Microsystems - Beijing China static crb_128M_2M_block_map_t	crb_128M_2M_map[64] = {
829a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {{{0, 0, 0, 0}}}, /* 0: PCI */
839a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {{{1, 0x0100000, 0x0102000, 0x120000}, /* 1: PCIE */
849a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {1, 0x0110000, 0x0120000, 0x130000},
859a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {1, 0x0120000, 0x0122000, 0x124000},
869a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {1, 0x0130000, 0x0132000, 0x126000},
879a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {1, 0x0140000, 0x0142000, 0x128000},
889a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {1, 0x0150000, 0x0152000, 0x12a000},
899a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {1, 0x0160000, 0x0170000, 0x110000},
909a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {1, 0x0170000, 0x0172000, 0x12e000},
919a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000},
929a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000},
939a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000},
949a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000},
959a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000},
969a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000},
979a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {1, 0x01e0000, 0x01e0800, 0x122000},
989a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000}}},
999a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {{{1, 0x0200000, 0x0210000, 0x180000}}}, /* 2: MN */
1009a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {{{0, 0, 0, 0}}}, /* 3: */
1019a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {{{1, 0x0400000, 0x0401000, 0x169000}}}, /* 4: P2NR1 */
1029a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {{{1, 0x0500000, 0x0510000, 0x140000}}}, /* 5: SRE   */
1039a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {{{1, 0x0600000, 0x0610000, 0x1c0000}}}, /* 6: NIU   */
1049a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {{{1, 0x0700000, 0x0704000, 0x1b8000}}}, /* 7: QM    */
1059a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {{{1, 0x0800000, 0x0802000, 0x170000}, /* 8: SQM0  */
1069a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000},
1079a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000},
1089a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000},
1099a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000},
1109a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000},
1119a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000},
1129a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000},
1139a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000},
1149a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000},
1159a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000},
1169a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000},
1179a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000},
1189a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000},
1199a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000},
1209a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {1, 0x08f0000, 0x08f2000, 0x172000}}},
1219a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {{{1, 0x0900000, 0x0902000, 0x174000}, /* 9: SQM1 */
1229a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000},
1239a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000},
1249a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000},
1259a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000},
1269a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000},
1279a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000},
1289a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000},
1299a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000},
1309a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000},
1319a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000},
1329a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000},
1339a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000},
1349a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000},
1359a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000},
1369a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {1, 0x09f0000, 0x09f2000, 0x176000}}},
1379a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {{{0, 0x0a00000, 0x0a02000, 0x178000}, /* 10: SQM2 */
1389a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000},
1399a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000},
1409a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000},
1419a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000},
1429a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000},
1439a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000},
1449a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000},
1459a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000},
1469a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000},
1479a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000},
1489a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000},
1499a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000},
1509a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000},
1519a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000},
1529a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {1, 0x0af0000, 0x0af2000, 0x17a000}}},
1539a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {{{0, 0x0b00000, 0x0b02000, 0x17c000}, /* 11: SQM3 */
1549a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000},
1559a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000},
1569a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000},
1579a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000},
1589a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000},
1599a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000},
1609a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000},
1619a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000},
1629a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000},
1639a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000},
1649a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000},
1659a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000},
1669a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000},
1679a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000},
1689a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {1, 0x0bf0000, 0x0bf2000, 0x17e000}}},
1699a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {{{1, 0x0c00000, 0x0c04000, 0x1d4000}}}, /* 12: I2Q */
1709a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {{{1, 0x0d00000, 0x0d04000, 0x1a4000}}}, /* 13: TMR */
1719a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {{{1, 0x0e00000, 0x0e04000, 0x1a0000}}}, /* 14: ROMUSB */
1729a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {{{1, 0x0f00000, 0x0f01000, 0x164000}}}, /* 15: PEG4 */
1739a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {{{0, 0x1000000, 0x1004000, 0x1a8000}}}, /* 16: XDMA */
1749a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {{{1, 0x1100000, 0x1101000, 0x160000}}}, /* 17: PEG0 */
1759a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {{{1, 0x1200000, 0x1201000, 0x161000}}}, /* 18: PEG1 */
1769a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {{{1, 0x1300000, 0x1301000, 0x162000}}}, /* 19: PEG2 */
1779a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {{{1, 0x1400000, 0x1401000, 0x163000}}}, /* 20: PEG3 */
1789a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {{{1, 0x1500000, 0x1501000, 0x165000}}}, /* 21: P2ND */
1799a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {{{1, 0x1600000, 0x1601000, 0x166000}}}, /* 22: P2NI */
1809a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {{{0, 0, 0, 0}}}, /* 23: */
1819a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {{{0, 0, 0, 0}}}, /* 24: */
1829a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {{{0, 0, 0, 0}}}, /* 25: */
1839a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {{{0, 0, 0, 0}}}, /* 26: */
1849a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {{{0, 0, 0, 0}}}, /* 27: */
1859a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {{{0, 0, 0, 0}}}, /* 28: */
1869a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {{{1, 0x1d00000, 0x1d10000, 0x190000}}}, /* 29: MS */
1879a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {{{1, 0x1e00000, 0x1e01000, 0x16a000}}}, /* 30: P2NR2 */
1889a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {{{1, 0x1f00000, 0x1f10000, 0x150000}}}, /* 31: EPG */
1899a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {{{0}}}, /* 32: PCI */
1909a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {{{1, 0x2100000, 0x2102000, 0x120000}, /* 33: PCIE */
1919a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {1, 0x2110000, 0x2120000, 0x130000},
1929a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {1, 0x2120000, 0x2122000, 0x124000},
1939a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {1, 0x2130000, 0x2132000, 0x126000},
1949a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {1, 0x2140000, 0x2142000, 0x128000},
1959a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {1, 0x2150000, 0x2152000, 0x12a000},
1969a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {1, 0x2160000, 0x2170000, 0x110000},
1979a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {1, 0x2170000, 0x2172000, 0x12e000},
1989a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000},
1999a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000},
2009a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000},
2019a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000},
2029a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000},
2039a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000},
2049a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000},
2059a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {0, 0x0000000, 0x0000000, 0x000000}}},
2069a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {{{1, 0x2200000, 0x2204000, 0x1b0000}}}, /* 34: CAM */
2079a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {{{0}}}, /* 35: */
2089a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {{{0}}}, /* 36: */
2099a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {{{0}}}, /* 37: */
2109a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {{{0}}}, /* 38: */
2119a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {{{0}}}, /* 39: */
2129a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {{{1, 0x2800000, 0x2804000, 0x1a4000}}}, /* 40: TMR */
2139a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {{{1, 0x2900000, 0x2901000, 0x16b000}}}, /* 41: P2NR3 */
2149a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {{{1, 0x2a00000, 0x2a00400, 0x1ac400}}}, /* 42: RPMX1 */
2159a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {{{1, 0x2b00000, 0x2b00400, 0x1ac800}}}, /* 43: RPMX2 */
2169a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {{{1, 0x2c00000, 0x2c00400, 0x1acc00}}}, /* 44: RPMX3 */
2179a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {{{1, 0x2d00000, 0x2d00400, 0x1ad000}}}, /* 45: RPMX4 */
2189a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {{{1, 0x2e00000, 0x2e00400, 0x1ad400}}}, /* 46: RPMX5 */
2199a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {{{1, 0x2f00000, 0x2f00400, 0x1ad800}}}, /* 47: RPMX6 */
2209a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {{{1, 0x3000000, 0x3000400, 0x1adc00}}}, /* 48: RPMX7 */
2219a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {{{0, 0x3100000, 0x3104000, 0x1a8000}}}, /* 49: XDMA */
2229a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {{{1, 0x3200000, 0x3204000, 0x1d4000}}}, /* 50: I2Q */
2239a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {{{1, 0x3300000, 0x3304000, 0x1a0000}}}, /* 51: ROMUSB */
2249a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {{{0}}}, /* 52: */
2259a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {{{1, 0x3500000, 0x3500400, 0x1ac000}}}, /* 53: RPMX0 */
2269a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {{{1, 0x3600000, 0x3600400, 0x1ae000}}}, /* 54: RPMX8 */
2279a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {{{1, 0x3700000, 0x3700400, 0x1ae400}}}, /* 55: RPMX9 */
2289a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {{{1, 0x3800000, 0x3804000, 0x1d0000}}}, /* 56: OCM0 */
2299a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {{{1, 0x3900000, 0x3904000, 0x1b4000}}}, /* 57: CRYPTO */
2309a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {{{1, 0x3a00000, 0x3a04000, 0x1d8000}}}, /* 58: SMB */
2319a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {{{0}}}, /* 59: I2C0 */
2329a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {{{0}}}, /* 60: I2C1 */
2339a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {{{1, 0x3d00000, 0x3d04000, 0x1d8000}}}, /* 61: LPC */
2349a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {{{1, 0x3e00000, 0x3e01000, 0x167000}}}, /* 62: P2NC */
2359a5557fdSlucy wang - Sun Microsystems - Beijing China 	    {{{1, 0x3f00000, 0x3f01000, 0x168000}}} /* 63: P2NR0 */
2369a5557fdSlucy wang - Sun Microsystems - Beijing China };
2379a5557fdSlucy wang - Sun Microsystems - Beijing China 
2389a5557fdSlucy wang - Sun Microsystems - Beijing China /*
2399a5557fdSlucy wang - Sun Microsystems - Beijing China  * top 12 bits of crb internal address (hub, agent)
2409a5557fdSlucy wang - Sun Microsystems - Beijing China  */
2419a5557fdSlucy wang - Sun Microsystems - Beijing China static unsigned crb_hub_agt[64] = {
2429a5557fdSlucy wang - Sun Microsystems - Beijing China 	0,
2439a5557fdSlucy wang - Sun Microsystems - Beijing China 	UNM_HW_CRB_HUB_AGT_ADR_PS,
2449a5557fdSlucy wang - Sun Microsystems - Beijing China 	UNM_HW_CRB_HUB_AGT_ADR_MN,
2459a5557fdSlucy wang - Sun Microsystems - Beijing China 	UNM_HW_CRB_HUB_AGT_ADR_MS,
2469a5557fdSlucy wang - Sun Microsystems - Beijing China 	0,
2479a5557fdSlucy wang - Sun Microsystems - Beijing China 	UNM_HW_CRB_HUB_AGT_ADR_SRE,
2489a5557fdSlucy wang - Sun Microsystems - Beijing China 	UNM_HW_CRB_HUB_AGT_ADR_NIU,
2499a5557fdSlucy wang - Sun Microsystems - Beijing China 	UNM_HW_CRB_HUB_AGT_ADR_QMN,
2509a5557fdSlucy wang - Sun Microsystems - Beijing China 	UNM_HW_CRB_HUB_AGT_ADR_SQN0,
2519a5557fdSlucy wang - Sun Microsystems - Beijing China 	UNM_HW_CRB_HUB_AGT_ADR_SQN1,
2529a5557fdSlucy wang - Sun Microsystems - Beijing China 	UNM_HW_CRB_HUB_AGT_ADR_SQN2,
2539a5557fdSlucy wang - Sun Microsystems - Beijing China 	UNM_HW_CRB_HUB_AGT_ADR_SQN3,
2549a5557fdSlucy wang - Sun Microsystems - Beijing China 	UNM_HW_CRB_HUB_AGT_ADR_I2Q,
2559a5557fdSlucy wang - Sun Microsystems - Beijing China 	UNM_HW_CRB_HUB_AGT_ADR_TIMR,
2569a5557fdSlucy wang - Sun Microsystems - Beijing China 	UNM_HW_CRB_HUB_AGT_ADR_ROMUSB,
2579a5557fdSlucy wang - Sun Microsystems - Beijing China 	UNM_HW_CRB_HUB_AGT_ADR_PGN4,
2589a5557fdSlucy wang - Sun Microsystems - Beijing China 	UNM_HW_CRB_HUB_AGT_ADR_XDMA,
2599a5557fdSlucy wang - Sun Microsystems - Beijing China 	UNM_HW_CRB_HUB_AGT_ADR_PGN0,
2609a5557fdSlucy wang - Sun Microsystems - Beijing China 	UNM_HW_CRB_HUB_AGT_ADR_PGN1,
2619a5557fdSlucy wang - Sun Microsystems - Beijing China 	UNM_HW_CRB_HUB_AGT_ADR_PGN2,
2629a5557fdSlucy wang - Sun Microsystems - Beijing China 	UNM_HW_CRB_HUB_AGT_ADR_PGN3,
2639a5557fdSlucy wang - Sun Microsystems - Beijing China 	UNM_HW_CRB_HUB_AGT_ADR_PGND,
2649a5557fdSlucy wang - Sun Microsystems - Beijing China 	UNM_HW_CRB_HUB_AGT_ADR_PGNI,
2659a5557fdSlucy wang - Sun Microsystems - Beijing China 	UNM_HW_CRB_HUB_AGT_ADR_PGS0,
2669a5557fdSlucy wang - Sun Microsystems - Beijing China 	UNM_HW_CRB_HUB_AGT_ADR_PGS1,
2679a5557fdSlucy wang - Sun Microsystems - Beijing China 	UNM_HW_CRB_HUB_AGT_ADR_PGS2,
2689a5557fdSlucy wang - Sun Microsystems - Beijing China 	UNM_HW_CRB_HUB_AGT_ADR_PGS3,
2699a5557fdSlucy wang - Sun Microsystems - Beijing China 	0,
2709a5557fdSlucy wang - Sun Microsystems - Beijing China 	UNM_HW_CRB_HUB_AGT_ADR_PGSI,
2719a5557fdSlucy wang - Sun Microsystems - Beijing China 	UNM_HW_CRB_HUB_AGT_ADR_SN,
2729a5557fdSlucy wang - Sun Microsystems - Beijing China 	0,
2739a5557fdSlucy wang - Sun Microsystems - Beijing China 	UNM_HW_CRB_HUB_AGT_ADR_EG,
2749a5557fdSlucy wang - Sun Microsystems - Beijing China 	0,
2759a5557fdSlucy wang - Sun Microsystems - Beijing China 	UNM_HW_CRB_HUB_AGT_ADR_PS,
2769a5557fdSlucy wang - Sun Microsystems - Beijing China 	UNM_HW_CRB_HUB_AGT_ADR_CAM,
2779a5557fdSlucy wang - Sun Microsystems - Beijing China 	0,
2789a5557fdSlucy wang - Sun Microsystems - Beijing China 	0,
2799a5557fdSlucy wang - Sun Microsystems - Beijing China 	0,
2809a5557fdSlucy wang - Sun Microsystems - Beijing China 	0,
2819a5557fdSlucy wang - Sun Microsystems - Beijing China 	0,
2829a5557fdSlucy wang - Sun Microsystems - Beijing China 	UNM_HW_CRB_HUB_AGT_ADR_TIMR,
2839a5557fdSlucy wang - Sun Microsystems - Beijing China 	0,
2849a5557fdSlucy wang - Sun Microsystems - Beijing China 	UNM_HW_CRB_HUB_AGT_ADR_RPMX1,
2859a5557fdSlucy wang - Sun Microsystems - Beijing China 	UNM_HW_CRB_HUB_AGT_ADR_RPMX2,
2869a5557fdSlucy wang - Sun Microsystems - Beijing China 	UNM_HW_CRB_HUB_AGT_ADR_RPMX3,
2879a5557fdSlucy wang - Sun Microsystems - Beijing China 	UNM_HW_CRB_HUB_AGT_ADR_RPMX4,
2889a5557fdSlucy wang - Sun Microsystems - Beijing China 	UNM_HW_CRB_HUB_AGT_ADR_RPMX5,
2899a5557fdSlucy wang - Sun Microsystems - Beijing China 	UNM_HW_CRB_HUB_AGT_ADR_RPMX6,
2909a5557fdSlucy wang - Sun Microsystems - Beijing China 	UNM_HW_CRB_HUB_AGT_ADR_RPMX7,
2919a5557fdSlucy wang - Sun Microsystems - Beijing China 	UNM_HW_CRB_HUB_AGT_ADR_XDMA,
2929a5557fdSlucy wang - Sun Microsystems - Beijing China 	UNM_HW_CRB_HUB_AGT_ADR_I2Q,
2939a5557fdSlucy wang - Sun Microsystems - Beijing China 	UNM_HW_CRB_HUB_AGT_ADR_ROMUSB,
2949a5557fdSlucy wang - Sun Microsystems - Beijing China 	0,
2959a5557fdSlucy wang - Sun Microsystems - Beijing China 	UNM_HW_CRB_HUB_AGT_ADR_RPMX0,
2969a5557fdSlucy wang - Sun Microsystems - Beijing China 	UNM_HW_CRB_HUB_AGT_ADR_RPMX8,
2979a5557fdSlucy wang - Sun Microsystems - Beijing China 	UNM_HW_CRB_HUB_AGT_ADR_RPMX9,
2989a5557fdSlucy wang - Sun Microsystems - Beijing China 	UNM_HW_CRB_HUB_AGT_ADR_OCM0,
2999a5557fdSlucy wang - Sun Microsystems - Beijing China 	0,
3009a5557fdSlucy wang - Sun Microsystems - Beijing China 	UNM_HW_CRB_HUB_AGT_ADR_SMB,
3019a5557fdSlucy wang - Sun Microsystems - Beijing China 	UNM_HW_CRB_HUB_AGT_ADR_I2C0,
3029a5557fdSlucy wang - Sun Microsystems - Beijing China 	UNM_HW_CRB_HUB_AGT_ADR_I2C1,
3039a5557fdSlucy wang - Sun Microsystems - Beijing China 	0,
3049a5557fdSlucy wang - Sun Microsystems - Beijing China 	UNM_HW_CRB_HUB_AGT_ADR_PGNC,
3059a5557fdSlucy wang - Sun Microsystems - Beijing China 	0,
3069a5557fdSlucy wang - Sun Microsystems - Beijing China };
3079a5557fdSlucy wang - Sun Microsystems - Beijing China 
3089a5557fdSlucy wang - Sun Microsystems - Beijing China #define	CRB_WIN_LOCK_TIMEOUT 100000000
3099a5557fdSlucy wang - Sun Microsystems - Beijing China 
3109a5557fdSlucy wang - Sun Microsystems - Beijing China static void
crb_win_lock(struct unm_adapter_s * adapter)3119a5557fdSlucy wang - Sun Microsystems - Beijing China crb_win_lock(struct unm_adapter_s *adapter)
3129a5557fdSlucy wang - Sun Microsystems - Beijing China {
3139a5557fdSlucy wang - Sun Microsystems - Beijing China 	int i;
3149a5557fdSlucy wang - Sun Microsystems - Beijing China 	int done = 0, timeout = 0;
3159a5557fdSlucy wang - Sun Microsystems - Beijing China 
3169a5557fdSlucy wang - Sun Microsystems - Beijing China 	while (!done) {
3179a5557fdSlucy wang - Sun Microsystems - Beijing China 		/* acquire semaphore3 from PCI HW block */
3189a5557fdSlucy wang - Sun Microsystems - Beijing China 		adapter->unm_nic_hw_read_wx(adapter,
3199a5557fdSlucy wang - Sun Microsystems - Beijing China 		    UNM_PCIE_REG(PCIE_SEM7_LOCK), &done, 4);
3209a5557fdSlucy wang - Sun Microsystems - Beijing China 		if (done == 1)
3219a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
3229a5557fdSlucy wang - Sun Microsystems - Beijing China 		if (timeout >= CRB_WIN_LOCK_TIMEOUT) {
3239a5557fdSlucy wang - Sun Microsystems - Beijing China 			cmn_err(CE_WARN, "%s%d: crb_win_lock timed out\n",
3249a5557fdSlucy wang - Sun Microsystems - Beijing China 			    adapter->name, adapter->instance);
3259a5557fdSlucy wang - Sun Microsystems - Beijing China 			return;
3269a5557fdSlucy wang - Sun Microsystems - Beijing China 		}
3279a5557fdSlucy wang - Sun Microsystems - Beijing China 		timeout++;
3289a5557fdSlucy wang - Sun Microsystems - Beijing China 		/*
3299a5557fdSlucy wang - Sun Microsystems - Beijing China 		 *  Yield CPU
3309a5557fdSlucy wang - Sun Microsystems - Beijing China 		 */
3311f0a2977SToomas Soome 		for (i = 0; i < 20; i++)
3321f0a2977SToomas Soome 			;
3339a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
3349a5557fdSlucy wang - Sun Microsystems - Beijing China 	adapter->unm_crb_writelit_adapter(adapter, UNM_CRB_WIN_LOCK_ID,
3359a5557fdSlucy wang - Sun Microsystems - Beijing China 	    adapter->portnum);
3369a5557fdSlucy wang - Sun Microsystems - Beijing China }
3379a5557fdSlucy wang - Sun Microsystems - Beijing China 
3389a5557fdSlucy wang - Sun Microsystems - Beijing China static void
crb_win_unlock(struct unm_adapter_s * adapter)3399a5557fdSlucy wang - Sun Microsystems - Beijing China crb_win_unlock(struct unm_adapter_s *adapter)
3409a5557fdSlucy wang - Sun Microsystems - Beijing China {
3419a5557fdSlucy wang - Sun Microsystems - Beijing China 	int	val;
3429a5557fdSlucy wang - Sun Microsystems - Beijing China 
3439a5557fdSlucy wang - Sun Microsystems - Beijing China 	adapter->unm_nic_hw_read_wx(adapter, UNM_PCIE_REG(PCIE_SEM7_UNLOCK),
3449a5557fdSlucy wang - Sun Microsystems - Beijing China 	    &val, 4);
3459a5557fdSlucy wang - Sun Microsystems - Beijing China }
3469a5557fdSlucy wang - Sun Microsystems - Beijing China 
3479a5557fdSlucy wang - Sun Microsystems - Beijing China /*
3489a5557fdSlucy wang - Sun Microsystems - Beijing China  * Changes the CRB window to the specified window.
3499a5557fdSlucy wang - Sun Microsystems - Beijing China  */
3509a5557fdSlucy wang - Sun Microsystems - Beijing China void
unm_nic_pci_change_crbwindow_128M(unm_adapter * adapter,uint32_t wndw)3519a5557fdSlucy wang - Sun Microsystems - Beijing China unm_nic_pci_change_crbwindow_128M(unm_adapter *adapter, uint32_t wndw)
3529a5557fdSlucy wang - Sun Microsystems - Beijing China {
3539a5557fdSlucy wang - Sun Microsystems - Beijing China 	unm_pcix_crb_window_t	window;
3549a5557fdSlucy wang - Sun Microsystems - Beijing China 	unsigned long			offset;
3559a5557fdSlucy wang - Sun Microsystems - Beijing China 	uint32_t				tmp;
3569a5557fdSlucy wang - Sun Microsystems - Beijing China 
3579a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (adapter->curr_window == wndw) {
3589a5557fdSlucy wang - Sun Microsystems - Beijing China 		return;
3599a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
3609a5557fdSlucy wang - Sun Microsystems - Beijing China 
3619a5557fdSlucy wang - Sun Microsystems - Beijing China 	/*
3629a5557fdSlucy wang - Sun Microsystems - Beijing China 	 * Move the CRB window.
3639a5557fdSlucy wang - Sun Microsystems - Beijing China 	 * We need to write to the "direct access" region of PCI
3649a5557fdSlucy wang - Sun Microsystems - Beijing China 	 * to avoid a race condition where the window register has
3659a5557fdSlucy wang - Sun Microsystems - Beijing China 	 * not been successfully written across CRB before the target
3669a5557fdSlucy wang - Sun Microsystems - Beijing China 	 * register address is received by PCI. The direct region bypasses
3679a5557fdSlucy wang - Sun Microsystems - Beijing China 	 * the CRB bus.
3689a5557fdSlucy wang - Sun Microsystems - Beijing China 	 */
3699a5557fdSlucy wang - Sun Microsystems - Beijing China 	offset = PCI_OFFSET_SECOND_RANGE(adapter,
3709a5557fdSlucy wang - Sun Microsystems - Beijing China 	    UNM_PCIX_PH_REG(PCIE_CRB_WINDOW_REG(adapter->ahw.pci_func)));
3719a5557fdSlucy wang - Sun Microsystems - Beijing China 
3729a5557fdSlucy wang - Sun Microsystems - Beijing China 	*(unm_crbword_t *)&window = 0;
3739a5557fdSlucy wang - Sun Microsystems - Beijing China 	window.addrbit = wndw;
3749a5557fdSlucy wang - Sun Microsystems - Beijing China 	UNM_NIC_PCI_WRITE_32(*(unsigned int *)&window, (void*) (offset));
3759a5557fdSlucy wang - Sun Microsystems - Beijing China 	/* MUST make sure window is set before we forge on... */
3769a5557fdSlucy wang - Sun Microsystems - Beijing China 	while ((tmp = UNM_NIC_PCI_READ_32((void*) offset)) !=
3779a5557fdSlucy wang - Sun Microsystems - Beijing China 	    *(uint32_t *)&window) {
3789a5557fdSlucy wang - Sun Microsystems - Beijing China 		cmn_err(CE_WARN, "%s: %s WARNING: CRB window value not "
3799a5557fdSlucy wang - Sun Microsystems - Beijing China 		    "registered properly: 0x%08x.\n",
3809a5557fdSlucy wang - Sun Microsystems - Beijing China 		    unm_nic_driver_name, __FUNCTION__, tmp);
3819a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
3829a5557fdSlucy wang - Sun Microsystems - Beijing China 
3839a5557fdSlucy wang - Sun Microsystems - Beijing China 	adapter->curr_window = wndw;
3849a5557fdSlucy wang - Sun Microsystems - Beijing China }
3859a5557fdSlucy wang - Sun Microsystems - Beijing China 
3869a5557fdSlucy wang - Sun Microsystems - Beijing China 
3879a5557fdSlucy wang - Sun Microsystems - Beijing China /*
3889a5557fdSlucy wang - Sun Microsystems - Beijing China  * Changes the CRB window to the specified window.
3899a5557fdSlucy wang - Sun Microsystems - Beijing China  */
3909a5557fdSlucy wang - Sun Microsystems - Beijing China /* ARGSUSED */
3919a5557fdSlucy wang - Sun Microsystems - Beijing China void
unm_nic_pci_change_crbwindow_2M(unm_adapter * adapter,uint32_t wndw)3929a5557fdSlucy wang - Sun Microsystems - Beijing China unm_nic_pci_change_crbwindow_2M(unm_adapter *adapter, uint32_t wndw)
3939a5557fdSlucy wang - Sun Microsystems - Beijing China {
3949a5557fdSlucy wang - Sun Microsystems - Beijing China }
3959a5557fdSlucy wang - Sun Microsystems - Beijing China 
3969a5557fdSlucy wang - Sun Microsystems - Beijing China 
3979a5557fdSlucy wang - Sun Microsystems - Beijing China uint32_t
unm_nic_get_crbwindow(unm_adapter * adapter)3989a5557fdSlucy wang - Sun Microsystems - Beijing China unm_nic_get_crbwindow(unm_adapter *adapter)
3999a5557fdSlucy wang - Sun Microsystems - Beijing China {
4009a5557fdSlucy wang - Sun Microsystems - Beijing China 	return (adapter->curr_window);
4019a5557fdSlucy wang - Sun Microsystems - Beijing China }
4029a5557fdSlucy wang - Sun Microsystems - Beijing China 
4039a5557fdSlucy wang - Sun Microsystems - Beijing China /*
4049a5557fdSlucy wang - Sun Microsystems - Beijing China  * Return -1 if off is not valid,
4059a5557fdSlucy wang - Sun Microsystems - Beijing China  *	 1 if window access is needed. 'off' is set to offset from
4069a5557fdSlucy wang - Sun Microsystems - Beijing China  *	   CRB space in 128M pci map
4079a5557fdSlucy wang - Sun Microsystems - Beijing China  *	 0 if no window access is needed. 'off' is set to 2M addr
4089a5557fdSlucy wang - Sun Microsystems - Beijing China  * In: 'off' is offset from base in 128M pci map
4099a5557fdSlucy wang - Sun Microsystems - Beijing China  */
4109a5557fdSlucy wang - Sun Microsystems - Beijing China int
unm_nic_pci_get_crb_addr_2M(unm_adapter * adapter,u64 * off,int len)4119a5557fdSlucy wang - Sun Microsystems - Beijing China unm_nic_pci_get_crb_addr_2M(unm_adapter *adapter, u64 *off, int len)
4129a5557fdSlucy wang - Sun Microsystems - Beijing China {
4139a5557fdSlucy wang - Sun Microsystems - Beijing China 	unsigned long end = *off + len;
4149a5557fdSlucy wang - Sun Microsystems - Beijing China 	crb_128M_2M_sub_block_map_t *m;
4159a5557fdSlucy wang - Sun Microsystems - Beijing China 
4169a5557fdSlucy wang - Sun Microsystems - Beijing China 
4179a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (*off >= UNM_CRB_MAX)
4189a5557fdSlucy wang - Sun Microsystems - Beijing China 		return (-1);
4199a5557fdSlucy wang - Sun Microsystems - Beijing China 
4209a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (*off >= UNM_PCI_CAMQM && (end <= UNM_PCI_CAMQM_2M_END)) {
4219a5557fdSlucy wang - Sun Microsystems - Beijing China 		*off = (*off - UNM_PCI_CAMQM) + UNM_PCI_CAMQM_2M_BASE +
4229a5557fdSlucy wang - Sun Microsystems - Beijing China 		    adapter->ahw.pci_base0;
4239a5557fdSlucy wang - Sun Microsystems - Beijing China 		return (0);
4249a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
4259a5557fdSlucy wang - Sun Microsystems - Beijing China 
4269a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (*off < UNM_PCI_CRBSPACE)
4279a5557fdSlucy wang - Sun Microsystems - Beijing China 		return (-1);
4289a5557fdSlucy wang - Sun Microsystems - Beijing China 
4299a5557fdSlucy wang - Sun Microsystems - Beijing China 	*off -= UNM_PCI_CRBSPACE;
4309a5557fdSlucy wang - Sun Microsystems - Beijing China 	end = *off + len;
4319a5557fdSlucy wang - Sun Microsystems - Beijing China 	/*
4329a5557fdSlucy wang - Sun Microsystems - Beijing China 	 * Try direct map
4339a5557fdSlucy wang - Sun Microsystems - Beijing China 	 */
4349a5557fdSlucy wang - Sun Microsystems - Beijing China 
4359a5557fdSlucy wang - Sun Microsystems - Beijing China 	m = &crb_128M_2M_map[CRB_BLK(*off)].sub_block[CRB_SUBBLK(*off)];
4369a5557fdSlucy wang - Sun Microsystems - Beijing China 
4379a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (m->valid && (m->start_128M <= *off) && (m->end_128M >= end)) {
4389a5557fdSlucy wang - Sun Microsystems - Beijing China 		*off = *off + m->start_2M - m->start_128M +
4399a5557fdSlucy wang - Sun Microsystems - Beijing China 		    adapter->ahw.pci_base0;
4409a5557fdSlucy wang - Sun Microsystems - Beijing China 		return (0);
4419a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
4429a5557fdSlucy wang - Sun Microsystems - Beijing China 
4439a5557fdSlucy wang - Sun Microsystems - Beijing China 	/*
4449a5557fdSlucy wang - Sun Microsystems - Beijing China 	 * Not in direct map, use crb window
4459a5557fdSlucy wang - Sun Microsystems - Beijing China 	 */
4469a5557fdSlucy wang - Sun Microsystems - Beijing China 	return (1);
4479a5557fdSlucy wang - Sun Microsystems - Beijing China }
4489a5557fdSlucy wang - Sun Microsystems - Beijing China /*
4499a5557fdSlucy wang - Sun Microsystems - Beijing China  * In: 'off' is offset from CRB space in 128M pci map
4509a5557fdSlucy wang - Sun Microsystems - Beijing China  * Out: 'off' is 2M pci map addr
4519a5557fdSlucy wang - Sun Microsystems - Beijing China  * side effect: lock crb window
4529a5557fdSlucy wang - Sun Microsystems - Beijing China  */
4539a5557fdSlucy wang - Sun Microsystems - Beijing China static void
unm_nic_pci_set_crbwindow_2M(unm_adapter * adapter,u64 * off)4549a5557fdSlucy wang - Sun Microsystems - Beijing China unm_nic_pci_set_crbwindow_2M(unm_adapter *adapter, u64 *off)
4559a5557fdSlucy wang - Sun Microsystems - Beijing China {
4569a5557fdSlucy wang - Sun Microsystems - Beijing China 	u32 win_read;
4579a5557fdSlucy wang - Sun Microsystems - Beijing China 
4589a5557fdSlucy wang - Sun Microsystems - Beijing China 	adapter->crb_win = CRB_HI(*off);
4599a5557fdSlucy wang - Sun Microsystems - Beijing China 	UNM_NIC_PCI_WRITE_32(adapter->crb_win, (void *) (CRB_WINDOW_2M +
4609a5557fdSlucy wang - Sun Microsystems - Beijing China 	    adapter->ahw.pci_base0));
4619a5557fdSlucy wang - Sun Microsystems - Beijing China 	/*
4629a5557fdSlucy wang - Sun Microsystems - Beijing China 	 * Read back value to make sure write has gone through before trying
4639a5557fdSlucy wang - Sun Microsystems - Beijing China 	 * to use it.
4649a5557fdSlucy wang - Sun Microsystems - Beijing China 	 */
4659a5557fdSlucy wang - Sun Microsystems - Beijing China 	win_read = UNM_NIC_PCI_READ_32((void *)
4669a5557fdSlucy wang - Sun Microsystems - Beijing China 	    (CRB_WINDOW_2M + adapter->ahw.pci_base0));
4679a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (win_read != adapter->crb_win) {
4689a5557fdSlucy wang - Sun Microsystems - Beijing China 		cmn_err(CE_WARN, "%s: Written crbwin (0x%x) != Read crbwin "
4699a5557fdSlucy wang - Sun Microsystems - Beijing China 		    "(0x%x), off=0x%llx\n", __FUNCTION__, adapter->crb_win,
4709a5557fdSlucy wang - Sun Microsystems - Beijing China 		    win_read, *off);
4719a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
4729a5557fdSlucy wang - Sun Microsystems - Beijing China 	*off = (*off & MASK(16)) + CRB_INDIRECT_2M +
4739a5557fdSlucy wang - Sun Microsystems - Beijing China 	    adapter->ahw.pci_base0;
4749a5557fdSlucy wang - Sun Microsystems - Beijing China }
4759a5557fdSlucy wang - Sun Microsystems - Beijing China 
4769a5557fdSlucy wang - Sun Microsystems - Beijing China int
unm_nic_hw_write_ioctl_128M(unm_adapter * adapter,u64 off,void * data,int len)4779a5557fdSlucy wang - Sun Microsystems - Beijing China unm_nic_hw_write_ioctl_128M(unm_adapter *adapter, u64 off, void *data, int len)
4789a5557fdSlucy wang - Sun Microsystems - Beijing China {
4799a5557fdSlucy wang - Sun Microsystems - Beijing China 	void		*addr;
4809a5557fdSlucy wang - Sun Microsystems - Beijing China 	u64		offset = off;
4819a5557fdSlucy wang - Sun Microsystems - Beijing China 
4829a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (ADDR_IN_WINDOW1(off)) { // Window 1
4839a5557fdSlucy wang - Sun Microsystems - Beijing China 		addr = CRB_NORMALIZE(adapter, off);
4849a5557fdSlucy wang - Sun Microsystems - Beijing China 		if (!addr) {
4859a5557fdSlucy wang - Sun Microsystems - Beijing China 			offset = CRB_NORMAL(off);
4869a5557fdSlucy wang - Sun Microsystems - Beijing China 			if (adapter->ahw.pci_len0 == 0)
4879a5557fdSlucy wang - Sun Microsystems - Beijing China 				offset -= UNM_PCI_CRBSPACE;
4889a5557fdSlucy wang - Sun Microsystems - Beijing China 			addr = (void *) ((uint8_t *)adapter->ahw.pci_base0 +
4899a5557fdSlucy wang - Sun Microsystems - Beijing China 			    offset);
4909a5557fdSlucy wang - Sun Microsystems - Beijing China 		}
4919a5557fdSlucy wang - Sun Microsystems - Beijing China 		UNM_READ_LOCK(&adapter->adapter_lock);
4929a5557fdSlucy wang - Sun Microsystems - Beijing China 	} else {// Window 0
4939a5557fdSlucy wang - Sun Microsystems - Beijing China 		addr = (void *) (uptr_t)(pci_base_offset(adapter, off));
4949a5557fdSlucy wang - Sun Microsystems - Beijing China 		if (!addr) {
4959a5557fdSlucy wang - Sun Microsystems - Beijing China 			offset = off;
4969a5557fdSlucy wang - Sun Microsystems - Beijing China 			addr = (void *) ((uint8_t *)adapter->ahw.pci_base0 +
4979a5557fdSlucy wang - Sun Microsystems - Beijing China 			    offset);
4989a5557fdSlucy wang - Sun Microsystems - Beijing China 		}
4999a5557fdSlucy wang - Sun Microsystems - Beijing China 		UNM_WRITE_LOCK_IRQS(&adapter->adapter_lock, flags);
5009a5557fdSlucy wang - Sun Microsystems - Beijing China 		unm_nic_pci_change_crbwindow_128M(adapter, 0);
5019a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
5029a5557fdSlucy wang - Sun Microsystems - Beijing China 
5039a5557fdSlucy wang - Sun Microsystems - Beijing China 	switch (len) {
5049a5557fdSlucy wang - Sun Microsystems - Beijing China 		case 1:
5059a5557fdSlucy wang - Sun Microsystems - Beijing China 			UNM_NIC_PCI_WRITE_8 (*(__uint8_t *)data, addr);
5069a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
5079a5557fdSlucy wang - Sun Microsystems - Beijing China 		case 2:
5089a5557fdSlucy wang - Sun Microsystems - Beijing China 			UNM_NIC_PCI_WRITE_16 (*(__uint16_t *)data, addr);
5099a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
5109a5557fdSlucy wang - Sun Microsystems - Beijing China 		case 4:
5119a5557fdSlucy wang - Sun Microsystems - Beijing China 			UNM_NIC_PCI_WRITE_32 (*(__uint32_t *)data, addr);
5129a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
5139a5557fdSlucy wang - Sun Microsystems - Beijing China 		case 8:
5149a5557fdSlucy wang - Sun Microsystems - Beijing China 			UNM_NIC_PCI_WRITE_64 (*(__uint64_t *)data, addr);
5159a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
5169a5557fdSlucy wang - Sun Microsystems - Beijing China 		default:
5179a5557fdSlucy wang - Sun Microsystems - Beijing China #if !defined(NDEBUG)
5189a5557fdSlucy wang - Sun Microsystems - Beijing China 		if ((len & 0x7) != 0)
5199a5557fdSlucy wang - Sun Microsystems - Beijing China 			cmn_err(CE_WARN, "%s: %s len(%d) not multiple of 8.\n",
5209a5557fdSlucy wang - Sun Microsystems - Beijing China 			    unm_nic_driver_name, __FUNCTION__, len);
5219a5557fdSlucy wang - Sun Microsystems - Beijing China #endif
5229a5557fdSlucy wang - Sun Microsystems - Beijing China 		UNM_NIC_HW_BLOCK_WRITE_64(data, addr, (len>>3));
5239a5557fdSlucy wang - Sun Microsystems - Beijing China 		break;
5249a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
5259a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (ADDR_IN_WINDOW1(off)) {// Window 1
5269a5557fdSlucy wang - Sun Microsystems - Beijing China 		UNM_READ_UNLOCK(&adapter->adapter_lock);
5279a5557fdSlucy wang - Sun Microsystems - Beijing China 	} else {// Window 0
5289a5557fdSlucy wang - Sun Microsystems - Beijing China 		unm_nic_pci_change_crbwindow_128M(adapter, 1);
5299a5557fdSlucy wang - Sun Microsystems - Beijing China 		UNM_WRITE_UNLOCK_IRQR(&adapter->adapter_lock, flags);
5309a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
5319a5557fdSlucy wang - Sun Microsystems - Beijing China 
5329a5557fdSlucy wang - Sun Microsystems - Beijing China 	return (0);
5339a5557fdSlucy wang - Sun Microsystems - Beijing China }
5349a5557fdSlucy wang - Sun Microsystems - Beijing China 
5359a5557fdSlucy wang - Sun Microsystems - Beijing China /*
5369a5557fdSlucy wang - Sun Microsystems - Beijing China  * Note : 'len' argument should be either 1, 2, 4, or a multiple of 8.
5379a5557fdSlucy wang - Sun Microsystems - Beijing China  */
5389a5557fdSlucy wang - Sun Microsystems - Beijing China int
unm_nic_hw_write_wx_128M(unm_adapter * adapter,u64 off,void * data,int len)5399a5557fdSlucy wang - Sun Microsystems - Beijing China unm_nic_hw_write_wx_128M(unm_adapter *adapter, u64 off, void *data, int len)
5409a5557fdSlucy wang - Sun Microsystems - Beijing China {
5419a5557fdSlucy wang - Sun Microsystems - Beijing China 	/*
5429a5557fdSlucy wang - Sun Microsystems - Beijing China 	 * This is modified from _unm_nic_hw_write().
5439a5557fdSlucy wang - Sun Microsystems - Beijing China 	 * unm_nic_hw_write does not exist now.
5449a5557fdSlucy wang - Sun Microsystems - Beijing China 	 */
5459a5557fdSlucy wang - Sun Microsystems - Beijing China 
5469a5557fdSlucy wang - Sun Microsystems - Beijing China 	void *addr;
5479a5557fdSlucy wang - Sun Microsystems - Beijing China 
5489a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (ADDR_IN_WINDOW1(off)) {// Window 1
5499a5557fdSlucy wang - Sun Microsystems - Beijing China 		addr = CRB_NORMALIZE(adapter, off);
5509a5557fdSlucy wang - Sun Microsystems - Beijing China 		UNM_READ_LOCK(&adapter->adapter_lock);
5519a5557fdSlucy wang - Sun Microsystems - Beijing China 	} else {// Window 0
5529a5557fdSlucy wang - Sun Microsystems - Beijing China 		addr = (void *) (uptr_t)(pci_base_offset(adapter, off));
5539a5557fdSlucy wang - Sun Microsystems - Beijing China 		UNM_WRITE_LOCK_IRQS(&adapter->adapter_lock, flags);
5549a5557fdSlucy wang - Sun Microsystems - Beijing China 		unm_nic_pci_change_crbwindow_128M(adapter, 0);
5559a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
5569a5557fdSlucy wang - Sun Microsystems - Beijing China 
5579a5557fdSlucy wang - Sun Microsystems - Beijing China 
5589a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (!addr) {
5599a5557fdSlucy wang - Sun Microsystems - Beijing China 		if (ADDR_IN_WINDOW1(off)) {// Window 1
5609a5557fdSlucy wang - Sun Microsystems - Beijing China 			UNM_READ_UNLOCK(&adapter->adapter_lock);
5619a5557fdSlucy wang - Sun Microsystems - Beijing China 		} else {// Window 0
5629a5557fdSlucy wang - Sun Microsystems - Beijing China 			unm_nic_pci_change_crbwindow_128M(adapter, 1);
5639a5557fdSlucy wang - Sun Microsystems - Beijing China 			UNM_WRITE_UNLOCK_IRQR(&adapter->adapter_lock, flags);
5649a5557fdSlucy wang - Sun Microsystems - Beijing China 		}
5659a5557fdSlucy wang - Sun Microsystems - Beijing China 		return (1);
5669a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
5679a5557fdSlucy wang - Sun Microsystems - Beijing China 
5689a5557fdSlucy wang - Sun Microsystems - Beijing China 	switch (len) {
5699a5557fdSlucy wang - Sun Microsystems - Beijing China 		case 1:
5709a5557fdSlucy wang - Sun Microsystems - Beijing China 			UNM_NIC_PCI_WRITE_8 (*(__uint8_t *)data, addr);
5719a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
5729a5557fdSlucy wang - Sun Microsystems - Beijing China 		case 2:
5739a5557fdSlucy wang - Sun Microsystems - Beijing China 			UNM_NIC_PCI_WRITE_16 (*(__uint16_t *)data, addr);
5749a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
5759a5557fdSlucy wang - Sun Microsystems - Beijing China 		case 4:
5769a5557fdSlucy wang - Sun Microsystems - Beijing China 			UNM_NIC_PCI_WRITE_32 (*(__uint32_t *)data, addr);
5779a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
5789a5557fdSlucy wang - Sun Microsystems - Beijing China 		case 8:
5799a5557fdSlucy wang - Sun Microsystems - Beijing China 			UNM_NIC_PCI_WRITE_64 (*(__uint64_t *)data, addr);
5809a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
5819a5557fdSlucy wang - Sun Microsystems - Beijing China 		default:
5829a5557fdSlucy wang - Sun Microsystems - Beijing China #if !defined(NDEBUG)
5839a5557fdSlucy wang - Sun Microsystems - Beijing China 			if ((len & 0x7) != 0)
5849a5557fdSlucy wang - Sun Microsystems - Beijing China 				cmn_err(CE_WARN,
5859a5557fdSlucy wang - Sun Microsystems - Beijing China 				    "%s: %s  len(%d) not multiple of 8.\n",
5869a5557fdSlucy wang - Sun Microsystems - Beijing China 				    unm_nic_driver_name, __FUNCTION__, len);
5879a5557fdSlucy wang - Sun Microsystems - Beijing China #endif
5889a5557fdSlucy wang - Sun Microsystems - Beijing China 			UNM_NIC_HW_BLOCK_WRITE_64(data, addr, (len>>3));
5899a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
5909a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
5919a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (ADDR_IN_WINDOW1(off)) {// Window 1
5929a5557fdSlucy wang - Sun Microsystems - Beijing China 		UNM_READ_UNLOCK(&adapter->adapter_lock);
5939a5557fdSlucy wang - Sun Microsystems - Beijing China 	} else {// Window 0
5949a5557fdSlucy wang - Sun Microsystems - Beijing China 		unm_nic_pci_change_crbwindow_128M(adapter, 1);
5959a5557fdSlucy wang - Sun Microsystems - Beijing China 		UNM_WRITE_UNLOCK_IRQR(&adapter->adapter_lock, flags);
5969a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
5979a5557fdSlucy wang - Sun Microsystems - Beijing China 
5989a5557fdSlucy wang - Sun Microsystems - Beijing China 	return (0);
5999a5557fdSlucy wang - Sun Microsystems - Beijing China }
6009a5557fdSlucy wang - Sun Microsystems - Beijing China 
6019a5557fdSlucy wang - Sun Microsystems - Beijing China /*
6029a5557fdSlucy wang - Sun Microsystems - Beijing China  * Note : only 32-bit writes!
6039a5557fdSlucy wang - Sun Microsystems - Beijing China  */
6049a5557fdSlucy wang - Sun Microsystems - Beijing China void
unm_nic_pci_write_normalize_128M(unm_adapter * adapter,u64 off,u32 data)6059a5557fdSlucy wang - Sun Microsystems - Beijing China unm_nic_pci_write_normalize_128M(unm_adapter *adapter, u64 off, u32 data)
6069a5557fdSlucy wang - Sun Microsystems - Beijing China {
6079a5557fdSlucy wang - Sun Microsystems - Beijing China 	UNM_NIC_PCI_WRITE_32(data, CRB_NORMALIZE(adapter, off));
6089a5557fdSlucy wang - Sun Microsystems - Beijing China }
6099a5557fdSlucy wang - Sun Microsystems - Beijing China 
6109a5557fdSlucy wang - Sun Microsystems - Beijing China /*
6119a5557fdSlucy wang - Sun Microsystems - Beijing China  * Note : only 32-bit reads!
6129a5557fdSlucy wang - Sun Microsystems - Beijing China  */
6139a5557fdSlucy wang - Sun Microsystems - Beijing China u32
unm_nic_pci_read_normalize_128M(unm_adapter * adapter,u64 off)6149a5557fdSlucy wang - Sun Microsystems - Beijing China unm_nic_pci_read_normalize_128M(unm_adapter *adapter, u64 off)
6159a5557fdSlucy wang - Sun Microsystems - Beijing China {
6169a5557fdSlucy wang - Sun Microsystems - Beijing China 	return (UNM_NIC_PCI_READ_32(CRB_NORMALIZE(adapter, off)));
6179a5557fdSlucy wang - Sun Microsystems - Beijing China }
6189a5557fdSlucy wang - Sun Microsystems - Beijing China 
6199a5557fdSlucy wang - Sun Microsystems - Beijing China /*
6209a5557fdSlucy wang - Sun Microsystems - Beijing China  * Note : only 32-bit writes!
6219a5557fdSlucy wang - Sun Microsystems - Beijing China  */
6229a5557fdSlucy wang - Sun Microsystems - Beijing China int
unm_nic_pci_write_immediate_128M(unm_adapter * adapter,u64 off,u32 * data)6239a5557fdSlucy wang - Sun Microsystems - Beijing China unm_nic_pci_write_immediate_128M(unm_adapter *adapter, u64 off, u32 *data)
6249a5557fdSlucy wang - Sun Microsystems - Beijing China {
6259a5557fdSlucy wang - Sun Microsystems - Beijing China 	UNM_NIC_PCI_WRITE_32(*data,
6269a5557fdSlucy wang - Sun Microsystems - Beijing China 	    (void *) (uptr_t)(PCI_OFFSET_SECOND_RANGE(adapter, off)));
6279a5557fdSlucy wang - Sun Microsystems - Beijing China 	return (0);
6289a5557fdSlucy wang - Sun Microsystems - Beijing China }
6299a5557fdSlucy wang - Sun Microsystems - Beijing China 
6309a5557fdSlucy wang - Sun Microsystems - Beijing China /*
6319a5557fdSlucy wang - Sun Microsystems - Beijing China  * Note : only 32-bit reads!
6329a5557fdSlucy wang - Sun Microsystems - Beijing China  */
6339a5557fdSlucy wang - Sun Microsystems - Beijing China int
unm_nic_pci_read_immediate_128M(unm_adapter * adapter,u64 off,u32 * data)6349a5557fdSlucy wang - Sun Microsystems - Beijing China unm_nic_pci_read_immediate_128M(unm_adapter *adapter, u64 off, u32 *data)
6359a5557fdSlucy wang - Sun Microsystems - Beijing China {
6369a5557fdSlucy wang - Sun Microsystems - Beijing China 	*data = UNM_NIC_PCI_READ_32((void *)
6379a5557fdSlucy wang - Sun Microsystems - Beijing China 	    (uptr_t)(pci_base_offset(adapter, off)));
6389a5557fdSlucy wang - Sun Microsystems - Beijing China 	return (0);
6399a5557fdSlucy wang - Sun Microsystems - Beijing China }
6409a5557fdSlucy wang - Sun Microsystems - Beijing China 
6419a5557fdSlucy wang - Sun Microsystems - Beijing China /*
6429a5557fdSlucy wang - Sun Microsystems - Beijing China  * Note : only 32-bit writes!
6439a5557fdSlucy wang - Sun Microsystems - Beijing China  */
6449a5557fdSlucy wang - Sun Microsystems - Beijing China void
unm_nic_pci_write_normalize_2M(unm_adapter * adapter,u64 off,u32 data)6459a5557fdSlucy wang - Sun Microsystems - Beijing China unm_nic_pci_write_normalize_2M(unm_adapter *adapter, u64 off, u32 data)
6469a5557fdSlucy wang - Sun Microsystems - Beijing China {
6479a5557fdSlucy wang - Sun Microsystems - Beijing China 	u32 temp = data;
6489a5557fdSlucy wang - Sun Microsystems - Beijing China 
6499a5557fdSlucy wang - Sun Microsystems - Beijing China 	adapter->unm_nic_hw_write_wx(adapter, off, &temp, 4);
6509a5557fdSlucy wang - Sun Microsystems - Beijing China }
6519a5557fdSlucy wang - Sun Microsystems - Beijing China 
6529a5557fdSlucy wang - Sun Microsystems - Beijing China /*
6539a5557fdSlucy wang - Sun Microsystems - Beijing China  * Note : only 32-bit reads!
6549a5557fdSlucy wang - Sun Microsystems - Beijing China  */
6559a5557fdSlucy wang - Sun Microsystems - Beijing China u32
unm_nic_pci_read_normalize_2M(unm_adapter * adapter,u64 off)6569a5557fdSlucy wang - Sun Microsystems - Beijing China unm_nic_pci_read_normalize_2M(unm_adapter *adapter, u64 off)
6579a5557fdSlucy wang - Sun Microsystems - Beijing China {
6589a5557fdSlucy wang - Sun Microsystems - Beijing China 	u32 temp;
6599a5557fdSlucy wang - Sun Microsystems - Beijing China 
6609a5557fdSlucy wang - Sun Microsystems - Beijing China 	adapter->unm_nic_hw_read_wx(adapter, off, &temp, 4);
6619a5557fdSlucy wang - Sun Microsystems - Beijing China 
6629a5557fdSlucy wang - Sun Microsystems - Beijing China 	return (temp);
6639a5557fdSlucy wang - Sun Microsystems - Beijing China }
6649a5557fdSlucy wang - Sun Microsystems - Beijing China 
6659a5557fdSlucy wang - Sun Microsystems - Beijing China /*
6669a5557fdSlucy wang - Sun Microsystems - Beijing China  * Note : only 32-bit writes!
6679a5557fdSlucy wang - Sun Microsystems - Beijing China  */
6689a5557fdSlucy wang - Sun Microsystems - Beijing China int
unm_nic_pci_write_immediate_2M(unm_adapter * adapter,u64 off,u32 * data)6699a5557fdSlucy wang - Sun Microsystems - Beijing China unm_nic_pci_write_immediate_2M(unm_adapter *adapter, u64 off, u32 *data)
6709a5557fdSlucy wang - Sun Microsystems - Beijing China {
6719a5557fdSlucy wang - Sun Microsystems - Beijing China 	u32 temp = *data;
6729a5557fdSlucy wang - Sun Microsystems - Beijing China 
6739a5557fdSlucy wang - Sun Microsystems - Beijing China 	adapter->unm_nic_hw_write_wx(adapter, off, &temp, 4);
6749a5557fdSlucy wang - Sun Microsystems - Beijing China 
6759a5557fdSlucy wang - Sun Microsystems - Beijing China 	return (0);
6769a5557fdSlucy wang - Sun Microsystems - Beijing China }
6779a5557fdSlucy wang - Sun Microsystems - Beijing China 
6789a5557fdSlucy wang - Sun Microsystems - Beijing China /*
6799a5557fdSlucy wang - Sun Microsystems - Beijing China  * Note : only 32-bit reads!
6809a5557fdSlucy wang - Sun Microsystems - Beijing China  */
6819a5557fdSlucy wang - Sun Microsystems - Beijing China int
unm_nic_pci_read_immediate_2M(unm_adapter * adapter,u64 off,u32 * data)6829a5557fdSlucy wang - Sun Microsystems - Beijing China unm_nic_pci_read_immediate_2M(unm_adapter *adapter, u64 off, u32 *data)
6839a5557fdSlucy wang - Sun Microsystems - Beijing China {
6849a5557fdSlucy wang - Sun Microsystems - Beijing China 	u32 temp;
6859a5557fdSlucy wang - Sun Microsystems - Beijing China 
6869a5557fdSlucy wang - Sun Microsystems - Beijing China 	adapter->unm_nic_hw_read_wx(adapter, off, &temp, 4);
6879a5557fdSlucy wang - Sun Microsystems - Beijing China 
6889a5557fdSlucy wang - Sun Microsystems - Beijing China 	*data = temp;
6899a5557fdSlucy wang - Sun Microsystems - Beijing China 
6909a5557fdSlucy wang - Sun Microsystems - Beijing China 	return (0);
6919a5557fdSlucy wang - Sun Microsystems - Beijing China }
6929a5557fdSlucy wang - Sun Microsystems - Beijing China 
6939a5557fdSlucy wang - Sun Microsystems - Beijing China /*
6949a5557fdSlucy wang - Sun Microsystems - Beijing China  * write cross hw window boundary is not supported
6959a5557fdSlucy wang - Sun Microsystems - Beijing China  * 'len' should be either 1, 2, 4, or multiple of 8
6969a5557fdSlucy wang - Sun Microsystems - Beijing China  */
6979a5557fdSlucy wang - Sun Microsystems - Beijing China int
unm_nic_hw_write_wx_2M(unm_adapter * adapter,u64 off,void * data,int len)6989a5557fdSlucy wang - Sun Microsystems - Beijing China unm_nic_hw_write_wx_2M(unm_adapter *adapter, u64 off, void *data, int len)
6999a5557fdSlucy wang - Sun Microsystems - Beijing China {
7009a5557fdSlucy wang - Sun Microsystems - Beijing China 	int rv;
7019a5557fdSlucy wang - Sun Microsystems - Beijing China 
7029a5557fdSlucy wang - Sun Microsystems - Beijing China 	rv = unm_nic_pci_get_crb_addr_2M(adapter, &off, len);
7039a5557fdSlucy wang - Sun Microsystems - Beijing China 
7049a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (rv == -1) {
7059a5557fdSlucy wang - Sun Microsystems - Beijing China 		cmn_err(CE_PANIC, "%s: invalid offset: 0x%016llx\n",
7069a5557fdSlucy wang - Sun Microsystems - Beijing China 		    __FUNCTION__, off);
7079a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
7089a5557fdSlucy wang - Sun Microsystems - Beijing China 
7099a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (rv == 1) {
7109a5557fdSlucy wang - Sun Microsystems - Beijing China 		UNM_WRITE_LOCK_IRQS(&adapter->adapter_lock, flags);
7119a5557fdSlucy wang - Sun Microsystems - Beijing China 		crb_win_lock(adapter);
7129a5557fdSlucy wang - Sun Microsystems - Beijing China 		unm_nic_pci_set_crbwindow_2M(adapter, &off);
7139a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
7149a5557fdSlucy wang - Sun Microsystems - Beijing China 
7159a5557fdSlucy wang - Sun Microsystems - Beijing China 	switch (len) {
7169a5557fdSlucy wang - Sun Microsystems - Beijing China 	case 1:
7179a5557fdSlucy wang - Sun Microsystems - Beijing China 		UNM_NIC_PCI_WRITE_8(*(__uint8_t *)data, (void *) (uptr_t)off);
7189a5557fdSlucy wang - Sun Microsystems - Beijing China 		break;
7199a5557fdSlucy wang - Sun Microsystems - Beijing China 	case 2:
7209a5557fdSlucy wang - Sun Microsystems - Beijing China 		UNM_NIC_PCI_WRITE_16(*(__uint16_t *)data, (void *) (uptr_t)off);
7219a5557fdSlucy wang - Sun Microsystems - Beijing China 		break;
7229a5557fdSlucy wang - Sun Microsystems - Beijing China 	case 4:
7239a5557fdSlucy wang - Sun Microsystems - Beijing China 		UNM_NIC_PCI_WRITE_32(*(__uint32_t *)data, (void *) (uptr_t)off);
7249a5557fdSlucy wang - Sun Microsystems - Beijing China 		break;
7259a5557fdSlucy wang - Sun Microsystems - Beijing China 	case 8:
7269a5557fdSlucy wang - Sun Microsystems - Beijing China 		UNM_NIC_PCI_WRITE_64(*(__uint64_t *)data, (void *) (uptr_t)off);
7279a5557fdSlucy wang - Sun Microsystems - Beijing China 		break;
7289a5557fdSlucy wang - Sun Microsystems - Beijing China 	default:
7299a5557fdSlucy wang - Sun Microsystems - Beijing China #if !defined(NDEBUG)
7309a5557fdSlucy wang - Sun Microsystems - Beijing China 		if ((len & 0x7) != 0)
7319a5557fdSlucy wang - Sun Microsystems - Beijing China 			cmn_err(CE_WARN, "%s: %s  len(%d) not multiple of 8.\n",
7329a5557fdSlucy wang - Sun Microsystems - Beijing China 			    unm_nic_driver_name, __FUNCTION__, len);
7339a5557fdSlucy wang - Sun Microsystems - Beijing China #endif
7349a5557fdSlucy wang - Sun Microsystems - Beijing China 		UNM_NIC_HW_BLOCK_WRITE_64(data, (uptr_t)off, (len>>3));
7359a5557fdSlucy wang - Sun Microsystems - Beijing China 		break;
7369a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
7379a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (rv == 1) {
7389a5557fdSlucy wang - Sun Microsystems - Beijing China 		crb_win_unlock(adapter);
7399a5557fdSlucy wang - Sun Microsystems - Beijing China 		UNM_WRITE_UNLOCK_IRQR(&adapter->adapter_lock, flags);
7409a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
7419a5557fdSlucy wang - Sun Microsystems - Beijing China 
7429a5557fdSlucy wang - Sun Microsystems - Beijing China 	return (0);
7439a5557fdSlucy wang - Sun Microsystems - Beijing China }
7449a5557fdSlucy wang - Sun Microsystems - Beijing China 
7459a5557fdSlucy wang - Sun Microsystems - Beijing China int
unm_nic_hw_read_ioctl_128M(unm_adapter * adapter,u64 off,void * data,int len)7469a5557fdSlucy wang - Sun Microsystems - Beijing China unm_nic_hw_read_ioctl_128M(unm_adapter *adapter, u64 off, void *data, int len)
7479a5557fdSlucy wang - Sun Microsystems - Beijing China {
7489a5557fdSlucy wang - Sun Microsystems - Beijing China 	void		*addr;
7499a5557fdSlucy wang - Sun Microsystems - Beijing China 	u64		offset;
7509a5557fdSlucy wang - Sun Microsystems - Beijing China 
7519a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (ADDR_IN_WINDOW1(off)) {// Window 1
7529a5557fdSlucy wang - Sun Microsystems - Beijing China 		addr = CRB_NORMALIZE(adapter, off);
7539a5557fdSlucy wang - Sun Microsystems - Beijing China 		if (!addr) {
7549a5557fdSlucy wang - Sun Microsystems - Beijing China 			offset = CRB_NORMAL(off);
7559a5557fdSlucy wang - Sun Microsystems - Beijing China 			if (adapter->ahw.pci_len0 == 0)
7569a5557fdSlucy wang - Sun Microsystems - Beijing China 				offset -= UNM_PCI_CRBSPACE;
7579a5557fdSlucy wang - Sun Microsystems - Beijing China 			addr = (void *) ((uint8_t *)adapter->ahw.pci_base0 +
7589a5557fdSlucy wang - Sun Microsystems - Beijing China 			    offset);
7599a5557fdSlucy wang - Sun Microsystems - Beijing China 		}
7609a5557fdSlucy wang - Sun Microsystems - Beijing China 		UNM_READ_LOCK(&adapter->adapter_lock);
7619a5557fdSlucy wang - Sun Microsystems - Beijing China 	} else {// Window 0
7629a5557fdSlucy wang - Sun Microsystems - Beijing China 		addr = (void *) (uptr_t)(pci_base_offset(adapter, off));
7639a5557fdSlucy wang - Sun Microsystems - Beijing China 		if (!addr) {
7649a5557fdSlucy wang - Sun Microsystems - Beijing China 			offset = off;
7659a5557fdSlucy wang - Sun Microsystems - Beijing China 			addr = (void *) ((uint8_t *)adapter->ahw.pci_base0 +
7669a5557fdSlucy wang - Sun Microsystems - Beijing China 			    offset);
7679a5557fdSlucy wang - Sun Microsystems - Beijing China 		}
7689a5557fdSlucy wang - Sun Microsystems - Beijing China 		UNM_WRITE_LOCK_IRQS(&adapter->adapter_lock, flags);
7699a5557fdSlucy wang - Sun Microsystems - Beijing China 		unm_nic_pci_change_crbwindow_128M(adapter, 0);
7709a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
7719a5557fdSlucy wang - Sun Microsystems - Beijing China 
7729a5557fdSlucy wang - Sun Microsystems - Beijing China 	switch (len) {
7739a5557fdSlucy wang - Sun Microsystems - Beijing China 	case 1:
7749a5557fdSlucy wang - Sun Microsystems - Beijing China 		*(__uint8_t  *)data = UNM_NIC_PCI_READ_8(addr);
7759a5557fdSlucy wang - Sun Microsystems - Beijing China 		break;
7769a5557fdSlucy wang - Sun Microsystems - Beijing China 	case 2:
7779a5557fdSlucy wang - Sun Microsystems - Beijing China 		*(__uint16_t *)data = UNM_NIC_PCI_READ_16(addr);
7789a5557fdSlucy wang - Sun Microsystems - Beijing China 		break;
7799a5557fdSlucy wang - Sun Microsystems - Beijing China 	case 4:
7809a5557fdSlucy wang - Sun Microsystems - Beijing China 		*(__uint32_t *)data = UNM_NIC_PCI_READ_32(addr);
7819a5557fdSlucy wang - Sun Microsystems - Beijing China 		break;
7829a5557fdSlucy wang - Sun Microsystems - Beijing China 	case 8:
7839a5557fdSlucy wang - Sun Microsystems - Beijing China 		*(__uint64_t *)data = UNM_NIC_PCI_READ_64(addr);
7849a5557fdSlucy wang - Sun Microsystems - Beijing China 		break;
7859a5557fdSlucy wang - Sun Microsystems - Beijing China 	default:
7869a5557fdSlucy wang - Sun Microsystems - Beijing China #if !defined(NDEBUG)
7879a5557fdSlucy wang - Sun Microsystems - Beijing China 		if ((len & 0x7) != 0)
7889a5557fdSlucy wang - Sun Microsystems - Beijing China 			cmn_err(CE_WARN, "%s: %s len(%d) not multiple of 8.\n",
7899a5557fdSlucy wang - Sun Microsystems - Beijing China 			    unm_nic_driver_name, __FUNCTION__, len);
7909a5557fdSlucy wang - Sun Microsystems - Beijing China #endif
7919a5557fdSlucy wang - Sun Microsystems - Beijing China 		UNM_NIC_HW_BLOCK_READ_64(data, addr, (len>>3));
7929a5557fdSlucy wang - Sun Microsystems - Beijing China 		break;
7939a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
7949a5557fdSlucy wang - Sun Microsystems - Beijing China 
7959a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (ADDR_IN_WINDOW1(off)) {// Window 1
7969a5557fdSlucy wang - Sun Microsystems - Beijing China 		UNM_READ_UNLOCK(&adapter->adapter_lock);
7979a5557fdSlucy wang - Sun Microsystems - Beijing China 	} else {// Window 0
7989a5557fdSlucy wang - Sun Microsystems - Beijing China 		unm_nic_pci_change_crbwindow_128M(adapter, 1);
7999a5557fdSlucy wang - Sun Microsystems - Beijing China 		UNM_WRITE_UNLOCK_IRQR(&adapter->adapter_lock, flags);
8009a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
8019a5557fdSlucy wang - Sun Microsystems - Beijing China 
8029a5557fdSlucy wang - Sun Microsystems - Beijing China 	return (0);
8039a5557fdSlucy wang - Sun Microsystems - Beijing China }
8049a5557fdSlucy wang - Sun Microsystems - Beijing China 
8059a5557fdSlucy wang - Sun Microsystems - Beijing China int
unm_nic_hw_read_wx_2M(unm_adapter * adapter,u64 off,void * data,int len)8069a5557fdSlucy wang - Sun Microsystems - Beijing China unm_nic_hw_read_wx_2M(unm_adapter *adapter, u64 off, void *data, int len)
8079a5557fdSlucy wang - Sun Microsystems - Beijing China {
8089a5557fdSlucy wang - Sun Microsystems - Beijing China 	int rv;
8099a5557fdSlucy wang - Sun Microsystems - Beijing China 
8109a5557fdSlucy wang - Sun Microsystems - Beijing China 	rv = unm_nic_pci_get_crb_addr_2M(adapter, &off, len);
8119a5557fdSlucy wang - Sun Microsystems - Beijing China 
8129a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (rv == -1) {
8139a5557fdSlucy wang - Sun Microsystems - Beijing China 		cmn_err(CE_PANIC, "%s: invalid offset: 0x%016llx\n",
8149a5557fdSlucy wang - Sun Microsystems - Beijing China 		    __FUNCTION__, off);
8159a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
8169a5557fdSlucy wang - Sun Microsystems - Beijing China 
8179a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (rv == 1) {
8189a5557fdSlucy wang - Sun Microsystems - Beijing China 		UNM_WRITE_LOCK_IRQS(&adapter->adapter_lock, flags);
8199a5557fdSlucy wang - Sun Microsystems - Beijing China 		crb_win_lock(adapter);
8209a5557fdSlucy wang - Sun Microsystems - Beijing China 		unm_nic_pci_set_crbwindow_2M(adapter, &off);
8219a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
8229a5557fdSlucy wang - Sun Microsystems - Beijing China 
8239a5557fdSlucy wang - Sun Microsystems - Beijing China 	switch (len) {
8249a5557fdSlucy wang - Sun Microsystems - Beijing China 	case 1:
8259a5557fdSlucy wang - Sun Microsystems - Beijing China 		*(__uint8_t  *)data = UNM_NIC_PCI_READ_8((void *) (uptr_t)off);
8269a5557fdSlucy wang - Sun Microsystems - Beijing China 		break;
8279a5557fdSlucy wang - Sun Microsystems - Beijing China 	case 2:
8289a5557fdSlucy wang - Sun Microsystems - Beijing China 		*(__uint16_t *)data = UNM_NIC_PCI_READ_16((void *) (uptr_t)off);
8299a5557fdSlucy wang - Sun Microsystems - Beijing China 		break;
8309a5557fdSlucy wang - Sun Microsystems - Beijing China 	case 4:
8319a5557fdSlucy wang - Sun Microsystems - Beijing China 		*(__uint32_t *)data = UNM_NIC_PCI_READ_32((void *) (uptr_t)off);
8329a5557fdSlucy wang - Sun Microsystems - Beijing China 		break;
8339a5557fdSlucy wang - Sun Microsystems - Beijing China 	case 8:
8349a5557fdSlucy wang - Sun Microsystems - Beijing China 		*(__uint64_t *)data = UNM_NIC_PCI_READ_64((void *) (uptr_t)off);
8359a5557fdSlucy wang - Sun Microsystems - Beijing China 		break;
8369a5557fdSlucy wang - Sun Microsystems - Beijing China 	default:
8379a5557fdSlucy wang - Sun Microsystems - Beijing China #if !defined(NDEBUG)
8389a5557fdSlucy wang - Sun Microsystems - Beijing China 		if ((len & 0x7) != 0)
8399a5557fdSlucy wang - Sun Microsystems - Beijing China 			cmn_err(CE_WARN, "%s: %s len(%d) not multiple of 8.\n",
8409a5557fdSlucy wang - Sun Microsystems - Beijing China 			    unm_nic_driver_name, __FUNCTION__, len);
8419a5557fdSlucy wang - Sun Microsystems - Beijing China #endif
8429a5557fdSlucy wang - Sun Microsystems - Beijing China 		UNM_NIC_HW_BLOCK_READ_64(data, (void *) (uptr_t)off, (len>>3));
8439a5557fdSlucy wang - Sun Microsystems - Beijing China 		break;
8449a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
8459a5557fdSlucy wang - Sun Microsystems - Beijing China 
8469a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (rv == 1) {
8479a5557fdSlucy wang - Sun Microsystems - Beijing China 		crb_win_unlock(adapter);
8489a5557fdSlucy wang - Sun Microsystems - Beijing China 		UNM_WRITE_UNLOCK_IRQR(&adapter->adapter_lock, flags);
8499a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
8509a5557fdSlucy wang - Sun Microsystems - Beijing China 
8519a5557fdSlucy wang - Sun Microsystems - Beijing China 	return (0);
8529a5557fdSlucy wang - Sun Microsystems - Beijing China }
8539a5557fdSlucy wang - Sun Microsystems - Beijing China 
8549a5557fdSlucy wang - Sun Microsystems - Beijing China int
unm_nic_hw_read_wx_128M(unm_adapter * adapter,u64 off,void * data,int len)8559a5557fdSlucy wang - Sun Microsystems - Beijing China unm_nic_hw_read_wx_128M(unm_adapter *adapter, u64 off, void *data, int len)
8569a5557fdSlucy wang - Sun Microsystems - Beijing China {
8579a5557fdSlucy wang - Sun Microsystems - Beijing China 	void *addr;
8589a5557fdSlucy wang - Sun Microsystems - Beijing China 
8599a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (ADDR_IN_WINDOW1(off)) {
8609a5557fdSlucy wang - Sun Microsystems - Beijing China 		// Window 1
8619a5557fdSlucy wang - Sun Microsystems - Beijing China 		addr = CRB_NORMALIZE(adapter, off);
8629a5557fdSlucy wang - Sun Microsystems - Beijing China 		UNM_READ_LOCK(&adapter->adapter_lock);
8639a5557fdSlucy wang - Sun Microsystems - Beijing China 	} else {// Window 0
8649a5557fdSlucy wang - Sun Microsystems - Beijing China 		addr = (void *) (uptr_t)(pci_base_offset(adapter, off));
8659a5557fdSlucy wang - Sun Microsystems - Beijing China 		UNM_WRITE_LOCK_IRQS(&adapter->adapter_lock, flags);
8669a5557fdSlucy wang - Sun Microsystems - Beijing China 		unm_nic_pci_change_crbwindow_128M(adapter, 0);
8679a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
8689a5557fdSlucy wang - Sun Microsystems - Beijing China 
8699a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (!addr) {
8709a5557fdSlucy wang - Sun Microsystems - Beijing China 		if (ADDR_IN_WINDOW1(off)) {// Window 1
8719a5557fdSlucy wang - Sun Microsystems - Beijing China 			UNM_READ_UNLOCK(&adapter->adapter_lock);
8729a5557fdSlucy wang - Sun Microsystems - Beijing China 		} else {// Window 0
8739a5557fdSlucy wang - Sun Microsystems - Beijing China 			unm_nic_pci_change_crbwindow_128M(adapter, 1);
8749a5557fdSlucy wang - Sun Microsystems - Beijing China 			UNM_WRITE_UNLOCK_IRQR(&adapter->adapter_lock, flags);
8759a5557fdSlucy wang - Sun Microsystems - Beijing China 		}
8769a5557fdSlucy wang - Sun Microsystems - Beijing China 		return (1);
8779a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
8789a5557fdSlucy wang - Sun Microsystems - Beijing China 
8799a5557fdSlucy wang - Sun Microsystems - Beijing China 	switch (len) {
8809a5557fdSlucy wang - Sun Microsystems - Beijing China 		case 1:
8819a5557fdSlucy wang - Sun Microsystems - Beijing China 			*(__uint8_t  *)data = UNM_NIC_PCI_READ_8(addr);
8829a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
8839a5557fdSlucy wang - Sun Microsystems - Beijing China 		case 2:
8849a5557fdSlucy wang - Sun Microsystems - Beijing China 			*(__uint16_t *)data = UNM_NIC_PCI_READ_16(addr);
8859a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
8869a5557fdSlucy wang - Sun Microsystems - Beijing China 		case 4:
8879a5557fdSlucy wang - Sun Microsystems - Beijing China 			*(__uint32_t *)data = UNM_NIC_PCI_READ_32(addr);
8889a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
8899a5557fdSlucy wang - Sun Microsystems - Beijing China 		case 8:
8909a5557fdSlucy wang - Sun Microsystems - Beijing China 			*(__uint64_t *)data = UNM_NIC_PCI_READ_64(addr);
8919a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
8929a5557fdSlucy wang - Sun Microsystems - Beijing China 		default:
8939a5557fdSlucy wang - Sun Microsystems - Beijing China #if !defined(NDEBUG)
8949a5557fdSlucy wang - Sun Microsystems - Beijing China 			if ((len & 0x7) != 0)
8959a5557fdSlucy wang - Sun Microsystems - Beijing China 				cmn_err(CE_WARN,
8969a5557fdSlucy wang - Sun Microsystems - Beijing China 				    "%s: %s len(%d) not multiple of 8.\n",
8979a5557fdSlucy wang - Sun Microsystems - Beijing China 				    unm_nic_driver_name, __FUNCTION__, len);
8989a5557fdSlucy wang - Sun Microsystems - Beijing China #endif
8999a5557fdSlucy wang - Sun Microsystems - Beijing China 			UNM_NIC_HW_BLOCK_READ_64(data, addr, (len>>3));
9009a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
9019a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
9029a5557fdSlucy wang - Sun Microsystems - Beijing China 
9039a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (ADDR_IN_WINDOW1(off)) {// Window 1
9049a5557fdSlucy wang - Sun Microsystems - Beijing China 		UNM_READ_UNLOCK(&adapter->adapter_lock);
9059a5557fdSlucy wang - Sun Microsystems - Beijing China 	} else {// Window 0
9069a5557fdSlucy wang - Sun Microsystems - Beijing China 		unm_nic_pci_change_crbwindow_128M(adapter, 1);
9079a5557fdSlucy wang - Sun Microsystems - Beijing China 		UNM_WRITE_UNLOCK_IRQR(&adapter->adapter_lock, flags);
9089a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
9099a5557fdSlucy wang - Sun Microsystems - Beijing China 
9109a5557fdSlucy wang - Sun Microsystems - Beijing China 	return (0);
9119a5557fdSlucy wang - Sun Microsystems - Beijing China }
9129a5557fdSlucy wang - Sun Microsystems - Beijing China 
9139a5557fdSlucy wang - Sun Microsystems - Beijing China /*  PCI Windowing for DDR regions.  */
9149a5557fdSlucy wang - Sun Microsystems - Beijing China #define	ADDR_IN_RANGE(addr, low, high)	    \
9159a5557fdSlucy wang - Sun Microsystems - Beijing China 	(((addr) <= (high)) && ((low) ? ((addr) >= (low)) : 1))
9169a5557fdSlucy wang - Sun Microsystems - Beijing China 
9179a5557fdSlucy wang - Sun Microsystems - Beijing China /*
9189a5557fdSlucy wang - Sun Microsystems - Beijing China  * check memory access boundary.
9199a5557fdSlucy wang - Sun Microsystems - Beijing China  * used by test agent. support ddr access only for now
9209a5557fdSlucy wang - Sun Microsystems - Beijing China  */
9219a5557fdSlucy wang - Sun Microsystems - Beijing China /* ARGSUSED */
9229a5557fdSlucy wang - Sun Microsystems - Beijing China static unsigned long
unm_nic_pci_mem_bound_check(struct unm_adapter_s * adapter,unsigned long long addr,int size)9239a5557fdSlucy wang - Sun Microsystems - Beijing China unm_nic_pci_mem_bound_check(struct unm_adapter_s *adapter,
9249a5557fdSlucy wang - Sun Microsystems - Beijing China     unsigned long long addr, int size)
9259a5557fdSlucy wang - Sun Microsystems - Beijing China {
9269a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (!ADDR_IN_RANGE(addr, UNM_ADDR_DDR_NET, UNM_ADDR_DDR_NET_MAX) ||
9279a5557fdSlucy wang - Sun Microsystems - Beijing China 	    !ADDR_IN_RANGE(addr + size -1, UNM_ADDR_DDR_NET,
9289a5557fdSlucy wang - Sun Microsystems - Beijing China 	    UNM_ADDR_DDR_NET_MAX) || ((size != 1) && (size != 2) &&
9299a5557fdSlucy wang - Sun Microsystems - Beijing China 	    (size != 4) && (size != 8)))
9309a5557fdSlucy wang - Sun Microsystems - Beijing China 		return (0);
9319a5557fdSlucy wang - Sun Microsystems - Beijing China 
9329a5557fdSlucy wang - Sun Microsystems - Beijing China 	return (1);
9339a5557fdSlucy wang - Sun Microsystems - Beijing China }
9349a5557fdSlucy wang - Sun Microsystems - Beijing China 
9359a5557fdSlucy wang - Sun Microsystems - Beijing China int unm_pci_set_window_warning_count = 0;
9369a5557fdSlucy wang - Sun Microsystems - Beijing China 
9379a5557fdSlucy wang - Sun Microsystems - Beijing China unsigned long long
unm_nic_pci_set_window_128M(struct unm_adapter_s * adapter,unsigned long long addr)9389a5557fdSlucy wang - Sun Microsystems - Beijing China unm_nic_pci_set_window_128M(struct unm_adapter_s *adapter,
9399a5557fdSlucy wang - Sun Microsystems - Beijing China     unsigned long long addr)
9409a5557fdSlucy wang - Sun Microsystems - Beijing China {
9419a5557fdSlucy wang - Sun Microsystems - Beijing China 	int		window;
9429a5557fdSlucy wang - Sun Microsystems - Beijing China 	unsigned long long	qdr_max;
9439a5557fdSlucy wang - Sun Microsystems - Beijing China 
9449a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) {
9459a5557fdSlucy wang - Sun Microsystems - Beijing China 		qdr_max = NX_P2_ADDR_QDR_NET_MAX;
9469a5557fdSlucy wang - Sun Microsystems - Beijing China 	} else {
9479a5557fdSlucy wang - Sun Microsystems - Beijing China 		qdr_max = NX_P3_ADDR_QDR_NET_MAX;
9489a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
9499a5557fdSlucy wang - Sun Microsystems - Beijing China 
9509a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (ADDR_IN_RANGE(addr, UNM_ADDR_DDR_NET, UNM_ADDR_DDR_NET_MAX)) {
9519a5557fdSlucy wang - Sun Microsystems - Beijing China 		/* DDR network side */
9529a5557fdSlucy wang - Sun Microsystems - Beijing China 		/* MN access should never come here */
9539a5557fdSlucy wang - Sun Microsystems - Beijing China 		cmn_err(CE_PANIC, "%s\n", __FUNCTION__);
9549a5557fdSlucy wang - Sun Microsystems - Beijing China 	} else if (ADDR_IN_RANGE(addr, UNM_ADDR_OCM0, UNM_ADDR_OCM0_MAX)) {
9559a5557fdSlucy wang - Sun Microsystems - Beijing China 		addr -= UNM_ADDR_OCM0;
9569a5557fdSlucy wang - Sun Microsystems - Beijing China 		addr += UNM_PCI_OCM0;
9579a5557fdSlucy wang - Sun Microsystems - Beijing China 	} else if (ADDR_IN_RANGE(addr, UNM_ADDR_OCM1, UNM_ADDR_OCM1_MAX)) {
9589a5557fdSlucy wang - Sun Microsystems - Beijing China 		addr -= UNM_ADDR_OCM1;
9599a5557fdSlucy wang - Sun Microsystems - Beijing China 		addr += UNM_PCI_OCM1;
9609a5557fdSlucy wang - Sun Microsystems - Beijing China 	} else if (ADDR_IN_RANGE(addr, UNM_ADDR_QDR_NET, qdr_max)) {
9619a5557fdSlucy wang - Sun Microsystems - Beijing China 		/* QDR network side */
9629a5557fdSlucy wang - Sun Microsystems - Beijing China 		addr -= UNM_ADDR_QDR_NET;
9639a5557fdSlucy wang - Sun Microsystems - Beijing China 		window = (addr >> 22) & 0x3f;
9649a5557fdSlucy wang - Sun Microsystems - Beijing China 		if (adapter->ahw.qdr_sn_window != window) {
9659a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->ahw.qdr_sn_window = window;
9669a5557fdSlucy wang - Sun Microsystems - Beijing China 			UNM_NIC_PCI_WRITE_32((window << 22),
9679a5557fdSlucy wang - Sun Microsystems - Beijing China 			    (void *) (uptr_t)(PCI_OFFSET_SECOND_RANGE(adapter,
9689a5557fdSlucy wang - Sun Microsystems - Beijing China 			    UNM_PCIX_PH_REG(PCIE_SN_WINDOW_REG(
9699a5557fdSlucy wang - Sun Microsystems - Beijing China 			    adapter->ahw.pci_func)))));
9709a5557fdSlucy wang - Sun Microsystems - Beijing China 			/* MUST make sure window is set before we forge on... */
9719a5557fdSlucy wang - Sun Microsystems - Beijing China 			(void) UNM_NIC_PCI_READ_32((void *)
9729a5557fdSlucy wang - Sun Microsystems - Beijing China 			    (uptr_t)(PCI_OFFSET_SECOND_RANGE(adapter,
9739a5557fdSlucy wang - Sun Microsystems - Beijing China 			    UNM_PCIX_PH_REG(PCIE_SN_WINDOW_REG(
9749a5557fdSlucy wang - Sun Microsystems - Beijing China 			    adapter->ahw.pci_func)))));
9759a5557fdSlucy wang - Sun Microsystems - Beijing China 		}
9769a5557fdSlucy wang - Sun Microsystems - Beijing China 		addr -= (window * 0x400000);
9779a5557fdSlucy wang - Sun Microsystems - Beijing China 		addr += UNM_PCI_QDR_NET;
9789a5557fdSlucy wang - Sun Microsystems - Beijing China 	} else {
9799a5557fdSlucy wang - Sun Microsystems - Beijing China 		/*
9809a5557fdSlucy wang - Sun Microsystems - Beijing China 		 * peg gdb frequently accesses memory that doesn't exist,
9819a5557fdSlucy wang - Sun Microsystems - Beijing China 		 * this limits the chit chat so debugging isn't slowed down.
9829a5557fdSlucy wang - Sun Microsystems - Beijing China 		 */
9839a5557fdSlucy wang - Sun Microsystems - Beijing China 		if ((unm_pci_set_window_warning_count++ < 8) ||
9849a5557fdSlucy wang - Sun Microsystems - Beijing China 		    (unm_pci_set_window_warning_count%64 == 0)) {
9859a5557fdSlucy wang - Sun Microsystems - Beijing China 			cmn_err(CE_WARN, "%s: Warning:unm_nic_pci_set_window() "
9869a5557fdSlucy wang - Sun Microsystems - Beijing China 			    "Unknown address range!\n", unm_nic_driver_name);
9879a5557fdSlucy wang - Sun Microsystems - Beijing China 		}
9889a5557fdSlucy wang - Sun Microsystems - Beijing China 		addr = -1ULL;
9899a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
9909a5557fdSlucy wang - Sun Microsystems - Beijing China 	return (addr);
9919a5557fdSlucy wang - Sun Microsystems - Beijing China }
9929a5557fdSlucy wang - Sun Microsystems - Beijing China 
9939a5557fdSlucy wang - Sun Microsystems - Beijing China unsigned long long
unm_nic_pci_set_window_2M(struct unm_adapter_s * adapter,unsigned long long addr)9949a5557fdSlucy wang - Sun Microsystems - Beijing China unm_nic_pci_set_window_2M(struct unm_adapter_s *adapter,
9959a5557fdSlucy wang - Sun Microsystems - Beijing China     unsigned long long addr)
9969a5557fdSlucy wang - Sun Microsystems - Beijing China {
9979a5557fdSlucy wang - Sun Microsystems - Beijing China 	int window;
9989a5557fdSlucy wang - Sun Microsystems - Beijing China 	u32 win_read;
9999a5557fdSlucy wang - Sun Microsystems - Beijing China 
10009a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (ADDR_IN_RANGE(addr, UNM_ADDR_DDR_NET, UNM_ADDR_DDR_NET_MAX)) {
10019a5557fdSlucy wang - Sun Microsystems - Beijing China 		/* DDR network side */
10029a5557fdSlucy wang - Sun Microsystems - Beijing China 		window = MN_WIN(addr);
10039a5557fdSlucy wang - Sun Microsystems - Beijing China 		adapter->ahw.ddr_mn_window = window;
10049a5557fdSlucy wang - Sun Microsystems - Beijing China 		adapter->unm_nic_hw_write_wx(adapter, adapter->ahw.mn_win_crb |
10059a5557fdSlucy wang - Sun Microsystems - Beijing China 		    UNM_PCI_CRBSPACE, &window, 4);
10069a5557fdSlucy wang - Sun Microsystems - Beijing China 		adapter->unm_nic_hw_read_wx(adapter, adapter->ahw.mn_win_crb |
10079a5557fdSlucy wang - Sun Microsystems - Beijing China 		    UNM_PCI_CRBSPACE, &win_read, 4);
10089a5557fdSlucy wang - Sun Microsystems - Beijing China 		if ((win_read << 17) != window) {
10099a5557fdSlucy wang - Sun Microsystems - Beijing China 			cmn_err(CE_WARN,
10109a5557fdSlucy wang - Sun Microsystems - Beijing China 			    "%s: Written MNwin (0x%x) != Read MNwin (0x%x)\n",
10119a5557fdSlucy wang - Sun Microsystems - Beijing China 			    __FUNCTION__, window, win_read);
10129a5557fdSlucy wang - Sun Microsystems - Beijing China 		}
10139a5557fdSlucy wang - Sun Microsystems - Beijing China 		addr = GET_MEM_OFFS_2M(addr) + UNM_PCI_DDR_NET;
10149a5557fdSlucy wang - Sun Microsystems - Beijing China 	} else if (ADDR_IN_RANGE(addr, UNM_ADDR_OCM0, UNM_ADDR_OCM0_MAX)) {
10159a5557fdSlucy wang - Sun Microsystems - Beijing China 		unsigned int temp1;
10169a5557fdSlucy wang - Sun Microsystems - Beijing China // OCM: pci_addr[20:18] == 011 && pci_addr[17:11] != 7f
10179a5557fdSlucy wang - Sun Microsystems - Beijing China 		if ((addr & 0x00ff800) == 0xff800) {
10189a5557fdSlucy wang - Sun Microsystems - Beijing China 			// if bits 19:18&17:11 are on
10199a5557fdSlucy wang - Sun Microsystems - Beijing China 			cmn_err(CE_WARN, "%s: QM access not handled.\n",
10209a5557fdSlucy wang - Sun Microsystems - Beijing China 			    __FUNCTION__);
10219a5557fdSlucy wang - Sun Microsystems - Beijing China 			addr = -1ULL;
10229a5557fdSlucy wang - Sun Microsystems - Beijing China 		}
10239a5557fdSlucy wang - Sun Microsystems - Beijing China 
10249a5557fdSlucy wang - Sun Microsystems - Beijing China 		window = OCM_WIN(addr);
10259a5557fdSlucy wang - Sun Microsystems - Beijing China 		adapter->ahw.ddr_mn_window = window;
10269a5557fdSlucy wang - Sun Microsystems - Beijing China 		adapter->unm_nic_hw_write_wx(adapter, adapter->ahw.mn_win_crb |
10279a5557fdSlucy wang - Sun Microsystems - Beijing China 		    UNM_PCI_CRBSPACE, &window, 4);
10289a5557fdSlucy wang - Sun Microsystems - Beijing China 		adapter->unm_nic_hw_read_wx(adapter, adapter->ahw.mn_win_crb |
10299a5557fdSlucy wang - Sun Microsystems - Beijing China 		    UNM_PCI_CRBSPACE, &win_read, 4);
10309a5557fdSlucy wang - Sun Microsystems - Beijing China 		temp1 = ((window & 0x1FF) << 7) |
10319a5557fdSlucy wang - Sun Microsystems - Beijing China 		    ((window & 0x0FFFE0000) >> 17);
10329a5557fdSlucy wang - Sun Microsystems - Beijing China 		if (win_read != temp1) {
10339a5557fdSlucy wang - Sun Microsystems - Beijing China 			cmn_err(CE_WARN,
10349a5557fdSlucy wang - Sun Microsystems - Beijing China 			    "%s: Written OCMwin(0x%x) != Read OCMwin(0x%x)\n",
10359a5557fdSlucy wang - Sun Microsystems - Beijing China 			    __FUNCTION__, temp1, win_read);
10369a5557fdSlucy wang - Sun Microsystems - Beijing China 		}
10379a5557fdSlucy wang - Sun Microsystems - Beijing China 		addr = GET_MEM_OFFS_2M(addr) + UNM_PCI_OCM0_2M;
10389a5557fdSlucy wang - Sun Microsystems - Beijing China 
10399a5557fdSlucy wang - Sun Microsystems - Beijing China 	} else if (ADDR_IN_RANGE(addr, UNM_ADDR_QDR_NET,
10409a5557fdSlucy wang - Sun Microsystems - Beijing China 	    NX_P3_ADDR_QDR_NET_MAX)) {
10419a5557fdSlucy wang - Sun Microsystems - Beijing China 		/* QDR network side */
10429a5557fdSlucy wang - Sun Microsystems - Beijing China 		window = MS_WIN(addr);
10439a5557fdSlucy wang - Sun Microsystems - Beijing China 		adapter->ahw.qdr_sn_window = window;
10449a5557fdSlucy wang - Sun Microsystems - Beijing China 		adapter->unm_nic_hw_write_wx(adapter, adapter->ahw.ms_win_crb |
10459a5557fdSlucy wang - Sun Microsystems - Beijing China 		    UNM_PCI_CRBSPACE, &window, 4);
10469a5557fdSlucy wang - Sun Microsystems - Beijing China 		adapter->unm_nic_hw_read_wx(adapter, adapter->ahw.ms_win_crb |
10479a5557fdSlucy wang - Sun Microsystems - Beijing China 		    UNM_PCI_CRBSPACE, &win_read, 4);
10489a5557fdSlucy wang - Sun Microsystems - Beijing China 		if (win_read != window) {
10499a5557fdSlucy wang - Sun Microsystems - Beijing China 			cmn_err(CE_WARN,
10509a5557fdSlucy wang - Sun Microsystems - Beijing China 			    "%s: Written MSwin (0x%x) != Read MSwin (0x%x)\n",
10519a5557fdSlucy wang - Sun Microsystems - Beijing China 			    __FUNCTION__, window, win_read);
10529a5557fdSlucy wang - Sun Microsystems - Beijing China 		}
10539a5557fdSlucy wang - Sun Microsystems - Beijing China 		addr = GET_MEM_OFFS_2M(addr) + UNM_PCI_QDR_NET;
10549a5557fdSlucy wang - Sun Microsystems - Beijing China 
10559a5557fdSlucy wang - Sun Microsystems - Beijing China 	} else {
10569a5557fdSlucy wang - Sun Microsystems - Beijing China 		/*
10579a5557fdSlucy wang - Sun Microsystems - Beijing China 		 * peg gdb frequently accesses memory that doesn't exist,
10589a5557fdSlucy wang - Sun Microsystems - Beijing China 		 * this limits the chit chat so debugging isn't slowed down.
10599a5557fdSlucy wang - Sun Microsystems - Beijing China 		 */
10609a5557fdSlucy wang - Sun Microsystems - Beijing China 		if ((unm_pci_set_window_warning_count++ < 8) ||
10619a5557fdSlucy wang - Sun Microsystems - Beijing China 		    (unm_pci_set_window_warning_count%64 == 0)) {
10629a5557fdSlucy wang - Sun Microsystems - Beijing China 			cmn_err(CE_WARN, "%s%d: %s Unknown address range!\n",
10639a5557fdSlucy wang - Sun Microsystems - Beijing China 			    adapter->name, adapter->instance, __FUNCTION__);
10649a5557fdSlucy wang - Sun Microsystems - Beijing China 		}
10659a5557fdSlucy wang - Sun Microsystems - Beijing China 		addr = -1ULL;
10669a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
10679a5557fdSlucy wang - Sun Microsystems - Beijing China 	return (addr);
10689a5557fdSlucy wang - Sun Microsystems - Beijing China }
10699a5557fdSlucy wang - Sun Microsystems - Beijing China 
10709a5557fdSlucy wang - Sun Microsystems - Beijing China /* check if address is in the same windows as the previous access */
10719a5557fdSlucy wang - Sun Microsystems - Beijing China static unsigned long
unm_nic_pci_is_same_window(struct unm_adapter_s * adapter,unsigned long long addr)10729a5557fdSlucy wang - Sun Microsystems - Beijing China unm_nic_pci_is_same_window(struct unm_adapter_s *adapter,
10739a5557fdSlucy wang - Sun Microsystems - Beijing China     unsigned long long addr)
10749a5557fdSlucy wang - Sun Microsystems - Beijing China {
10759a5557fdSlucy wang - Sun Microsystems - Beijing China 	int			window;
10769a5557fdSlucy wang - Sun Microsystems - Beijing China 	unsigned long long	qdr_max;
10779a5557fdSlucy wang - Sun Microsystems - Beijing China 
10789a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) {
10799a5557fdSlucy wang - Sun Microsystems - Beijing China 		qdr_max = NX_P2_ADDR_QDR_NET_MAX;
10809a5557fdSlucy wang - Sun Microsystems - Beijing China 	} else {
10819a5557fdSlucy wang - Sun Microsystems - Beijing China 		qdr_max = NX_P3_ADDR_QDR_NET_MAX;
10829a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
10839a5557fdSlucy wang - Sun Microsystems - Beijing China 
10849a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (ADDR_IN_RANGE(addr, UNM_ADDR_DDR_NET, UNM_ADDR_DDR_NET_MAX)) {
10859a5557fdSlucy wang - Sun Microsystems - Beijing China 		/* DDR network side */
10869a5557fdSlucy wang - Sun Microsystems - Beijing China 		/* MN access can not come here */
10879a5557fdSlucy wang - Sun Microsystems - Beijing China 		cmn_err(CE_PANIC, "%s\n", __FUNCTION__);
10889a5557fdSlucy wang - Sun Microsystems - Beijing China #if 0
10899a5557fdSlucy wang - Sun Microsystems - Beijing China 		window = ((addr - UNM_ADDR_DDR_NET) >> 25) & 0x3ff;
10909a5557fdSlucy wang - Sun Microsystems - Beijing China 		if (adapter->ahw.ddr_mn_window == window) {
10919a5557fdSlucy wang - Sun Microsystems - Beijing China 			return (1);
10929a5557fdSlucy wang - Sun Microsystems - Beijing China 		}
10939a5557fdSlucy wang - Sun Microsystems - Beijing China #endif
10949a5557fdSlucy wang - Sun Microsystems - Beijing China 	} else if (ADDR_IN_RANGE(addr, UNM_ADDR_OCM0, UNM_ADDR_OCM0_MAX)) {
10959a5557fdSlucy wang - Sun Microsystems - Beijing China 		return (1);
10969a5557fdSlucy wang - Sun Microsystems - Beijing China 	} else if (ADDR_IN_RANGE(addr, UNM_ADDR_OCM1, UNM_ADDR_OCM1_MAX)) {
10979a5557fdSlucy wang - Sun Microsystems - Beijing China 		return (1);
10989a5557fdSlucy wang - Sun Microsystems - Beijing China 	} else if (ADDR_IN_RANGE(addr, UNM_ADDR_QDR_NET, qdr_max)) {
10999a5557fdSlucy wang - Sun Microsystems - Beijing China 		/* QDR network side */
11009a5557fdSlucy wang - Sun Microsystems - Beijing China 		window = ((addr - UNM_ADDR_QDR_NET) >> 22) & 0x3f;
11019a5557fdSlucy wang - Sun Microsystems - Beijing China 		if (adapter->ahw.qdr_sn_window == window) {
11029a5557fdSlucy wang - Sun Microsystems - Beijing China 			return (1);
11039a5557fdSlucy wang - Sun Microsystems - Beijing China 		}
11049a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
11059a5557fdSlucy wang - Sun Microsystems - Beijing China 
11069a5557fdSlucy wang - Sun Microsystems - Beijing China 	return (0);
11079a5557fdSlucy wang - Sun Microsystems - Beijing China }
11089a5557fdSlucy wang - Sun Microsystems - Beijing China 
11099a5557fdSlucy wang - Sun Microsystems - Beijing China static int
unm_nic_pci_mem_read_direct(struct unm_adapter_s * adapter,u64 off,void * data,int size)11109a5557fdSlucy wang - Sun Microsystems - Beijing China unm_nic_pci_mem_read_direct(struct unm_adapter_s *adapter,
11119a5557fdSlucy wang - Sun Microsystems - Beijing China     u64 off, void *data, int size)
11129a5557fdSlucy wang - Sun Microsystems - Beijing China {
11139a5557fdSlucy wang - Sun Microsystems - Beijing China 	void			*addr;
11149a5557fdSlucy wang - Sun Microsystems - Beijing China 	int				ret = 0;
11159a5557fdSlucy wang - Sun Microsystems - Beijing China 	u64				start;
11169a5557fdSlucy wang - Sun Microsystems - Beijing China 
11179a5557fdSlucy wang - Sun Microsystems - Beijing China #if 0
11189a5557fdSlucy wang - Sun Microsystems - Beijing China 	/*
11199a5557fdSlucy wang - Sun Microsystems - Beijing China 	 * This check can not be currently executed, since phanmon findq
11209a5557fdSlucy wang - Sun Microsystems - Beijing China 	 * command breaks this check whereby 8 byte reads are being attempted
11219a5557fdSlucy wang - Sun Microsystems - Beijing China 	 * on "aligned-by-4" addresses on x86. Reason this works is our version
11229a5557fdSlucy wang - Sun Microsystems - Beijing China 	 * breaks up the access into 2 consecutive 4 byte writes; on other
11239a5557fdSlucy wang - Sun Microsystems - Beijing China 	 * architectures, this might require "aligned-by-8" addresses and we
11249a5557fdSlucy wang - Sun Microsystems - Beijing China 	 * will run into trouble.
11259a5557fdSlucy wang - Sun Microsystems - Beijing China 	 *
11269a5557fdSlucy wang - Sun Microsystems - Beijing China 	 * Check alignment for expected sizes of 1, 2, 4, 8. Other size
11279a5557fdSlucy wang - Sun Microsystems - Beijing China 	 * values will not trigger access.
11289a5557fdSlucy wang - Sun Microsystems - Beijing China 	 */
11299a5557fdSlucy wang - Sun Microsystems - Beijing China 	if ((off & (size - 1)) != 0)
11309a5557fdSlucy wang - Sun Microsystems - Beijing China 		return (-1);
11319a5557fdSlucy wang - Sun Microsystems - Beijing China #endif
11329a5557fdSlucy wang - Sun Microsystems - Beijing China 
11339a5557fdSlucy wang - Sun Microsystems - Beijing China 	UNM_WRITE_LOCK_IRQS(&adapter->adapter_lock, flags);
11349a5557fdSlucy wang - Sun Microsystems - Beijing China 
11359a5557fdSlucy wang - Sun Microsystems - Beijing China 	/*
11369a5557fdSlucy wang - Sun Microsystems - Beijing China 	 * If attempting to access unknown address or straddle hw windows,
11379a5557fdSlucy wang - Sun Microsystems - Beijing China 	 * do not access.
11389a5557fdSlucy wang - Sun Microsystems - Beijing China 	 */
11399a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (((start = adapter->unm_nic_pci_set_window(adapter, off)) == -1UL) ||
11409a5557fdSlucy wang - Sun Microsystems - Beijing China 	    (unm_nic_pci_is_same_window(adapter, off + size -1) == 0)) {
11419a5557fdSlucy wang - Sun Microsystems - Beijing China 		UNM_WRITE_UNLOCK_IRQR(&adapter->adapter_lock, flags);
11429a5557fdSlucy wang - Sun Microsystems - Beijing China 		cmn_err(CE_WARN, "%s out of bound pci memory access. "
11439a5557fdSlucy wang - Sun Microsystems - Beijing China 		    "offset is 0x%llx\n", unm_nic_driver_name, off);
11449a5557fdSlucy wang - Sun Microsystems - Beijing China 		return (-1);
11459a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
11469a5557fdSlucy wang - Sun Microsystems - Beijing China 
11479a5557fdSlucy wang - Sun Microsystems - Beijing China 	addr = (void *) (uptr_t)(pci_base_offset(adapter, start));
11489a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (!addr)
11499a5557fdSlucy wang - Sun Microsystems - Beijing China 		addr = (void *) ((uint8_t *)adapter->ahw.pci_base0 + start);
11509a5557fdSlucy wang - Sun Microsystems - Beijing China 
11519a5557fdSlucy wang - Sun Microsystems - Beijing China 	switch (size) {
11529a5557fdSlucy wang - Sun Microsystems - Beijing China 		case 1:
11539a5557fdSlucy wang - Sun Microsystems - Beijing China 			*(__uint8_t  *)data = UNM_NIC_PCI_READ_8(addr);
11549a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
11559a5557fdSlucy wang - Sun Microsystems - Beijing China 		case 2:
11569a5557fdSlucy wang - Sun Microsystems - Beijing China 			*(__uint16_t *)data = UNM_NIC_PCI_READ_16(addr);
11579a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
11589a5557fdSlucy wang - Sun Microsystems - Beijing China 		case 4:
11599a5557fdSlucy wang - Sun Microsystems - Beijing China 			*(__uint32_t *)data = UNM_NIC_PCI_READ_32(addr);
11609a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
11619a5557fdSlucy wang - Sun Microsystems - Beijing China 		case 8:
11629a5557fdSlucy wang - Sun Microsystems - Beijing China 			*(__uint64_t *)data = UNM_NIC_PCI_READ_64(addr);
11639a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
11649a5557fdSlucy wang - Sun Microsystems - Beijing China 		default:
11659a5557fdSlucy wang - Sun Microsystems - Beijing China 			ret = -1;
11669a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
11679a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
11689a5557fdSlucy wang - Sun Microsystems - Beijing China 
11699a5557fdSlucy wang - Sun Microsystems - Beijing China 	UNM_WRITE_UNLOCK_IRQR(&adapter->adapter_lock, flags);
11709a5557fdSlucy wang - Sun Microsystems - Beijing China 	return (ret);
11719a5557fdSlucy wang - Sun Microsystems - Beijing China }
11729a5557fdSlucy wang - Sun Microsystems - Beijing China 
11739a5557fdSlucy wang - Sun Microsystems - Beijing China static int
unm_nic_pci_mem_write_direct(struct unm_adapter_s * adapter,u64 off,void * data,int size)11749a5557fdSlucy wang - Sun Microsystems - Beijing China unm_nic_pci_mem_write_direct(struct unm_adapter_s *adapter, u64 off,
11759a5557fdSlucy wang - Sun Microsystems - Beijing China     void *data, int size)
11769a5557fdSlucy wang - Sun Microsystems - Beijing China {
11779a5557fdSlucy wang - Sun Microsystems - Beijing China 	void	*addr;
11789a5557fdSlucy wang - Sun Microsystems - Beijing China 	int		ret = 0;
11799a5557fdSlucy wang - Sun Microsystems - Beijing China 	u64		start;
11809a5557fdSlucy wang - Sun Microsystems - Beijing China 
11819a5557fdSlucy wang - Sun Microsystems - Beijing China #if 0
11829a5557fdSlucy wang - Sun Microsystems - Beijing China 	/*
11839a5557fdSlucy wang - Sun Microsystems - Beijing China 	 * This check can not be currently executed, since firmware load
11849a5557fdSlucy wang - Sun Microsystems - Beijing China 	 * breaks this check whereby 8 byte writes are being attempted on
11859a5557fdSlucy wang - Sun Microsystems - Beijing China 	 * "aligned-by-4" addresses on x86. Reason this works is our version
11869a5557fdSlucy wang - Sun Microsystems - Beijing China 	 * breaks up the access into 2 consecutive 4 byte writes; on other
11879a5557fdSlucy wang - Sun Microsystems - Beijing China 	 * architectures, this might require "aligned-by-8" addresses and we
11889a5557fdSlucy wang - Sun Microsystems - Beijing China 	 * will run into trouble.
11899a5557fdSlucy wang - Sun Microsystems - Beijing China 	 *
11909a5557fdSlucy wang - Sun Microsystems - Beijing China 	 * Check alignment for expected sizes of 1, 2, 4, 8. Other size
11919a5557fdSlucy wang - Sun Microsystems - Beijing China 	 * values will not trigger access.
11929a5557fdSlucy wang - Sun Microsystems - Beijing China 	 */
11939a5557fdSlucy wang - Sun Microsystems - Beijing China 	if ((off & (size - 1)) != 0)
11949a5557fdSlucy wang - Sun Microsystems - Beijing China 		return (-1);
11959a5557fdSlucy wang - Sun Microsystems - Beijing China #endif
11969a5557fdSlucy wang - Sun Microsystems - Beijing China 
11979a5557fdSlucy wang - Sun Microsystems - Beijing China 	UNM_WRITE_LOCK_IRQS(&adapter->adapter_lock, flags);
11989a5557fdSlucy wang - Sun Microsystems - Beijing China 
11999a5557fdSlucy wang - Sun Microsystems - Beijing China 	/*
12009a5557fdSlucy wang - Sun Microsystems - Beijing China 	 * If attempting to access unknown address or straddle hw windows,
12019a5557fdSlucy wang - Sun Microsystems - Beijing China 	 * do not access.
12029a5557fdSlucy wang - Sun Microsystems - Beijing China 	 */
12039a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (((start = adapter->unm_nic_pci_set_window(adapter, off)) == -1UL) ||
12049a5557fdSlucy wang - Sun Microsystems - Beijing China 	    (unm_nic_pci_is_same_window(adapter, off + size -1) == 0)) {
12059a5557fdSlucy wang - Sun Microsystems - Beijing China 		UNM_WRITE_UNLOCK_IRQR(&adapter->adapter_lock, flags);
12069a5557fdSlucy wang - Sun Microsystems - Beijing China 		cmn_err(CE_WARN, "%s out of bound pci memory access. "
12079a5557fdSlucy wang - Sun Microsystems - Beijing China 		    "offset is 0x%llx\n", unm_nic_driver_name, off);
12089a5557fdSlucy wang - Sun Microsystems - Beijing China 		return (-1);
12099a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
12109a5557fdSlucy wang - Sun Microsystems - Beijing China 
12119a5557fdSlucy wang - Sun Microsystems - Beijing China 	addr = (void *) (uptr_t)(pci_base_offset(adapter, start));
12129a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (!addr)
12139a5557fdSlucy wang - Sun Microsystems - Beijing China 		addr = (void *) ((uint8_t *)adapter->ahw.pci_base0 + start);
12149a5557fdSlucy wang - Sun Microsystems - Beijing China 
12159a5557fdSlucy wang - Sun Microsystems - Beijing China 	switch (size) {
12169a5557fdSlucy wang - Sun Microsystems - Beijing China 		case 1:
12179a5557fdSlucy wang - Sun Microsystems - Beijing China 			UNM_NIC_PCI_WRITE_8(*(__uint8_t  *)data, addr);
12189a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
12199a5557fdSlucy wang - Sun Microsystems - Beijing China 		case 2:
12209a5557fdSlucy wang - Sun Microsystems - Beijing China 			UNM_NIC_PCI_WRITE_16(*(__uint16_t *)data, addr);
12219a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
12229a5557fdSlucy wang - Sun Microsystems - Beijing China 		case 4:
12239a5557fdSlucy wang - Sun Microsystems - Beijing China 			UNM_NIC_PCI_WRITE_32(*(__uint32_t *)data, addr);
12249a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
12259a5557fdSlucy wang - Sun Microsystems - Beijing China 		case 8:
12269a5557fdSlucy wang - Sun Microsystems - Beijing China 			UNM_NIC_PCI_WRITE_64(*(__uint64_t *)data, addr);
12279a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
12289a5557fdSlucy wang - Sun Microsystems - Beijing China 		default:
12299a5557fdSlucy wang - Sun Microsystems - Beijing China 			ret = -1;
12309a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
12319a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
12329a5557fdSlucy wang - Sun Microsystems - Beijing China 	UNM_WRITE_UNLOCK_IRQR(&adapter->adapter_lock, flags);
12339a5557fdSlucy wang - Sun Microsystems - Beijing China 	return (ret);
12349a5557fdSlucy wang - Sun Microsystems - Beijing China }
12359a5557fdSlucy wang - Sun Microsystems - Beijing China 
12369a5557fdSlucy wang - Sun Microsystems - Beijing China 
12379a5557fdSlucy wang - Sun Microsystems - Beijing China int
unm_nic_pci_mem_write_128M(struct unm_adapter_s * adapter,u64 off,void * data,int size)12389a5557fdSlucy wang - Sun Microsystems - Beijing China unm_nic_pci_mem_write_128M(struct unm_adapter_s *adapter, u64 off, void *data,
12399a5557fdSlucy wang - Sun Microsystems - Beijing China     int size)
12409a5557fdSlucy wang - Sun Microsystems - Beijing China {
12419a5557fdSlucy wang - Sun Microsystems - Beijing China 	int		i, j, ret = 0, loop, sz[2], off0;
12429a5557fdSlucy wang - Sun Microsystems - Beijing China 	__uint32_t		temp;
12439a5557fdSlucy wang - Sun Microsystems - Beijing China 	__uint64_t		off8, mem_crb, tmpw, word[2] = {0, 0};
12449a5557fdSlucy wang - Sun Microsystems - Beijing China #define	MAX_CTL_CHECK   1000
12459a5557fdSlucy wang - Sun Microsystems - Beijing China 
12469a5557fdSlucy wang - Sun Microsystems - Beijing China 	/*
12479a5557fdSlucy wang - Sun Microsystems - Beijing China 	 * If not MN, go check for MS or invalid.
12489a5557fdSlucy wang - Sun Microsystems - Beijing China 	 */
12499a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (unm_nic_pci_mem_bound_check(adapter, off, size) == 0)
12509a5557fdSlucy wang - Sun Microsystems - Beijing China 		return (unm_nic_pci_mem_write_direct(adapter, off, data, size));
12519a5557fdSlucy wang - Sun Microsystems - Beijing China 
12529a5557fdSlucy wang - Sun Microsystems - Beijing China 	off8 = off & 0xfffffff8;
12539a5557fdSlucy wang - Sun Microsystems - Beijing China 	off0 = off & 0x7;
12549a5557fdSlucy wang - Sun Microsystems - Beijing China 	sz[0] = (size < (8 - off0)) ? size : (8 - off0);
12559a5557fdSlucy wang - Sun Microsystems - Beijing China 	sz[1] = size - sz[0];
12569a5557fdSlucy wang - Sun Microsystems - Beijing China 	loop = ((off0 + size - 1) >> 3) + 1;
12579a5557fdSlucy wang - Sun Microsystems - Beijing China 	/* LINTED: E_FALSE_LOGICAL_EXPR */
12589a5557fdSlucy wang - Sun Microsystems - Beijing China 	mem_crb = (uptr_t)(pci_base_offset(adapter, UNM_CRB_DDR_NET));
12599a5557fdSlucy wang - Sun Microsystems - Beijing China 
12609a5557fdSlucy wang - Sun Microsystems - Beijing China 	if ((size != 8) || (off0 != 0))  {
12619a5557fdSlucy wang - Sun Microsystems - Beijing China 		for (i = 0; i < loop; i++) {
12629a5557fdSlucy wang - Sun Microsystems - Beijing China 			if (adapter->unm_nic_pci_mem_read(adapter,
12639a5557fdSlucy wang - Sun Microsystems - Beijing China 			    off8 + (i << 3), &word[i], 8))
12649a5557fdSlucy wang - Sun Microsystems - Beijing China 				return (-1);
12659a5557fdSlucy wang - Sun Microsystems - Beijing China 		}
12669a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
12679a5557fdSlucy wang - Sun Microsystems - Beijing China 
12689a5557fdSlucy wang - Sun Microsystems - Beijing China 	switch (size) {
12699a5557fdSlucy wang - Sun Microsystems - Beijing China 		case 1:
12709a5557fdSlucy wang - Sun Microsystems - Beijing China 			tmpw = *((__uint8_t *)data);
12719a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
12729a5557fdSlucy wang - Sun Microsystems - Beijing China 		case 2:
12739a5557fdSlucy wang - Sun Microsystems - Beijing China 			tmpw = *((__uint16_t *)data);
12749a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
12759a5557fdSlucy wang - Sun Microsystems - Beijing China 		case 4:
12769a5557fdSlucy wang - Sun Microsystems - Beijing China 			tmpw = *((__uint32_t *)data);
12779a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
12789a5557fdSlucy wang - Sun Microsystems - Beijing China 		case 8:
12799a5557fdSlucy wang - Sun Microsystems - Beijing China 		default:
12809a5557fdSlucy wang - Sun Microsystems - Beijing China 			tmpw = *((__uint64_t *)data);
12819a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
12829a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
12839a5557fdSlucy wang - Sun Microsystems - Beijing China 	word[0] &= ~((~(~0ULL << (sz[0] * 8))) << (off0 * 8));
12849a5557fdSlucy wang - Sun Microsystems - Beijing China 	word[0] |= tmpw << (off0 * 8);
12859a5557fdSlucy wang - Sun Microsystems - Beijing China 
12869a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (loop == 2) {
12879a5557fdSlucy wang - Sun Microsystems - Beijing China 		word[1] &= ~(~0ULL << (sz[1] * 8));
12889a5557fdSlucy wang - Sun Microsystems - Beijing China 		word[1] |= tmpw >> (sz[0] * 8);
12899a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
12909a5557fdSlucy wang - Sun Microsystems - Beijing China 
12919a5557fdSlucy wang - Sun Microsystems - Beijing China 	UNM_WRITE_LOCK_IRQS(&adapter->adapter_lock, flags);
12929a5557fdSlucy wang - Sun Microsystems - Beijing China 	unm_nic_pci_change_crbwindow_128M(adapter, 0);
12939a5557fdSlucy wang - Sun Microsystems - Beijing China 
12949a5557fdSlucy wang - Sun Microsystems - Beijing China 	for (i = 0; i < loop; i++) {
12959a5557fdSlucy wang - Sun Microsystems - Beijing China 		UNM_NIC_PCI_WRITE_32((__uint32_t)(off8 + (i << 3)),
12969a5557fdSlucy wang - Sun Microsystems - Beijing China 		    (void *) (uptr_t)(mem_crb+MIU_TEST_AGT_ADDR_LO));
12979a5557fdSlucy wang - Sun Microsystems - Beijing China 		UNM_NIC_PCI_WRITE_32(0,
12989a5557fdSlucy wang - Sun Microsystems - Beijing China 		    (void *) (uptr_t)(mem_crb+MIU_TEST_AGT_ADDR_HI));
12999a5557fdSlucy wang - Sun Microsystems - Beijing China 		UNM_NIC_PCI_WRITE_32(word[i] & 0xffffffff,
13009a5557fdSlucy wang - Sun Microsystems - Beijing China 		    (void *) (uptr_t)(mem_crb+MIU_TEST_AGT_WRDATA_LO));
13019a5557fdSlucy wang - Sun Microsystems - Beijing China 		UNM_NIC_PCI_WRITE_32((word[i] >> 32) & 0xffffffff,
13029a5557fdSlucy wang - Sun Microsystems - Beijing China 		    (void *) (uptr_t)(mem_crb+MIU_TEST_AGT_WRDATA_HI));
13039a5557fdSlucy wang - Sun Microsystems - Beijing China 		UNM_NIC_PCI_WRITE_32(MIU_TA_CTL_ENABLE|MIU_TA_CTL_WRITE,
13049a5557fdSlucy wang - Sun Microsystems - Beijing China 		    (void *) (uptr_t)(mem_crb+MIU_TEST_AGT_CTRL));
13059a5557fdSlucy wang - Sun Microsystems - Beijing China 		UNM_NIC_PCI_WRITE_32(MIU_TA_CTL_START | MIU_TA_CTL_ENABLE |
13069a5557fdSlucy wang - Sun Microsystems - Beijing China 		    MIU_TA_CTL_WRITE,
13079a5557fdSlucy wang - Sun Microsystems - Beijing China 		    (void *) (uptr_t)(mem_crb+MIU_TEST_AGT_CTRL));
13089a5557fdSlucy wang - Sun Microsystems - Beijing China 
13099a5557fdSlucy wang - Sun Microsystems - Beijing China 		for (j = 0; j < MAX_CTL_CHECK; j++) {
13109a5557fdSlucy wang - Sun Microsystems - Beijing China 			temp = UNM_NIC_PCI_READ_32((void *)
13119a5557fdSlucy wang - Sun Microsystems - Beijing China 			    (uptr_t)(mem_crb+MIU_TEST_AGT_CTRL));
13129a5557fdSlucy wang - Sun Microsystems - Beijing China 			if ((temp & MIU_TA_CTL_BUSY) == 0) {
13139a5557fdSlucy wang - Sun Microsystems - Beijing China 				break;
13149a5557fdSlucy wang - Sun Microsystems - Beijing China 			}
13159a5557fdSlucy wang - Sun Microsystems - Beijing China 		}
13169a5557fdSlucy wang - Sun Microsystems - Beijing China 
13179a5557fdSlucy wang - Sun Microsystems - Beijing China 		if (j >= MAX_CTL_CHECK) {
13189a5557fdSlucy wang - Sun Microsystems - Beijing China 			cmn_err(CE_WARN, "%s: %s Fail to write thru agent\n",
13199a5557fdSlucy wang - Sun Microsystems - Beijing China 			    __FUNCTION__, unm_nic_driver_name);
13209a5557fdSlucy wang - Sun Microsystems - Beijing China 			ret = -1;
13219a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
13229a5557fdSlucy wang - Sun Microsystems - Beijing China 		}
13239a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
13249a5557fdSlucy wang - Sun Microsystems - Beijing China 
13259a5557fdSlucy wang - Sun Microsystems - Beijing China 	unm_nic_pci_change_crbwindow_128M(adapter, 1);
13269a5557fdSlucy wang - Sun Microsystems - Beijing China 	UNM_WRITE_UNLOCK_IRQR(&adapter->adapter_lock, flags);
13279a5557fdSlucy wang - Sun Microsystems - Beijing China 	return (ret);
13289a5557fdSlucy wang - Sun Microsystems - Beijing China }
13299a5557fdSlucy wang - Sun Microsystems - Beijing China 
13309a5557fdSlucy wang - Sun Microsystems - Beijing China int
unm_nic_pci_mem_read_128M(struct unm_adapter_s * adapter,u64 off,void * data,int size)13319a5557fdSlucy wang - Sun Microsystems - Beijing China unm_nic_pci_mem_read_128M(struct unm_adapter_s *adapter, u64 off, void *data,
13329a5557fdSlucy wang - Sun Microsystems - Beijing China     int size)
13339a5557fdSlucy wang - Sun Microsystems - Beijing China {
13349a5557fdSlucy wang - Sun Microsystems - Beijing China 	int		i, j = 0, k, start, end, loop, sz[2], off0[2];
13359a5557fdSlucy wang - Sun Microsystems - Beijing China 	__uint32_t		temp;
13369a5557fdSlucy wang - Sun Microsystems - Beijing China 	__uint64_t		off8, val, mem_crb, word[2] = {0, 0};
13379a5557fdSlucy wang - Sun Microsystems - Beijing China #define	MAX_CTL_CHECK   1000
13389a5557fdSlucy wang - Sun Microsystems - Beijing China 
13399a5557fdSlucy wang - Sun Microsystems - Beijing China 	/*
13409a5557fdSlucy wang - Sun Microsystems - Beijing China 	 * If not MN, go check for MS or invalid.
13419a5557fdSlucy wang - Sun Microsystems - Beijing China 	 */
13429a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (unm_nic_pci_mem_bound_check(adapter, off, size) == 0)
13439a5557fdSlucy wang - Sun Microsystems - Beijing China 		return (unm_nic_pci_mem_read_direct(adapter, off, data, size));
13449a5557fdSlucy wang - Sun Microsystems - Beijing China 
13459a5557fdSlucy wang - Sun Microsystems - Beijing China 	off8 = off & 0xfffffff8;
13469a5557fdSlucy wang - Sun Microsystems - Beijing China 	off0[0] = off & 0x7;
13479a5557fdSlucy wang - Sun Microsystems - Beijing China 	off0[1] = 0;
13489a5557fdSlucy wang - Sun Microsystems - Beijing China 	sz[0] = (size < (8 - off0[0])) ? size : (8 - off0[0]);
13499a5557fdSlucy wang - Sun Microsystems - Beijing China 	sz[1] = size - sz[0];
13509a5557fdSlucy wang - Sun Microsystems - Beijing China 	loop = ((off0[0] + size - 1) >> 3) + 1;
13519a5557fdSlucy wang - Sun Microsystems - Beijing China 	/* LINTED: E_FALSE_LOGICAL_EXPR */
13529a5557fdSlucy wang - Sun Microsystems - Beijing China 	mem_crb = (uptr_t)(pci_base_offset(adapter, UNM_CRB_DDR_NET));
13539a5557fdSlucy wang - Sun Microsystems - Beijing China 
13549a5557fdSlucy wang - Sun Microsystems - Beijing China 	UNM_WRITE_LOCK_IRQS(&adapter->adapter_lock, flags);
13559a5557fdSlucy wang - Sun Microsystems - Beijing China 	unm_nic_pci_change_crbwindow_128M(adapter, 0);
13569a5557fdSlucy wang - Sun Microsystems - Beijing China 
13579a5557fdSlucy wang - Sun Microsystems - Beijing China 	for (i = 0; i < loop; i++) {
13589a5557fdSlucy wang - Sun Microsystems - Beijing China 		UNM_NIC_PCI_WRITE_32((__uint32_t)(off8 + (i << 3)),
13599a5557fdSlucy wang - Sun Microsystems - Beijing China 		    (void *) (uptr_t)(mem_crb+MIU_TEST_AGT_ADDR_LO));
13609a5557fdSlucy wang - Sun Microsystems - Beijing China 		UNM_NIC_PCI_WRITE_32(0,
13619a5557fdSlucy wang - Sun Microsystems - Beijing China 		    (void *) (uptr_t)(mem_crb+MIU_TEST_AGT_ADDR_HI));
13629a5557fdSlucy wang - Sun Microsystems - Beijing China 		UNM_NIC_PCI_WRITE_32(MIU_TA_CTL_ENABLE,
13639a5557fdSlucy wang - Sun Microsystems - Beijing China 		    (void *) (uptr_t)(mem_crb+MIU_TEST_AGT_CTRL));
13649a5557fdSlucy wang - Sun Microsystems - Beijing China 		UNM_NIC_PCI_WRITE_32(MIU_TA_CTL_START|MIU_TA_CTL_ENABLE,
13659a5557fdSlucy wang - Sun Microsystems - Beijing China 		    (void *) (uptr_t)(mem_crb+MIU_TEST_AGT_CTRL));
13669a5557fdSlucy wang - Sun Microsystems - Beijing China 
13679a5557fdSlucy wang - Sun Microsystems - Beijing China 		for (j = 0; j < MAX_CTL_CHECK; j++) {
13689a5557fdSlucy wang - Sun Microsystems - Beijing China 			temp = UNM_NIC_PCI_READ_32((void *)
13699a5557fdSlucy wang - Sun Microsystems - Beijing China 			    (uptr_t)(mem_crb+MIU_TEST_AGT_CTRL));
13709a5557fdSlucy wang - Sun Microsystems - Beijing China 			if ((temp & MIU_TA_CTL_BUSY) == 0) {
13719a5557fdSlucy wang - Sun Microsystems - Beijing China 				break;
13729a5557fdSlucy wang - Sun Microsystems - Beijing China 			}
13739a5557fdSlucy wang - Sun Microsystems - Beijing China 		}
13749a5557fdSlucy wang - Sun Microsystems - Beijing China 
13759a5557fdSlucy wang - Sun Microsystems - Beijing China 		if (j >= MAX_CTL_CHECK) {
13769a5557fdSlucy wang - Sun Microsystems - Beijing China 			cmn_err(CE_WARN, "%s: %s Fail to read through agent\n",
13779a5557fdSlucy wang - Sun Microsystems - Beijing China 			    __FUNCTION__, unm_nic_driver_name);
13789a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
13799a5557fdSlucy wang - Sun Microsystems - Beijing China 		}
13809a5557fdSlucy wang - Sun Microsystems - Beijing China 
13819a5557fdSlucy wang - Sun Microsystems - Beijing China 		start = off0[i] >> 2;
13829a5557fdSlucy wang - Sun Microsystems - Beijing China 		end   = (off0[i] + sz[i] - 1) >> 2;
13839a5557fdSlucy wang - Sun Microsystems - Beijing China 		word[i] = 0;
13849a5557fdSlucy wang - Sun Microsystems - Beijing China 		for (k = start; k <= end; k++) {
13859a5557fdSlucy wang - Sun Microsystems - Beijing China 			word[i] |= ((__uint64_t)UNM_NIC_PCI_READ_32(
13869a5557fdSlucy wang - Sun Microsystems - Beijing China 			    (void *) (uptr_t)(mem_crb +
13879a5557fdSlucy wang - Sun Microsystems - Beijing China 			    MIU_TEST_AGT_RDDATA(k))) << (32*k));
13889a5557fdSlucy wang - Sun Microsystems - Beijing China 		}
13899a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
13909a5557fdSlucy wang - Sun Microsystems - Beijing China 
13919a5557fdSlucy wang - Sun Microsystems - Beijing China 	unm_nic_pci_change_crbwindow_128M(adapter, 1);
13929a5557fdSlucy wang - Sun Microsystems - Beijing China 	UNM_WRITE_UNLOCK_IRQR(&adapter->adapter_lock, flags);
13939a5557fdSlucy wang - Sun Microsystems - Beijing China 
13949a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (j >= MAX_CTL_CHECK)
13959a5557fdSlucy wang - Sun Microsystems - Beijing China 		return (-1);
13969a5557fdSlucy wang - Sun Microsystems - Beijing China 
13979a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (sz[0] == 8) {
13989a5557fdSlucy wang - Sun Microsystems - Beijing China 		val = word[0];
13999a5557fdSlucy wang - Sun Microsystems - Beijing China 	} else {
14009a5557fdSlucy wang - Sun Microsystems - Beijing China 		val = ((word[0] >> (off0[0] * 8)) & (~(~0ULL << (sz[0] * 8)))) |
14019a5557fdSlucy wang - Sun Microsystems - Beijing China 		    ((word[1] & (~(~0ULL << (sz[1] * 8)))) << (sz[0] * 8));
14029a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
14039a5557fdSlucy wang - Sun Microsystems - Beijing China 
14049a5557fdSlucy wang - Sun Microsystems - Beijing China 	switch (size) {
14059a5557fdSlucy wang - Sun Microsystems - Beijing China 	case 1:
14069a5557fdSlucy wang - Sun Microsystems - Beijing China 		*(__uint8_t  *)data = val;
14079a5557fdSlucy wang - Sun Microsystems - Beijing China 		break;
14089a5557fdSlucy wang - Sun Microsystems - Beijing China 	case 2:
14099a5557fdSlucy wang - Sun Microsystems - Beijing China 		*(__uint16_t *)data = val;
14109a5557fdSlucy wang - Sun Microsystems - Beijing China 		break;
14119a5557fdSlucy wang - Sun Microsystems - Beijing China 	case 4:
14129a5557fdSlucy wang - Sun Microsystems - Beijing China 		*(__uint32_t *)data = val;
14139a5557fdSlucy wang - Sun Microsystems - Beijing China 		break;
14149a5557fdSlucy wang - Sun Microsystems - Beijing China 	case 8:
14159a5557fdSlucy wang - Sun Microsystems - Beijing China 		*(__uint64_t *)data = val;
14169a5557fdSlucy wang - Sun Microsystems - Beijing China 		break;
14179a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
14189a5557fdSlucy wang - Sun Microsystems - Beijing China 	return (0);
14199a5557fdSlucy wang - Sun Microsystems - Beijing China }
14209a5557fdSlucy wang - Sun Microsystems - Beijing China 
14219a5557fdSlucy wang - Sun Microsystems - Beijing China 
14229a5557fdSlucy wang - Sun Microsystems - Beijing China 
14239a5557fdSlucy wang - Sun Microsystems - Beijing China int
unm_nic_pci_mem_write_2M(struct unm_adapter_s * adapter,u64 off,void * data,int size)14249a5557fdSlucy wang - Sun Microsystems - Beijing China unm_nic_pci_mem_write_2M(struct unm_adapter_s *adapter, u64 off, void *data,
14259a5557fdSlucy wang - Sun Microsystems - Beijing China     int size)
14269a5557fdSlucy wang - Sun Microsystems - Beijing China {
14279a5557fdSlucy wang - Sun Microsystems - Beijing China 	int	i, j, ret = 0, loop, sz[2], off0;
14289a5557fdSlucy wang - Sun Microsystems - Beijing China 	__uint32_t	temp;
14299a5557fdSlucy wang - Sun Microsystems - Beijing China 	__uint64_t	off8, mem_crb, tmpw, word[2] = {0, 0};
14309a5557fdSlucy wang - Sun Microsystems - Beijing China #define	MAX_CTL_CHECK   1000
14319a5557fdSlucy wang - Sun Microsystems - Beijing China 
14329a5557fdSlucy wang - Sun Microsystems - Beijing China 	/*
14339a5557fdSlucy wang - Sun Microsystems - Beijing China 	 * If not MN, go check for MS or invalid.
14349a5557fdSlucy wang - Sun Microsystems - Beijing China 	 */
14359a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (off >= UNM_ADDR_QDR_NET && off <= NX_P3_ADDR_QDR_NET_MAX) {
14369a5557fdSlucy wang - Sun Microsystems - Beijing China 		mem_crb = UNM_CRB_QDR_NET;
14379a5557fdSlucy wang - Sun Microsystems - Beijing China 	} else {
14389a5557fdSlucy wang - Sun Microsystems - Beijing China 		mem_crb = UNM_CRB_DDR_NET;
14399a5557fdSlucy wang - Sun Microsystems - Beijing China 		if (unm_nic_pci_mem_bound_check(adapter, off, size) == 0)
14409a5557fdSlucy wang - Sun Microsystems - Beijing China 			return (unm_nic_pci_mem_write_direct(adapter,
14419a5557fdSlucy wang - Sun Microsystems - Beijing China 			    off, data, size));
14429a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
14439a5557fdSlucy wang - Sun Microsystems - Beijing China 
14449a5557fdSlucy wang - Sun Microsystems - Beijing China 	off8 = off & 0xfffffff8;
14459a5557fdSlucy wang - Sun Microsystems - Beijing China 	off0 = off & 0x7;
14469a5557fdSlucy wang - Sun Microsystems - Beijing China 	sz[0] = (size < (8 - off0)) ? size : (8 - off0);
14479a5557fdSlucy wang - Sun Microsystems - Beijing China 	sz[1] = size - sz[0];
14489a5557fdSlucy wang - Sun Microsystems - Beijing China 	loop = ((off0 + size - 1) >> 3) + 1;
14499a5557fdSlucy wang - Sun Microsystems - Beijing China 
14509a5557fdSlucy wang - Sun Microsystems - Beijing China 	if ((size != 8) || (off0 != 0)) {
14519a5557fdSlucy wang - Sun Microsystems - Beijing China 		for (i = 0; i < loop; i++) {
14529a5557fdSlucy wang - Sun Microsystems - Beijing China 			if (adapter->unm_nic_pci_mem_read(adapter,
14539a5557fdSlucy wang - Sun Microsystems - Beijing China 			    off8 + (i << 3), &word[i], 8))
14549a5557fdSlucy wang - Sun Microsystems - Beijing China 				return (-1);
14559a5557fdSlucy wang - Sun Microsystems - Beijing China 		}
14569a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
14579a5557fdSlucy wang - Sun Microsystems - Beijing China 
14589a5557fdSlucy wang - Sun Microsystems - Beijing China 	switch (size) {
14599a5557fdSlucy wang - Sun Microsystems - Beijing China 		case 1:
14609a5557fdSlucy wang - Sun Microsystems - Beijing China 			tmpw = *((__uint8_t *)data);
14619a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
14629a5557fdSlucy wang - Sun Microsystems - Beijing China 		case 2:
14639a5557fdSlucy wang - Sun Microsystems - Beijing China 			tmpw = *((__uint16_t *)data);
14649a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
14659a5557fdSlucy wang - Sun Microsystems - Beijing China 		case 4:
14669a5557fdSlucy wang - Sun Microsystems - Beijing China 			tmpw = *((__uint32_t *)data);
14679a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
14689a5557fdSlucy wang - Sun Microsystems - Beijing China 		case 8:
14699a5557fdSlucy wang - Sun Microsystems - Beijing China 		default:
14709a5557fdSlucy wang - Sun Microsystems - Beijing China 			tmpw = *((__uint64_t *)data);
14719a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
14729a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
14739a5557fdSlucy wang - Sun Microsystems - Beijing China 
14749a5557fdSlucy wang - Sun Microsystems - Beijing China 	word[0] &= ~((~(~0ULL << (sz[0] * 8))) << (off0 * 8));
14759a5557fdSlucy wang - Sun Microsystems - Beijing China 	word[0] |= tmpw << (off0 * 8);
14769a5557fdSlucy wang - Sun Microsystems - Beijing China 
14779a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (loop == 2) {
14789a5557fdSlucy wang - Sun Microsystems - Beijing China 		word[1] &= ~(~0ULL << (sz[1] * 8));
14799a5557fdSlucy wang - Sun Microsystems - Beijing China 		word[1] |= tmpw >> (sz[0] * 8);
14809a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
14819a5557fdSlucy wang - Sun Microsystems - Beijing China 
14829a5557fdSlucy wang - Sun Microsystems - Beijing China // don't lock here - write_wx gets the lock if each time
14839a5557fdSlucy wang - Sun Microsystems - Beijing China // UNM_WRITE_LOCK_IRQS(&adapter->adapter_lock, flags);
14849a5557fdSlucy wang - Sun Microsystems - Beijing China // unm_nic_pci_change_crbwindow_128M(adapter, 0);
14859a5557fdSlucy wang - Sun Microsystems - Beijing China 
14869a5557fdSlucy wang - Sun Microsystems - Beijing China 	for (i = 0; i < loop; i++) {
14879a5557fdSlucy wang - Sun Microsystems - Beijing China 		temp = off8 + (i << 3);
14889a5557fdSlucy wang - Sun Microsystems - Beijing China 		adapter->unm_nic_hw_write_wx(adapter,
14899a5557fdSlucy wang - Sun Microsystems - Beijing China 		    mem_crb+MIU_TEST_AGT_ADDR_LO, &temp, 4);
14909a5557fdSlucy wang - Sun Microsystems - Beijing China 		temp = 0;
14919a5557fdSlucy wang - Sun Microsystems - Beijing China 		adapter->unm_nic_hw_write_wx(adapter,
14929a5557fdSlucy wang - Sun Microsystems - Beijing China 		    mem_crb+MIU_TEST_AGT_ADDR_HI, &temp, 4);
14939a5557fdSlucy wang - Sun Microsystems - Beijing China 		temp = word[i] & 0xffffffff;
14949a5557fdSlucy wang - Sun Microsystems - Beijing China 		adapter->unm_nic_hw_write_wx(adapter,
14959a5557fdSlucy wang - Sun Microsystems - Beijing China 		    mem_crb+MIU_TEST_AGT_WRDATA_LO, &temp, 4);
14969a5557fdSlucy wang - Sun Microsystems - Beijing China 		temp = (word[i] >> 32) & 0xffffffff;
14979a5557fdSlucy wang - Sun Microsystems - Beijing China 		adapter->unm_nic_hw_write_wx(adapter,
14989a5557fdSlucy wang - Sun Microsystems - Beijing China 		    mem_crb+MIU_TEST_AGT_WRDATA_HI, &temp, 4);
14999a5557fdSlucy wang - Sun Microsystems - Beijing China 		temp = MIU_TA_CTL_ENABLE | MIU_TA_CTL_WRITE;
15009a5557fdSlucy wang - Sun Microsystems - Beijing China 		adapter->unm_nic_hw_write_wx(adapter,
15019a5557fdSlucy wang - Sun Microsystems - Beijing China 		    mem_crb+MIU_TEST_AGT_CTRL, &temp, 4);
15029a5557fdSlucy wang - Sun Microsystems - Beijing China 		temp = MIU_TA_CTL_START | MIU_TA_CTL_ENABLE | MIU_TA_CTL_WRITE;
15039a5557fdSlucy wang - Sun Microsystems - Beijing China 		adapter->unm_nic_hw_write_wx(adapter,
15049a5557fdSlucy wang - Sun Microsystems - Beijing China 		    mem_crb+MIU_TEST_AGT_CTRL, &temp, 4);
15059a5557fdSlucy wang - Sun Microsystems - Beijing China 
15069a5557fdSlucy wang - Sun Microsystems - Beijing China 		for (j = 0; j < MAX_CTL_CHECK; j++) {
15079a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->unm_nic_hw_read_wx(adapter,
15089a5557fdSlucy wang - Sun Microsystems - Beijing China 			    mem_crb + MIU_TEST_AGT_CTRL, &temp, 4);
15099a5557fdSlucy wang - Sun Microsystems - Beijing China 			if ((temp & MIU_TA_CTL_BUSY) == 0) {
15109a5557fdSlucy wang - Sun Microsystems - Beijing China 				break;
15119a5557fdSlucy wang - Sun Microsystems - Beijing China 			}
15129a5557fdSlucy wang - Sun Microsystems - Beijing China 		}
15139a5557fdSlucy wang - Sun Microsystems - Beijing China 
15149a5557fdSlucy wang - Sun Microsystems - Beijing China 		if (j >= MAX_CTL_CHECK) {
15159a5557fdSlucy wang - Sun Microsystems - Beijing China 			cmn_err(CE_WARN, "%s: Fail to write through agent\n",
15169a5557fdSlucy wang - Sun Microsystems - Beijing China 			    unm_nic_driver_name);
15179a5557fdSlucy wang - Sun Microsystems - Beijing China 			ret = -1;
15189a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
15199a5557fdSlucy wang - Sun Microsystems - Beijing China 		}
15209a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
15219a5557fdSlucy wang - Sun Microsystems - Beijing China 
15229a5557fdSlucy wang - Sun Microsystems - Beijing China //  unm_nic_pci_change_crbwindow_128M(adapter, 1);
15239a5557fdSlucy wang - Sun Microsystems - Beijing China //  UNM_WRITE_UNLOCK_IRQR(&adapter->adapter_lock, flags);
15249a5557fdSlucy wang - Sun Microsystems - Beijing China 	return (ret);
15259a5557fdSlucy wang - Sun Microsystems - Beijing China }
15269a5557fdSlucy wang - Sun Microsystems - Beijing China 
15279a5557fdSlucy wang - Sun Microsystems - Beijing China int
unm_nic_pci_mem_read_2M(struct unm_adapter_s * adapter,u64 off,void * data,int size)15289a5557fdSlucy wang - Sun Microsystems - Beijing China unm_nic_pci_mem_read_2M(struct unm_adapter_s *adapter, u64 off, void *data,
15299a5557fdSlucy wang - Sun Microsystems - Beijing China     int size)
15309a5557fdSlucy wang - Sun Microsystems - Beijing China {
15319a5557fdSlucy wang - Sun Microsystems - Beijing China // unsigned long   flags;
15329a5557fdSlucy wang - Sun Microsystems - Beijing China 	int		i, j = 0, k, start, end, loop, sz[2], off0[2];
15339a5557fdSlucy wang - Sun Microsystems - Beijing China 	__uint32_t	temp;
15349a5557fdSlucy wang - Sun Microsystems - Beijing China 	__uint64_t	off8, val, mem_crb, word[2] = {0, 0};
15359a5557fdSlucy wang - Sun Microsystems - Beijing China #define	MAX_CTL_CHECK   1000
15369a5557fdSlucy wang - Sun Microsystems - Beijing China 
15379a5557fdSlucy wang - Sun Microsystems - Beijing China 	/*
15389a5557fdSlucy wang - Sun Microsystems - Beijing China 	 * If not MN, go check for MS or invalid.
15399a5557fdSlucy wang - Sun Microsystems - Beijing China 	 */
15409a5557fdSlucy wang - Sun Microsystems - Beijing China 
15419a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (off >= UNM_ADDR_QDR_NET && off <= NX_P3_ADDR_QDR_NET_MAX) {
15429a5557fdSlucy wang - Sun Microsystems - Beijing China 		mem_crb = UNM_CRB_QDR_NET;
15439a5557fdSlucy wang - Sun Microsystems - Beijing China 	} else {
15449a5557fdSlucy wang - Sun Microsystems - Beijing China 		mem_crb = UNM_CRB_DDR_NET;
15459a5557fdSlucy wang - Sun Microsystems - Beijing China 		if (unm_nic_pci_mem_bound_check(adapter, off, size) == 0)
15469a5557fdSlucy wang - Sun Microsystems - Beijing China 			return (unm_nic_pci_mem_read_direct(adapter,
15479a5557fdSlucy wang - Sun Microsystems - Beijing China 			    off, data, size));
15489a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
15499a5557fdSlucy wang - Sun Microsystems - Beijing China 
15509a5557fdSlucy wang - Sun Microsystems - Beijing China 	off8 = off & 0xfffffff8;
15519a5557fdSlucy wang - Sun Microsystems - Beijing China 	off0[0] = off & 0x7;
15529a5557fdSlucy wang - Sun Microsystems - Beijing China 	off0[1] = 0;
15539a5557fdSlucy wang - Sun Microsystems - Beijing China 	sz[0] = (size < (8 - off0[0])) ? size : (8 - off0[0]);
15549a5557fdSlucy wang - Sun Microsystems - Beijing China 	sz[1] = size - sz[0];
15559a5557fdSlucy wang - Sun Microsystems - Beijing China 	loop = ((off0[0] + size - 1) >> 3) + 1;
15569a5557fdSlucy wang - Sun Microsystems - Beijing China 
15579a5557fdSlucy wang - Sun Microsystems - Beijing China // don't get lock - write_wx will get it
15589a5557fdSlucy wang - Sun Microsystems - Beijing China // UNM_WRITE_LOCK_IRQS(&adapter->adapter_lock, flags);
15599a5557fdSlucy wang - Sun Microsystems - Beijing China // unm_nic_pci_change_crbwindow_128M(adapter, 0);
15609a5557fdSlucy wang - Sun Microsystems - Beijing China 
15619a5557fdSlucy wang - Sun Microsystems - Beijing China 	for (i = 0; i < loop; i++) {
15629a5557fdSlucy wang - Sun Microsystems - Beijing China 		temp = off8 + (i << 3);
15639a5557fdSlucy wang - Sun Microsystems - Beijing China 		adapter->unm_nic_hw_write_wx(adapter,
15649a5557fdSlucy wang - Sun Microsystems - Beijing China 		    mem_crb + MIU_TEST_AGT_ADDR_LO, &temp, 4);
15659a5557fdSlucy wang - Sun Microsystems - Beijing China 		temp = 0;
15669a5557fdSlucy wang - Sun Microsystems - Beijing China 		adapter->unm_nic_hw_write_wx(adapter,
15679a5557fdSlucy wang - Sun Microsystems - Beijing China 		    mem_crb + MIU_TEST_AGT_ADDR_HI, &temp, 4);
15689a5557fdSlucy wang - Sun Microsystems - Beijing China 		temp = MIU_TA_CTL_ENABLE;
15699a5557fdSlucy wang - Sun Microsystems - Beijing China 		adapter->unm_nic_hw_write_wx(adapter,
15709a5557fdSlucy wang - Sun Microsystems - Beijing China 		    mem_crb + MIU_TEST_AGT_CTRL, &temp, 4);
15719a5557fdSlucy wang - Sun Microsystems - Beijing China 		temp = MIU_TA_CTL_START | MIU_TA_CTL_ENABLE;
15729a5557fdSlucy wang - Sun Microsystems - Beijing China 		adapter->unm_nic_hw_write_wx(adapter,
15739a5557fdSlucy wang - Sun Microsystems - Beijing China 		    mem_crb + MIU_TEST_AGT_CTRL, &temp, 4);
15749a5557fdSlucy wang - Sun Microsystems - Beijing China 
15759a5557fdSlucy wang - Sun Microsystems - Beijing China 		for (j = 0; j < MAX_CTL_CHECK; j++) {
15769a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->unm_nic_hw_read_wx(adapter,
15779a5557fdSlucy wang - Sun Microsystems - Beijing China 			    mem_crb + MIU_TEST_AGT_CTRL, &temp, 4);
15789a5557fdSlucy wang - Sun Microsystems - Beijing China 			if ((temp & MIU_TA_CTL_BUSY) == 0) {
15799a5557fdSlucy wang - Sun Microsystems - Beijing China 				break;
15809a5557fdSlucy wang - Sun Microsystems - Beijing China 			}
15819a5557fdSlucy wang - Sun Microsystems - Beijing China 		}
15829a5557fdSlucy wang - Sun Microsystems - Beijing China 
15839a5557fdSlucy wang - Sun Microsystems - Beijing China 		if (j >= MAX_CTL_CHECK) {
15849a5557fdSlucy wang - Sun Microsystems - Beijing China 			cmn_err(CE_WARN, "%s: Fail to read through agent\n",
15859a5557fdSlucy wang - Sun Microsystems - Beijing China 			    unm_nic_driver_name);
15869a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
15879a5557fdSlucy wang - Sun Microsystems - Beijing China 		}
15889a5557fdSlucy wang - Sun Microsystems - Beijing China 
15899a5557fdSlucy wang - Sun Microsystems - Beijing China 		start = off0[i] >> 2;
15909a5557fdSlucy wang - Sun Microsystems - Beijing China 		end   = (off0[i] + sz[i] - 1) >> 2;
15919a5557fdSlucy wang - Sun Microsystems - Beijing China 		for (k = start; k <= end; k++) {
15929a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->unm_nic_hw_read_wx(adapter,
15939a5557fdSlucy wang - Sun Microsystems - Beijing China 			    mem_crb + MIU_TEST_AGT_RDDATA(k), &temp, 4);
15949a5557fdSlucy wang - Sun Microsystems - Beijing China 			word[i] |= ((__uint64_t)temp << (32 * k));
15959a5557fdSlucy wang - Sun Microsystems - Beijing China 		}
15969a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
15979a5557fdSlucy wang - Sun Microsystems - Beijing China 
15989a5557fdSlucy wang - Sun Microsystems - Beijing China // unm_nic_pci_change_crbwindow_128M(adapter, 1);
15999a5557fdSlucy wang - Sun Microsystems - Beijing China // UNM_WRITE_UNLOCK_IRQR(&adapter->adapter_lock, flags);
16009a5557fdSlucy wang - Sun Microsystems - Beijing China 
16019a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (j >= MAX_CTL_CHECK)
16029a5557fdSlucy wang - Sun Microsystems - Beijing China 		return (-1);
16039a5557fdSlucy wang - Sun Microsystems - Beijing China 
16049a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (sz[0] == 8) {
16059a5557fdSlucy wang - Sun Microsystems - Beijing China 		val = word[0];
16069a5557fdSlucy wang - Sun Microsystems - Beijing China 	} else {
16079a5557fdSlucy wang - Sun Microsystems - Beijing China 		val = ((word[0] >> (off0[0] * 8)) & (~(~0ULL << (sz[0] * 8)))) |
16089a5557fdSlucy wang - Sun Microsystems - Beijing China 		    ((word[1] & (~(~0ULL << (sz[1] * 8)))) << (sz[0] * 8));
16099a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
16109a5557fdSlucy wang - Sun Microsystems - Beijing China 
16119a5557fdSlucy wang - Sun Microsystems - Beijing China 	switch (size) {
16129a5557fdSlucy wang - Sun Microsystems - Beijing China 		case 1:
16139a5557fdSlucy wang - Sun Microsystems - Beijing China 			*(__uint8_t  *)data = val;
16149a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
16159a5557fdSlucy wang - Sun Microsystems - Beijing China 		case 2:
16169a5557fdSlucy wang - Sun Microsystems - Beijing China 			*(__uint16_t *)data = val;
16179a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
16189a5557fdSlucy wang - Sun Microsystems - Beijing China 		case 4:
16199a5557fdSlucy wang - Sun Microsystems - Beijing China 			*(__uint32_t *)data = val;
16209a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
16219a5557fdSlucy wang - Sun Microsystems - Beijing China 		case 8:
16229a5557fdSlucy wang - Sun Microsystems - Beijing China 			*(__uint64_t *)data = val;
16239a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
16249a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
16259a5557fdSlucy wang - Sun Microsystems - Beijing China 	return (0);
16269a5557fdSlucy wang - Sun Microsystems - Beijing China }
16279a5557fdSlucy wang - Sun Microsystems - Beijing China 
16289a5557fdSlucy wang - Sun Microsystems - Beijing China int
unm_crb_writelit_adapter_2M(struct unm_adapter_s * adapter,unsigned long off,int data)16299a5557fdSlucy wang - Sun Microsystems - Beijing China unm_crb_writelit_adapter_2M(struct unm_adapter_s *adapter, unsigned long off,
16309a5557fdSlucy wang - Sun Microsystems - Beijing China     int data)
16319a5557fdSlucy wang - Sun Microsystems - Beijing China {
16329a5557fdSlucy wang - Sun Microsystems - Beijing China 	return (unm_nic_hw_write_wx_2M(adapter, off, &data, 4));
16339a5557fdSlucy wang - Sun Microsystems - Beijing China }
16349a5557fdSlucy wang - Sun Microsystems - Beijing China 
16359a5557fdSlucy wang - Sun Microsystems - Beijing China int
unm_crb_writelit_adapter_128M(struct unm_adapter_s * adapter,unsigned long off,int data)16369a5557fdSlucy wang - Sun Microsystems - Beijing China unm_crb_writelit_adapter_128M(struct unm_adapter_s *adapter, unsigned long off,
16379a5557fdSlucy wang - Sun Microsystems - Beijing China     int data)
16389a5557fdSlucy wang - Sun Microsystems - Beijing China {
16399a5557fdSlucy wang - Sun Microsystems - Beijing China 	void *addr;
16409a5557fdSlucy wang - Sun Microsystems - Beijing China 
16419a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (ADDR_IN_WINDOW1(off)) {
16429a5557fdSlucy wang - Sun Microsystems - Beijing China 		UNM_READ_LOCK(&adapter->adapter_lock);
16439a5557fdSlucy wang - Sun Microsystems - Beijing China 		UNM_NIC_PCI_WRITE_32(data, CRB_NORMALIZE(adapter, off));
16449a5557fdSlucy wang - Sun Microsystems - Beijing China 		UNM_READ_UNLOCK(&adapter->adapter_lock);
16459a5557fdSlucy wang - Sun Microsystems - Beijing China 	} else {
16469a5557fdSlucy wang - Sun Microsystems - Beijing China 		// unm_nic_write_w0 (adapter, off, data);
16479a5557fdSlucy wang - Sun Microsystems - Beijing China 		UNM_WRITE_LOCK_IRQS(&adapter->adapter_lock, flags);
16489a5557fdSlucy wang - Sun Microsystems - Beijing China 		unm_nic_pci_change_crbwindow_128M(adapter, 0);
16499a5557fdSlucy wang - Sun Microsystems - Beijing China 		addr = (void *) (pci_base_offset(adapter, off));
16509a5557fdSlucy wang - Sun Microsystems - Beijing China 		UNM_NIC_PCI_WRITE_32(data, addr);
16519a5557fdSlucy wang - Sun Microsystems - Beijing China 		unm_nic_pci_change_crbwindow_128M(adapter, 1);
16529a5557fdSlucy wang - Sun Microsystems - Beijing China 		UNM_WRITE_UNLOCK_IRQR(&adapter->adapter_lock, flags);
16539a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
16549a5557fdSlucy wang - Sun Microsystems - Beijing China 
16559a5557fdSlucy wang - Sun Microsystems - Beijing China 	return (0);
16569a5557fdSlucy wang - Sun Microsystems - Beijing China }
16579a5557fdSlucy wang - Sun Microsystems - Beijing China 
16589a5557fdSlucy wang - Sun Microsystems - Beijing China int
unm_nic_get_board_info(struct unm_adapter_s * adapter)16599a5557fdSlucy wang - Sun Microsystems - Beijing China unm_nic_get_board_info(struct unm_adapter_s *adapter)
16609a5557fdSlucy wang - Sun Microsystems - Beijing China {
16619a5557fdSlucy wang - Sun Microsystems - Beijing China 	int	rv = 0;
16629a5557fdSlucy wang - Sun Microsystems - Beijing China 	unm_board_info_t  *boardinfo;
16639a5557fdSlucy wang - Sun Microsystems - Beijing China 	int		i;
16649a5557fdSlucy wang - Sun Microsystems - Beijing China 	int		addr = BRDCFG_START;
16659a5557fdSlucy wang - Sun Microsystems - Beijing China 	uint32_t	  *ptr32;
16669a5557fdSlucy wang - Sun Microsystems - Beijing China 	uint32_t	gpioval;
16679a5557fdSlucy wang - Sun Microsystems - Beijing China 
16689a5557fdSlucy wang - Sun Microsystems - Beijing China 	boardinfo = &adapter->ahw.boardcfg;
16699a5557fdSlucy wang - Sun Microsystems - Beijing China 	ptr32 = (uint32_t *)boardinfo;
16709a5557fdSlucy wang - Sun Microsystems - Beijing China 
16719a5557fdSlucy wang - Sun Microsystems - Beijing China 	for (i = 0; i < sizeof (unm_board_info_t) / sizeof (uint32_t); i++) {
16729a5557fdSlucy wang - Sun Microsystems - Beijing China 		if (rom_fast_read(adapter, addr, (int *)ptr32) == -1) {
16739a5557fdSlucy wang - Sun Microsystems - Beijing China 			return (-1);
16749a5557fdSlucy wang - Sun Microsystems - Beijing China 		}
16759a5557fdSlucy wang - Sun Microsystems - Beijing China 		DPRINTF(1, (CE_WARN, "ROM(%d): %x\n", i, *ptr32));
16769a5557fdSlucy wang - Sun Microsystems - Beijing China 		ptr32++;
16779a5557fdSlucy wang - Sun Microsystems - Beijing China 		addr += sizeof (uint32_t);
16789a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
16799a5557fdSlucy wang - Sun Microsystems - Beijing China 
16809a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (boardinfo->magic != UNM_BDINFO_MAGIC) {
16819a5557fdSlucy wang - Sun Microsystems - Beijing China 		DPRINTF(1, (CE_WARN, "%s: ERROR reading board config."
16829a5557fdSlucy wang - Sun Microsystems - Beijing China 		    " Read %x, expected %x\n", unm_nic_driver_name,
16839a5557fdSlucy wang - Sun Microsystems - Beijing China 		    boardinfo->magic, UNM_BDINFO_MAGIC));
16849a5557fdSlucy wang - Sun Microsystems - Beijing China 		rv = -1;
16859a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
16869a5557fdSlucy wang - Sun Microsystems - Beijing China 
16879a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (boardinfo->header_version != UNM_BDINFO_VERSION) {
16889a5557fdSlucy wang - Sun Microsystems - Beijing China 		DPRINTF(1, (CE_WARN, "%s: Unknown board config version."
16899a5557fdSlucy wang - Sun Microsystems - Beijing China 		    " Read %x, expected %x\n", unm_nic_driver_name,
16909a5557fdSlucy wang - Sun Microsystems - Beijing China 		    boardinfo->header_version, UNM_BDINFO_VERSION));
16919a5557fdSlucy wang - Sun Microsystems - Beijing China 		rv = -1;
16929a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
16939a5557fdSlucy wang - Sun Microsystems - Beijing China 
16949a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (boardinfo->board_type == UNM_BRDTYPE_P3_4_GB_MM) {
16959a5557fdSlucy wang - Sun Microsystems - Beijing China 		gpioval = UNM_CRB_READ_VAL_ADAPTER(UNM_ROMUSB_GLB_PAD_GPIO_I,
16969a5557fdSlucy wang - Sun Microsystems - Beijing China 		    adapter);
16979a5557fdSlucy wang - Sun Microsystems - Beijing China 		if ((gpioval & 0x8000) == 0)
16989a5557fdSlucy wang - Sun Microsystems - Beijing China 			boardinfo->board_type = UNM_BRDTYPE_P3_10G_TRP;
16999a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
17009a5557fdSlucy wang - Sun Microsystems - Beijing China 
17019a5557fdSlucy wang - Sun Microsystems - Beijing China 	DPRINTF(0, (CE_WARN, "Discovered board type:0x%x  ",
17029a5557fdSlucy wang - Sun Microsystems - Beijing China 	    boardinfo->board_type));
17039a5557fdSlucy wang - Sun Microsystems - Beijing China 
17049a5557fdSlucy wang - Sun Microsystems - Beijing China 	switch ((unm_brdtype_t)boardinfo->board_type) {
17059a5557fdSlucy wang - Sun Microsystems - Beijing China 	case UNM_BRDTYPE_P2_SB35_4G:
17069a5557fdSlucy wang - Sun Microsystems - Beijing China 		adapter->ahw.board_type = UNM_NIC_GBE;
17079a5557fdSlucy wang - Sun Microsystems - Beijing China 		break;
17089a5557fdSlucy wang - Sun Microsystems - Beijing China 	case UNM_BRDTYPE_P2_SB31_10G:
17099a5557fdSlucy wang - Sun Microsystems - Beijing China 	case UNM_BRDTYPE_P2_SB31_10G_IMEZ:
17109a5557fdSlucy wang - Sun Microsystems - Beijing China 	case UNM_BRDTYPE_P2_SB31_10G_HMEZ:
17119a5557fdSlucy wang - Sun Microsystems - Beijing China 	case UNM_BRDTYPE_P2_SB31_10G_CX4:
17129a5557fdSlucy wang - Sun Microsystems - Beijing China 	case UNM_BRDTYPE_P3_HMEZ:
17139a5557fdSlucy wang - Sun Microsystems - Beijing China 	case UNM_BRDTYPE_P3_XG_LOM:
17149a5557fdSlucy wang - Sun Microsystems - Beijing China 	case UNM_BRDTYPE_P3_10G_CX4:
17159a5557fdSlucy wang - Sun Microsystems - Beijing China 	case UNM_BRDTYPE_P3_10G_CX4_LP:
17169a5557fdSlucy wang - Sun Microsystems - Beijing China 	case UNM_BRDTYPE_P3_IMEZ:
17179a5557fdSlucy wang - Sun Microsystems - Beijing China 	case UNM_BRDTYPE_P3_10G_SFP_PLUS:
17189a5557fdSlucy wang - Sun Microsystems - Beijing China 	case UNM_BRDTYPE_P3_10G_XFP:
17199a5557fdSlucy wang - Sun Microsystems - Beijing China 	case UNM_BRDTYPE_P3_10000_BASE_T:
17209a5557fdSlucy wang - Sun Microsystems - Beijing China 		adapter->ahw.board_type = UNM_NIC_XGBE;
17219a5557fdSlucy wang - Sun Microsystems - Beijing China 		break;
17229a5557fdSlucy wang - Sun Microsystems - Beijing China 	case UNM_BRDTYPE_P3_REF_QG:
17239a5557fdSlucy wang - Sun Microsystems - Beijing China 	case UNM_BRDTYPE_P3_4_GB:
17249a5557fdSlucy wang - Sun Microsystems - Beijing China 	case UNM_BRDTYPE_P3_4_GB_MM:
17259a5557fdSlucy wang - Sun Microsystems - Beijing China 		adapter->ahw.board_type = UNM_NIC_GBE;
17269a5557fdSlucy wang - Sun Microsystems - Beijing China 		break;
17279a5557fdSlucy wang - Sun Microsystems - Beijing China 	case UNM_BRDTYPE_P1_BD:
17289a5557fdSlucy wang - Sun Microsystems - Beijing China 	case UNM_BRDTYPE_P1_SB:
17299a5557fdSlucy wang - Sun Microsystems - Beijing China 	case UNM_BRDTYPE_P1_SMAX:
17309a5557fdSlucy wang - Sun Microsystems - Beijing China 	case UNM_BRDTYPE_P1_SOCK:
17319a5557fdSlucy wang - Sun Microsystems - Beijing China 		adapter->ahw.board_type = UNM_NIC_GBE;
17329a5557fdSlucy wang - Sun Microsystems - Beijing China 		break;
17339a5557fdSlucy wang - Sun Microsystems - Beijing China 	case UNM_BRDTYPE_P3_10G_TRP:
17349a5557fdSlucy wang - Sun Microsystems - Beijing China 		if (adapter->portnum < 2)
17359a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->ahw.board_type = UNM_NIC_XGBE;
17369a5557fdSlucy wang - Sun Microsystems - Beijing China 		else
17379a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->ahw.board_type = UNM_NIC_GBE;
17389a5557fdSlucy wang - Sun Microsystems - Beijing China 		break;
17399a5557fdSlucy wang - Sun Microsystems - Beijing China 	default:
17409a5557fdSlucy wang - Sun Microsystems - Beijing China 		DPRINTF(1, (CE_WARN, "%s: Unknown(%x)\n", unm_nic_driver_name,
17419a5557fdSlucy wang - Sun Microsystems - Beijing China 		    boardinfo->board_type));
17429a5557fdSlucy wang - Sun Microsystems - Beijing China 		break;
17439a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
17449a5557fdSlucy wang - Sun Microsystems - Beijing China 
17459a5557fdSlucy wang - Sun Microsystems - Beijing China 	return (rv);
17469a5557fdSlucy wang - Sun Microsystems - Beijing China }
17479a5557fdSlucy wang - Sun Microsystems - Beijing China 
17489a5557fdSlucy wang - Sun Microsystems - Beijing China /* NIU access sections */
17499a5557fdSlucy wang - Sun Microsystems - Beijing China 
17509a5557fdSlucy wang - Sun Microsystems - Beijing China int
unm_nic_macaddr_set(struct unm_adapter_s * adapter,__uint8_t * addr)17519a5557fdSlucy wang - Sun Microsystems - Beijing China unm_nic_macaddr_set(struct unm_adapter_s *adapter, __uint8_t *addr)
17529a5557fdSlucy wang - Sun Microsystems - Beijing China {
17539a5557fdSlucy wang - Sun Microsystems - Beijing China 	int		ret = 0, i, retry_count = 10;
17549a5557fdSlucy wang - Sun Microsystems - Beijing China 	unsigned char		mac_addr[MAX_ADDR_LEN];
17559a5557fdSlucy wang - Sun Microsystems - Beijing China 
17569a5557fdSlucy wang - Sun Microsystems - Beijing China 	/* For P3, we should not set MAC in HW any more */
17579a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (NX_IS_REVISION_P3(adapter->ahw.revision_id))
17589a5557fdSlucy wang - Sun Microsystems - Beijing China 		return (0);
17599a5557fdSlucy wang - Sun Microsystems - Beijing China 
17609a5557fdSlucy wang - Sun Microsystems - Beijing China 	switch (adapter->ahw.board_type) {
17619a5557fdSlucy wang - Sun Microsystems - Beijing China 		case UNM_NIC_GBE:
17629a5557fdSlucy wang - Sun Microsystems - Beijing China 	/*
17639a5557fdSlucy wang - Sun Microsystems - Beijing China 	 * Flaky Mac address registers on qgig require several writes.
17649a5557fdSlucy wang - Sun Microsystems - Beijing China 	 */
17659a5557fdSlucy wang - Sun Microsystems - Beijing China 			for (i = 0; i < retry_count; ++i) {
17669a5557fdSlucy wang - Sun Microsystems - Beijing China 				if (unm_niu_macaddr_set(adapter, addr) != 0)
17679a5557fdSlucy wang - Sun Microsystems - Beijing China 					return (-1);
17689a5557fdSlucy wang - Sun Microsystems - Beijing China 
17699a5557fdSlucy wang - Sun Microsystems - Beijing China 				(void) unm_niu_macaddr_get(adapter,
17709a5557fdSlucy wang - Sun Microsystems - Beijing China 				    (unsigned char *)mac_addr);
17719a5557fdSlucy wang - Sun Microsystems - Beijing China 				if (memcmp(mac_addr, addr, 6) == 0)
17729a5557fdSlucy wang - Sun Microsystems - Beijing China 					return (0);
17739a5557fdSlucy wang - Sun Microsystems - Beijing China 			}
17749a5557fdSlucy wang - Sun Microsystems - Beijing China 			cmn_err(CE_WARN, "%s: Flaky MAC addr registers\n",
17759a5557fdSlucy wang - Sun Microsystems - Beijing China 			    unm_nic_driver_name);
17769a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
17779a5557fdSlucy wang - Sun Microsystems - Beijing China 
17789a5557fdSlucy wang - Sun Microsystems - Beijing China 		case UNM_NIC_XGBE:
17799a5557fdSlucy wang - Sun Microsystems - Beijing China 			ret = unm_niu_xg_macaddr_set(adapter, addr);
17809a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
17819a5557fdSlucy wang - Sun Microsystems - Beijing China 
17829a5557fdSlucy wang - Sun Microsystems - Beijing China 		default:
17839a5557fdSlucy wang - Sun Microsystems - Beijing China 			cmn_err(CE_WARN,  "\r\nUnknown board type encountered"
17849a5557fdSlucy wang - Sun Microsystems - Beijing China 			    " while setting the MAC address.\n");
17859a5557fdSlucy wang - Sun Microsystems - Beijing China 			return (-1);
17869a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
17879a5557fdSlucy wang - Sun Microsystems - Beijing China 	return (ret);
17889a5557fdSlucy wang - Sun Microsystems - Beijing China }
17899a5557fdSlucy wang - Sun Microsystems - Beijing China 
17909a5557fdSlucy wang - Sun Microsystems - Beijing China #define	MTU_FUDGE_FACTOR 100
17919a5557fdSlucy wang - Sun Microsystems - Beijing China int
unm_nic_set_mtu(struct unm_adapter_s * adapter,int new_mtu)17929a5557fdSlucy wang - Sun Microsystems - Beijing China unm_nic_set_mtu(struct unm_adapter_s *adapter, int new_mtu)
17939a5557fdSlucy wang - Sun Microsystems - Beijing China {
17949a5557fdSlucy wang - Sun Microsystems - Beijing China 	long		port = adapter->physical_port;
17959a5557fdSlucy wang - Sun Microsystems - Beijing China 	int			ret = 0;
17969a5557fdSlucy wang - Sun Microsystems - Beijing China 	u32			port_mode = 0;
17979a5557fdSlucy wang - Sun Microsystems - Beijing China 
17989a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (adapter->ahw.revision_id >= NX_P3_A2)
17999a5557fdSlucy wang - Sun Microsystems - Beijing China 		return (nx_fw_cmd_set_mtu(adapter, new_mtu));
18009a5557fdSlucy wang - Sun Microsystems - Beijing China 
18019a5557fdSlucy wang - Sun Microsystems - Beijing China 	new_mtu += MTU_FUDGE_FACTOR; /* so that MAC accepts frames > MTU */
18029a5557fdSlucy wang - Sun Microsystems - Beijing China 	switch (adapter->ahw.board_type) {
18039a5557fdSlucy wang - Sun Microsystems - Beijing China 		case UNM_NIC_GBE:
18049a5557fdSlucy wang - Sun Microsystems - Beijing China 			unm_nic_write_w0(adapter,
18059a5557fdSlucy wang - Sun Microsystems - Beijing China 			    UNM_NIU_GB_MAX_FRAME_SIZE(adapter->physical_port),
18069a5557fdSlucy wang - Sun Microsystems - Beijing China 			    new_mtu);
18079a5557fdSlucy wang - Sun Microsystems - Beijing China 
18089a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
18099a5557fdSlucy wang - Sun Microsystems - Beijing China 
18109a5557fdSlucy wang - Sun Microsystems - Beijing China 		case UNM_NIC_XGBE:
18119a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->unm_nic_hw_read_wx(adapter, UNM_PORT_MODE_ADDR,
18129a5557fdSlucy wang - Sun Microsystems - Beijing China 			    &port_mode, 4);
18139a5557fdSlucy wang - Sun Microsystems - Beijing China 			if (port_mode == UNM_PORT_MODE_802_3_AP) {
18149a5557fdSlucy wang - Sun Microsystems - Beijing China 				unm_nic_write_w0(adapter,
18159a5557fdSlucy wang - Sun Microsystems - Beijing China 				    UNM_NIU_AP_MAX_FRAME_SIZE(port), new_mtu);
18169a5557fdSlucy wang - Sun Microsystems - Beijing China 			} else {
18179a5557fdSlucy wang - Sun Microsystems - Beijing China 				if (adapter->physical_port == 0) {
18189a5557fdSlucy wang - Sun Microsystems - Beijing China 					unm_nic_write_w0(adapter,
18199a5557fdSlucy wang - Sun Microsystems - Beijing China 					    UNM_NIU_XGE_MAX_FRAME_SIZE,
18209a5557fdSlucy wang - Sun Microsystems - Beijing China 					    new_mtu);
18219a5557fdSlucy wang - Sun Microsystems - Beijing China 				} else {
18229a5557fdSlucy wang - Sun Microsystems - Beijing China 					unm_nic_write_w0(adapter,
18239a5557fdSlucy wang - Sun Microsystems - Beijing China 					    UNM_NIU_XG1_MAX_FRAME_SIZE,
18249a5557fdSlucy wang - Sun Microsystems - Beijing China 					    new_mtu);
18259a5557fdSlucy wang - Sun Microsystems - Beijing China 				}
18269a5557fdSlucy wang - Sun Microsystems - Beijing China 			}
18279a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
18289a5557fdSlucy wang - Sun Microsystems - Beijing China 
18299a5557fdSlucy wang - Sun Microsystems - Beijing China 		default:
18309a5557fdSlucy wang - Sun Microsystems - Beijing China 			cmn_err(CE_WARN, "%s: Unknown brdtype\n",
18319a5557fdSlucy wang - Sun Microsystems - Beijing China 			    unm_nic_driver_name);
18329a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
18339a5557fdSlucy wang - Sun Microsystems - Beijing China 
18349a5557fdSlucy wang - Sun Microsystems - Beijing China 	return (ret);
18359a5557fdSlucy wang - Sun Microsystems - Beijing China }
18369a5557fdSlucy wang - Sun Microsystems - Beijing China 
18379a5557fdSlucy wang - Sun Microsystems - Beijing China int
unm_nic_set_promisc_mode(struct unm_adapter_s * adapter)18389a5557fdSlucy wang - Sun Microsystems - Beijing China unm_nic_set_promisc_mode(struct unm_adapter_s *adapter)
18399a5557fdSlucy wang - Sun Microsystems - Beijing China {
18409a5557fdSlucy wang - Sun Microsystems - Beijing China 	int		ret;
18419a5557fdSlucy wang - Sun Microsystems - Beijing China 
18429a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (adapter->promisc)
18439a5557fdSlucy wang - Sun Microsystems - Beijing China 		return (0);
18449a5557fdSlucy wang - Sun Microsystems - Beijing China 
18459a5557fdSlucy wang - Sun Microsystems - Beijing China 	switch (adapter->ahw.board_type) {
18469a5557fdSlucy wang - Sun Microsystems - Beijing China 		case UNM_NIC_GBE:
18479a5557fdSlucy wang - Sun Microsystems - Beijing China 			ret = unm_niu_set_promiscuous_mode(adapter,
18489a5557fdSlucy wang - Sun Microsystems - Beijing China 			    UNM_NIU_PROMISCOUS_MODE);
18499a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
18509a5557fdSlucy wang - Sun Microsystems - Beijing China 
18519a5557fdSlucy wang - Sun Microsystems - Beijing China 		case UNM_NIC_XGBE:
18529a5557fdSlucy wang - Sun Microsystems - Beijing China 			ret = unm_niu_xg_set_promiscuous_mode(adapter,
18539a5557fdSlucy wang - Sun Microsystems - Beijing China 			    UNM_NIU_PROMISCOUS_MODE);
18549a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
18559a5557fdSlucy wang - Sun Microsystems - Beijing China 
18569a5557fdSlucy wang - Sun Microsystems - Beijing China 		default:
18579a5557fdSlucy wang - Sun Microsystems - Beijing China 			cmn_err(CE_WARN, "%s: Unknown brdtype\n",
18589a5557fdSlucy wang - Sun Microsystems - Beijing China 			    unm_nic_driver_name);
18599a5557fdSlucy wang - Sun Microsystems - Beijing China 			ret = -1;
18609a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
18619a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
18629a5557fdSlucy wang - Sun Microsystems - Beijing China 
18639a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (!ret)
18649a5557fdSlucy wang - Sun Microsystems - Beijing China 		adapter->promisc = 1;
18659a5557fdSlucy wang - Sun Microsystems - Beijing China 
18669a5557fdSlucy wang - Sun Microsystems - Beijing China 	return (ret);
18679a5557fdSlucy wang - Sun Microsystems - Beijing China }
18689a5557fdSlucy wang - Sun Microsystems - Beijing China 
18699a5557fdSlucy wang - Sun Microsystems - Beijing China int
unm_nic_unset_promisc_mode(struct unm_adapter_s * adapter)18709a5557fdSlucy wang - Sun Microsystems - Beijing China unm_nic_unset_promisc_mode(struct unm_adapter_s *adapter)
18719a5557fdSlucy wang - Sun Microsystems - Beijing China {
18729a5557fdSlucy wang - Sun Microsystems - Beijing China 	int	ret = 0;
18739a5557fdSlucy wang - Sun Microsystems - Beijing China 
18749a5557fdSlucy wang - Sun Microsystems - Beijing China 	/*
18759a5557fdSlucy wang - Sun Microsystems - Beijing China 	 * P3 does not unset promiscous mode. Why?
18769a5557fdSlucy wang - Sun Microsystems - Beijing China 	 */
18779a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (adapter->ahw.revision_id >= NX_P3_A2) {
18789a5557fdSlucy wang - Sun Microsystems - Beijing China 		return (0);
18799a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
18809a5557fdSlucy wang - Sun Microsystems - Beijing China 
18819a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (!adapter->promisc)
18829a5557fdSlucy wang - Sun Microsystems - Beijing China 		return (0);
18839a5557fdSlucy wang - Sun Microsystems - Beijing China 
18849a5557fdSlucy wang - Sun Microsystems - Beijing China 	switch (adapter->ahw.board_type) {
18859a5557fdSlucy wang - Sun Microsystems - Beijing China 		case UNM_NIC_GBE:
18869a5557fdSlucy wang - Sun Microsystems - Beijing China 			ret = unm_niu_set_promiscuous_mode(adapter,
18879a5557fdSlucy wang - Sun Microsystems - Beijing China 			    UNM_NIU_NON_PROMISCOUS_MODE);
18889a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
18899a5557fdSlucy wang - Sun Microsystems - Beijing China 
18909a5557fdSlucy wang - Sun Microsystems - Beijing China 		case UNM_NIC_XGBE:
18919a5557fdSlucy wang - Sun Microsystems - Beijing China 			ret = unm_niu_xg_set_promiscuous_mode(adapter,
18929a5557fdSlucy wang - Sun Microsystems - Beijing China 			    UNM_NIU_NON_PROMISCOUS_MODE);
18939a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
18949a5557fdSlucy wang - Sun Microsystems - Beijing China 
18959a5557fdSlucy wang - Sun Microsystems - Beijing China 		default:
18969a5557fdSlucy wang - Sun Microsystems - Beijing China 			cmn_err(CE_WARN, "%s: Unknown brdtype\n",
18979a5557fdSlucy wang - Sun Microsystems - Beijing China 			    unm_nic_driver_name);
18989a5557fdSlucy wang - Sun Microsystems - Beijing China 			ret = -1;
18999a5557fdSlucy wang - Sun Microsystems - Beijing China 			break;
19009a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
19019a5557fdSlucy wang - Sun Microsystems - Beijing China 
19029a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (!ret)
19039a5557fdSlucy wang - Sun Microsystems - Beijing China 		adapter->promisc = 0;
19049a5557fdSlucy wang - Sun Microsystems - Beijing China 
19059a5557fdSlucy wang - Sun Microsystems - Beijing China 	return (ret);
19069a5557fdSlucy wang - Sun Microsystems - Beijing China }
19079a5557fdSlucy wang - Sun Microsystems - Beijing China 
19089a5557fdSlucy wang - Sun Microsystems - Beijing China long
unm_nic_phy_read(unm_adapter * adapter,long reg,__uint32_t * readval)19091f0a2977SToomas Soome unm_nic_phy_read(unm_adapter *adapter, long reg, __uint32_t *readval)
19109a5557fdSlucy wang - Sun Microsystems - Beijing China {
19119a5557fdSlucy wang - Sun Microsystems - Beijing China 	long	ret = 0;
19129a5557fdSlucy wang - Sun Microsystems - Beijing China 
19139a5557fdSlucy wang - Sun Microsystems - Beijing China 	switch (adapter->ahw.board_type) {
19149a5557fdSlucy wang - Sun Microsystems - Beijing China 	case UNM_NIC_GBE:
19159a5557fdSlucy wang - Sun Microsystems - Beijing China 		ret = unm_niu_gbe_phy_read(adapter, reg, readval);
19169a5557fdSlucy wang - Sun Microsystems - Beijing China 		break;
19179a5557fdSlucy wang - Sun Microsystems - Beijing China 
19189a5557fdSlucy wang - Sun Microsystems - Beijing China 	case UNM_NIC_XGBE:
19199a5557fdSlucy wang - Sun Microsystems - Beijing China 		DPRINTF(1, (CE_WARN,
19209a5557fdSlucy wang - Sun Microsystems - Beijing China 		    "%s: Function %s is not implemented for XG\n",
19219a5557fdSlucy wang - Sun Microsystems - Beijing China 		    unm_nic_driver_name, __FUNCTION__));
19229a5557fdSlucy wang - Sun Microsystems - Beijing China 		break;
19239a5557fdSlucy wang - Sun Microsystems - Beijing China 
19249a5557fdSlucy wang - Sun Microsystems - Beijing China 	default:
19259a5557fdSlucy wang - Sun Microsystems - Beijing China 		DPRINTF(1, (CE_WARN, "%s: Unknown board type\n",
19269a5557fdSlucy wang - Sun Microsystems - Beijing China 		    unm_nic_driver_name));
19279a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
19289a5557fdSlucy wang - Sun Microsystems - Beijing China 
19299a5557fdSlucy wang - Sun Microsystems - Beijing China 	return (ret);
19309a5557fdSlucy wang - Sun Microsystems - Beijing China }
19319a5557fdSlucy wang - Sun Microsystems - Beijing China 
19329a5557fdSlucy wang - Sun Microsystems - Beijing China long
unm_nic_init_port(struct unm_adapter_s * adapter)19339a5557fdSlucy wang - Sun Microsystems - Beijing China unm_nic_init_port(struct unm_adapter_s *adapter)
19349a5557fdSlucy wang - Sun Microsystems - Beijing China {
19359a5557fdSlucy wang - Sun Microsystems - Beijing China 	long	portnum = adapter->physical_port;
19369a5557fdSlucy wang - Sun Microsystems - Beijing China 	long	ret = 0;
19379a5557fdSlucy wang - Sun Microsystems - Beijing China 	long	reg = 0;
19389a5557fdSlucy wang - Sun Microsystems - Beijing China 	u32			port_mode = 0;
19399a5557fdSlucy wang - Sun Microsystems - Beijing China 
19409a5557fdSlucy wang - Sun Microsystems - Beijing China 	unm_nic_set_link_parameters(adapter);
19419a5557fdSlucy wang - Sun Microsystems - Beijing China 
19429a5557fdSlucy wang - Sun Microsystems - Beijing China 	switch (adapter->ahw.board_type) {
19439a5557fdSlucy wang - Sun Microsystems - Beijing China 	case UNM_NIC_GBE:
19441f0a2977SToomas Soome 		ret = unm_niu_enable_gbe_port(adapter);
19459a5557fdSlucy wang - Sun Microsystems - Beijing China 		break;
19469a5557fdSlucy wang - Sun Microsystems - Beijing China 
19479a5557fdSlucy wang - Sun Microsystems - Beijing China 	case UNM_NIC_XGBE:
19489a5557fdSlucy wang - Sun Microsystems - Beijing China 		adapter->unm_nic_hw_read_wx(adapter, UNM_PORT_MODE_ADDR,
19499a5557fdSlucy wang - Sun Microsystems - Beijing China 		    &port_mode, 4);
19509a5557fdSlucy wang - Sun Microsystems - Beijing China 		if (port_mode == UNM_PORT_MODE_802_3_AP) {
19511f0a2977SToomas Soome 			ret = unm_niu_enable_gbe_port(adapter);
19529a5557fdSlucy wang - Sun Microsystems - Beijing China 		} else {
19539a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->unm_crb_writelit_adapter(adapter,
19549a5557fdSlucy wang - Sun Microsystems - Beijing China 			    UNM_NIU_XGE_CONFIG_0 + (0x10000 * portnum), 0x5);
19559a5557fdSlucy wang - Sun Microsystems - Beijing China 			UNM_CRB_READ_CHECK_ADAPTER(UNM_NIU_XGE_CONFIG_1 +
19569a5557fdSlucy wang - Sun Microsystems - Beijing China 			    (0x10000 * portnum), &reg, adapter);
19579a5557fdSlucy wang - Sun Microsystems - Beijing China 			if (adapter->ahw.revision_id < NX_P3_A2)
19589a5557fdSlucy wang - Sun Microsystems - Beijing China 				reg = (reg & ~0x2000UL);
19599a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->unm_crb_writelit_adapter(adapter,
19609a5557fdSlucy wang - Sun Microsystems - Beijing China 			    UNM_NIU_XGE_CONFIG_1 + (0x10000 * portnum), reg);
19619a5557fdSlucy wang - Sun Microsystems - Beijing China 		}
19629a5557fdSlucy wang - Sun Microsystems - Beijing China 		break;
19639a5557fdSlucy wang - Sun Microsystems - Beijing China 
19649a5557fdSlucy wang - Sun Microsystems - Beijing China 	default:
19659a5557fdSlucy wang - Sun Microsystems - Beijing China 		DPRINTF(1, (CE_WARN, "%s: Unknown board type\n",
19669a5557fdSlucy wang - Sun Microsystems - Beijing China 		    unm_nic_driver_name));
19679a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
19689a5557fdSlucy wang - Sun Microsystems - Beijing China 
19699a5557fdSlucy wang - Sun Microsystems - Beijing China 	return (ret);
19709a5557fdSlucy wang - Sun Microsystems - Beijing China }
19719a5557fdSlucy wang - Sun Microsystems - Beijing China 
19729a5557fdSlucy wang - Sun Microsystems - Beijing China void
unm_nic_stop_port(struct unm_adapter_s * adapter)19739a5557fdSlucy wang - Sun Microsystems - Beijing China unm_nic_stop_port(struct unm_adapter_s *adapter)
19749a5557fdSlucy wang - Sun Microsystems - Beijing China {
19759a5557fdSlucy wang - Sun Microsystems - Beijing China 
197693833965Sjing xiong ERI-SUN 	(void) mac_unregister(adapter->mach);
19779a5557fdSlucy wang - Sun Microsystems - Beijing China 
19789a5557fdSlucy wang - Sun Microsystems - Beijing China 	switch (adapter->ahw.board_type) {
19799a5557fdSlucy wang - Sun Microsystems - Beijing China 	case UNM_NIC_GBE:
19809a5557fdSlucy wang - Sun Microsystems - Beijing China 		(void) unm_niu_disable_gbe_port(adapter);
19819a5557fdSlucy wang - Sun Microsystems - Beijing China 		break;
19829a5557fdSlucy wang - Sun Microsystems - Beijing China 
19839a5557fdSlucy wang - Sun Microsystems - Beijing China 	case UNM_NIC_XGBE:
19849a5557fdSlucy wang - Sun Microsystems - Beijing China 		(void) unm_niu_disable_xg_port(adapter);
19859a5557fdSlucy wang - Sun Microsystems - Beijing China 		break;
19869a5557fdSlucy wang - Sun Microsystems - Beijing China 
19879a5557fdSlucy wang - Sun Microsystems - Beijing China 	default:
19889a5557fdSlucy wang - Sun Microsystems - Beijing China 		DPRINTF(1, (CE_WARN, "%s: Unknown board type\n",
19899a5557fdSlucy wang - Sun Microsystems - Beijing China 		    unm_nic_driver_name));
19909a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
19919a5557fdSlucy wang - Sun Microsystems - Beijing China }
19929a5557fdSlucy wang - Sun Microsystems - Beijing China 
19939a5557fdSlucy wang - Sun Microsystems - Beijing China void
unm_crb_write_adapter(unsigned long off,void * data,struct unm_adapter_s * adapter)19949a5557fdSlucy wang - Sun Microsystems - Beijing China unm_crb_write_adapter(unsigned long off, void *data,
19959a5557fdSlucy wang - Sun Microsystems - Beijing China     struct unm_adapter_s *adapter)
19969a5557fdSlucy wang - Sun Microsystems - Beijing China {
19979a5557fdSlucy wang - Sun Microsystems - Beijing China 	(void) adapter->unm_nic_hw_write_wx(adapter, off, data, 4);
19989a5557fdSlucy wang - Sun Microsystems - Beijing China }
19999a5557fdSlucy wang - Sun Microsystems - Beijing China 
20009a5557fdSlucy wang - Sun Microsystems - Beijing China int
unm_crb_read_adapter(unsigned long off,void * data,struct unm_adapter_s * adapter)20019a5557fdSlucy wang - Sun Microsystems - Beijing China unm_crb_read_adapter(unsigned long off, void *data,
20029a5557fdSlucy wang - Sun Microsystems - Beijing China     struct unm_adapter_s *adapter)
20039a5557fdSlucy wang - Sun Microsystems - Beijing China {
20049a5557fdSlucy wang - Sun Microsystems - Beijing China 	return (adapter->unm_nic_hw_read_wx(adapter, off, data, 4));
20059a5557fdSlucy wang - Sun Microsystems - Beijing China }
20069a5557fdSlucy wang - Sun Microsystems - Beijing China 
20079a5557fdSlucy wang - Sun Microsystems - Beijing China int
unm_crb_read_val_adapter(unsigned long off,struct unm_adapter_s * adapter)20089a5557fdSlucy wang - Sun Microsystems - Beijing China unm_crb_read_val_adapter(unsigned long off, struct unm_adapter_s *adapter)
20099a5557fdSlucy wang - Sun Microsystems - Beijing China {
20109a5557fdSlucy wang - Sun Microsystems - Beijing China 	int data;
20119a5557fdSlucy wang - Sun Microsystems - Beijing China 
20129a5557fdSlucy wang - Sun Microsystems - Beijing China 	adapter->unm_nic_hw_read_wx(adapter, off, &data, 4);
20139a5557fdSlucy wang - Sun Microsystems - Beijing China 	return (data);
20149a5557fdSlucy wang - Sun Microsystems - Beijing China }
20159a5557fdSlucy wang - Sun Microsystems - Beijing China 
20169a5557fdSlucy wang - Sun Microsystems - Beijing China void
unm_nic_set_link_parameters(struct unm_adapter_s * adapter)20179a5557fdSlucy wang - Sun Microsystems - Beijing China unm_nic_set_link_parameters(struct unm_adapter_s *adapter)
20189a5557fdSlucy wang - Sun Microsystems - Beijing China {
20199a5557fdSlucy wang - Sun Microsystems - Beijing China 	unm_niu_phy_status_t status;
20209a5557fdSlucy wang - Sun Microsystems - Beijing China 	uint16_t defval = (uint16_t)-1;
20219a5557fdSlucy wang - Sun Microsystems - Beijing China 	unm_niu_control_t mode;
20229a5557fdSlucy wang - Sun Microsystems - Beijing China 	u32 port_mode = 0;
20239a5557fdSlucy wang - Sun Microsystems - Beijing China 
20249a5557fdSlucy wang - Sun Microsystems - Beijing China 	unm_nic_read_w0(adapter, UNM_NIU_MODE, (uint32_t *)&mode);
20259a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (mode.enable_ge) { // Gb 10/100/1000 Mbps mode
20269a5557fdSlucy wang - Sun Microsystems - Beijing China 		adapter->unm_nic_hw_read_wx(adapter, UNM_PORT_MODE_ADDR,
20279a5557fdSlucy wang - Sun Microsystems - Beijing China 		    &port_mode, 4);
20289a5557fdSlucy wang - Sun Microsystems - Beijing China 		if (port_mode == UNM_PORT_MODE_802_3_AP) {
20299a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->link_speed = MBPS_1000;
20309a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->link_duplex = LINK_DUPLEX_FULL;
20319a5557fdSlucy wang - Sun Microsystems - Beijing China 		} else {
20329a5557fdSlucy wang - Sun Microsystems - Beijing China 		if (unm_nic_phy_read(adapter,
20339a5557fdSlucy wang - Sun Microsystems - Beijing China 		    UNM_NIU_GB_MII_MGMT_ADDR_PHY_STATUS,
20349a5557fdSlucy wang - Sun Microsystems - Beijing China 		    (unm_crbword_t *)&status) == 0) {
20359a5557fdSlucy wang - Sun Microsystems - Beijing China 			if (status.link) {
20369a5557fdSlucy wang - Sun Microsystems - Beijing China 				switch (status.speed) {
20379a5557fdSlucy wang - Sun Microsystems - Beijing China 				case 0: adapter->link_speed = MBPS_10;
20389a5557fdSlucy wang - Sun Microsystems - Beijing China 					break;
20399a5557fdSlucy wang - Sun Microsystems - Beijing China 				case 1: adapter->link_speed = MBPS_100;
20409a5557fdSlucy wang - Sun Microsystems - Beijing China 					break;
20419a5557fdSlucy wang - Sun Microsystems - Beijing China 				case 2: adapter->link_speed = MBPS_1000;
20429a5557fdSlucy wang - Sun Microsystems - Beijing China 					break;
20439a5557fdSlucy wang - Sun Microsystems - Beijing China 				default:
20449a5557fdSlucy wang - Sun Microsystems - Beijing China 					adapter->link_speed = defval;
20459a5557fdSlucy wang - Sun Microsystems - Beijing China 					break;
20469a5557fdSlucy wang - Sun Microsystems - Beijing China 				}
20479a5557fdSlucy wang - Sun Microsystems - Beijing China 				switch (status.duplex) {
20489a5557fdSlucy wang - Sun Microsystems - Beijing China 				case 0: adapter->link_duplex = LINK_DUPLEX_HALF;
20499a5557fdSlucy wang - Sun Microsystems - Beijing China 					break;
20509a5557fdSlucy wang - Sun Microsystems - Beijing China 				case 1: adapter->link_duplex = LINK_DUPLEX_FULL;
20519a5557fdSlucy wang - Sun Microsystems - Beijing China 					break;
20529a5557fdSlucy wang - Sun Microsystems - Beijing China 				default:
20539a5557fdSlucy wang - Sun Microsystems - Beijing China 					adapter->link_duplex = defval;
20549a5557fdSlucy wang - Sun Microsystems - Beijing China 					break;
20559a5557fdSlucy wang - Sun Microsystems - Beijing China 				}
20569a5557fdSlucy wang - Sun Microsystems - Beijing China 			} else {
20579a5557fdSlucy wang - Sun Microsystems - Beijing China 				adapter->link_speed = defval;
20589a5557fdSlucy wang - Sun Microsystems - Beijing China 				adapter->link_duplex = defval;
20599a5557fdSlucy wang - Sun Microsystems - Beijing China 			}
20609a5557fdSlucy wang - Sun Microsystems - Beijing China 		} else {
20619a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->link_speed = defval;
20629a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->link_duplex = defval;
20639a5557fdSlucy wang - Sun Microsystems - Beijing China 		}
20649a5557fdSlucy wang - Sun Microsystems - Beijing China 		}
20659a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
20669a5557fdSlucy wang - Sun Microsystems - Beijing China }
20679a5557fdSlucy wang - Sun Microsystems - Beijing China 
20689a5557fdSlucy wang - Sun Microsystems - Beijing China void
unm_nic_flash_print(struct unm_adapter_s * adapter)20699a5557fdSlucy wang - Sun Microsystems - Beijing China unm_nic_flash_print(struct unm_adapter_s *adapter)
20709a5557fdSlucy wang - Sun Microsystems - Beijing China {
20719a5557fdSlucy wang - Sun Microsystems - Beijing China 	int valid = 1;
20729a5557fdSlucy wang - Sun Microsystems - Beijing China 	unm_board_info_t *board_info = &(adapter->ahw.boardcfg);
20739a5557fdSlucy wang - Sun Microsystems - Beijing China 
20749a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (board_info->magic != UNM_BDINFO_MAGIC) {
20759a5557fdSlucy wang - Sun Microsystems - Beijing China 		cmn_err(CE_WARN, "%s UNM Unknown board config, Read 0x%x "
20769a5557fdSlucy wang - Sun Microsystems - Beijing China 		    "expected as 0x%x\n", unm_nic_driver_name,
20779a5557fdSlucy wang - Sun Microsystems - Beijing China 		    board_info->magic, UNM_BDINFO_MAGIC);
20789a5557fdSlucy wang - Sun Microsystems - Beijing China 		valid = 0;
20799a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
20809a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (board_info->header_version != UNM_BDINFO_VERSION) {
20819a5557fdSlucy wang - Sun Microsystems - Beijing China 		cmn_err(CE_WARN, "%s UNM Unknown board config version."
20829a5557fdSlucy wang - Sun Microsystems - Beijing China 		    " Read %x, expected %x\n", unm_nic_driver_name,
20839a5557fdSlucy wang - Sun Microsystems - Beijing China 		    board_info->header_version, UNM_BDINFO_VERSION);
20849a5557fdSlucy wang - Sun Microsystems - Beijing China 		valid = 0;
20859a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
20869a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (valid) {
20879a5557fdSlucy wang - Sun Microsystems - Beijing China 		unm_user_info_t  user_info;
20889a5557fdSlucy wang - Sun Microsystems - Beijing China 		int	i;
20899a5557fdSlucy wang - Sun Microsystems - Beijing China 		int	addr = USER_START;
20909a5557fdSlucy wang - Sun Microsystems - Beijing China 		int	*ptr32;
20919a5557fdSlucy wang - Sun Microsystems - Beijing China 
20929a5557fdSlucy wang - Sun Microsystems - Beijing China 		ptr32 = (int *)&user_info;
20939a5557fdSlucy wang - Sun Microsystems - Beijing China 		for (i = 0; i < sizeof (unm_user_info_t) / sizeof (uint32_t);
20949a5557fdSlucy wang - Sun Microsystems - Beijing China 		    i++) {
20959a5557fdSlucy wang - Sun Microsystems - Beijing China 			if (rom_fast_read(adapter, addr, ptr32) == -1) {
20969a5557fdSlucy wang - Sun Microsystems - Beijing China 				cmn_err(CE_WARN,
20979a5557fdSlucy wang - Sun Microsystems - Beijing China 				    "%s: ERROR reading %s board userarea.\n",
20989a5557fdSlucy wang - Sun Microsystems - Beijing China 				    unm_nic_driver_name, unm_nic_driver_name);
20999a5557fdSlucy wang - Sun Microsystems - Beijing China 				return;
21009a5557fdSlucy wang - Sun Microsystems - Beijing China 			}
21019a5557fdSlucy wang - Sun Microsystems - Beijing China 			ptr32++;
21029a5557fdSlucy wang - Sun Microsystems - Beijing China 			addr += sizeof (uint32_t);
21039a5557fdSlucy wang - Sun Microsystems - Beijing China 		}
21049a5557fdSlucy wang - Sun Microsystems - Beijing China 		if (verbmsg != 0) {
21059a5557fdSlucy wang - Sun Microsystems - Beijing China 			char	*brd_name;
21069a5557fdSlucy wang - Sun Microsystems - Beijing China 			GET_BRD_NAME_BY_TYPE(board_info->board_type, brd_name);
21079a5557fdSlucy wang - Sun Microsystems - Beijing China 			cmn_err(CE_NOTE, "%s %s Board S/N %s  Chip id 0x%x\n",
21089a5557fdSlucy wang - Sun Microsystems - Beijing China 			    unm_nic_driver_name, brd_name, user_info.serial_num,
21099a5557fdSlucy wang - Sun Microsystems - Beijing China 			    board_info->chip_id);
21109a5557fdSlucy wang - Sun Microsystems - Beijing China 		}
21119a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
21129a5557fdSlucy wang - Sun Microsystems - Beijing China }
21139a5557fdSlucy wang - Sun Microsystems - Beijing China 
21149a5557fdSlucy wang - Sun Microsystems - Beijing China static int
nx_nic_send_cmd_descs(unm_adapter * adapter,cmdDescType0_t * cmd_desc_arr,int nr_elements)21159a5557fdSlucy wang - Sun Microsystems - Beijing China nx_nic_send_cmd_descs(unm_adapter *adapter, cmdDescType0_t *cmd_desc_arr,
21169a5557fdSlucy wang - Sun Microsystems - Beijing China     int nr_elements)
21179a5557fdSlucy wang - Sun Microsystems - Beijing China {
21189a5557fdSlucy wang - Sun Microsystems - Beijing China 	struct unm_cmd_buffer	*pbuf;
21199a5557fdSlucy wang - Sun Microsystems - Beijing China 	unsigned int		i = 0, producer;
21209a5557fdSlucy wang - Sun Microsystems - Beijing China 
21219a5557fdSlucy wang - Sun Microsystems - Beijing China 	/*
21229a5557fdSlucy wang - Sun Microsystems - Beijing China 	 * We need to check if space is available.
21239a5557fdSlucy wang - Sun Microsystems - Beijing China 	 */
21249a5557fdSlucy wang - Sun Microsystems - Beijing China 	UNM_SPIN_LOCK(&adapter->tx_lock);
21259a5557fdSlucy wang - Sun Microsystems - Beijing China 	producer = adapter->cmdProducer;
21269a5557fdSlucy wang - Sun Microsystems - Beijing China 
21279a5557fdSlucy wang - Sun Microsystems - Beijing China 	do {
21289a5557fdSlucy wang - Sun Microsystems - Beijing China 		pbuf = &adapter->cmd_buf_arr[producer];
21299a5557fdSlucy wang - Sun Microsystems - Beijing China 		pbuf->head = pbuf->tail = NULL;
21309a5557fdSlucy wang - Sun Microsystems - Beijing China 		pbuf->msg = NULL;
21319a5557fdSlucy wang - Sun Microsystems - Beijing China 		(void) memcpy(&adapter->ahw.cmdDescHead[producer],
21329a5557fdSlucy wang - Sun Microsystems - Beijing China 		    &cmd_desc_arr[i], sizeof (cmdDescType0_t));
21339a5557fdSlucy wang - Sun Microsystems - Beijing China 		unm_desc_dma_sync(adapter->ahw.cmd_desc_dma_handle, producer,
21349a5557fdSlucy wang - Sun Microsystems - Beijing China 		    1, adapter->MaxTxDescCount, sizeof (cmdDescType0_t),
21359a5557fdSlucy wang - Sun Microsystems - Beijing China 		    DDI_DMA_SYNC_FORDEV);
21369a5557fdSlucy wang - Sun Microsystems - Beijing China 		producer = get_next_index(producer, adapter->MaxTxDescCount);
21379a5557fdSlucy wang - Sun Microsystems - Beijing China 		i++;
21389a5557fdSlucy wang - Sun Microsystems - Beijing China 	} while (i != nr_elements);
21399a5557fdSlucy wang - Sun Microsystems - Beijing China 
21409a5557fdSlucy wang - Sun Microsystems - Beijing China 	adapter->cmdProducer = adapter->ahw.cmdProducer = producer;
21419a5557fdSlucy wang - Sun Microsystems - Beijing China 	adapter->freecmds -= i;
21429a5557fdSlucy wang - Sun Microsystems - Beijing China 
21439a5557fdSlucy wang - Sun Microsystems - Beijing China 	unm_nic_update_cmd_producer(adapter, producer);
21449a5557fdSlucy wang - Sun Microsystems - Beijing China 
21459a5557fdSlucy wang - Sun Microsystems - Beijing China 	UNM_SPIN_UNLOCK(&adapter->tx_lock);
21469a5557fdSlucy wang - Sun Microsystems - Beijing China 	return (0);
21479a5557fdSlucy wang - Sun Microsystems - Beijing China }
21489a5557fdSlucy wang - Sun Microsystems - Beijing China 
21499a5557fdSlucy wang - Sun Microsystems - Beijing China typedef struct {
21509a5557fdSlucy wang - Sun Microsystems - Beijing China 	u64	qhdr, req_hdr, words[6];
21519a5557fdSlucy wang - Sun Microsystems - Beijing China } nx_nic_req_t;
21529a5557fdSlucy wang - Sun Microsystems - Beijing China 
21539a5557fdSlucy wang - Sun Microsystems - Beijing China typedef struct {
21549a5557fdSlucy wang - Sun Microsystems - Beijing China 	u8	op, tag, mac_addr[6];
21559a5557fdSlucy wang - Sun Microsystems - Beijing China } nx_mac_req_t;
21569a5557fdSlucy wang - Sun Microsystems - Beijing China 
21579a5557fdSlucy wang - Sun Microsystems - Beijing China static void
nx_p3_sre_macaddr_change(unm_adapter * adapter,u8 * addr,u8 op)21589a5557fdSlucy wang - Sun Microsystems - Beijing China nx_p3_sre_macaddr_change(unm_adapter *adapter, u8 *addr, u8 op)
21599a5557fdSlucy wang - Sun Microsystems - Beijing China {
21609a5557fdSlucy wang - Sun Microsystems - Beijing China 	nx_nic_req_t	req;
21619a5557fdSlucy wang - Sun Microsystems - Beijing China 	nx_mac_req_t	mac_req;
21629a5557fdSlucy wang - Sun Microsystems - Beijing China 	int		rv;
21639a5557fdSlucy wang - Sun Microsystems - Beijing China 
21649a5557fdSlucy wang - Sun Microsystems - Beijing China 	(void) memset(&req, 0, sizeof (nx_nic_req_t));
21659a5557fdSlucy wang - Sun Microsystems - Beijing China 	req.qhdr |= (NX_NIC_REQUEST << 23);
21669a5557fdSlucy wang - Sun Microsystems - Beijing China 	req.req_hdr |= NX_MAC_EVENT;
21679a5557fdSlucy wang - Sun Microsystems - Beijing China 	req.req_hdr |= ((u64)adapter->portnum << 16);
21689a5557fdSlucy wang - Sun Microsystems - Beijing China 	mac_req.op = op;
21699a5557fdSlucy wang - Sun Microsystems - Beijing China 	(void) memcpy(&mac_req.mac_addr, addr, 6);
21709a5557fdSlucy wang - Sun Microsystems - Beijing China 	req.words[0] = HOST_TO_LE_64(*(u64 *)(uintptr_t)&mac_req);
21719a5557fdSlucy wang - Sun Microsystems - Beijing China 
21729a5557fdSlucy wang - Sun Microsystems - Beijing China 	rv = nx_nic_send_cmd_descs(adapter, (cmdDescType0_t *)&req, 1);
21739a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (rv != 0)
21749a5557fdSlucy wang - Sun Microsystems - Beijing China 		cmn_err(CE_WARN, "%s%d: Could not send mac update\n",
21759a5557fdSlucy wang - Sun Microsystems - Beijing China 		    adapter->name, adapter->instance);
21769a5557fdSlucy wang - Sun Microsystems - Beijing China }
21779a5557fdSlucy wang - Sun Microsystems - Beijing China 
21789a5557fdSlucy wang - Sun Microsystems - Beijing China static int
nx_p3_nic_set_promisc(unm_adapter * adapter,u32 mode)21799a5557fdSlucy wang - Sun Microsystems - Beijing China nx_p3_nic_set_promisc(unm_adapter *adapter, u32 mode)
21809a5557fdSlucy wang - Sun Microsystems - Beijing China {
21819a5557fdSlucy wang - Sun Microsystems - Beijing China 	nx_nic_req_t	req;
21829a5557fdSlucy wang - Sun Microsystems - Beijing China 
21839a5557fdSlucy wang - Sun Microsystems - Beijing China 	(void) memset(&req, 0, sizeof (nx_nic_req_t));
21849a5557fdSlucy wang - Sun Microsystems - Beijing China 
21859a5557fdSlucy wang - Sun Microsystems - Beijing China 	req.qhdr |= (NX_HOST_REQUEST << 23);
21869a5557fdSlucy wang - Sun Microsystems - Beijing China 	req.req_hdr |= NX_NIC_H2C_OPCODE_PROXY_SET_VPORT_MISS_MODE;
21879a5557fdSlucy wang - Sun Microsystems - Beijing China 	req.req_hdr |= ((u64)adapter->portnum << 16);
21889a5557fdSlucy wang - Sun Microsystems - Beijing China 	req.words[0] = HOST_TO_LE_64(mode);
21899a5557fdSlucy wang - Sun Microsystems - Beijing China 
21909a5557fdSlucy wang - Sun Microsystems - Beijing China 	return (nx_nic_send_cmd_descs(adapter, (cmdDescType0_t *)&req, 1));
21919a5557fdSlucy wang - Sun Microsystems - Beijing China }
21929a5557fdSlucy wang - Sun Microsystems - Beijing China 
21939a5557fdSlucy wang - Sun Microsystems - Beijing China /*
21949a5557fdSlucy wang - Sun Microsystems - Beijing China  * Currently only invoked at interface initialization time
21959a5557fdSlucy wang - Sun Microsystems - Beijing China  */
21969a5557fdSlucy wang - Sun Microsystems - Beijing China void
nx_p3_nic_set_multi(unm_adapter * adapter)21979a5557fdSlucy wang - Sun Microsystems - Beijing China nx_p3_nic_set_multi(unm_adapter *adapter)
21989a5557fdSlucy wang - Sun Microsystems - Beijing China {
21999a5557fdSlucy wang - Sun Microsystems - Beijing China 	u8	bcast_addr[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
22009a5557fdSlucy wang - Sun Microsystems - Beijing China 
22019a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (nx_p3_nic_set_promisc(adapter, VPORT_MISS_MODE_ACCEPT_ALL))
22029a5557fdSlucy wang - Sun Microsystems - Beijing China 		cmn_err(CE_WARN, "Could not set promisc mode\n");
22039a5557fdSlucy wang - Sun Microsystems - Beijing China 
22049a5557fdSlucy wang - Sun Microsystems - Beijing China 	nx_p3_sre_macaddr_change(adapter, adapter->mac_addr, NETXEN_MAC_ADD);
22059a5557fdSlucy wang - Sun Microsystems - Beijing China 	nx_p3_sre_macaddr_change(adapter, bcast_addr, NETXEN_MAC_ADD);
22069a5557fdSlucy wang - Sun Microsystems - Beijing China }
2207