Merge branch 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jgarzik/libata-dev
* 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jgarzik/libata-dev: sata_sil: add Large Block Transfer support [libata] ata_piix: cleanup dmi strings checking DMI: add dmi_match libata: blacklist NCQ on OCZ CORE 2 SSD (resend) [libata] Update kernel-doc comments to match source code libata: perform port detach in EH libata: when restoring SControl during detach do the PMP links first libata: beef up iterators
This commit is contained in:
@@ -47,6 +47,7 @@ extern int dmi_name_in_vendors(const char *str);
|
||||
extern int dmi_name_in_serial(const char *str);
|
||||
extern int dmi_available;
|
||||
extern int dmi_walk(void (*decode)(const struct dmi_header *));
|
||||
extern bool dmi_match(enum dmi_field f, const char *str);
|
||||
|
||||
#else
|
||||
|
||||
@@ -61,6 +62,8 @@ static inline int dmi_name_in_serial(const char *s) { return 0; }
|
||||
#define dmi_available 0
|
||||
static inline int dmi_walk(void (*decode)(const struct dmi_header *))
|
||||
{ return -1; }
|
||||
static inline bool dmi_match(enum dmi_field f, const char *str)
|
||||
{ return false; }
|
||||
|
||||
#endif
|
||||
|
||||
|
@@ -213,10 +213,11 @@ enum {
|
||||
ATA_PFLAG_FROZEN = (1 << 2), /* port is frozen */
|
||||
ATA_PFLAG_RECOVERED = (1 << 3), /* recovery action performed */
|
||||
ATA_PFLAG_LOADING = (1 << 4), /* boot/loading probe */
|
||||
ATA_PFLAG_UNLOADING = (1 << 5), /* module is unloading */
|
||||
ATA_PFLAG_SCSI_HOTPLUG = (1 << 6), /* SCSI hotplug scheduled */
|
||||
ATA_PFLAG_INITIALIZING = (1 << 7), /* being initialized, don't touch */
|
||||
ATA_PFLAG_RESETTING = (1 << 8), /* reset in progress */
|
||||
ATA_PFLAG_UNLOADING = (1 << 9), /* driver is being unloaded */
|
||||
ATA_PFLAG_UNLOADED = (1 << 10), /* driver is unloaded */
|
||||
|
||||
ATA_PFLAG_SUSPENDED = (1 << 17), /* port is suspended (power) */
|
||||
ATA_PFLAG_PM_PENDING = (1 << 18), /* PM operation pending */
|
||||
@@ -1285,26 +1286,62 @@ static inline int ata_link_active(struct ata_link *link)
|
||||
return ata_tag_valid(link->active_tag) || link->sactive;
|
||||
}
|
||||
|
||||
extern struct ata_link *__ata_port_next_link(struct ata_port *ap,
|
||||
struct ata_link *link,
|
||||
bool dev_only);
|
||||
/*
|
||||
* Iterators
|
||||
*
|
||||
* ATA_LITER_* constants are used to select link iteration mode and
|
||||
* ATA_DITER_* device iteration mode.
|
||||
*
|
||||
* For a custom iteration directly using ata_{link|dev}_next(), if
|
||||
* @link or @dev, respectively, is NULL, the first element is
|
||||
* returned. @dev and @link can be any valid device or link and the
|
||||
* next element according to the iteration mode will be returned.
|
||||
* After the last element, NULL is returned.
|
||||
*/
|
||||
enum ata_link_iter_mode {
|
||||
ATA_LITER_EDGE, /* if present, PMP links only; otherwise,
|
||||
* host link. no slave link */
|
||||
ATA_LITER_HOST_FIRST, /* host link followed by PMP or slave links */
|
||||
ATA_LITER_PMP_FIRST, /* PMP links followed by host link,
|
||||
* slave link still comes after host link */
|
||||
};
|
||||
|
||||
#define __ata_port_for_each_link(link, ap) \
|
||||
for ((link) = __ata_port_next_link((ap), NULL, false); (link); \
|
||||
(link) = __ata_port_next_link((ap), (link), false))
|
||||
enum ata_dev_iter_mode {
|
||||
ATA_DITER_ENABLED,
|
||||
ATA_DITER_ENABLED_REVERSE,
|
||||
ATA_DITER_ALL,
|
||||
ATA_DITER_ALL_REVERSE,
|
||||
};
|
||||
|
||||
#define ata_port_for_each_link(link, ap) \
|
||||
for ((link) = __ata_port_next_link((ap), NULL, true); (link); \
|
||||
(link) = __ata_port_next_link((ap), (link), true))
|
||||
extern struct ata_link *ata_link_next(struct ata_link *link,
|
||||
struct ata_port *ap,
|
||||
enum ata_link_iter_mode mode);
|
||||
|
||||
#define ata_link_for_each_dev(dev, link) \
|
||||
for ((dev) = (link)->device; \
|
||||
(dev) < (link)->device + ata_link_max_devices(link) || ((dev) = NULL); \
|
||||
(dev)++)
|
||||
extern struct ata_device *ata_dev_next(struct ata_device *dev,
|
||||
struct ata_link *link,
|
||||
enum ata_dev_iter_mode mode);
|
||||
|
||||
#define ata_link_for_each_dev_reverse(dev, link) \
|
||||
for ((dev) = (link)->device + ata_link_max_devices(link) - 1; \
|
||||
(dev) >= (link)->device || ((dev) = NULL); (dev)--)
|
||||
/*
|
||||
* Shortcut notation for iterations
|
||||
*
|
||||
* ata_for_each_link() iterates over each link of @ap according to
|
||||
* @mode. @link points to the current link in the loop. @link is
|
||||
* NULL after loop termination. ata_for_each_dev() works the same way
|
||||
* except that it iterates over each device of @link.
|
||||
*
|
||||
* Note that the mode prefixes ATA_{L|D}ITER_ shouldn't need to be
|
||||
* specified when using the following shorthand notations. Only the
|
||||
* mode itself (EDGE, HOST_FIRST, ENABLED, etc...) should be
|
||||
* specified. This not only increases brevity but also makes it
|
||||
* impossible to use ATA_LITER_* for device iteration or vice-versa.
|
||||
*/
|
||||
#define ata_for_each_link(link, ap, mode) \
|
||||
for ((link) = ata_link_next(NULL, (ap), ATA_LITER_##mode); (link); \
|
||||
(link) = ata_link_next((link), (ap), ATA_LITER_##mode))
|
||||
|
||||
#define ata_for_each_dev(dev, link, mode) \
|
||||
for ((dev) = ata_dev_next(NULL, (link), ATA_DITER_##mode); (dev); \
|
||||
(dev) = ata_dev_next((dev), (link), ATA_DITER_##mode))
|
||||
|
||||
/**
|
||||
* ata_ncq_enabled - Test whether NCQ is enabled
|
||||
|
Reference in New Issue
Block a user