> I have the same problem for that i can't use Solaris (09/07 Developers
> Edition)... without ethernet/internet connectivity i can't use it like
> a server... :(
> Now I try the solution of Jürgen Keil.
It seems that Masayuki Murayama's nfo-2.4.5 driver
knows about the problem with the reversed MAC format
on some of the nvidia nic hardware.
It seems there is code to swap the MAC under certain conditions:
nfo-2.4.5/nfo_gem.c:
2000 /*
2001 * XXX - As the factory mac address is set in incorrect format,
2002 * aka in reversed order after power-on, we must re-write it.
2003 * But as there are no copies of the original mac address
anywhere
2004 * else, it is gone after we fix it.
2005 */
2006 mac_addr = lp->factory_mac_addr;
2007 val = INL(dp, TxPOLL);
2008 DPRINTF(0, (CE_CONT, "!%s: %s: TxPOLL:%x", dp->name, __func__,
val));
2009
2010 if ((val & TxPOLL_MACADDR_REV) == 0 &&
2011 (lp->chip->hwcap & CAP_CORRECT_MAC) == 0) {
2012 /* original format */
2013 dp->dev_addr.ether_addr_octet[0] = mac_addr[1] >> (1*8);
2014 dp->dev_addr.ether_addr_octet[1] = mac_addr[1] >> (0*8);
2015 dp->dev_addr.ether_addr_octet[2] = mac_addr[0] >> (3*8);
2016 dp->dev_addr.ether_addr_octet[3] = mac_addr[0] >> (2*8);
2017 dp->dev_addr.ether_addr_octet[4] = mac_addr[0] >> (1*8);
2018 dp->dev_addr.ether_addr_octet[5] = mac_addr[0] >> (0*8);
2019 /* mark that we will change it in correct format */
2020 OUTL(dp, TxPOLL, val | TxPOLL_MACADDR_REV);
2021 } else {
2022 /* mac address format has been fixed */
2023 dp->dev_addr.ether_addr_octet[0] = mac_addr[0] >> (0*8);
2024 dp->dev_addr.ether_addr_octet[1] = mac_addr[0] >> (1*8);
2025 dp->dev_addr.ether_addr_octet[2] = mac_addr[0] >> (2*8);
2026 dp->dev_addr.ether_addr_octet[3] = mac_addr[0] >> (3*8);
2027 dp->dev_addr.ether_addr_octet[4] = mac_addr[1] >> (0*8);
2028 dp->dev_addr.ether_addr_octet[5] = mac_addr[1] >> (1*8);
2029 }
Solaris' nge driver doesn't seem to know about the problem with
the reversed MAC:
http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/uts/common/io/nge/nge_chip.c#1000
1001 /*
1002 * Reading the unicast mac address table
1003 */
1004 if (ngep->nge_chip_state == NGE_CHIP_INITIAL) {
1005 uaddr1.addr_val = nge_reg_get32(ngep, NGE_UNI_ADDR1);
1006 mac = uaddr1.addr_bits.addr;
1007 mac <<= 32;
1008 mac |= nge_reg_get32(ngep, NGE_UNI_ADDR0);
1009 if (mac != 0ULL && mac != ~0ULL) {
1010 ngep->chipinfo.hw_mac_addr = mac;
1011 for (i = ETHERADDRL; i-- != 0; ) {
1012 ngep->chipinfo.vendor_addr.addr[i] =
1013 (uchar_t)mac;
1014 ngep->cur_uni_addr.addr[i] =
(uchar_t)mac;
1015 mac >>= 8;
1016 }
1017 ngep->chipinfo.vendor_addr.set = 1;
1018 }
1019 }
I see no code in nge that looks at the NGE_TX_POLL 0x10c register,
bit 0x8000 for the case of reversed MACs.....
This message posted from opensolaris.org
_______________________________________________
opensolaris-help mailing list
[email protected]