diff options
author | Tejun Heo <htejun@gmail.com> | 2006-08-10 03:59:12 -0400 |
---|---|---|
committer | Tejun Heo <htejun@gmail.com> | 2006-08-10 03:59:12 -0400 |
commit | dd5b06c490de72440ec39f814de99a714a45a1a9 (patch) | |
tree | 7a4665f9b6fdb5a264c753b90a215e2953e2d0f7 /include/linux | |
parent | 2ec7df0457b710d9201f211dbccdbecf0ad38b7e (diff) |
[PATCH] libata: implement dummy port
Implement dummy port which can be requested by setting appropriate bit
in probe_ent->dummy_port_mask. The dummy port is used as placeholder
for stolen legacy port. This allows libata to guarantee that
index_of(ap) == ap->port_no == actual_device_port_no, and thus to
remove error-prone ap->hard_port_no.
As it's used only when one port of a legacy controller is reserved by
some other entity (e.g. IDE), the focus is on keeping the added *code*
complexity at minimum, so dummy port allocates all libata core
resources and acts as a normal port. It just has all dummy port_ops.
This patch only implements dummy port. The following patch will make
libata use it for stolen legacy ports.
Signed-off-by: Tejun Heo <htejun@gmail.com>
Diffstat (limited to 'include/linux')
-rw-r--r-- | include/linux/libata.h | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/include/linux/libata.h b/include/linux/libata.h index 4504776570e4..30bfe8f1666e 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h | |||
@@ -353,6 +353,7 @@ struct ata_probe_ent { | |||
353 | struct ata_ioports port[ATA_MAX_PORTS]; | 353 | struct ata_ioports port[ATA_MAX_PORTS]; |
354 | unsigned int n_ports; | 354 | unsigned int n_ports; |
355 | unsigned int hard_port_no; | 355 | unsigned int hard_port_no; |
356 | unsigned int dummy_port_mask; | ||
356 | unsigned int pio_mask; | 357 | unsigned int pio_mask; |
357 | unsigned int mwdma_mask; | 358 | unsigned int mwdma_mask; |
358 | unsigned int udma_mask; | 359 | unsigned int udma_mask; |
@@ -652,6 +653,8 @@ extern const unsigned long sata_deb_timing_normal[]; | |||
652 | extern const unsigned long sata_deb_timing_hotplug[]; | 653 | extern const unsigned long sata_deb_timing_hotplug[]; |
653 | extern const unsigned long sata_deb_timing_long[]; | 654 | extern const unsigned long sata_deb_timing_long[]; |
654 | 655 | ||
656 | extern const struct ata_port_operations ata_dummy_port_ops; | ||
657 | |||
655 | static inline const unsigned long * | 658 | static inline const unsigned long * |
656 | sata_ehc_deb_timing(struct ata_eh_context *ehc) | 659 | sata_ehc_deb_timing(struct ata_eh_context *ehc) |
657 | { | 660 | { |
@@ -661,6 +664,11 @@ sata_ehc_deb_timing(struct ata_eh_context *ehc) | |||
661 | return sata_deb_timing_normal; | 664 | return sata_deb_timing_normal; |
662 | } | 665 | } |
663 | 666 | ||
667 | static inline int ata_port_is_dummy(struct ata_port *ap) | ||
668 | { | ||
669 | return ap->ops == &ata_dummy_port_ops; | ||
670 | } | ||
671 | |||
664 | extern void ata_port_probe(struct ata_port *); | 672 | extern void ata_port_probe(struct ata_port *); |
665 | extern void __sata_phy_reset(struct ata_port *ap); | 673 | extern void __sata_phy_reset(struct ata_port *ap); |
666 | extern void sata_phy_reset(struct ata_port *ap); | 674 | extern void sata_phy_reset(struct ata_port *ap); |