Home | History | Annotate | Download | only in ntxn
      1 /*
      2  * CDDL HEADER START
      3  *
      4  * The contents of this file are subject to the terms of the
      5  * Common Development and Distribution License (the "License").
      6  * You may not use this file except in compliance with the License.
      7  *
      8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
      9  * or http://www.opensolaris.org/os/licensing.
     10  * See the License for the specific language governing permissions
     11  * and limitations under the License.
     12  *
     13  * When distributing Covered Code, include this CDDL HEADER in each
     14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     15  * If applicable, add the following below this CDDL HEADER, with the
     16  * fields enclosed by brackets "[]" replaced with your own identifying
     17  * information: Portions Copyright [yyyy] [name of copyright owner]
     18  *
     19  * CDDL HEADER END
     20  */
     21 
     22 /*
     23  * Copyright 2008 NetXen, Inc.  All rights reserved.
     24  * Use is subject to license terms.
     25  */
     26 
     27 #include <sys/types.h>
     28 #include <sys/conf.h>
     29 #include <sys/debug.h>
     30 #include <sys/stropts.h>
     31 #include <sys/stream.h>
     32 #include <sys/strlog.h>
     33 #include <sys/kmem.h>
     34 #include <sys/stat.h>
     35 #include <sys/kstat.h>
     36 #include <sys/vtrace.h>
     37 #include <sys/dlpi.h>
     38 #include <sys/strsun.h>
     39 #include <sys/ethernet.h>
     40 #include <sys/modctl.h>
     41 #include <sys/errno.h>
     42 #include <sys/dditypes.h>
     43 #include <sys/ddi.h>
     44 #include <sys/sunddi.h>
     45 #include <sys/sysmacros.h>
     46 
     47 #include <sys/pci.h>
     48 
     49 #include "unm_nic.h"
     50 #include "unm_nic_hw.h"
     51 #include "nic_cmn.h"
     52 #include "nic_phan_reg.h"
     53 
     54 static void
     55 unm_nic_isr_other(struct unm_adapter_s *adapter)
     56 {
     57 	u32 portno = adapter->portnum;
     58 	u32 val, linkup, qg_linksup = adapter->ahw.linkup;
     59 
     60 	UNM_READ_LOCK(&adapter->adapter_lock);
     61 	adapter->unm_nic_hw_read_wx(adapter, CRB_XG_STATE, &val, 4);
     62 	UNM_READ_UNLOCK(&adapter->adapter_lock);
     63 
     64 	linkup = 1 & (val >> adapter->physical_port);
     65 	adapter->ahw.linkup = linkup;
     66 
     67 	if (linkup != qg_linksup) {
     68 		cmn_err(CE_WARN, "%s: PORT %d link %s\n", unm_nic_driver_name,
     69 		    portno, ((linkup == 0) ? "down" : "up"));
     70 		mac_link_update(adapter->mach, linkup);
     71 		if (linkup)
     72 			unm_nic_set_link_parameters(adapter);
     73 	}
     74 }
     75 
     76 void
     77 unm_nic_handle_phy_intr(struct unm_adapter_s *adapter)
     78 {
     79 	uint32_t	val, val1, linkupval;
     80 
     81 	switch (adapter->ahw.board_type) {
     82 		case UNM_NIC_GBE:
     83 			if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) {
     84 				unm_nic_isr_other(adapter);
     85 				break;
     86 			}
     87 		/* FALLTHROUGH */
     88 
     89 		case UNM_NIC_XGBE:
     90 			/* WINDOW = 1 */
     91 		UNM_READ_LOCK(&adapter->adapter_lock);
     92 		if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) {
     93 			adapter->unm_nic_hw_read_wx(adapter, CRB_XG_STATE_P3,
     94 			    &val, 4);
     95 			val1 = XG_LINK_STATE_P3(adapter->ahw.pci_func, val);
     96 			linkupval = XG_LINK_UP_P3;
     97 		} else {
     98 			adapter->unm_nic_hw_read_wx(adapter, CRB_XG_STATE,
     99 			    &val, 4);
    100 			val >>= (adapter->portnum * 8);
    101 			val1 = val & 0xff;
    102 			linkupval = XG_LINK_UP;
    103 		}
    104 		UNM_READ_UNLOCK(&adapter->adapter_lock);
    105 
    106 		if (adapter->ahw.linkup && (val1 != linkupval)) {
    107 			if (verbmsg != 0)
    108 				cmn_err(CE_NOTE, "%s%d: NIC Link is down\n",
    109 				    adapter->name, adapter->portnum);
    110 			mac_link_update(adapter->mach, LINK_STATE_DOWN);
    111 			adapter->ahw.linkup = 0;
    112 		} else if ((adapter->ahw.linkup == 0) && (val1 == linkupval)) {
    113 			if (verbmsg != 0)
    114 				cmn_err(CE_NOTE, "%s%d: NIC Link is up\n",
    115 				    adapter->name, adapter->portnum);
    116 			mac_link_update(adapter->mach, LINK_STATE_UP);
    117 			adapter->ahw.linkup = 1;
    118 
    119 			if (adapter->ahw.board_type == UNM_NIC_GBE)
    120 				unm_nic_set_link_parameters(adapter);
    121 		}
    122 
    123 		break;
    124 
    125 		default:
    126 		DPRINTF(0, (CE_WARN, "%s%d ISR: Unknown board type\n",
    127 		    unm_nic_driver_name, adapter->portnum));
    128 	}
    129 }
    130