|
@@ -163,6 +163,35 @@ MODULE_LICENSE("GPL");
|
|
MODULE_VERSION(DRV_VERSION);
|
|
MODULE_VERSION(DRV_VERSION);
|
|
|
|
|
|
|
|
|
|
|
|
+/*
|
|
|
|
+ * Iterator helpers. Don't use directly.
|
|
|
|
+ *
|
|
|
|
+ * LOCKING:
|
|
|
|
+ * Host lock or EH context.
|
|
|
|
+ */
|
|
|
|
+struct ata_link *__ata_port_next_link(struct ata_port *ap,
|
|
|
|
+ struct ata_link *link, bool dev_only)
|
|
|
|
+{
|
|
|
|
+ /* NULL link indicates start of iteration */
|
|
|
|
+ if (!link) {
|
|
|
|
+ if (dev_only && sata_pmp_attached(ap))
|
|
|
|
+ return ap->pmp_link;
|
|
|
|
+ return &ap->link;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /* we just iterated over the host link, what's next? */
|
|
|
|
+ if (ata_is_host_link(link)) {
|
|
|
|
+ if (!sata_pmp_attached(ap))
|
|
|
|
+ return NULL;
|
|
|
|
+ return ap->pmp_link;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /* iterate to the next PMP link */
|
|
|
|
+ if (++link < ap->pmp_link + ap->nr_pmp_links)
|
|
|
|
+ return link;
|
|
|
|
+ return NULL;
|
|
|
|
+}
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* ata_force_cbl - force cable type according to libata.force
|
|
* ata_force_cbl - force cable type according to libata.force
|
|
* @ap: ATA port of interest
|
|
* @ap: ATA port of interest
|
|
@@ -6255,6 +6284,7 @@ EXPORT_SYMBOL_GPL(ata_base_port_ops);
|
|
EXPORT_SYMBOL_GPL(sata_port_ops);
|
|
EXPORT_SYMBOL_GPL(sata_port_ops);
|
|
EXPORT_SYMBOL_GPL(ata_dummy_port_ops);
|
|
EXPORT_SYMBOL_GPL(ata_dummy_port_ops);
|
|
EXPORT_SYMBOL_GPL(ata_dummy_port_info);
|
|
EXPORT_SYMBOL_GPL(ata_dummy_port_info);
|
|
|
|
+EXPORT_SYMBOL_GPL(__ata_port_next_link);
|
|
EXPORT_SYMBOL_GPL(ata_std_bios_param);
|
|
EXPORT_SYMBOL_GPL(ata_std_bios_param);
|
|
EXPORT_SYMBOL_GPL(ata_host_init);
|
|
EXPORT_SYMBOL_GPL(ata_host_init);
|
|
EXPORT_SYMBOL_GPL(ata_host_alloc);
|
|
EXPORT_SYMBOL_GPL(ata_host_alloc);
|