summaryrefslogtreecommitdiffstats
path: root/sys/dev/ata
diff options
context:
space:
mode:
authormav <mav@FreeBSD.org>2009-02-16 19:10:07 +0000
committermav <mav@FreeBSD.org>2009-02-16 19:10:07 +0000
commit2faabf52c8c4a36ab3aa958abb2bead1a9ce8795 (patch)
tree28b0ab512687fe2f7043055c4277bac197f7df5a /sys/dev/ata
parent73a32c3f96222b8f118fa826a1bb60bf586c4733 (diff)
downloadFreeBSD-src-2faabf52c8c4a36ab3aa958abb2bead1a9ce8795.zip
FreeBSD-src-2faabf52c8c4a36ab3aa958abb2bead1a9ce8795.tar.gz
Give atapci knowledge about set of implemented AHCI ports. It is possible
to not allocate them after the recent ata channels enumeration changes. It allows to save some resources, not bother user with unexisting hardware and not check unimplemented ports status on every interrupt.
Diffstat (limited to 'sys/dev/ata')
-rw-r--r--sys/dev/ata/ata-pci.c3
-rw-r--r--sys/dev/ata/ata-pci.h1
-rw-r--r--sys/dev/ata/chipsets/ata-ahci.c8
3 files changed, 6 insertions, 6 deletions
diff --git a/sys/dev/ata/ata-pci.c b/sys/dev/ata/ata-pci.c
index 62d41d0..68c209f 100644
--- a/sys/dev/ata/ata-pci.c
+++ b/sys/dev/ata/ata-pci.c
@@ -98,6 +98,7 @@ ata_pci_attach(device_t dev)
ctlr->channels = 2;
else
ctlr->channels = 1;
+ ctlr->ichannels = -1;
ctlr->allocate = ata_pci_allocate;
ctlr->dmainit = ata_pci_dmainit;
ctlr->dev = dev;
@@ -122,6 +123,8 @@ ata_pci_attach(device_t dev)
/* attach all channels on this controller */
for (unit = 0; unit < ctlr->channels; unit++) {
+ if ((ctlr->ichannels & (1 << unit)) == 0)
+ continue;
child = device_add_child(dev, "ata",
((unit == 0 || unit == 1) && ctlr->legacy) ?
unit : devclass_find_free_unit(ata_devclass, 2));
diff --git a/sys/dev/ata/ata-pci.h b/sys/dev/ata/ata-pci.h
index a31f30e..bd5104f 100644
--- a/sys/dev/ata/ata-pci.h
+++ b/sys/dev/ata/ata-pci.h
@@ -51,6 +51,7 @@ struct ata_pci_controller {
struct ata_chip_id *chip;
int legacy;
int channels;
+ int ichannels;
int (*chipinit)(device_t);
int (*suspend)(device_t);
int (*resume)(device_t);
diff --git a/sys/dev/ata/chipsets/ata-ahci.c b/sys/dev/ata/chipsets/ata-ahci.c
index b5a5c74..6e14db1d 100644
--- a/sys/dev/ata/chipsets/ata-ahci.c
+++ b/sys/dev/ata/chipsets/ata-ahci.c
@@ -122,8 +122,9 @@ ata_ahci_chipinit(device_t dev)
};
/* get the number of HW channels */
+ ctlr->ichannels = ATA_INL(ctlr->r_res2, ATA_AHCI_PI);
ctlr->channels =
- MAX(flsl(ATA_INL(ctlr->r_res2, ATA_AHCI_PI)),
+ MAX(flsl(ctlr->ichannels),
(ATA_INL(ctlr->r_res2, ATA_AHCI_CAP) & ATA_AHCI_NPMASK) + 1);
ctlr->reset = ata_ahci_reset;
@@ -667,11 +668,6 @@ ata_ahci_reset(device_t dev)
u_int32_t signature;
int offset = ch->unit << 7;
- if (!(ATA_INL(ctlr->r_res2, ATA_AHCI_PI) & (1 << ch->unit))) {
- device_printf(dev, "port not implemented\n");
- return;
- }
-
/* setup work areas */
work = ch->dma.work_bus + ATA_AHCI_CL_OFFSET;
ATA_OUTL(ctlr->r_res2, ATA_AHCI_P_CLB + offset, work & 0xffffffff);
OpenPOWER on IntegriCloud