Re: ATA regression [PATCH]

From: Søren Schmidt <sos_at_DeepCore.dk>
Date: Tue, 28 Dec 2004 13:49:20 +0100
Ruslan Ermilov wrote:

> So I analyzed what was changed in this ata-chipset.c revision
> when it comes to my chip, and tried the following patch, and
> it brought me back my ad8 drive:

Hmm, there are grimlins in there alright. Could you try the attached 
patch as thats what I have in my WIP and it cleans up the code a bit as 
well..

-- 

-Søren


Index: ata-chipset.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/ata/ata-chipset.c,v
retrieving revision 1.97
diff -u -r1.97 ata-chipset.c
--- ata-chipset.c	24 Dec 2004 13:36:04 -0000	1.97
+++ ata-chipset.c	28 Dec 2004 12:47:10 -0000
_at__at_ -1367,6 +1367,11 _at__at_
 	return ENXIO;
     }
 
+    if (ctlr->chip->max_dma >= ATA_SA150)
+	ctlr->setmode = ata_sata_setmode;
+    else
+	ctlr->setmode = ata_promise_setmode;
+
     switch  (ctlr->chip->cfg1) {
     case PRNEW:
 	/* setup clocks */
_at__at_ -1413,22 +1418,33 _at__at_
 	ctlr->dmainit = ata_promise_mio_dmainit;
 	ctlr->allocate = ata_promise_mio_allocate;
 
-	if (ctlr->chip->cfg2 & PRPATA) {
-	    ctlr->channels = ((ATA_INL(ctlr->r_res2, 0x48) & 0x01) > 0) +
-			     ((ATA_INL(ctlr->r_res2, 0x48) & 0x02) > 0) + 2;
-	}
-	else if (ctlr->chip->cfg2 & PRCMBO) {
-	    ATA_OUTL(ctlr->r_res2, 0x06c, 0x000000ff);
-	    ctlr->channels = ((ATA_INL(ctlr->r_res2, 0x48) & 0x02) > 0) + 3;
-	}
-	else if (ctlr->chip->cfg2 & PRCMBO2) {
-	    ATA_OUTL(ctlr->r_res2, 0x060, 0x000000ff);
-	    ctlr->channels = 3;
-	}
-	else
-	    ctlr->channels = 4;
+	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;
+	    break;
 
-	if (ctlr->chip->cfg2 & PRSX4X) {
+	case PRCMBO:
+            ATA_OUTL(ctlr->r_res2, 0x06c, 0x000000ff);
+            ctlr->channels = ((ATA_INL(ctlr->r_res2, 0x48) & 0x02) > 0) + 3;
+	    break;
+
+	case PRSATA:
+            ATA_OUTL(ctlr->r_res2, 0x06c, 0x000000ff);
+            ctlr->channels = 4;
+	    break;
+
+	case PRCMBO2:
+            ATA_OUTL(ctlr->r_res2, 0x060, 0x000000ff);
+            ctlr->channels = 3;
+	    break;
+
+	case PRSATA2:
+            ATA_OUTL(ctlr->r_res2, 0x060, 0x000000ff);
+            ctlr->channels = 4;
+	    break;
+
+	case PRSX4X: {
 	    struct ata_promise_sx4 *hpkt;
 	    u_int32_t dimm = ATA_INL(ctlr->r_res2, 0x000c0080);
 
_at__at_ -1448,26 +1464,25 _at__at_
 	    mtx_init(&hpkt->mtx, "ATA promise HPKT lock", NULL, MTX_DEF);
 	    hpkt->busy = hpkt->head = hpkt->tail = 0;
 
+            ctlr->channels = 4;
+
 	    if ((bus_setup_intr(dev, ctlr->r_irq, ATA_INTR_FLAGS,
 				ata_promise_sx4_intr, ctlr, &ctlr->handle))) {
 		device_printf(dev, "unable to setup interrupt\n");
 		return ENXIO;
 	    }
-	}
-	else {
-	    if ((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");
-		return ENXIO;
+	    return 0;
 	    }
 	}
-	break;
+
+	if ((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");
+	    return ENXIO;
+	}
+	return 0;
     }
-    if (ctlr->chip->max_dma >= ATA_SA150)
-	ctlr->setmode = ata_sata_setmode;
-    else
-	ctlr->setmode = ata_promise_setmode;
-    return 0;
+    return ENXIO;
 }
 
 static int
Received on Tue Dec 28 2004 - 11:50:03 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:38:25 UTC