diff options
author | Tejun Heo <htejun@gmail.com> | 2007-08-06 05:36:23 -0400 |
---|---|---|
committer | Jeff Garzik <jeff@garzik.org> | 2007-10-12 14:55:31 -0400 |
commit | 8989805d6d176aa32c0e9a68a536aa4c8ef5231c (patch) | |
tree | 9111bf6a881ab6c90aac9953b678ab62bb6c2d3b /include | |
parent | dbd826168d6267a26cf20cd233f6730f8d8047d6 (diff) |
libata-link: add PMP links
Add link->pmp, ap->nr_pmp_links, ap->pmp_link[], and implement/update
link helpers.
printk helpers are updated such that port and link are identifed as
'ataP:' if no PMP is attached, while device is identified as
'ataP.DD:'. If PMP is attached, they become 'ataP:', 'ataP.LL:' and
'ataP.LL' - ie. link and device are identified their PMP number.
If PPM is attached (ap->nr_pmp_links != 0), ata_for_each_link()
iterates over PMP links, while __ata_for_each_link() iterates over the
host link + PMP links. If PMP is not attached (ap->nr_pmp_links ==
0), both iterate over only the host link.
Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
Diffstat (limited to 'include')
-rw-r--r-- | include/linux/libata.h | 53 |
1 files changed, 47 insertions, 6 deletions
diff --git a/include/linux/libata.h b/include/linux/libata.h index bfa155789993..7a1793bd2371 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h | |||
@@ -515,6 +515,7 @@ struct ata_acpi_gtm { | |||
515 | 515 | ||
516 | struct ata_link { | 516 | struct ata_link { |
517 | struct ata_port *ap; | 517 | struct ata_port *ap; |
518 | int pmp; /* port multiplier port # */ | ||
518 | 519 | ||
519 | unsigned int active_tag; /* active tag on this link */ | 520 | unsigned int active_tag; /* active tag on this link */ |
520 | u32 sactive; /* active NCQ commands */ | 521 | u32 sactive; /* active NCQ commands */ |
@@ -563,6 +564,9 @@ struct ata_port { | |||
563 | 564 | ||
564 | struct ata_link link; /* host default link */ | 565 | struct ata_link link; /* host default link */ |
565 | 566 | ||
567 | int nr_pmp_links; /* nr of available PMP links */ | ||
568 | struct ata_link *pmp_link; /* array of PMP links */ | ||
569 | |||
566 | struct ata_port_stats stats; | 570 | struct ata_port_stats stats; |
567 | struct ata_host *host; | 571 | struct ata_host *host; |
568 | struct device *dev; | 572 | struct device *dev; |
@@ -926,11 +930,17 @@ extern void ata_do_eh(struct ata_port *ap, ata_prereset_fn_t prereset, | |||
926 | #define ata_port_printk(ap, lv, fmt, args...) \ | 930 | #define ata_port_printk(ap, lv, fmt, args...) \ |
927 | printk(lv"ata%u: "fmt, (ap)->print_id , ##args) | 931 | printk(lv"ata%u: "fmt, (ap)->print_id , ##args) |
928 | 932 | ||
929 | #define ata_link_printk(link, lv, fmt, args...) \ | 933 | #define ata_link_printk(link, lv, fmt, args...) do { \ |
930 | printk(lv"ata%u: "fmt, (link)->ap->print_id , ##args) | 934 | if ((link)->ap->nr_pmp_links) \ |
935 | printk(lv"ata%u.%02u: "fmt, (link)->ap->print_id, \ | ||
936 | (link)->pmp , ##args); \ | ||
937 | else \ | ||
938 | printk(lv"ata%u: "fmt, (link)->ap->print_id , ##args); \ | ||
939 | } while(0) | ||
931 | 940 | ||
932 | #define ata_dev_printk(dev, lv, fmt, args...) \ | 941 | #define ata_dev_printk(dev, lv, fmt, args...) \ |
933 | printk(lv"ata%u.%02u: "fmt, (dev)->link->ap->print_id, (dev)->devno , ##args) | 942 | printk(lv"ata%u.%02u: "fmt, (dev)->link->ap->print_id, \ |
943 | (dev)->link->pmp + (dev)->devno , ##args) | ||
934 | 944 | ||
935 | /* | 945 | /* |
936 | * ata_eh_info helpers | 946 | * ata_eh_info helpers |
@@ -1039,15 +1049,46 @@ static inline unsigned int ata_dev_absent(const struct ata_device *dev) | |||
1039 | /* | 1049 | /* |
1040 | * link helpers | 1050 | * link helpers |
1041 | */ | 1051 | */ |
1052 | static inline int ata_is_host_link(const struct ata_link *link) | ||
1053 | { | ||
1054 | return link == &link->ap->link; | ||
1055 | } | ||
1056 | |||
1042 | static inline int ata_link_max_devices(const struct ata_link *link) | 1057 | static inline int ata_link_max_devices(const struct ata_link *link) |
1043 | { | 1058 | { |
1044 | if (link->ap->flags & ATA_FLAG_SLAVE_POSS) | 1059 | if (ata_is_host_link(link) && link->ap->flags & ATA_FLAG_SLAVE_POSS) |
1045 | return 2; | 1060 | return 2; |
1046 | return 1; | 1061 | return 1; |
1047 | } | 1062 | } |
1048 | 1063 | ||
1049 | #define ata_port_for_each_link(lk, ap) \ | 1064 | static inline struct ata_link *ata_port_first_link(struct ata_port *ap) |
1050 | for ((lk) = &(ap)->link; (lk); (lk) = NULL) | 1065 | { |
1066 | if (ap->nr_pmp_links) | ||
1067 | return ap->pmp_link; | ||
1068 | return &ap->link; | ||
1069 | } | ||
1070 | |||
1071 | static inline struct ata_link *ata_port_next_link(struct ata_link *link) | ||
1072 | { | ||
1073 | struct ata_port *ap = link->ap; | ||
1074 | |||
1075 | if (link == &ap->link) { | ||
1076 | if (!ap->nr_pmp_links) | ||
1077 | return NULL; | ||
1078 | return ap->pmp_link; | ||
1079 | } | ||
1080 | |||
1081 | if (++link - ap->pmp_link < ap->nr_pmp_links) | ||
1082 | return link; | ||
1083 | return NULL; | ||
1084 | } | ||
1085 | |||
1086 | #define __ata_port_for_each_link(lk, ap) \ | ||
1087 | for ((lk) = &(ap)->link; (lk); (lk) = ata_port_next_link(lk)) | ||
1088 | |||
1089 | #define ata_port_for_each_link(link, ap) \ | ||
1090 | for ((link) = ata_port_first_link(ap); (link); \ | ||
1091 | (link) = ata_port_next_link(link)) | ||
1051 | 1092 | ||
1052 | #define ata_link_for_each_dev(dev, link) \ | 1093 | #define ata_link_for_each_dev(dev, link) \ |
1053 | for ((dev) = (link)->device; \ | 1094 | for ((dev) = (link)->device; \ |