Wilko Bulte wrote:
On Wed, Feb 08, 2006 at 10:44:05PM +0100, Sren Schmidt wrote..
Wilko Bulte wrote:
On Wed, Feb 08, 2006 at 10:02:08PM +0100, Sren Schmidt wrote..
Wilko Bulte wrote:
Hi Soren,

I just went to 6.1-PRE on my main machine, coming from 6.0-STABLE
of roughly end of december.

And I hit some stuff that really worries me:

- the freshly built kernel keels over with (hand transcribed):

ata3: reiniting channel SATA connect ... SATA connected
sata_connect_devices 0x1 <ATA_MASTER>

ad6: req=0xC35ba0c8 SETFEATURES SETTRANSFERMODE semaphore timeout !! DANGER Will RObinson !!

(... is where I cannot read my own handwriting, it scrolled quite fast on
the screen..)

Boot device is a SATA RAID1 on a Promise 2300.
Hmm, that should not happen. Could you try to backstep just ATA to before the MFC, that is 24/1/06 and let me know if that helps please ?
First impression is that the problem is gone. None of the previously reported errors are seen. I am running a level 0 dump from disk to disk
to see if the box remains stable.  Given that this is my primary machine
I sure hope it will be :-)

Another snag is that my ad10 disk on 6.0-STABLE suddenly became ad12 on
6.1-PRE
Hmm that is because there is only 2 ports on your promise which is now correctly identified, before it was errounsly found as 3 ports.
Ah, OK.  I would suggest a note to the Release Note writers would be a good
thing, devices changing location after an upgrade in the -stable branch
is unnerving ;-)
Well, the good thing is that I can reproduce the error here, the bad thing is that it slipped through testing on -current...
Oh, well, I'll look into it ASAP...

Thank you Soren!

OK, had a few this afternoon, could you try this patch and let me know if it helps, at least it makes the problem go away on my testbed..

-Søren
Index: ata-chipset.c
===================================================================
RCS file: /nfs/export/ncvs/src/sys/dev/ata/ata-chipset.c,v
retrieving revision 1.156
diff -u -r1.156 ata-chipset.c
--- ata-chipset.c       6 Feb 2006 19:17:48 -0000       1.156
+++ ata-chipset.c       9 Feb 2006 13:20:06 -0000
@@ -2861,10 +2861,10 @@
      { ATA_PDC20377,  0, PRMIO, PRCMBO,  ATA_SA150, "PDC20377" },
      { ATA_PDC20378,  0, PRMIO, PRCMBO,  ATA_SA150, "PDC20378" },
      { ATA_PDC20379,  0, PRMIO, PRCMBO,  ATA_SA150, "PDC20379" },
-     { ATA_PDC20571,  0, PRMIO, PRSATA2, ATA_SA150, "PDC20571" },
+     { ATA_PDC20571,  0, PRMIO, PRCMBO2, ATA_SA150, "PDC20571" },
      { ATA_PDC20575,  0, PRMIO, PRCMBO2, ATA_SA150, "PDC20575" },
      { ATA_PDC20579,  0, PRMIO, PRCMBO2, ATA_SA150, "PDC20579" },
-     { ATA_PDC20771,  0, PRMIO, PRSATA2, ATA_SA300, "PDC20771" },
+     { ATA_PDC20771,  0, PRMIO, PRCMBO2, ATA_SA300, "PDC20771" },
      { ATA_PDC40775,  0, PRMIO, PRCMBO2, ATA_SA300, "PDC40775" },
      { ATA_PDC20617,  0, PRMIO, PRPATA,  ATA_UDMA6, "PDC20617" },
      { ATA_PDC20618,  0, PRMIO, PRPATA,  ATA_UDMA6, "PDC20618" },
@@ -2925,6 +2925,7 @@
 ata_promise_chipinit(device_t dev)
 {
     struct ata_pci_controller *ctlr = device_get_softc(dev);
+    int fake_reg, stat_reg;
 
     if (ata_setup_interrupt(dev))
        return ENXIO;
@@ -2962,8 +2963,7 @@
                                                    &ctlr->r_rid2, RF_ACTIVE)))
            goto failnfree;
 
