ATA regression [PATCH]
Søren Schmidt
sos at DeepCore.dk
Tue Dec 28 04:50:03 PST 2004
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
-------------- next part --------------
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
@@ -1367,6 +1367,11 @@
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 */
@@ -1413,22 +1418,33 @@
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);
@@ -1448,26 +1464,25 @@
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
More information about the freebsd-current
mailing list