diff options
author | Hannes Reinecke <hare@suse.de> | 2016-04-25 06:45:54 -0400 |
---|---|---|
committer | Tejun Heo <tj@kernel.org> | 2016-05-09 12:36:46 -0400 |
commit | 284b3b77ea883234dadb2cbf97b145c3c30fe4bd (patch) | |
tree | 2faa832ef21a350e2d6b5e4c238f70e38e0e6502 /drivers/ata/libata-core.c | |
parent | 27708a9579ee069c6e0ebb6e61ac1114ed1d546c (diff) |
libata: NCQ encapsulation for ZAC MANAGEMENT OUT
Add NCQ encapsulation for ZAC MANAGEMENT OUT and evaluate
NCQ Non-Data log pages to figure out if NCQ encapsulation
is supported.
Signed-off-by: Hannes Reinecke <hare@suse.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
Diffstat (limited to 'drivers/ata/libata-core.c')
-rw-r--r-- | drivers/ata/libata-core.c | 43 |
1 files changed, 40 insertions, 3 deletions
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index b2bd7c499653..1528c7cc0089 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c | |||
@@ -2121,6 +2121,40 @@ static void ata_dev_config_ncq_send_recv(struct ata_device *dev) | |||
2121 | } | 2121 | } |
2122 | } | 2122 | } |
2123 | 2123 | ||
2124 | static void ata_dev_config_ncq_non_data(struct ata_device *dev) | ||
2125 | { | ||
2126 | struct ata_port *ap = dev->link->ap; | ||
2127 | unsigned int err_mask; | ||
2128 | int log_index = ATA_LOG_NCQ_NON_DATA * 2; | ||
2129 | u16 log_pages; | ||
2130 | |||
2131 | err_mask = ata_read_log_page(dev, ATA_LOG_DIRECTORY, | ||
2132 | 0, ap->sector_buf, 1); | ||
2133 | if (err_mask) { | ||
2134 | ata_dev_dbg(dev, | ||
2135 | "failed to get Log Directory Emask 0x%x\n", | ||
2136 | err_mask); | ||
2137 | return; | ||
2138 | } | ||
2139 | log_pages = get_unaligned_le16(&ap->sector_buf[log_index]); | ||
2140 | if (!log_pages) { | ||
2141 | ata_dev_warn(dev, | ||
2142 | "NCQ Send/Recv Log not supported\n"); | ||
2143 | return; | ||
2144 | } | ||
2145 | err_mask = ata_read_log_page(dev, ATA_LOG_NCQ_NON_DATA, | ||
2146 | 0, ap->sector_buf, 1); | ||
2147 | if (err_mask) { | ||
2148 | ata_dev_dbg(dev, | ||
2149 | "failed to get NCQ Non-Data Log Emask 0x%x\n", | ||
2150 | err_mask); | ||
2151 | } else { | ||
2152 | u8 *cmds = dev->ncq_non_data_cmds; | ||
2153 | |||
2154 | memcpy(cmds, ap->sector_buf, ATA_LOG_NCQ_NON_DATA_SIZE); | ||
2155 | } | ||
2156 | } | ||
2157 | |||
2124 | static int ata_dev_config_ncq(struct ata_device *dev, | 2158 | static int ata_dev_config_ncq(struct ata_device *dev, |
2125 | char *desc, size_t desc_sz) | 2159 | char *desc, size_t desc_sz) |
2126 | { | 2160 | { |
@@ -2165,9 +2199,12 @@ static int ata_dev_config_ncq(struct ata_device *dev, | |||
2165 | snprintf(desc, desc_sz, "NCQ (depth %d/%d)%s", hdepth, | 2199 | snprintf(desc, desc_sz, "NCQ (depth %d/%d)%s", hdepth, |
2166 | ddepth, aa_desc); | 2200 | ddepth, aa_desc); |
2167 | 2201 | ||
2168 | if ((ap->flags & ATA_FLAG_FPDMA_AUX) && | 2202 | if ((ap->flags & ATA_FLAG_FPDMA_AUX)) { |
2169 | ata_id_has_ncq_send_and_recv(dev->id)) | 2203 | if (ata_id_has_ncq_send_and_recv(dev->id)) |
2170 | ata_dev_config_ncq_send_recv(dev); | 2204 | ata_dev_config_ncq_send_recv(dev); |
2205 | if (ata_id_has_ncq_non_data(dev->id)) | ||
2206 | ata_dev_config_ncq_non_data(dev); | ||
2207 | } | ||
2171 | 2208 | ||
2172 | return 0; | 2209 | return 0; |
2173 | } | 2210 | } |