diff options
Diffstat (limited to 'include')
-rw-r--r-- | include/linux/libata.h | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/include/linux/libata.h b/include/linux/libata.h index eccc38e17568..46aa4ab64891 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h | |||
@@ -433,7 +433,7 @@ struct ata_host { | |||
433 | void __iomem * const *iomap; | 433 | void __iomem * const *iomap; |
434 | unsigned int n_ports; | 434 | unsigned int n_ports; |
435 | void *private_data; | 435 | void *private_data; |
436 | const struct ata_port_operations *ops; | 436 | struct ata_port_operations *ops; |
437 | unsigned long flags; | 437 | unsigned long flags; |
438 | #ifdef CONFIG_ATA_ACPI | 438 | #ifdef CONFIG_ATA_ACPI |
439 | acpi_handle acpi_handle; | 439 | acpi_handle acpi_handle; |
@@ -602,7 +602,7 @@ struct ata_link { | |||
602 | 602 | ||
603 | struct ata_port { | 603 | struct ata_port { |
604 | struct Scsi_Host *scsi_host; /* our co-allocated scsi host */ | 604 | struct Scsi_Host *scsi_host; /* our co-allocated scsi host */ |
605 | const struct ata_port_operations *ops; | 605 | struct ata_port_operations *ops; |
606 | spinlock_t *lock; | 606 | spinlock_t *lock; |
607 | unsigned long flags; /* ATA_FLAG_xxx */ | 607 | unsigned long flags; /* ATA_FLAG_xxx */ |
608 | unsigned int pflags; /* ATA_PFLAG_xxx */ | 608 | unsigned int pflags; /* ATA_PFLAG_xxx */ |
@@ -664,6 +664,13 @@ struct ata_port { | |||
664 | u8 sector_buf[ATA_SECT_SIZE]; /* owned by EH */ | 664 | u8 sector_buf[ATA_SECT_SIZE]; /* owned by EH */ |
665 | }; | 665 | }; |
666 | 666 | ||
667 | /* The following initializer overrides a method to NULL whether one of | ||
668 | * its parent has the method defined or not. This is equivalent to | ||
669 | * ERR_PTR(-ENOENT). Unfortunately, ERR_PTR doesn't render a constant | ||
670 | * expression and thus can't be used as an initializer. | ||
671 | */ | ||
672 | #define ATA_OP_NULL (void *)(unsigned long)(-ENOENT) | ||
673 | |||
667 | struct ata_port_operations { | 674 | struct ata_port_operations { |
668 | /* | 675 | /* |
669 | * Command execution | 676 | * Command execution |
@@ -733,6 +740,12 @@ struct ata_port_operations { | |||
733 | void (*phy_reset)(struct ata_port *ap); | 740 | void (*phy_reset)(struct ata_port *ap); |
734 | void (*eng_timeout)(struct ata_port *ap); | 741 | void (*eng_timeout)(struct ata_port *ap); |
735 | irq_handler_t irq_handler; | 742 | irq_handler_t irq_handler; |
743 | |||
744 | /* | ||
745 | * ->inherits must be the last field and all the preceding | ||
746 | * fields must be pointers. | ||
747 | */ | ||
748 | const struct ata_port_operations *inherits; | ||
736 | }; | 749 | }; |
737 | 750 | ||
738 | struct ata_port_info { | 751 | struct ata_port_info { |
@@ -742,7 +755,7 @@ struct ata_port_info { | |||
742 | unsigned long pio_mask; | 755 | unsigned long pio_mask; |
743 | unsigned long mwdma_mask; | 756 | unsigned long mwdma_mask; |
744 | unsigned long udma_mask; | 757 | unsigned long udma_mask; |
745 | const struct ata_port_operations *port_ops; | 758 | struct ata_port_operations *port_ops; |
746 | irq_handler_t irq_handler; | 759 | irq_handler_t irq_handler; |
747 | void *private_data; | 760 | void *private_data; |
748 | }; | 761 | }; |
@@ -765,7 +778,7 @@ extern const unsigned long sata_deb_timing_normal[]; | |||
765 | extern const unsigned long sata_deb_timing_hotplug[]; | 778 | extern const unsigned long sata_deb_timing_hotplug[]; |
766 | extern const unsigned long sata_deb_timing_long[]; | 779 | extern const unsigned long sata_deb_timing_long[]; |
767 | 780 | ||
768 | extern const struct ata_port_operations ata_dummy_port_ops; | 781 | extern struct ata_port_operations ata_dummy_port_ops; |
769 | extern const struct ata_port_info ata_dummy_port_info; | 782 | extern const struct ata_port_info ata_dummy_port_info; |
770 | 783 | ||
771 | static inline const unsigned long * | 784 | static inline const unsigned long * |
@@ -812,7 +825,7 @@ extern int ata_host_activate(struct ata_host *host, int irq, | |||
812 | struct scsi_host_template *sht); | 825 | struct scsi_host_template *sht); |
813 | extern void ata_host_detach(struct ata_host *host); | 826 | extern void ata_host_detach(struct ata_host *host); |
814 | extern void ata_host_init(struct ata_host *, struct device *, | 827 | extern void ata_host_init(struct ata_host *, struct device *, |
815 | unsigned long, const struct ata_port_operations *); | 828 | unsigned long, struct ata_port_operations *); |
816 | extern int ata_scsi_detect(struct scsi_host_template *sht); | 829 | extern int ata_scsi_detect(struct scsi_host_template *sht); |
817 | extern int ata_scsi_ioctl(struct scsi_device *dev, int cmd, void __user *arg); | 830 | extern int ata_scsi_ioctl(struct scsi_device *dev, int cmd, void __user *arg); |
818 | extern int ata_scsi_queuecmd(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *)); | 831 | extern int ata_scsi_queuecmd(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *)); |