Browse Source

Plan 9 from Bell Labs 2003-10-20

David du Colombier 20 years ago
parent
commit
b05219dfd8

+ 9 - 9
dist/replica/plan9.db

@@ -5,9 +5,9 @@
 29000/lib - 20000000775 sys sys 948037563 0
 29000/mkfile - 664 sys sys 948141302 46
 386 - 20000000775 sys sys 1010957353 0
-386/9load - 775 sys sys 1057323598 180364
+386/9load - 775 sys sys 1066618054 181248
 386/9loaddebug - 775 sys sys 1064598409 260250
-386/9loadlite - 775 sys sys 1032215927 124616
+386/9loadlite - 775 sys sys 1066618055 124684
 386/9loadlitedebug - 775 sys sys 1064598410 183708
 386/9pc - 775 sys sys 1064598419 1848196
 386/9pc.gz - 664 sys sys 1040006338 614078
@@ -137,7 +137,7 @@
 386/bin/aux/posttek - 775 sys sys 1048745025 162347
 386/bin/aux/rdwr - 775 sys sys 1064598085 38530
 386/bin/aux/reboot - 775 sys sys 1064598085 58802
-386/bin/aux/samterm - 775 sys sys 1064598087 245306
+386/bin/aux/samterm - 775 sys sys 1066572837 245540
 386/bin/aux/searchfs - 775 sys sys 1064598087 90729
 386/bin/aux/sprog - 775 sys sys 1064598088 77816
 386/bin/aux/ssh_genkey - 775 sys sys 1045537957 194629
@@ -367,7 +367,7 @@
 386/bin/rio - 775 sys sys 1064598297 303363
 386/bin/rm - 775 sys sys 1064598298 59786
 386/bin/rtstats - 775 sys sys 1064598300 177851
-386/bin/rx - 775 sys sys 1064598300 79503
+386/bin/rx - 775 sys sys 1066572586 79934
 386/bin/sam - 775 sys sys 1064598302 156664
 386/bin/scat - 775 sys sys 1064598303 282458
 386/bin/scp - 775 sys sys 1064598305 150966
@@ -5216,7 +5216,7 @@ sys/src/9/pc/devusb.c - 664 sys sys 1063857423 18352
 sys/src/9/pc/devvga.c - 664 sys sys 1063857412 8714
 sys/src/9/pc/dma.c - 664 sys sys 1015014515 4736
 sys/src/9/pc/ether2000.c - 664 sys sys 1017854323 2839
-sys/src/9/pc/ether2114x.c - 664 sys sys 1034021961 38762
+sys/src/9/pc/ether2114x.c - 664 sys sys 1066618082 41227
 sys/src/9/pc/ether589.c - 664 sys sys 1015014516 4644
 sys/src/9/pc/ether79c970.c - 664 sys sys 1018386992 14056
 sys/src/9/pc/ether8003.c - 664 sys sys 1015014516 6665
@@ -6283,7 +6283,7 @@ sys/src/boot/pc/eoffs - 664 sys sys 1015007950 0
 sys/src/boot/pc/error.h - 664 sys sys 1015007950 3081
 sys/src/boot/pc/ether.c - 664 sys sys 1056073258 4670
 sys/src/boot/pc/ether2000.c - 664 sys sys 1015007950 2609
-sys/src/boot/pc/ether2114x.c - 664 sys sys 1015007950 34538
+sys/src/boot/pc/ether2114x.c - 664 sys sys 1066618033 37048
 sys/src/boot/pc/ether589.c - 664 sys sys 1015007950 4628
 sys/src/boot/pc/ether79c970.c - 664 sys sys 1015007950 11717
 sys/src/boot/pc/ether8003.c - 664 sys sys 1015007950 6446
@@ -9965,7 +9965,7 @@ sys/src/cmd/rtstats/resproc.c - 664 sys sys 1037669163 2287
 sys/src/cmd/rtstats/rtstats.c - 664 sys sys 1048644563 13224
 sys/src/cmd/rtstats/time.c - 664 sys sys 1038425433 2094
 sys/src/cmd/rtstats/time.h - 664 sys sys 1038425434 164
