[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

periph_target is 0 (Re: boot from secondary IDE drive)



>                                            千葉市中央区長洲
>                                                    藤原  誠
何とか wd1 で固定で boot-device を見つけるようにして(hard code) 
boot すると dmesg が採集出来るようになりました (強引)。

どうも drive 1 というのを拾えていないように思われます(それは当
然な訳ですが)。
sys/dev/scsipi/scsipiconf.h
の中に、次のような行があるのですが、
    366         int     periph_target;          /* target ID (drive # on ATAPI) */
この変数に drive # が入っていないのが問題ということでしょうか。
 
添付の patch を使って、wd1 に置いた disk から
boot enet:0 /pci@f2000000/pci-bridge@d/mac-io@7/ata-4/disk@1:0
で起動した時の dmesg の一部。後半の wd1 で drive 1 と表示
しているが、それを拾えていない。二回目の periph_target(0) が問題
+----------------------------------------------
| wd0 at wdc0 channel 0 drive 0
|  -- addr(1)
|  -- p()
| 
|  -- dv_xname(wd0)
|  -- cp (/disk@1)
|  -- bp (disk@1:0/netbsd)
| 
|  -- addr(1) periph_target(0) does not match, returning.
| : <IBM-DPTA-371020>
| wd0: drive supports 16-sector PIO transfers, LBA addressing
| wd0: 9779 MB, 16383 cyl, 16 head, 63 sec, 512 bytes/sect x 20028960 sectors
| wd0: drive supports PIO mode 4, DMA mode 2, Ultra-DMA mode 4 (Ultra/66)
| wd1 at wdc0 channel 0 drive 1
|  -- addr(1)
|  -- p()
| 
|  -- dv_xname(wd1)
|  -- cp (/disk@1)
|  -- bp (disk@1:0/netbsd)
| 
|  -- addr(1) periph_target(0).
| 
|  -- addr(1) aa -> aa_channel(0).
| : <ST320420A>
| wd1: drive supports 16-sector PIO transfers, LBA addressing
+----------------------------------------------
もっとも、channel も指定出来るような必要もあるような気もします。
@wdc:channel:drive:partition, つまり disk@0:0:1:0 のような。
---
(藤原)
http://www.ki.nu/software/NetBSD/iBook2/
--- autoconf.c-ooo	Sun Jul 22 20:29:47 2001
+++ autoconf.c	Sat Aug 18 15:58:26 2001
@@ -142,6 +142,10 @@
 	 *
 	 * The last component may have no address... so append it.
 	 */
+#if 1
+	printf("\n -- before -- cbootpath(%s)\n -- bootpath(%s)\n -- last(%s)\n",
+	       cbootpath,bootpath,last);
+#endif
 	p = strrchr(cbootpath, '/');
 	if (p != NULL && strchr(p, '@') == NULL) {
 		/* Append it. */
@@ -157,6 +161,10 @@
 	/* XXX Does this belong here, or device_register()? */
 	if ((p = strrchr(cbootpath, ',')) != NULL)
 		*p = 0;
+#if 1
+	printf("\n -- after  -- cbootpath(%s)\n -- bootpath(%s)\n -- last(%s)\n",
+	       cbootpath,bootpath,last);
+#endif
 }
 
 #define DEVICE_IS(dev, name) \
@@ -219,6 +227,9 @@
 	} else
 		addr = strtoul(p + 1, &p, 16);
 
+#if 1
+	printf("\n -- addr(%x)\n -- p(%s)\n",(int) addr, p);
+#endif	
 	if (DEVICE_IS(dev->dv_parent, "mainbus")) {
 		struct confargs *ca = aux;
 
@@ -262,9 +273,23 @@
 			return;
 	} else if (DEVICE_IS(dev->dv_parent, "wdc")) {
 		struct ata_atapi_attach *aa = aux;
+		struct scsipibus_attach_args *sa = aux;
 
-		if (addr != aa->aa_channel)
+		printf("\n -- dv_xname(%s)\n -- cp (%s)\n -- bp (%s)\n",
+		       dev->dv_xname,cp,bp);
+		if (strcmp( dev->dv_xname,"wd1") == 0 ) {
+		  printf("\n -- addr(%x) periph_target(%x).\n",
+			 (int) addr, sa->sa_periph->periph_target);
+		  printf("\n -- addr(%x) aa -> aa_channel(%x).\n",
+			 (int) addr, aa->aa_channel);
+		}
+		else {
+		if (addr != sa->sa_periph->periph_target)
+		  {
+		  printf("\n -- addr(%x) periph_target(%x) does not match, returning.\n",
+			 (int) addr, sa->sa_periph->periph_target);
 			return;
+		  }}  
 	} else
 		return;