Initial ZAC support
Subsystems (5)
v2 cover Initial ZAC support
Hi all,
this patchset updates the ATA stack to correctly detect host-managed ZAC devices.
Hannes Reinecke (3):
libsas: use ata_dev_classify()
libata: Implement ATA_DEV_ZAC
libata-scsi: Update SATL for ZAC drives
drivers/ata/libata-core.c | 20 +++++++---- drivers/ata/libata-eh.c | 7 ++-- drivers/ata/libata-scsi.c | 30 +++++++++++++++-- drivers/ata/libata-transport.c | 1 + drivers/scsi/aic94xx/aic94xx_task.c | 10 +++--- drivers/scsi/isci/request.c | 4 +-- drivers/scsi/libsas/sas_ata.c | 66 +++++++------------------------------ drivers/scsi/mvsas/mv_sas.c | 4 +-- drivers/scsi/pm8001/pm8001_hwi.c | 2 +- drivers/scsi/pm8001/pm80xx_hwi.c | 2 +- include/linux/libata.h | 6 ++-- include/scsi/libsas.h | 11 ++----- 12 files changed, 76 insertions(+), 87 deletions(-)
Signature · 1 line
1.8.5.2
PATCH v2 1/3 libsas: use ata_dev_classify()
Use the ata device class from libata in libsas instead of checking the supported command set and switch to using ata_dev_classify() instead of our own method.
--- drivers/scsi/aic94xx/aic94xx_task.c | 10 +++--- drivers/scsi/isci/request.c | 4 +-- drivers/scsi/libsas/sas_ata.c | 66 +++++++------------------------------ drivers/scsi/mvsas/mv_sas.c | 4 +-- drivers/scsi/pm8001/pm8001_hwi.c | 2 +- drivers/scsi/pm8001/pm80xx_hwi.c | 2 +- include/scsi/libsas.h | 11 ++----- 7 files changed, 25 insertions(+), 74 deletions(-)
drivers/scsi/aic94xx/aic94xx_task.c +5 -5
@@ -373,10 +373,10 @@ static int asd_build_ata_ascb(struct asd_ascb *ascb, struct sas_task *task,if (unlikely (task->ata_task.device_control_reg_update)) scb->header.opcode =CONTROL_ATA_DEV ; -else if (dev->sata_dev.command_set ==ATA_COMMAND_SET ) - scb->header.opcode =INITIATE_ATA_TASK ; -else +else if (dev->sata_dev.class ==ATA_DEV_ATAPI ) scb->header.opcode =INITIATE_ATAPI_TASK ; +else + scb->header.opcode =INITIATE_ATA_TASK ; scb->ata_task.proto_conn_rate = (1 <<5 );/* STP */ if (dev->port->oob_mode ==SAS_OOB_MODE )
@@ -387,7 +387,7 @@ static int asd_build_ata_ascb(struct asd_ascb *ascb, struct sas_task *task,if (likely (!task->ata_task.device_control_reg_update)) scb->ata_task.fis.flags |=0x80 ;/* C=1: update ATA cmd reg */ scb->ata_task.fis.flags &=0xF0 ;/* PM_PORT field shall be 0 */ -if (dev->sata_dev.command_set ==ATAPI_COMMAND_SET ) +if (dev->sata_dev.class ==ATA_DEV_ATAPI )memcpy (scb->ata_task.atapi_packet, task->ata_task.atapi_packet,16 ); scb->ata_task.sister_scb =cpu_to_le16 (0xFFFF );
@@ -399,7 +399,7 @@ static int asd_build_ata_ascb(struct asd_ascb *ascb, struct sas_task *task,if (task->ata_task.dma_xfer) flags |=DATA_XFER_MODE_DMA ;if (task->ata_task.use_ncq && - dev->sata_dev.command_set !=ATAPI_COMMAND_SET ) + dev->sata_dev.class !=ATA_DEV_ATAPI ) flags |=ATA_Q_TYPE_NCQ ; flags |= data_dir_flags[task->data_dir]; scb->ata_task.ata_flags = flags;
drivers/scsi/isci/request.c +2 -2
@@ -694,7 +694,7 @@ sci_io_request_construct_sata(struct isci_request *ireq, }/* ATAPI */ -if (dev->sata_dev.command_set ==ATAPI_COMMAND_SET && +if (dev->sata_dev.class ==ATA_DEV_ATAPI && task->ata_task.fis.command ==ATA_CMD_PACKET ) {sci_atapi_construct (ireq);return SCI_SUCCESS ;
@@ -2980,7 +2980,7 @@ static void sci_request_started_state_enter(struct sci_base_state_machine *sm) state =SCI_REQ_SMP_WAIT_RESP ; }else if (task &&sas_protocol_ata (task->task_proto) && !task->ata_task.use_ncq) { -if (dev->sata_dev.command_set ==ATAPI_COMMAND_SET && +if (dev->sata_dev.class ==ATA_DEV_ATAPI && task->ata_task.fis.command ==ATA_CMD_PACKET ) { state =SCI_REQ_ATAPI_WAIT_H2D ; }else if (task->data_dir ==DMA_NONE ) {
drivers/scsi/libsas/sas_ata.c +11 -55
108 lines not on this page · raw message
drivers/scsi/mvsas/mv_sas.c +2 -2
@@ -479,7 +479,7 @@ static int mvs_task_prep_ata(struct mvs_info *mvi,if (task->ata_task.use_ncq) flags |=MCH_FPDMA ; -if (dev->sata_dev.command_set ==ATAPI_COMMAND_SET ) { +if (dev->sata_dev.class ==ATA_DEV_ATAPI ) {if (task->ata_task.fis.command !=ATA_CMD_ID_ATAPI ) flags |=MCH_ATAPI ; }
@@ -546,7 +546,7 @@ static int mvs_task_prep_ata(struct mvs_info *mvi, task->ata_task.fis.flags |=0x80 ;/* C=1: update ATA cmd reg */ /* fill in command FIS and ATAPI CDB */ memcpy (buf_cmd, &task->ata_task.fis,sizeof (struct host_to_dev_fis )); -if (dev->sata_dev.command_set ==ATAPI_COMMAND_SET ) +if (dev->sata_dev.class ==ATA_DEV_ATAPI )memcpy (buf_cmd +STP_ATAPI_CMD , task->ata_task.atapi_packet,16 );
drivers/scsi/pm8001/pm8001_hwi.c +1 -1
@@ -4367,7 +4367,7 @@ static int pm8001_chip_sata_req(struct pm8001_hba_info *pm8001_ha,PM8001_IO_DBG (pm8001_ha,pm8001_printk ("PIO\n" )); }if (task->ata_task.use_ncq && - dev->sata_dev.command_set !=ATAPI_COMMAND_SET ) { + dev->sata_dev.class !=ATA_DEV_ATAPI ) {ATAP =0x07 ;/* FPDMA */ PM8001_IO_DBG (pm8001_ha,pm8001_printk ("FPDMA\n" )); }
drivers/scsi/pm8001/pm80xx_hwi.c +1 -1
@@ -4077,7 +4077,7 @@ static int pm80xx_chip_sata_req(struct pm8001_hba_info *pm8001_ha,PM8001_IO_DBG (pm8001_ha,pm8001_printk ("PIO\n" )); }if (task->ata_task.use_ncq && - dev->sata_dev.command_set !=ATAPI_COMMAND_SET ) { + dev->sata_dev.class !=ATA_DEV_ATAPI ) {ATAP =0x07 ;/* FPDMA */ PM8001_IO_DBG (pm8001_ha,pm8001_printk ("FPDMA\n" )); }
include/scsi/libsas.h +3 -8
@@ -161,17 +161,12 @@ struct expander_device { };/* ---------- SATA device ---------- */ -enum ata_command_set { -ATA_COMMAND_SET =0 , -ATAPI_COMMAND_SET =1 , -}; -#define ATA_RESP_FIS_SIZE 24struct sata_device { -enum ata_command_set command_set; -struct smp_resp rps_resp;/* report_phy_sata_resp */ -u8 port_no;/* port number, if this is a PM (Port) */ +unsigned int class; +struct smp_resp rps_resp;/* report_phy_sata_resp */ +u8 port_no;/* port number, if this is a PM (Port) */ struct ata_port *ap;struct ata_host ata_host;
Signature · 1 line
1.8.5.2
PATCH v2 2/3 libata: Implement ATA_DEV_ZAC
In reply to Hannes ReineckeAdd new ATA device type for ZAC devices.
--- drivers/ata/libata-core.c | 20 ++++++++++++++------ drivers/ata/libata-eh.c | 7 +++++-- drivers/ata/libata-scsi.c | 5 +++-- drivers/ata/libata-transport.c | 1 + include/linux/libata.h | 6 ++++-- 5 files changed, 27 insertions(+), 12 deletions(-)
drivers/ata/libata-core.c +14 -6
@@ -1043,8 +1043,8 @@ const char *sata_spd_string(unsigned int spd)* None. * * RETURNS: -* Device type, %ATA_DEV_ATA, %ATA_DEV_ATAPI, %ATA_DEV_PMP or -* %ATA_DEV_UNKNOWN the event of failure. +* Device type, %ATA_DEV_ATA, %ATA_DEV_ATAPI, %ATA_DEV_PMP, +* %ATA_DEV_ZAC, or %ATA_DEV_UNKNOWN the event of failure. */ unsigned int ata_dev_classify (const struct ata_taskfile *tf) {
@@ -1089,6 +1089,11 @@ unsigned int ata_dev_classify(const struct ata_taskfile *tf)return ATA_DEV_SEMB ; } +if ((tf->lbam ==0xcd ) && (tf->lbah ==0xab )) { +DPRINTK ("found ZAC device by sig\n" ); +return ATA_DEV_ZAC ; + } +DPRINTK ("unknown device\n" );return ATA_DEV_UNKNOWN ; }
@@ -1329,7 +1334,7 @@ static int ata_hpa_resize(struct ata_device *dev)int rc;/* do we need to do it? */ -if (dev->class !=ATA_DEV_ATA || +if ((dev->class !=ATA_DEV_ATA && dev->class !=ATA_DEV_ZAC ) || !ata_id_has_lba (dev->id) || !ata_id_hpa_enabled (dev->id) || (dev->horkage &ATA_HORKAGE_BROKEN_HPA ))return 0 ;
@@ -1889,6 +1894,7 @@ retry:case ATA_DEV_SEMB : class =ATA_DEV_ATA ;/* some hard drives report SEMB sig */ case ATA_DEV_ATA : +case ATA_DEV_ZAC : tf.command =ATA_CMD_ID_ATA ;break ;case ATA_DEV_ATAPI :
@@ -1980,7 +1986,7 @@ retry: rc = -EINVAL ; reason ="device reports invalid type" ; -if (class ==ATA_DEV_ATA ) { +if (class ==ATA_DEV_ATA || class ==ATA_DEV_ZAC ) {if (!ata_id_is_ata (id) && !ata_id_is_cfa (id)) goto err_out; if (ap->host->flags & ATA_HOST_IGNORE_ATA &&
@@ -2015,7 +2021,8 @@ retry: goto retry; } -if ((flags &ATA_READID_POSTRESET ) && class ==ATA_DEV_ATA ) { +if ((flags &ATA_READID_POSTRESET ) && + (class ==ATA_DEV_ATA || class ==ATA_DEV_ZAC )) {/* * The exact sequence expected by certain pre-ATA4 drives is: * SRST RESET
@@ -2280,7 +2287,7 @@ int ata_dev_configure(struct ata_device *dev) sizeof(modelbuf));/* ATA-specific feature tests */ -if (dev->class ==ATA_DEV_ATA ) { +if (dev->class ==ATA_DEV_ATA || dev->class ==ATA_DEV_ZAC ) {if (ata_id_is_cfa (id)) {/* CPRM may make this media unusable */ if (id[ATA_ID_CFA_KEY_MGMT ] &1 )
@@ -4033,6 +4040,7 @@ int ata_dev_revalidate(struct ata_device *dev, unsigned int new_class,if (ata_class_enabled (new_class) && new_class !=ATA_DEV_ATA && new_class !=ATA_DEV_ATAPI && + new_class !=ATA_DEV_ZAC && new_class !=ATA_DEV_SEMB ) {ata_dev_info (dev,"class mismatch %u != %u\n" , dev->class, new_class);
drivers/ata/libata-eh.c +5 -2
@@ -1809,6 +1809,7 @@ static unsigned int ata_eh_analyze_tf(struct ata_queued_cmd *qc,switch (qc->dev->class) {case ATA_DEV_ATA : +case ATA_DEV_ZAC :if (err &ATA_ICRC ) qc->err_mask |=AC_ERR_ATA_BUS ;if (err & (ATA_UNC |ATA_AMNF ))
@@ -3792,7 +3793,8 @@ int ata_eh_recover(struct ata_port *ap, ata_prereset_fn_t prereset,struct ata_eh_context *ehc = &link->eh_context;unsigned long tmp; -if (dev->class !=ATA_DEV_ATA ) +if (dev->class !=ATA_DEV_ATA && + dev->class !=ATA_DEV_ZAC )continue ;if (!(ehc->i.dev_action[dev->devno] &ATA_EH_PARK ))
@@ -3873,7 +3875,8 @@ int ata_eh_recover(struct ata_port *ap, ata_prereset_fn_t prereset,/* retry flush if necessary */ ata_for_each_dev (dev, link,ALL ) { -if (dev->class !=ATA_DEV_ATA ) +if (dev->class !=ATA_DEV_ATA && + dev->class !=ATA_DEV_ZAC )continue ; rc =ata_eh_maybe_retry_flush (dev);if (rc)
drivers/ata/libata-scsi.c +3 -2
@@ -235,7 +235,8 @@ static ssize_t ata_scsi_park_store(struct device *device, rc = -ENODEV ; goto unlock; } -if (dev->class !=ATA_DEV_ATA ) { +if (dev->class !=ATA_DEV_ATA && + dev->class !=ATA_DEV_ZAC ) { rc = -EOPNOTSUPP ; goto unlock; }
@@ -3412,7 +3413,7 @@ static inline int __ata_scsi_queuecmd(struct scsi_cmnd *scmd,ata_xlat_func_t xlat_func;int rc =0 ; -if (dev->class ==ATA_DEV_ATA ) { +if (dev->class ==ATA_DEV_ATA || dev->class ==ATA_DEV_ZAC ) {if (unlikely (!scmd->cmd_len || scmd->cmd_len > dev->cdb_len)) goto bad_cdb_len;
drivers/ata/libata-transport.c +1 -0
@@ -143,6 +143,7 @@ static struct { { ATA_DEV_PMP_UNSUP, "pmp" }, { ATA_DEV_SEMB, "semb" }, { ATA_DEV_SEMB_UNSUP, "semb" }, + { ATA_DEV_ZAC, "zac" }, { ATA_DEV_NONE, "none" } };ata_bitfield_name_search (class, ata_class_names)
include/linux/libata.h +4 -2
@@ -191,7 +191,8 @@ enum {ATA_DEV_PMP_UNSUP =6 ,/* SATA port multiplier (unsupported) */ ATA_DEV_SEMB =7 ,/* SEMB */ ATA_DEV_SEMB_UNSUP =8 ,/* SEMB (unsupported) */ -ATA_DEV_NONE =9 ,/* no device */ +ATA_DEV_ZAC =9 ,/* ZAC device */ +ATA_DEV_NONE =10 ,/* no device */ /* struct ata_link flags */ ATA_LFLAG_NO_HRST = (1 << 1), /* avoid hardreset */
@@ -1491,7 +1492,8 @@ static inline unsigned int ata_tag_internal(unsigned int tag)static inline unsigned int ata_class_enabled (unsigned int class) {return class ==ATA_DEV_ATA || class ==ATA_DEV_ATAPI || - class ==ATA_DEV_PMP || class ==ATA_DEV_SEMB ; + class ==ATA_DEV_PMP || class ==ATA_DEV_SEMB || + class ==ATA_DEV_ZAC ; }static inline unsigned int ata_class_disabled (unsigned int class)
Signature · 1 line
1.8.5.2
PATCH v2 3/3 libata-scsi: Update SATL for ZAC drives
In reply to Hannes ReineckeZAC (zoned-access command) drives translate into ZBC (Zoned block command) device type for SCSI. So implement the correct mappings into libata-scsi and update the SCSI command set versions.
--- drivers/ata/libata-scsi.c | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-)
drivers/ata/libata-scsi.c +24 -1
@@ -1969,6 +1969,7 @@ static void ata_scsi_rbuf_fill(struct ata_scsi_args *args,static unsigned int ata_scsiop_inq_std (struct ata_scsi_args *args,u8 *rbuf) {const u8 versions[] = { +0x00 ,0x60 ,/* SAM-3 (no version claimed) */ 0x03 ,
@@ -1977,6 +1978,20 @@ static unsigned int ata_scsiop_inq_std(struct ata_scsi_args *args, u8 *rbuf)0x02 ,0x60 /* SPC-3 (no version claimed) */ }; +const u8 versions_zbc[] = { +0x00 , +0xA0 ,/* SAM-5 (no version claimed) */ + +0x04 , +0xC0 ,/* SBC-3 (no version claimed) */ + +0x04 , +0x60 ,/* SPC-4 (no version claimed) */ + +0x60 , +0x20 ,/* ZBC (no version claimed) */ + }; +u8 hdr[] = {TYPE_DISK , 0,
@@ -1991,6 +2006,11 @@ static unsigned int ata_scsiop_inq_std(struct ata_scsi_args *args, u8 *rbuf)if (ata_id_removeable (args->id)) hdr[1 ] |= (1 <<7 ); +if (args->dev->class ==ATA_DEV_ZAC ) { + hdr[0 ] =TYPE_ZBC ; + hdr[2 ] =0x6 ;/* ZBC is defined in SPC-4 */ + } +memcpy (rbuf, hdr,sizeof (hdr));memcpy (&rbuf[8 ],"ATA " ,8 );ata_id_string (args->id, &rbuf[16 ],ATA_ID_PROD ,16 );
@@ -2003,7 +2023,10 @@ static unsigned int ata_scsiop_inq_std(struct ata_scsi_args *args, u8 *rbuf)if (rbuf[32 ] ==0 || rbuf[32 ] ==' ' )memcpy (&rbuf[32 ],"n/a " ,4 ); -memcpy (rbuf +59 , versions,sizeof (versions)); +if (args->dev->class ==ATA_DEV_ZAC ) +memcpy (rbuf +58 , versions_zbc,sizeof (versions_zbc)); +else +memcpy (rbuf +58 , versions,sizeof (versions));return 0 ; }
Signature · 1 line
1.8.5.2
Quoted 4 lines · Hannes Reinecke
Hi all,
this patchset updates the ATA stack to correctly detect host-managed ZAC devices.
And more importantly exports /dev/sg nodes from them so they can be actually be accessed.
I'm fine with taking the whole series through the libata tree, so far there are no conflicting libsas changes on the radar.
Quoted 12 lines · Christoph Hellwig
Quoted 4 lines · Hannes Reinecke
Hi all,
this patchset updates the ATA stack to correctly detect host-managed ZAC devices.
And more importantly exports
/dev/sgnodes from them so they can be actually be accessed.I'm fine with taking the whole series through the libata tree, so far there are no conflicting libsas changes on the radar.
Tejun?
I've made the requested changes of using taskfiles in libsas, so everything should be fine now ...
Cheers,
Hannes
Signature · 8 lines
Dr. Hannes Reinecke zSeries & Storage [email protected] +49 911 74053 688 SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg GF: J. Hawn, J. Guild, F. Imendörffer, HRB 21284 (AG Nürnberg) -- To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Quoted 9 lines · Hannes Reinecke
Hi all,
this patchset updates the ATA stack to correctly detect host-managed ZAC devices.
Hannes Reinecke (3):
libsas: useata_dev_classify()
libata: ImplementATA_DEV_ZAC
libata-scsi: Update SATL for ZAC drives
Applied 1-3 to libata/for-3.19.
Thanks.
Signature · 1 line
tejun