-       switch (ctlr->chip->cfg2) {
-       case PRSX4X: {
+       if (ctlr->chip->cfg2 == PRSX4X) {
            struct ata_promise_sx4 *hpkt;
            u_int32_t dimm = ATA_INL(ctlr->r_res2, 0x000c0080);
 
@@ -2998,58 +2998,55 @@
            ctlr->setmode = ata_promise_setmode;
            ctlr->channels = 4;
            return 0;
-           }
-       case PRPATA:
-       case PRCMBO:
-       case PRSATA:
-           /* 
-            * older "mio" type controllers need an interrupt intercept
-            * function to compensate for the "reset on read" type interrupt
-            * status register they have.
-            */
-           if (bus_teardown_intr(dev, ctlr->r_irq, ctlr->handle) ||
+       }
+
+       /* mio type controllers need an interrupt intercept */
+       if (bus_teardown_intr(dev, ctlr->r_irq, ctlr->handle) ||
                bus_setup_intr(dev, ctlr->r_irq, ATA_INTR_FLAGS,
                               ata_promise_mio_intr, ctlr, &ctlr->handle)) {
                device_printf(dev, "unable to setup interrupt\n");
                goto failnfree;
-           }
-           /* prime fake interrupt register */
-           ATA_OUTL(ctlr->r_res2, 0x060, 0xffffffff);
-           break;
        }
 
-
-       ctlr->allocate = ata_promise_mio_allocate;
-       ctlr->reset = ata_promise_mio_reset;
-       ctlr->dmainit = ata_promise_mio_dmainit;
-       ctlr->setmode = ata_promise_mio_setmode;
-
        switch (ctlr->chip->cfg2) {
        case PRPATA:
            ctlr->channels = ((ATA_INL(ctlr->r_res2, 0x48) & 0x01) > 0) +
                             ((ATA_INL(ctlr->r_res2, 0x48) & 0x02) > 0) + 2;
-           return 0;
-
+           goto sata150;
        case PRCMBO:
-           ATA_OUTL(ctlr->r_res2, 0x06c, 0x000000ff);
-           ctlr->channels = ((ATA_INL(ctlr->r_res2, 0x48) & 0x02) > 0) + 3;
-           return 0;
-
+           ctlr->channels = 3;
+           goto sata150;
        case PRSATA:
-           ATA_OUTL(ctlr->r_res2, 0x06c, 0x000000ff);
            ctlr->channels = 4;
-           return 0;
+sata150:
+           fake_reg = 0x60;
+           stat_reg = 0x6c;
+           break;
 
-       case PRCMBO2:
-           ATA_OUTL(ctlr->r_res2, 0x060, 0x000000ff);
+       case PRCMBO2: 
            ctlr->channels = 3;
-           return 0;
-
+           goto sataii;
        case PRSATA2:
-           ATA_OUTL(ctlr->r_res2, 0x060, 0x000000ff);
+       default:
            ctlr->channels = 4;
-           return 0;
+sataii:
+           fake_reg = 0x54;
+           stat_reg = 0x60;
+           break;
        }
+
+       /* prime fake interrupt register */
+       ATA_OUTL(ctlr->r_res2, fake_reg, 0xffffffff);
+
+       /* clear SATA status */
+       ATA_OUTL(ctlr->r_res2, stat_reg, 0x000000ff);
+
+       ctlr->allocate = ata_promise_mio_allocate;
+       ctlr->reset = ata_promise_mio_reset;
+       ctlr->dmainit = ata_promise_mio_dmainit;
+       ctlr->setmode = ata_promise_mio_setmode;
+
+       return 0;
     }
 
 failnfree:
