Recently I discovered that (some?) mpii(4) controllers fill in link->port_wwn
with a fake wwn (4433221102000000) for sata devices.  When you're trying to
boot a sparc64 box off a sata device attached to such a controller, this means
the bootpath matching in device_register() doesn't work, so you have to enter
the root device manually, which is unfun.

By the time the device is being registered, scsi_probedev has filled in the
devid, so we can use that to match against the boot path if link->port_wwn
doesn't work.

This makes life a lot easier on this controller in my S7-2:
mpii0 at pci19 dev 0 function 0 "Symbios Logic SAS3008" rev 0x02a
mpii0: ORCL-INT-SAS3, firmware 9.0.0.0, MPI 2.5
scsibus2 at mpii0: 1024 targets

ok?


Index: autoconf.c
===================================================================
RCS file: /cvs/src/sys/arch/sparc64/sparc64/autoconf.c,v
retrieving revision 1.132
diff -u -p -r1.132 autoconf.c
--- autoconf.c  25 Jul 2019 22:45:53 -0000      1.132
+++ autoconf.c  14 Oct 2019 03:34:08 -0000
@@ -1459,6 +1459,16 @@ device_register(struct device *dev, void
                        if (bp->val[0] == sl->port_wwn && lun == sl->lun) {
                                nail_bootdev(dev, bp);
                        }
+
+                       /*
+                        * sata devices on some controllers don't get
+                        * port_wwn filled in, so look at devid too.
+                        */
+                       if (sl->id && sl->id->d_len == 8 &&
+                           sl->id->d_type == DEVID_NAA) {
+                               if (memcmp(sl->id + 1, &bp->val[0], 8) == 0)
+                                       nail_bootdev(dev, bp);
+                       }
                        return;
                }
 

Reply via email to