-sys/src/cmd/rx.c - 664 sys sys 1053223080 3374
+sys/src/cmd/rx.c - 664 sys sys 1066572585 3657
 sys/src/cmd/sam - 20000000775 sys sys 944961629 0
 sys/src/cmd/sam/address.c - 664 sys sys 944961628 3985
 sys/src/cmd/sam/buff.c - 664 sys sys 1014926937 5161
@@ -9997,10 +9997,10 @@ sys/src/cmd/samterm/flayer.c - 664 sys sys 1014926592 9863
 sys/src/cmd/samterm/flayer.h - 664 sys sys 956946464 1147
 sys/src/cmd/samterm/icons.c - 664 sys sys 1014926592 1627
 sys/src/cmd/samterm/io.c - 664 sys sys 952627627 4226
-sys/src/cmd/samterm/main.c - 664 sys sys 947099637 9949
+sys/src/cmd/samterm/main.c - 664 sys sys 1066572812 10009
 sys/src/cmd/samterm/menu.c - 664 sys sys 1045502822 6528
 sys/src/cmd/samterm/mesg.c - 664 sys sys 1014926592 12558
-sys/src/cmd/samterm/mkfile - 664 sys sys 944961350 544
+sys/src/cmd/samterm/mkfile - 664 sys sys 1066572811 595
 sys/src/cmd/samterm/plan9.c - 664 sys sys 1014926592 4675
 sys/src/cmd/samterm/rasp.c - 664 sys sys 944961350 4433
 sys/src/cmd/samterm/samterm.h - 664 sys sys 1045502822 3730

+ 9 - 0
dist/replica/plan9.log

@@ -13907,3 +13907,12 @@
 1066516291 11 c sys/src/cmd/ssh/ssh.c - 664 sys sys 1066515693 9667
 1066516291 12 c sys/src/cmd/stats.c - 664 sys sys 1066515220 27952
 1066516291 13 c sys/src/libip/myetheraddr.c - 664 sys sys 1066515138 837
+1066573884 0 c 386/bin/rx - 775 sys sys 1066572586 79934
+1066573884 1 c 386/bin/aux/samterm - 775 sys sys 1066572837 245540
+1066573884 2 c sys/src/cmd/samterm/main.c - 664 sys sys 1066572812 10009
+1066573884 3 c sys/src/cmd/samterm/mkfile - 664 sys sys 1066572811 595
+1066573884 4 c sys/src/cmd/rx.c - 664 sys sys 1066572585 3657
+1066618935 0 c 386/9load - 775 sys sys 1066618054 181248
+1066618935 1 c 386/9loadlite - 775 sys sys 1066618055 124684
+1066618935 2 c sys/src/9/pc/ether2114x.c - 664 sys sys 1066618082 41227
+1066618935 3 c sys/src/boot/pc/ether2114x.c - 664 sys sys 1066618033 37048

+ 128 - 15
sys/src/9/pc/ether2114x.c

