Moin,
ich glaube du hast da ein grundsaetzliches Verstaendnisproblem mit den Paramatern.
Mit dem Parameter "adv_autoneg_cap" stellt du ein ob du hier ueber Auto-Negotiation machen willst oder nicht.
Wenn adv_autoneg_cap auf 1 steht, dann kannst du mit den anderen adv_<speed>_cap Werten angeben was die Sun der Gegenseite alles an Geschwindigkeiten vorschlagen soll. Aus dieser Menge und der Menge der Gegenseite wird dann der groesste gemeinsamme Nenner genommen.
Wenn adv_autoneg_cap auf 0 steht, dann schaltest du Auto-Negotiation aus und musst dann ueber den ndd Parameter force_speed_duplex die gewuenschte feste Geschwindigkeit einstellen (z.B. 4 fuer 100Mbit fill duplex). Siehe "man e1000g" fuer mehr Infos. Dort gibt es einen Abschnitt "Configuration Options Using ndd".
Bliebe noch die Frage warum dein ndd get dir andere Werte zurueckliefert als du per set eingestellt hast.
Die ndd set Werte gelten nur bis zum naechsten Reboot und sind daher nicht persistent. Wenn du da angeblich ein Problem mit ndd set/get hast, dann waere es hilfreich ein typescript von einer gesamten Session zu haben wo die set und get Befehle zu sehen sind. In deinem cut and paste aus Scripten ist dieses nicht erkennbar, da hier weder ersichtlich ist ob das richtige Interface genutzt wurde noch was alles zwischen dem set und dem get passiert.
Bitte beachte, dass der Wert fuer Auto-Negotiation (an oder aus) auf beiden Seiten gleich eingestellt sein muss. Du kannst nicht anfangen auf der Sun-Seite was zu forcen waehrend der Switch noch auf Autoneg steht.
Meine Empfehlung: Finger weg von dem Tunable und den Default nutzen (Autoneg an, alles moegliche anbieten und sehen was die Remote Seite kann). In deinem Beispiel ist ja auch zu sehen, dass das prima klappt und das Interface korrekt auf 1Gb fdx steht.
Den Duplex wert kannst du per ndd Parameter link_duplex abfragen (1 = half duplex, 2 = full duplex). Einfacher als das ganze ndd Geraffel geht es aber mit dem Befehl "dladm show-dev".
Tschau,
Drusus.