19a5557fdSlucy wang - Sun Microsystems - Beijing China /*
29a5557fdSlucy wang - Sun Microsystems - Beijing China  * CDDL HEADER START
39a5557fdSlucy wang - Sun Microsystems - Beijing China  *
49a5557fdSlucy wang - Sun Microsystems - Beijing China  * The contents of this file are subject to the terms of the
59a5557fdSlucy wang - Sun Microsystems - Beijing China  * Common Development and Distribution License (the "License").
69a5557fdSlucy wang - Sun Microsystems - Beijing China  * You may not use this file except in compliance with the License.
79a5557fdSlucy wang - Sun Microsystems - Beijing China  *
89a5557fdSlucy wang - Sun Microsystems - Beijing China  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
99a5557fdSlucy wang - Sun Microsystems - Beijing China  * or http://www.opensolaris.org/os/licensing.
109a5557fdSlucy wang - Sun Microsystems - Beijing China  * See the License for the specific language governing permissions
119a5557fdSlucy wang - Sun Microsystems - Beijing China  * and limitations under the License.
129a5557fdSlucy wang - Sun Microsystems - Beijing China  *
139a5557fdSlucy wang - Sun Microsystems - Beijing China  * When distributing Covered Code, include this CDDL HEADER in each
149a5557fdSlucy wang - Sun Microsystems - Beijing China  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
159a5557fdSlucy wang - Sun Microsystems - Beijing China  * If applicable, add the following below this CDDL HEADER, with the
169a5557fdSlucy wang - Sun Microsystems - Beijing China  * fields enclosed by brackets "[]" replaced with your own identifying
179a5557fdSlucy wang - Sun Microsystems - Beijing China  * information: Portions Copyright [yyyy] [name of copyright owner]
189a5557fdSlucy wang - Sun Microsystems - Beijing China  *
199a5557fdSlucy wang - Sun Microsystems - Beijing China  * CDDL HEADER END
209a5557fdSlucy wang - Sun Microsystems - Beijing China  */
21*93833965Sjing xiong ERI-SUN 
229a5557fdSlucy wang - Sun Microsystems - Beijing China /*
239a5557fdSlucy wang - Sun Microsystems - Beijing China  * Copyright 2008 NetXen, Inc.  All rights reserved.
249a5557fdSlucy wang - Sun Microsystems - Beijing China  * Use is subject to license terms.
259a5557fdSlucy wang - Sun Microsystems - Beijing China  */
26*93833965Sjing xiong ERI-SUN 
279a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/types.h>
289a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/conf.h>
299a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/debug.h>
309a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/stropts.h>
319a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/stream.h>
329a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/strlog.h>
339a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/kmem.h>
349a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/stat.h>
359a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/kstat.h>
369a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/vtrace.h>
379a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/dlpi.h>
389a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/strsun.h>
399a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/ethernet.h>
409a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/modctl.h>
419a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/errno.h>
429a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/dditypes.h>
439a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/ddi.h>
449a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/sunddi.h>
459a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/sysmacros.h>
469a5557fdSlucy wang - Sun Microsystems - Beijing China 
479a5557fdSlucy wang - Sun Microsystems - Beijing China #include <sys/pci.h>
489a5557fdSlucy wang - Sun Microsystems - Beijing China 
499a5557fdSlucy wang - Sun Microsystems - Beijing China #include "unm_nic.h"
509a5557fdSlucy wang - Sun Microsystems - Beijing China #include "unm_nic_hw.h"
519a5557fdSlucy wang - Sun Microsystems - Beijing China #include "nic_cmn.h"
529a5557fdSlucy wang - Sun Microsystems - Beijing China #include "nic_phan_reg.h"
539a5557fdSlucy wang - Sun Microsystems - Beijing China 
549a5557fdSlucy wang - Sun Microsystems - Beijing China static void
unm_nic_isr_other(struct unm_adapter_s * adapter)559a5557fdSlucy wang - Sun Microsystems - Beijing China unm_nic_isr_other(struct unm_adapter_s *adapter)
569a5557fdSlucy wang - Sun Microsystems - Beijing China {
579a5557fdSlucy wang - Sun Microsystems - Beijing China 	u32 portno = adapter->portnum;
589a5557fdSlucy wang - Sun Microsystems - Beijing China 	u32 val, linkup, qg_linksup = adapter->ahw.linkup;
599a5557fdSlucy wang - Sun Microsystems - Beijing China 
609a5557fdSlucy wang - Sun Microsystems - Beijing China 	UNM_READ_LOCK(&adapter->adapter_lock);
619a5557fdSlucy wang - Sun Microsystems - Beijing China 	adapter->unm_nic_hw_read_wx(adapter, CRB_XG_STATE, &val, 4);
629a5557fdSlucy wang - Sun Microsystems - Beijing China 	UNM_READ_UNLOCK(&adapter->adapter_lock);
639a5557fdSlucy wang - Sun Microsystems - Beijing China 
649a5557fdSlucy wang - Sun Microsystems - Beijing China 	linkup = 1 & (val >> adapter->physical_port);
659a5557fdSlucy wang - Sun Microsystems - Beijing China 	adapter->ahw.linkup = linkup;
669a5557fdSlucy wang - Sun Microsystems - Beijing China 
679a5557fdSlucy wang - Sun Microsystems - Beijing China 	if (linkup != qg_linksup) {
689a5557fdSlucy wang - Sun Microsystems - Beijing China 		cmn_err(CE_WARN, "%s: PORT %d link %s\n", unm_nic_driver_name,
699a5557fdSlucy wang - Sun Microsystems - Beijing China 		    portno, ((linkup == 0) ? "down" : "up"));
709a5557fdSlucy wang - Sun Microsystems - Beijing China 		mac_link_update(adapter->mach, linkup);
719a5557fdSlucy wang - Sun Microsystems - Beijing China 		if (linkup)
729a5557fdSlucy wang - Sun Microsystems - Beijing China 			unm_nic_set_link_parameters(adapter);
739a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
749a5557fdSlucy wang - Sun Microsystems - Beijing China }
759a5557fdSlucy wang - Sun Microsystems - Beijing China 
769a5557fdSlucy wang - Sun Microsystems - Beijing China void
unm_nic_handle_phy_intr(struct unm_adapter_s * adapter)779a5557fdSlucy wang - Sun Microsystems - Beijing China unm_nic_handle_phy_intr(struct unm_adapter_s *adapter)
789a5557fdSlucy wang - Sun Microsystems - Beijing China {
799a5557fdSlucy wang - Sun Microsystems - Beijing China 	uint32_t	val, val1, linkupval;
809a5557fdSlucy wang - Sun Microsystems - Beijing China 
819a5557fdSlucy wang - Sun Microsystems - Beijing China 	switch (adapter->ahw.board_type) {
829a5557fdSlucy wang - Sun Microsystems - Beijing China 		case UNM_NIC_GBE:
839a5557fdSlucy wang - Sun Microsystems - Beijing China 			if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) {
849a5557fdSlucy wang - Sun Microsystems - Beijing China 				unm_nic_isr_other(adapter);
859a5557fdSlucy wang - Sun Microsystems - Beijing China 				break;
869a5557fdSlucy wang - Sun Microsystems - Beijing China 			}
879a5557fdSlucy wang - Sun Microsystems - Beijing China 		/* FALLTHROUGH */
889a5557fdSlucy wang - Sun Microsystems - Beijing China 
899a5557fdSlucy wang - Sun Microsystems - Beijing China 		case UNM_NIC_XGBE:
909a5557fdSlucy wang - Sun Microsystems - Beijing China 			/* WINDOW = 1 */
919a5557fdSlucy wang - Sun Microsystems - Beijing China 		UNM_READ_LOCK(&adapter->adapter_lock);
929a5557fdSlucy wang - Sun Microsystems - Beijing China 		if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) {
939a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->unm_nic_hw_read_wx(adapter, CRB_XG_STATE_P3,
949a5557fdSlucy wang - Sun Microsystems - Beijing China 			    &val, 4);
959a5557fdSlucy wang - Sun Microsystems - Beijing China 			val1 = XG_LINK_STATE_P3(adapter->ahw.pci_func, val);
969a5557fdSlucy wang - Sun Microsystems - Beijing China 			linkupval = XG_LINK_UP_P3;
979a5557fdSlucy wang - Sun Microsystems - Beijing China 		} else {
989a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->unm_nic_hw_read_wx(adapter, CRB_XG_STATE,
999a5557fdSlucy wang - Sun Microsystems - Beijing China 			    &val, 4);
1009a5557fdSlucy wang - Sun Microsystems - Beijing China 			val >>= (adapter->portnum * 8);
1019a5557fdSlucy wang - Sun Microsystems - Beijing China 			val1 = val & 0xff;
1029a5557fdSlucy wang - Sun Microsystems - Beijing China 			linkupval = XG_LINK_UP;
1039a5557fdSlucy wang - Sun Microsystems - Beijing China 		}
1049a5557fdSlucy wang - Sun Microsystems - Beijing China 		UNM_READ_UNLOCK(&adapter->adapter_lock);
1059a5557fdSlucy wang - Sun Microsystems - Beijing China 
1069a5557fdSlucy wang - Sun Microsystems - Beijing China 		if (adapter->ahw.linkup && (val1 != linkupval)) {
1079a5557fdSlucy wang - Sun Microsystems - Beijing China 			if (verbmsg != 0)
1089a5557fdSlucy wang - Sun Microsystems - Beijing China 				cmn_err(CE_NOTE, "%s%d: NIC Link is down\n",
1099a5557fdSlucy wang - Sun Microsystems - Beijing China 				    adapter->name, adapter->portnum);
1109a5557fdSlucy wang - Sun Microsystems - Beijing China 			mac_link_update(adapter->mach, LINK_STATE_DOWN);
1119a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->ahw.linkup = 0;
1129a5557fdSlucy wang - Sun Microsystems - Beijing China 		} else if ((adapter->ahw.linkup == 0) && (val1 == linkupval)) {
1139a5557fdSlucy wang - Sun Microsystems - Beijing China 			if (verbmsg != 0)
1149a5557fdSlucy wang - Sun Microsystems - Beijing China 				cmn_err(CE_NOTE, "%s%d: NIC Link is up\n",
1159a5557fdSlucy wang - Sun Microsystems - Beijing China 				    adapter->name, adapter->portnum);
1169a5557fdSlucy wang - Sun Microsystems - Beijing China 			mac_link_update(adapter->mach, LINK_STATE_UP);
1179a5557fdSlucy wang - Sun Microsystems - Beijing China 			adapter->ahw.linkup = 1;
1189a5557fdSlucy wang - Sun Microsystems - Beijing China 
1199a5557fdSlucy wang - Sun Microsystems - Beijing China 			if (adapter->ahw.board_type == UNM_NIC_GBE)
1209a5557fdSlucy wang - Sun Microsystems - Beijing China 				unm_nic_set_link_parameters(adapter);
1219a5557fdSlucy wang - Sun Microsystems - Beijing China 		}
1229a5557fdSlucy wang - Sun Microsystems - Beijing China 
1239a5557fdSlucy wang - Sun Microsystems - Beijing China 		break;
1249a5557fdSlucy wang - Sun Microsystems - Beijing China 
1259a5557fdSlucy wang - Sun Microsystems - Beijing China 		default:
1269a5557fdSlucy wang - Sun Microsystems - Beijing China 		DPRINTF(0, (CE_WARN, "%s%d ISR: Unknown board type\n",
1279a5557fdSlucy wang - Sun Microsystems - Beijing China 		    unm_nic_driver_name, adapter->portnum));
1289a5557fdSlucy wang - Sun Microsystems - Beijing China 	}
1299a5557fdSlucy wang - Sun Microsystems - Beijing China }
130