@@ -3297,7 +3294,21 @@
 {
     struct ata_pci_controller *ctlr = data;
     struct ata_channel *ch;
-    int unit;
+    u_int32_t vector;
+    int unit, fake_reg;
+
+    switch (ctlr->chip->cfg2) {
+    case PRPATA:
+    case PRCMBO:
+    case PRSATA:
+       fake_reg = 0x60;
+       break;
+    case PRCMBO2: 
+    case PRSATA2:
+    default:
+       fake_reg = 0x54;
+       break;
+    }
 
     /*
      * since reading interrupt status register on early "mio" chips
@@ -3306,13 +3317,16 @@
      * store the bits in an unused register in the chip so we can read
      * it from there safely to get around this "feature".
      */
-    ATA_OUTL(ctlr->r_res2, 0x060, ATA_INL(ctlr->r_res2, 0x040));
+    vector = ATA_INL(ctlr->r_res2, 0x040);
+    ATA_OUTL(ctlr->r_res2, 0x040, vector);
+    ATA_OUTL(ctlr->r_res2, fake_reg, vector);
 
     for (unit = 0; unit < ctlr->channels; unit++) {
        if ((ch = ctlr->interrupt[unit].argument))
            ctlr->interrupt[unit].function(ch);
     }
-    ATA_OUTL(ctlr->r_res2, 0x060, 0xffffffff);
+
+    ATA_OUTL(ctlr->r_res2, fake_reg, 0xffffffff);
 }
 
 static int
@@ -3321,37 +3335,30 @@
     struct ata_pci_controller *ctlr = device_get_softc(device_get_parent(dev));
     struct ata_channel *ch = device_get_softc(dev);
     struct ata_connect_task *tp;
-    u_int32_t vector, status;
+    u_int32_t fake_reg, stat_reg, vector, status;
 
     switch (ctlr->chip->cfg2) {
     case PRPATA:
-    case PRSATA:
     case PRCMBO:
-       /* read and acknowledge interrupt */
-       vector = ATA_INL(ctlr->r_res2, 0x0060);
-
-       /* read and clear interface status */
-       status = ATA_INL(ctlr->r_res2, 0x006c);
-       ATA_OUTL(ctlr->r_res2, 0x006c, status & (0x00000011 << ch->unit));
+    case PRSATA:
+       fake_reg = 0x60;
+       stat_reg = 0x6c;
        break;
-
+    case PRCMBO2: 
     case PRSATA2:
-    case PRCMBO2:
-critical_enter();
-       /* read and acknowledge interrupt */
-       vector = ATA_INL(ctlr->r_res2, 0x0040);
-       ATA_OUTL(ctlr->r_res2, 0x0040, (1 << (ch->unit + 1)));
-
-       /* read and clear interface status */
-       status = ATA_INL(ctlr->r_res2, 0x0060);
-       ATA_OUTL(ctlr->r_res2, 0x0060, status & (0x00000011 << ch->unit));
-critical_exit();
-       break;
-
     default:
-       return 0;
+       fake_reg = 0x54;
+       stat_reg = 0x60;
+       break;
     }
 
+    /* read and acknowledge interrupt */
+    vector = ATA_INL(ctlr->r_res2, fake_reg);
+
+    /* read and clear interface status */
+    status = ATA_INL(ctlr->r_res2, stat_reg);
+    ATA_OUTL(ctlr->r_res2, stat_reg, status & (0x00000011 << ch->unit));
+
     /* check for and handle disconnect events */
     if ((status & (0x00000001 << ch->unit)) &&
        (tp = (struct ata_connect_task *)
Index: ata-pci.c
===================================================================
RCS file: /nfs/export/ncvs/src/sys/dev/ata/ata-pci.c,v
retrieving revision 1.114
diff -u -r1.114 ata-pci.c
--- ata-pci.c   25 Jan 2006 23:07:42 -0000      1.114
+++ ata-pci.c   9 Feb 2006 13:31:10 -0000
@@ -34,6 +34,7 @@
 #include <sys/module.h>
 #include <sys/ata.h>
 #include <sys/bus.h>
+#include <sys/conf.h>
 #include <sys/malloc.h>
 #include <sys/sema.h>
 #include <sys/taskqueue.h>
@@ -443,7 +444,7 @@
 {
     struct ata_channel *ch = device_get_softc(dev);
 
-    if (!ata_legacy(device_get_parent(dev)) &&
+    if ((dumping || !ata_legacy(device_get_parent(dev))) &&
        ch->dma && ((ch->flags & ATA_ALWAYS_DMASTAT) ||
                    (ch->dma->flags & ATA_DMA_ACTIVE))) {
        int bmstat = ATA_IDX_INB(ch, ATA_BMSTAT_PORT) & ATA_BMSTAT_MASK;
_______________________________________________
freebsd-stable@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-stable
To unsubscribe, send any mail to "[EMAIL PROTECTED]"

Reply via email to