@@ -185,6 +185,7 @@ enum {					/* PHY registers */
 
 enum {					/* Variants */
 	Tulip0		= (0x0009<<16)|0x1011,
+	Tulip1		= (0x0014<<16)|0x1011,
 	Tulip3		= (0x0019<<16)|0x1011,
 	Pnic		= (0x0002<<16)|0x11AD,
 	Pnic2		= (0xC115<<16)|0x11AD,
@@ -740,7 +741,7 @@ sromr(Ctlr* ctlr, int r)
 
 	/*
 	 * This sequence for reading a 16-bit register 'r'
-	 * in the EEPROM is taken straight from Section
+	 * in the EEPROM is taken (pretty much) straight from Section
 	 * 7.4 of the 21140 Hardware Reference Manual.
 	 */
 reread:
@@ -759,9 +760,16 @@ reread:
 
 	/*
 	 * First time through must work out the EEPROM size.
+	 * This doesn't seem to work on the 21041 as implemented
+	 * in Virtual PC for the Mac, so wire any 21041 to 6,
+	 * it's the only 21041 this code will ever likely see.
 	 */
-	if((size = ctlr->sromsz) == 0)
-		size = 8;
+	if((size = ctlr->sromsz) == 0){
+		if(ctlr->id == Tulip1)
+			ctlr->sromsz = size = 6;
+		else
+			size = 8;
+	}
 
 	for(size = size-1; size >= 0; size--){
 		data = Rd|Ss|(((r>>size) & 0x01)<<2)|Scs;
@@ -769,7 +777,7 @@ reread:
 		csr9w(ctlr, data|Sclk);
 		csr9w(ctlr, data);
 		microdelay(1);
-		if(!(csr32r(ctlr, 9) & Sdo))
+		if(ctlr->sromsz == 0 && !(csr32r(ctlr, 9) & Sdo))
 			break;
 	}
 
@@ -894,7 +902,7 @@ typephylink(Ctlr* ctlr, uchar*)
 	else
 		x = 0x0800;
 
-	csr6 = Sc|Mbo|Hbd|Ps|Ca|Sb|TrMODE;
+	csr6 = Sc|Mbo|Hbd|Ps|Ca|TrMODE|Sb;
 	if(ctlr->fdx & x)
 		csr6 |= Fd;
 	if(ctlr->ttm & x)
@@ -951,7 +959,7 @@ typephymode(Ctlr* ctlr, uchar* block, int wait)
 	phyx = block[2];
 	ctlr->curphyad = ctlr->phy[phyx];
 
-	ctlr->csr6 = 0;//Sc|Mbo|Hbd|Ps|Ca|Sb|TrMODE;
+	ctlr->csr6 = 0;//Sc|Mbo|Hbd|Ps|Ca|TrMODE|Sb;
 	//csr32w(ctlr, 6, ctlr->csr6);
 	if(typephylink(ctlr, block))
 		return 0;
@@ -973,7 +981,7 @@ typephymode(Ctlr* ctlr, uchar* block, int wait)
 	type5block(ctlr, &block[3]);
 	debug("\n");
 
-	ctlr->csr6 = 0;//Sc|Mbo|Hbd|Ps|Ca|Sb|TrMODE;
+	ctlr->csr6 = 0;//Sc|Mbo|Hbd|Ps|Ca|TrMODE|Sb;
 	//csr32w(ctlr, 6, ctlr->csr6);
 	if(typephylink(ctlr, block))
 		return 0;
@@ -1025,7 +1033,7 @@ type2mode(Ctlr* ctlr, uchar* block, int)
 	uchar *p;
 	int csr6, csr13, csr14, csr15, gpc, gpd;
 
-	csr6 = Sc|Mbo|Ca|Sb|TrMODE;
+	csr6 = Sc|Mbo|Ca|TrMODE|Sb;
 	debug("type2mode: medium 0x%2.2uX\n", block[2]);
 
 	/*
@@ -1116,7 +1124,7 @@ type0mode(Ctlr* ctlr, uchar* block, int wait)
 {
 	int csr6, m, timeo;
 
-	csr6 = Sc|Mbo|Hbd|Ca|Sb|TrMODE;
+	csr6 = Sc|Mbo|Hbd|Ca|TrMODE|Sb;
 debug("type0: medium 0x%uX, fd %d: 0x%2.2uX 0x%2.2uX 0x%2.2uX 0x%2.2uX\n",
     ctlr->medium, ctlr->fd, block[0], block[1], block[2], block[3]); 
 	switch(block[0]){
@@ -1163,6 +1171,85 @@ debug("type0: medium 0x%uX, fd %d: 0x%2.2uX 0x%2.2uX 0x%2.2uX 0x%2.2uX\n",
 	return -1;
 }
 
+static int
+media21041(Ether* ether, int wait)
+{
+	Ctlr* ctlr;
+	uchar *block;
+	int csr6, csr13, csr14, csr15, medium, timeo;
+
+	ctlr = ether->ctlr;
+	block = ctlr->infoblock[ctlr->curk];
+	debug("media21041: block[0] %2.2uX, medium %4.4uX sct %4.4uX\n",
+		block[0], ctlr->medium, ctlr->sct);
+
+	medium = block[0] & 0x3F;
+	if(ctlr->medium >= 0 && medium != ctlr->medium)
+		return 0;
+	if(ctlr->sct != 0x0800 && (ctlr->sct & 0x3F) != medium)
+		return 0;
+
+	csr6 = Sc|Mbo|Ca|TrMODE|Sb;
+	if(block[0] & 0x40){
+		csr13 = (block[2]<<8)|block[1];
+		csr14 = (block[4]<<8)|block[3];
+		csr15 = (block[6]<<8)|block[5];
+	}
+	else switch(medium){
+	default:
+		return -1;
+	case 0x00:		/* 10BASE-T */
+		csr13 = 0xEF01;
+		csr14 = 0xFF3F;
+		csr15 = 0x0008;
+		break;
+	case 0x01:		/* 10BASE-2 */
+		csr13 = 0xEF09;
+		csr14 = 0xF73D;
+		csr15 = 0x0006;
+		break;
+	case 0x02:		/* 10BASE-5 */
+		csr13 = 0xEF09;
+		csr14 = 0xF73D;
+		csr15 = 0x000E;
+		break;
+	case 0x04:		/* 10BASE-TFD */
+		csr13 = 0xEF01;
+		csr14 = 0xFF3D;
+		csr15 = 0x0008;
+		break;
+	}
+
+	csr32w(ctlr, 13, 0);
+	csr32w(ctlr, 14, csr14);
+	csr32w(ctlr, 15, csr15);
+	csr32w(ctlr, 13, csr13);
+	delay(10);
+
+	if(medium == 0x04)
+		csr6 |= Fd;
+	ctlr->csr6 = csr6;
+	csr32w(ctlr, 6, ctlr->csr6);
+
+	debug("media21041: csr6 %8.8uX csr13 %4.4uX csr14 %4.4uX csr15 %4.4uX\n",
+		csr6, csr13, csr14, csr15);
+
+	if(!wait)
+		return 0;
+
+	for(timeo = 0; timeo < 30; timeo++){
+		if(!(csr32r(ctlr, 12) & 0x0002)){
+			debug("media21041: ok: csr12 %4.4luX timeo %d\n",
+				csr32r(ctlr, 12), timeo);
+			return 10;
+		}
+		delay(100);
+	}
+	debug("media21041: !ok: csr12 %4.4luX\n", csr32r(ctlr, 12));
+
+	return -1;
+}
+
 static int
 mediaxx(Ether* ether, int wait)
 {
@@ -1235,7 +1322,14 @@ media(Ether* ether, int wait)
 
 	ctlr = ether->ctlr;
 	for(k = 0; k < ctlr->k; k++){
-		mbps = mediaxx(ether, wait);
+		switch(ctlr->id){
+		default:
+			mbps = mediaxx(ether, wait);
+			break;
+		case Tulip1:			/* 21041 */
+			mbps = media21041(ether, wait);
+			break;
+		}
 		if(mbps > 0)
 			return mbps;
 		if(ctlr->curk == 0)
@@ -1361,6 +1455,16 @@ srom(Ctlr* ctlr)
 		ctlr->srom[2*i+1] = x>>8;
 	}
 
+	if(DEBUG){
+		print("srom:");
+		for(i = 0; i < ((1<<ctlr->sromsz)*sizeof(ushort)); i++){
+			if(i && ((i & 0x0F) == 0))
+				print("\n     ");
+			print(" %2.2uX", ctlr->srom[i]);
+		}
+		print("\n");
+	}
+
 	/*
 	 * There are at least 2 SROM layouts:
 	 *	e.g. Digital EtherWORKS	station address at offset 20;
@@ -1437,7 +1541,7 @@ srom(Ctlr* ctlr)
 	ctlr->leaf = p;
 	ctlr->sct = *p++;
 	ctlr->sct |= *p++<<8;
-	if(ctlr->id != Tulip3){
+	if(ctlr->id != Tulip3 && ctlr->id != Tulip1){
 		csr32w(ctlr, 12, Gpc|*p++);
 		delay(200);
 	}
@@ -1448,11 +1552,20 @@ srom(Ctlr* ctlr)
 	phy = 0;
 	for(k = 0; k < ctlr->k; k++){
 		ctlr->infoblock[k] = p;
+		if(ctlr->id == Tulip1){
+			debug("type21041: 0x%2.2uX\n", p[0]); 
+			if(ctlr->sct != 0x0800 && *p == (ctlr->sct & 0xFF))
+				ctlr->sctk = k;
+			if(*p & 0x40)
+				p += 7;
+			else
+				p += 1;
+		}
 		/*
 		 * The RAMIX PMC665 has a badly-coded SROM,
 		 * hence the test for 21143 and type 3.
 		 */
-		if((*p & 0x80) || (ctlr->id == Tulip3 && *(p+1) == 3)){
+		else if((*p & 0x80) || (ctlr->id == Tulip3 && *(p+1) == 3)){
 			*p |= 0x80;
 			if(*(p+1) == 1 || *(p+1) == 3)
 				phy = 1;
@@ -1479,7 +1592,7 @@ srom(Ctlr* ctlr)
 				continue;
 			if((oui = miir(ctlr, k, 2)) == -1 || oui == 0)
 				continue;
-debug("phy reg 2 %4.4uX\n", oui);
+			debug("phy reg 2 %4.4uX\n", oui);
 			if(DEBUG){
 				oui = (oui & 0x3FF)<<6;
 				oui |= miir(ctlr, k, 3)>>10;
@@ -1518,12 +1631,12 @@ dec2114xpci(void)
 			 * Exit sleep mode.
 			 */
 			x = pcicfgr32(p, 0x40);
-			x &= ~0xc0000000;
+			x &= ~0xC0000000;
 			pcicfgw32(p, 0x40, x);
 			/*FALLTHROUGH*/
 
 		case Tulip0:			/* 21140 */
-		case Pnic:			/* PNIC */
+		case Tulip1:			/* 21041 */
 		case Pnic2:			/* PNIC-II */
 		case CentaurP:			/* ADMtek */
 			break;

+ 130 - 16
sys/src/boot/pc/ether2114x.c

@@ -20,7 +20,7 @@
 #define debug		if(DEBUG)print
 
 enum {
-	Nrde		= 4,
+	Nrde		= 32,
 	Ntde		= 4,
 };
 
@@ -182,6 +182,7 @@ enum {					/* PHY registers */
 
 enum {					/* Variants */
 	Tulip0		= (0x0009<<16)|0x1011,
+	Tulip1		= (0x0014<<16)|0x1011,
 	Tulip3		= (0x0019<<16)|0x1011,
 	Pnic		= (0x0002<<16)|0x11AD,
 	Pnic2		= (0xC115<<16)|0x11AD,
@@ -614,7 +615,7 @@ sromr(Ctlr* ctlr, int r)
 
 	/*
 	 * This sequence for reading a 16-bit register 'r'
-	 * in the EEPROM is taken straight from Section
+	 * in the EEPROM is taken (pretty much) straight from Section
 	 * 7.4 of the 21140 Hardware Reference Manual.
 	 */
 reread:
@@ -633,9 +634,16 @@ reread:
 
 	/*
 	 * First time through must work out the EEPROM size.
+	 * This doesn't seem to work on the 21041 as implemented
+	 * in Virtual PC for the Mac, so wire any 21041 to 6,
+	 * it's the only 21041 this code will ever likely see.
 	 */
-	if((size = ctlr->sromsz) == 0)
-		size = 8;
+	if((size = ctlr->sromsz) == 0){
+		if(ctlr->id == Tulip1)
+			ctlr->sromsz = size = 6;
+		else
+			size = 8;
+	}
 
 	for(size = size-1; size >= 0; size--){
 		data = Rd|Ss|(((r>>size) & 0x01)<<2)|Scs;
@@ -643,7 +651,7 @@ reread:
 		csr9w(ctlr, data|Sclk);
 		csr9w(ctlr, data);
 		microdelay(1);
-		if(!(csr32r(ctlr, 9) & Sdo))
+		if(ctlr->sromsz == 0 && !(csr32r(ctlr, 9) & Sdo))
 			break;
 	}
 
@@ -768,7 +776,7 @@ typephylink(Ctlr* ctlr, uchar*)
 	else
 		x = 0x0800;
 
-	csr6 = Sc|Mbo|Hbd|Ps|Ca|Sb|TrMODE;
+	csr6 = Sc|Mbo|Hbd|Ps|Ca|TrMODE|Sb;
 	if(ctlr->fdx & x)
 		csr6 |= Fd;
 	if(ctlr->ttm & x)
@@ -825,7 +833,7 @@ typephymode(Ctlr* ctlr, uchar* block, int wait)
 	phyx = block[2];
 	ctlr->curphyad = ctlr->phy[phyx];
 
-	ctlr->csr6 = 0;//Sc|Mbo|Hbd|Ps|Ca|Sb|TrMODE;
+	ctlr->csr6 = 0;//Sc|Mbo|Hbd|Ps|Ca|TrMODE|Sb;
 	//csr32w(ctlr, 6, ctlr->csr6);
 	if(typephylink(ctlr, block))
 		return 0;
@@ -847,7 +855,7 @@ typephymode(Ctlr* ctlr, uchar* block, int wait)
 	type5block(ctlr, &block[3]);
 	debug("\n");
 
-	ctlr->csr6 = 0;//Sc|Mbo|Hbd|Ps|Ca|Sb|TrMODE;
+	ctlr->csr6 = 0;//Sc|Mbo|Hbd|Ps|Ca|TrMODE|Sb;
 	//csr32w(ctlr, 6, ctlr->csr6);
 	if(typephylink(ctlr, block))
 		return 0;
@@ -899,7 +907,7 @@ type2mode(Ctlr* ctlr, uchar* block, int)
 	uchar *p;
 	int csr6, csr13, csr14, csr15, gpc, gpd;
 
-	csr6 = Sc|Mbo|Ca|Sb|TrMODE;
+	csr6 = Sc|Mbo|Ca|TrMODE|Sb;
 	debug("type2mode: medium 0x%2.2uX\n", block[2]);
 
 	/*
@@ -990,7 +998,7 @@ type0mode(Ctlr* ctlr, uchar* block, int wait)
 {
 	int csr6, m, timeo;
 
-	csr6 = Sc|Mbo|Hbd|Ca|Sb|TrMODE;
+	csr6 = Sc|Mbo|Hbd|Ca|TrMODE|Sb;
 debug("type0: medium 0x%uX, fd %d: 0x%2.2uX 0x%2.2uX 0x%2.2uX 0x%2.2uX\n",
     ctlr->medium, ctlr->fd, block[0], block[1], block[2], block[3]); 
 	switch(block[0]){
@@ -1037,6 +1045,85 @@ debug("type0: medium 0x%uX, fd %d: 0x%2.2uX 0x%2.2uX 0x%2.2uX 0x%2.2uX\n",
 	return -1;
 }
 
+static int
+media21041(Ether* ether, int wait)
+{
+	Ctlr* ctlr;
+	uchar *block;
+	int csr6, csr13, csr14, csr15, medium, timeo;
+
+	ctlr = ether->ctlr;
+	block = ctlr->infoblock[ctlr->curk];
+	debug("media21041: block[0] %2.2uX, medium %4.4uX sct %4.4uX\n",
+		block[0], ctlr->medium, ctlr->sct);
+
+	medium = block[0] & 0x3F;
+	if(ctlr->medium >= 0 && medium != ctlr->medium)
+		return 0;
+	if(ctlr->sct != 0x0800 && (ctlr->sct & 0x3F) != medium)
+		return 0;
+
+	csr6 = Sc|Mbo|Ca|TrMODE|Sb;
+	if(block[0] & 0x40){
+		csr13 = (block[2]<<8)|block[1];
+		csr14 = (block[4]<<8)|block[3];
+		csr15 = (block[6]<<8)|block[5];
+	}
+	else switch(medium){
+	default:
+		return -1;
+	case 0x00:		/* 10BASE-T */
+		csr13 = 0xEF01;
+		csr14 = 0xFF3F;
+		csr15 = 0x0008;
+		break;
+	case 0x01:		/* 10BASE-2 */
+		csr13 = 0xEF09;
+		csr14 = 0xF73D;
+		csr15 = 0x0006;
+		break;
+	case 0x02:		/* 10BASE-5 */
+		csr13 = 0xEF09;
+		csr14 = 0xF73D;
+		csr15 = 0x000E;
+		break;
+	case 0x04:		/* 10BASE-TFD */
+		csr13 = 0xEF01;
+		csr14 = 0xFF3D;
+		csr15 = 0x0008;
+		break;
+	}
+
+	csr32w(ctlr, 13, 0);
+	csr32w(ctlr, 14, csr14);
+	csr32w(ctlr, 15, csr15);
+	csr32w(ctlr, 13, csr13);
+	delay(10);
+
+	if(medium == 0x04)
+		csr6 |= Fd;
+	ctlr->csr6 = csr6;
+	csr32w(ctlr, 6, ctlr->csr6);
+
+	debug("media21041: csr6 %8.8uX csr13 %4.4uX csr14 %4.4uX csr15 %4.4uX\n",
+		csr6, csr13, csr14, csr15);
+
+	if(!wait)
+		return 0;
+
+	for(timeo = 0; timeo < 30; timeo++){
+		if(!(csr32r(ctlr, 12) & 0x0002)){
+			debug("media21041: ok: csr12 %4.4luX timeo %d\n",
+				csr32r(ctlr, 12), timeo);
+			return 10;
+		}
+		delay(100);
+	}
+	debug("media21041: !ok: csr12 %4.4luX\n", csr32r(ctlr, 12));
+
+	return -1;
+}
+
 static int
 mediaxx(Ether* ether, int wait)
 {
@@ -1109,7 +1196,14 @@ media(Ether* ether, int wait)
 
 	ctlr = ether->ctlr;
 	for(k = 0; k < ctlr->k; k++){
-		mbps = mediaxx(ether, wait);
+		switch(ctlr->id){
+		default:
+			mbps = mediaxx(ether, wait);
+			break;
+		case Tulip1:			/* 21041 */
+			mbps = media21041(ether, wait);
+			break;
+		}
 		if(mbps > 0)
 			return mbps;
 		if(ctlr->curk == 0)
@@ -1234,6 +1328,16 @@ srom(Ctlr* ctlr)
 		ctlr->srom[2*i+1] = x>>8;
 	}
 
+	if(DEBUG){
+		print("srom:");
+		for(i = 0; i < ((1<<ctlr->sromsz)*sizeof(ushort)); i++){
+			if(i && ((i & 0x0F) == 0))
+				print("\n     ");
+			print(" %2.2uX", ctlr->srom[i]);
+		}
+		print("\n");
+	}
+
 	/*
 	 * There are 2 SROM layouts:
 	 *	e.g. Digital EtherWORKS	station address at offset 20;
@@ -1302,7 +1406,7 @@ srom(Ctlr* ctlr)
 	ctlr->leaf = p;
 	ctlr->sct = *p++;
 	ctlr->sct |= *p++<<8;
-	if(ctlr->id != Tulip3){
+	if(ctlr->id != Tulip3 && ctlr->id != Tulip1){
 		csr32w(ctlr, 12, Gpc|*p++);
 		delay(200);
 	}
@@ -1313,11 +1417,20 @@ srom(Ctlr* ctlr)
 	phy = 0;
 	for(k = 0; k < ctlr->k; k++){
 		ctlr->infoblock[k] = p;
+		if(ctlr->id == Tulip1){
+			debug("type21041: 0x%2.2uX\n", p[0]); 
+			if(ctlr->sct != 0x0800 && *p == (ctlr->sct & 0xFF))
+				ctlr->sctk = k;
+			if(*p & 0x40)
+				p += 7;
+			else
+				p += 1;
+		}
 		/*
 		 * The RAMIX PMC665 has a badly-coded SROM,
 		 * hence the test for 21143 and type 3.
 		 */
-		if((*p & 0x80) || (ctlr->id == Tulip3 && *(p+1) == 3)){
+		else if((*p & 0x80) || (ctlr->id == Tulip3 && *(p+1) == 3)){
 			*p |= 0x80;
 			if(*(p+1) == 1 || *(p+1) == 3)
 				phy = 1;
@@ -1380,13 +1493,14 @@ dec2114xpci(void)
 			 * Exit sleep mode.
 			 */
 			x = pcicfgr32(p, 0x40);
-			x &= ~0xc0000000;
+			x &= ~0xC0000000;
 			pcicfgw32(p, 0x40, x);
 			/*FALLTHROUGH*/
 
 		case Pnic:			/* PNIC */
 		case Pnic2:			/* PNIC-II */
 		case Tulip0:			/* 21140 */
+		case Tulip1:			/* 21041 */
 			break;
 		}
 
@@ -1398,8 +1512,8 @@ dec2114xpci(void)
 		ctlr->port = p->mem[0].bar & ~0x01;
 		ctlr->pcidev = p;
 		ctlr->id = (p->did<<16)|p->vid;
-		debug("2114x: type 0x%8.8uX at port 0x%4.4uX\n",
-			ctlr->id, ctlr->port);
+		debug("2114x: type 0x%8.8uX rev 0x%4.4uX at port 0x%4.4uX\n",
+			ctlr->id, p->rid, ctlr->port);
 
 		/*
 		 * Some cards (e.g. ANA-6910FX) seem to need the Ps bit

+ 16 - 1
sys/src/cmd/rx.c

@@ -13,6 +13,7 @@ int	call(char *, char*, char*, char**);
 char	*buildargs(char*[]);
 int	send(int);
 void	error(char*, char*);
+void	sshexec(char *host, char *cmd);
 
 void
 usage(void)
@@ -48,7 +49,7 @@ main(int argc, char *argv[])
 	host = argv[0];
 	args = buildargs(&argv[1]);
 
-	/* generic attempts: try p9any then dial again with p9sk2 */
+	/* try erexexec p9any then dial again with p9sk2 */
 	fd = call(0, host, "rexexec", &addr);
 	if(fd >= 0)
 		rex(fd, args, "p9any");
@@ -58,6 +59,14 @@ main(int argc, char *argv[])
 		rex(fd, args, "p9sk2");
 	close(fd);
 
+	/* if there's an ssh port, try that */
+	fd = call("tcp", host, "ssh", &addr);
+	if(fd >= 0){
+		close(fd);
+		sshexec(host, args);
+		/* falls through if no ssh */
+	}
+
 	/* specific attempts */
 	fd = call("tcp", host, "shell", &addr);
 	if(fd >= 0)
@@ -142,6 +151,12 @@ tcpexec(int fd, char *addr, char *cmd)
 	exits(0);
 }
 
+void
+sshexec(char *host, char *cmd)
+{
+	execl("/bin/ssh", "ssh", "-iCm", host, cmd, 0);
+}
+
 int
 send(int fd)
 {

+ 4 - 0
sys/src/cmd/samterm/main.c

@@ -346,6 +346,10 @@ ctlw(Rasp *r, long o, long p)
 long
 ctlu(Rasp *r, long o, long p)
 {
+	if(--p < o)
+		return o;
+	if(raspc(r, p)=='\n')
+		return p;
 	for(; p-1>=o && raspc(r, p-1)!='\n'; --p)
 		;
 	return p>=o? p : o;

+ 6 - 0
sys/src/cmd/samterm/mkfile

@@ -19,6 +19,12 @@ LIB=	/$objtype/lib/libdraw.a\
 	/$objtype/lib/libframe.a\
 
 BIN=/$objtype/bin/aux
+
+UPDATE=\
+	mkfile\
+	$HFILES\
+	${OFILES:%.$O=%.c}\
+
 </sys/src/cmd/mkone
 
 CFLAGS=-I../sam $CFLAGS