Message ID | 1461581156-92581-13-git-send-email-hare@suse.de |
---|---|
State | Not Applicable |
Delegated to: | David Miller |
Headers | show |
DQpIYW5uZXMsDQoNCj5BZGQgTkNRIGVuY2Fwc3VsYXRpb24gZm9yIFpBQyBNQU5BR0VNRU5UIE9V VCBhbmQgZXZhbHVhdGUNCj5OQ1EgTm9uLURhdGEgbG9nIHBhZ2VzIHRvIGZpZ3VyZSBvdXQgaWYg TkNRIGVuY2Fwc3VsYXRpb24NCj5pcyBzdXBwb3J0ZWQuDQouLi4NCj5kaWZmIC0tZ2l0IGEvZHJp dmVycy9hdGEvbGliYXRhLXNjc2kuYyBiL2RyaXZlcnMvYXRhL2xpYmF0YS1zY3NpLmMNCj5pbmRl eCA2YWZkMDg0Li40MzQwM2FhIDEwMDY0NA0KPi0tLSBhL2RyaXZlcnMvYXRhL2xpYmF0YS1zY3Np LmMNCj4rKysgYi9kcml2ZXJzL2F0YS9saWJhdGEtc2NzaS5jDQo+QEAgLTM1MDYsMTEgKzM1MDYs MTkgQEAgc3RhdGljIHVuc2lnbmVkIGludCBhdGFfc2NzaV96YmNfb3V0X3hsYXQoc3RydWN0IGF0 YV9xdWV1ZWRfY21kICpxYykNCj4gDQo+IAlyZXNldF9hbGwgPSBjZGJbMTRdICYgMHgxOw0KPiAN Cj4tCXRmLT5wcm90b2NvbCA9IEFUQV9QUk9UX05PREFUQTsNCj4tCXRmLT5jb21tYW5kID0gQVRB X0NNRF9aQUNfTUdNVF9PVVQ7DQo+LQl0Zi0+ZmVhdHVyZSA9IHNhOw0KPi0JdGYtPmhvYl9mZWF0 dXJlID0gcmVzZXRfYWxsICYgMHgxOw0KPi0NCj4rCWlmIChhdGFfbmNxX2VuYWJsZWQocWMtPmRl dikgJiYNCj4rCSAgICBhdGFfZnBkbWFfemFjX21nbXRfb3V0X3N1cHBvcnRlZChxYy0+ZGV2KSkg ew0KPisJCXRmLT5wcm90b2NvbCA9IEFUQV9QUk9UX05DUTsNCj4rCQl0Zi0+Y29tbWFuZCA9IEFU QV9DTURfTkNRX05PTl9EQVRBOw0KPisJCXRmLT5ob2JfbnNlY3QgPSBBVEFfU1VCQ01EX05DUV9O T05fREFUQV9aQUNfTUdNVF9PVVQ7DQo+KwkJdGYtPm5zZWN0ID0gcWMtPnRhZyA8PCAzOw0KPisJ CXRmLT5hdXhpbGlhcnkgPSBzYSB8IChyZXNldF9hbGwgJiAweDEpIDw8IDg7DQo+Kwl9IGVsc2Ug ew0KPisJCXRmLT5wcm90b2NvbCA9IEFUQV9QUk9UX05PREFUQTsNCj4rCQl0Zi0+Y29tbWFuZCA9 IEFUQV9DTURfWkFDX01HTVRfT1VUOw0KPisJCXRmLT5mZWF0dXJlID0gc2E7DQo+KwkJdGYtPmhv Yl9mZWF0dXJlID0gcmVzZXRfYWxsICYgMHgxOw0KPisJfQ0KDQpDYWxscyB0byBhdGFfaXNfZGF0 YShwcm90KSBmb3IgQVRBX1BST1RfTkNRIHRhc2sgZmlsZXMgd2lsbCBhbHdheXMNCnJldHVybiAi dHJ1ZSIsIGV2ZW4gaWYgdGhlIGNvbW1hbmQgaXMgQVRBX0NNRF9OQ1FfTk9OX0RBVEEgKGJlY2F1 c2UNCnRoZSBETUEgcHJvdCBmbGFnIGlzIGFsd2F5cyBzZXQgYnkgYXRhX3Byb3RfZmxhZ3MgZm9y IE5DUSBwcm90b2NvbCkuDQpUaGlzIHJlc3VsdCBpbiBhbGwgdGhlIEFUQV9DTURfWkFDX01HTVRf T1VUIGNvbW1hbmRzIHRvIGZhaWwgaW4NCmF0YV9xY19pc3N1ZSBiZWNhdXNlIG9mIHRoZSBjaGVj azogDQoNCiAgICAgICAgaWYgKFdBUk5fT05fT05DRShhdGFfaXNfZGF0YShwcm90KSAmJg0KICAg ICAgICAgICAgICAgICAgICAgICAgICghcWMtPnNnIHx8ICFxYy0+bl9lbGVtIHx8ICFxYy0+bmJ5 dGVzKSkpDQogICAgICAgICAgICAgICAgZ290byBzeXNfZXJyOw0KDQoNCkkgYW0gbm90IHN1cmUg dGhlIGJlc3Qgd2F5IHRvIGZpeCB0aGlzLi4uIEhhY2tpbmcgYXRhX3FjX2lzc3VlIHVzaW5nIHRo ZSBwcm90b2NvbA0KQU5EIGNvbW1hbmQgY29kZSB0byBkZWZpbmUgYSBib29sICJpc19kYXRhIiBw cmV2ZW50cyB0aGUgZXJyb3IgYnV0IGF0YV9pc19kYXRhIGlzDQphbHNvIHVzZWQgaW4gZGlmZmVy ZW50IGRyaXZlcnMgc28gYSBtb3JlIHNvbGlkIGZpeCBzZWVtIG5lY2Vzc2FyeS4NCg0KQWRkaW5n IGEgbmV3IEFUQV9QUk9UX05DUV9OT0RBVEEgZm9yIEFUQV9DTURfTkNRX05PTl9EQVRBIHdvdWxk IGJlIGJldHRlciwgYnV0IHRoaXMNCmRvZXMgbm90IHJlYWxseSBjb3JyZXNwb25kIHRvIGFueXRo aW5nIGluIHRoZSBzdGFuZGFyZHMuIEFuZCB3aXRoIHRoaXMsIHRoZSBlcnJvcg0KbW92ZXMgdG8g dGhlIGNvbW1hbmQgc2cgZG1hIHNldHVwIGNvbXBsYWluaW5nIHRoYXQgdGhlIERNQSBkaXJlY3Rp b24gaXMgbm90IGtub3duLg0KQW55IGlkZWFzID8NCg0KDQpBbHNvLCB0aGUgIiYgMHgxIiBpbiAi dGYtPmF1eGlsaWFyeSA9IHNhIHwgKHJlc2V0X2FsbCAmIDB4MSkgPDwgODsiIGlzIG5vdCBuZWNl c3NhcnkNCnNpbmNlIHJlc2V0X2FsbCBpcyBpbml0aWFsaXplZCBhbHJlYWR5IGFzICJyZXNldF9h bGwgPSBjZGJbMTRdICYgMHgxOyINCg0KQmVzdCByZWdhcmRzLg0KDQotLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0NCkRhbWllbiBMZSBNb2FsLCBQaC5ELg0KU3IuIE1hbmFnZXIsIFN5c3RlbSBTb2Z0 d2FyZSBHcm91cCwgSEdTVCBSZXNlYXJjaCwNCkhHU1QsIGEgV2VzdGVybiBEaWdpdGFsIGNvbXBh bnkNCkRhbWllbi5MZU1vYWxAaGdzdC5jb20NCigrODEpIDA0NjYtOTgtMzU5MyAoZXh0LiA1MTM1 OTMpDQoxIGtpcmloYXJhLWNobywgRnVqaXNhd2EsIA0KS2FuYWdhd2EsIDI1Mi0wODg4IEphcGFu DQp3d3cuaGdzdC5jb20NCldlc3Rlcm4gRGlnaXRhbCBDb3Jwb3JhdGlvbiAoYW5kIGl0cyBzdWJz aWRpYXJpZXMpIEUtbWFpbCBDb25maWRlbnRpYWxpdHkgTm90aWNlICYgRGlzY2xhaW1lcjoKClRo aXMgZS1tYWlsIGFuZCBhbnkgZmlsZXMgdHJhbnNtaXR0ZWQgd2l0aCBpdCBtYXkgY29udGFpbiBj b25maWRlbnRpYWwgb3IgbGVnYWxseSBwcml2aWxlZ2VkIGluZm9ybWF0aW9uIG9mIFdEQyBhbmQv b3IgaXRzIGFmZmlsaWF0ZXMsIGFuZCBhcmUgaW50ZW5kZWQgc29sZWx5IGZvciB0aGUgdXNlIG9m IHRoZSBpbmRpdmlkdWFsIG9yIGVudGl0eSB0byB3aGljaCB0aGV5IGFyZSBhZGRyZXNzZWQuIElm IHlvdSBhcmUgbm90IHRoZSBpbnRlbmRlZCByZWNpcGllbnQsIGFueSBkaXNjbG9zdXJlLCBjb3B5 aW5nLCBkaXN0cmlidXRpb24gb3IgYW55IGFjdGlvbiB0YWtlbiBvciBvbWl0dGVkIHRvIGJlIHRh a2VuIGluIHJlbGlhbmNlIG9uIGl0LCBpcyBwcm9oaWJpdGVkLiBJZiB5b3UgaGF2ZSByZWNlaXZl ZCB0aGlzIGUtbWFpbCBpbiBlcnJvciwgcGxlYXNlIG5vdGlmeSB0aGUgc2VuZGVyIGltbWVkaWF0 ZWx5IGFuZCBkZWxldGUgdGhlIGUtbWFpbCBpbiBpdHMgZW50aXJldHkgZnJvbSB5b3VyIHN5c3Rl bS4K -- To unsubscribe from this list: send the line "unsubscribe linux-ide" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On 05/13/2016 10:32 AM, Damien Le Moal wrote: > > Hannes, > >> Add NCQ encapsulation for ZAC MANAGEMENT OUT and evaluate >> NCQ Non-Data log pages to figure out if NCQ encapsulation >> is supported. > ... >> diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c >> index 6afd084..43403aa 100644 >> --- a/drivers/ata/libata-scsi.c >> +++ b/drivers/ata/libata-scsi.c >> @@ -3506,11 +3506,19 @@ static unsigned int ata_scsi_zbc_out_xlat(struct ata_queued_cmd *qc) >> >> reset_all = cdb[14] & 0x1; >> >> - tf->protocol = ATA_PROT_NODATA; >> - tf->command = ATA_CMD_ZAC_MGMT_OUT; >> - tf->feature = sa; >> - tf->hob_feature = reset_all & 0x1; >> - >> + if (ata_ncq_enabled(qc->dev) && >> + ata_fpdma_zac_mgmt_out_supported(qc->dev)) { >> + tf->protocol = ATA_PROT_NCQ; >> + tf->command = ATA_CMD_NCQ_NON_DATA; >> + tf->hob_nsect = ATA_SUBCMD_NCQ_NON_DATA_ZAC_MGMT_OUT; >> + tf->nsect = qc->tag << 3; >> + tf->auxiliary = sa | (reset_all & 0x1) << 8; >> + } else { >> + tf->protocol = ATA_PROT_NODATA; >> + tf->command = ATA_CMD_ZAC_MGMT_OUT; >> + tf->feature = sa; >> + tf->hob_feature = reset_all & 0x1; >> + } > > Calls to ata_is_data(prot) for ATA_PROT_NCQ task files will always > return "true", even if the command is ATA_CMD_NCQ_NON_DATA (because > the DMA prot flag is always set by ata_prot_flags for NCQ protocol). > This result in all the ATA_CMD_ZAC_MGMT_OUT commands to fail in > ata_qc_issue because of the check: > > if (WARN_ON_ONCE(ata_is_data(prot) && > (!qc->sg || !qc->n_elem || !qc->nbytes))) > goto sys_err; > > > I am not sure the best way to fix this... Hacking ata_qc_issue using the protocol > AND command code to define a bool "is_data" prevents the error but ata_is_data is > also used in different drivers so a more solid fix seem necessary. > > Adding a new ATA_PROT_NCQ_NODATA for ATA_CMD_NCQ_NON_DATA would be better, but this > does not really correspond to anything in the standards. And with this, the error > moves to the command sg dma setup complaining that the DMA direction is not known. > Any ideas ? > Hmm. Isn't there simply an 'ATA_TFLAG_WRITE' missing in tf->flags later on? > > Also, the "& 0x1" in "tf->auxiliary = sa | (reset_all & 0x1) << 8;" is not necessary > since reset_all is initialized already as "reset_all = cdb[14] & 0x1;" > Yeah. We can fix it up. Cheers, Hannes -- To unsubscribe from this list: send the line "unsubscribe linux-ide" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index b2bd7c4..1528c7c 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) } } +static void ata_dev_config_ncq_non_data(struct ata_device *dev) +{ + struct ata_port *ap = dev->link->ap; + unsigned int err_mask; + int log_index = ATA_LOG_NCQ_NON_DATA * 2; + u16 log_pages; + + err_mask = ata_read_log_page(dev, ATA_LOG_DIRECTORY, + 0, ap->sector_buf, 1); + if (err_mask) { + ata_dev_dbg(dev, + "failed to get Log Directory Emask 0x%x\n", + err_mask); + return; + } + log_pages = get_unaligned_le16(&ap->sector_buf[log_index]); + if (!log_pages) { + ata_dev_warn(dev, + "NCQ Send/Recv Log not supported\n"); + return; + } + err_mask = ata_read_log_page(dev, ATA_LOG_NCQ_NON_DATA, + 0, ap->sector_buf, 1); + if (err_mask) { + ata_dev_dbg(dev, + "failed to get NCQ Non-Data Log Emask 0x%x\n", + err_mask); + } else { + u8 *cmds = dev->ncq_non_data_cmds; + + memcpy(cmds, ap->sector_buf, ATA_LOG_NCQ_NON_DATA_SIZE); + } +} + static int ata_dev_config_ncq(struct ata_device *dev, char *desc, size_t desc_sz) { @@ -2165,9 +2199,12 @@ static int ata_dev_config_ncq(struct ata_device *dev, snprintf(desc, desc_sz, "NCQ (depth %d/%d)%s", hdepth, ddepth, aa_desc); - if ((ap->flags & ATA_FLAG_FPDMA_AUX) && - ata_id_has_ncq_send_and_recv(dev->id)) - ata_dev_config_ncq_send_recv(dev); + if ((ap->flags & ATA_FLAG_FPDMA_AUX)) { + if (ata_id_has_ncq_send_and_recv(dev->id)) + ata_dev_config_ncq_send_recv(dev); + if (ata_id_has_ncq_non_data(dev->id)) + ata_dev_config_ncq_non_data(dev); + } return 0; } diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c index 6afd084..43403aa 100644 --- a/drivers/ata/libata-scsi.c +++ b/drivers/ata/libata-scsi.c @@ -3506,11 +3506,19 @@ static unsigned int ata_scsi_zbc_out_xlat(struct ata_queued_cmd *qc) reset_all = cdb[14] & 0x1; - tf->protocol = ATA_PROT_NODATA; - tf->command = ATA_CMD_ZAC_MGMT_OUT; - tf->feature = sa; - tf->hob_feature = reset_all & 0x1; - + if (ata_ncq_enabled(qc->dev) && + ata_fpdma_zac_mgmt_out_supported(qc->dev)) { + tf->protocol = ATA_PROT_NCQ; + tf->command = ATA_CMD_NCQ_NON_DATA; + tf->hob_nsect = ATA_SUBCMD_NCQ_NON_DATA_ZAC_MGMT_OUT; + tf->nsect = qc->tag << 3; + tf->auxiliary = sa | (reset_all & 0x1) << 8; + } else { + tf->protocol = ATA_PROT_NODATA; + tf->command = ATA_CMD_ZAC_MGMT_OUT; + tf->feature = sa; + tf->hob_feature = reset_all & 0x1; + } tf->lbah = (block >> 16) & 0xff; tf->lbam = (block >> 8) & 0xff; tf->lbal = block & 0xff; diff --git a/drivers/ata/libata-trace.c b/drivers/ata/libata-trace.c index 1111ba7..f8c550d 100644 --- a/drivers/ata/libata-trace.c +++ b/drivers/ata/libata-trace.c @@ -188,6 +188,9 @@ libata_trace_parse_subcmd(struct trace_seq *p, unsigned char cmd, case ATA_SUBCMD_NCQ_NON_DATA_ZERO_EXT: trace_seq_printf(p, " ZERO_EXT"); break; + case ATA_SUBCMD_NCQ_NON_DATA_ZAC_MGMT_OUT: + trace_seq_printf(p, " ZAC_MGMT_OUT"); + break; } break; case ATA_CMD_ZAC_MGMT_IN: diff --git a/include/linux/ata.h b/include/linux/ata.h index 9d7c470..e627032 100644 --- a/include/linux/ata.h +++ b/include/linux/ata.h @@ -320,6 +320,7 @@ enum { ATA_SUBCMD_NCQ_NON_DATA_ABORT_QUEUE = 0x00, ATA_SUBCMD_NCQ_NON_DATA_SET_FEATURES = 0x05, ATA_SUBCMD_NCQ_NON_DATA_ZERO_EXT = 0x06, + ATA_SUBCMD_NCQ_NON_DATA_ZAC_MGMT_OUT = 0x07, /* Subcmds for ATA_CMD_ZAC_MGMT_IN */ ATA_SUBCMD_ZAC_MGMT_IN_REPORT_ZONES = 0x00, @@ -333,6 +334,7 @@ enum { /* READ_LOG_EXT pages */ ATA_LOG_DIRECTORY = 0x0, ATA_LOG_SATA_NCQ = 0x10, + ATA_LOG_NCQ_NON_DATA = 0x12, ATA_LOG_NCQ_SEND_RECV = 0x13, ATA_LOG_SATA_ID_DEV_DATA = 0x30, ATA_LOG_SATA_SETTINGS = 0x08, @@ -877,6 +879,11 @@ static inline bool ata_id_has_ncq_send_and_recv(const u16 *id) return id[ATA_ID_SATA_CAPABILITY_2] & BIT(6); } +static inline bool ata_id_has_ncq_non_data(const u16 *id) +{ + return id[ATA_ID_SATA_CAPABILITY_2] & BIT(5); +} + static inline bool ata_id_has_trim(const u16 *id) { if (ata_id_major_version(id) >= 7 && diff --git a/include/linux/libata.h b/include/linux/libata.h index c0806b6..0019d4b 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h @@ -729,6 +729,7 @@ struct ata_device { /* NCQ send and receive log subcommand support */ u8 ncq_send_recv_cmds[ATA_LOG_NCQ_SEND_RECV_SIZE]; + u8 ncq_non_data_cmds[ATA_LOG_NCQ_NON_DATA_SIZE]; /* error history */ int spdn_cnt; @@ -1658,6 +1659,12 @@ static inline bool ata_fpdma_zac_mgmt_in_supported(struct ata_device *dev) ATA_LOG_NCQ_SEND_RECV_ZAC_MGMT_IN_SUPPORTED); } +static inline bool ata_fpdma_zac_mgmt_out_supported(struct ata_device *dev) +{ + return (dev->ncq_non_data_cmds[ATA_LOG_NCQ_NON_DATA_ZAC_MGMT_OFFSET] & + ATA_LOG_NCQ_NON_DATA_ZAC_MGMT_OUT); +} + static inline void ata_qc_set_polling(struct ata_queued_cmd *qc) { qc->tf.ctl |= ATA_NIEN;
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> --- drivers/ata/libata-core.c | 43 ++++++++++++++++++++++++++++++++++++++++--- drivers/ata/libata-scsi.c | 18 +++++++++++++----- drivers/ata/libata-trace.c | 3 +++ include/linux/ata.h | 7 +++++++ include/linux/libata.h | 7 +++++++ 5 files changed, 70 insertions(+), 8 deletions(-)