On 8/6/21 9:42 AM, Damien Le Moal wrote: > Introduce the helper functions ata_dev_config_lba() and > ata_dev_config_chs() to configure the addressing capabilities of a > device. Each helper takes a string as argument for the addressing > information printed after these helpers execution completes. > > Signed-off-by: Damien Le Moal <damien.lemoal@xxxxxxx> > --- > drivers/ata/libata-core.c | 110 ++++++++++++++++++++------------------ > 1 file changed, 59 insertions(+), 51 deletions(-) > > diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c > index b13194432e5a..2b6054cdd8fc 100644 > --- a/drivers/ata/libata-core.c > +++ b/drivers/ata/libata-core.c > @@ -2363,6 +2363,52 @@ static void ata_dev_config_trusted(struct ata_device *dev) > dev->flags |= ATA_DFLAG_TRUSTED; > } > > +static int ata_dev_config_lba(struct ata_device *dev, > + char *info, size_t infosz) > +{ > + const u16 *id = dev->id; > + int info_ofst; > + > + dev->flags |= ATA_DFLAG_LBA; > + > + if (ata_id_has_lba48(id)) { > + dev->flags |= ATA_DFLAG_LBA48; > + strscpy(info, "LBA48 ", infosz); > + > + if (dev->n_sectors >= (1UL << 28) && > + ata_id_has_flush_ext(id)) > + dev->flags |= ATA_DFLAG_FLUSH_EXT; > + } else { > + strscpy(info, "LBA ", infosz); > + } > + info_ofst = strlen(info); > + > + /* config NCQ */ > + return ata_dev_config_ncq(dev, info + info_ofst, > + infosz - info_ofst); > +} > + > +static void ata_dev_config_chs(struct ata_device *dev, > + char *info, size_t infosz) > +{ > + const u16 *id = dev->id; > + > + /* Default translation */ > + dev->cylinders = id[1]; > + dev->heads = id[3]; > + dev->sectors = id[6]; > + > + if (ata_id_current_chs_valid(id)) { > + /* Current CHS translation is valid. */ > + dev->cylinders = id[54]; > + dev->heads = id[55]; > + dev->sectors = id[56]; > + } > + > + snprintf(info, infosz, "CHS %u/%u/%u", > + dev->cylinders, dev->heads, dev->sectors); > +} > + > static void ata_dev_config_devslp(struct ata_device *dev) > { > u8 *sata_setting = dev->link->ap->sector_buf; > @@ -2418,6 +2464,7 @@ int ata_dev_configure(struct ata_device *dev) > char revbuf[7]; /* XYZ-99\0 */ > char fwrevbuf[ATA_ID_FW_REV_LEN+1]; > char modelbuf[ATA_ID_PROD_LEN+1]; > + char lba_info[40]; > int rc; > > if (!ata_dev_enabled(dev) && ata_msg_info(ap)) { > @@ -2539,61 +2586,22 @@ int ata_dev_configure(struct ata_device *dev) > } > > if (ata_id_has_lba(id)) { > - const char *lba_desc; > - char ncq_desc[24]; > - > - lba_desc = "LBA"; > - dev->flags |= ATA_DFLAG_LBA; > - if (ata_id_has_lba48(id)) { > - dev->flags |= ATA_DFLAG_LBA48; > - lba_desc = "LBA48"; > - > - if (dev->n_sectors >= (1UL << 28) && > - ata_id_has_flush_ext(id)) > - dev->flags |= ATA_DFLAG_FLUSH_EXT; > - } > - > - /* config NCQ */ > - rc = ata_dev_config_ncq(dev, ncq_desc, sizeof(ncq_desc)); > + rc = ata_dev_config_lba(dev, lba_info, sizeof(lba_info)); > if (rc) > return rc; > - > - /* print device info to dmesg */ > - if (ata_msg_drv(ap) && print_info) { > - ata_dev_info(dev, "%s: %s, %s, max %s\n", > - revbuf, modelbuf, fwrevbuf, > - ata_mode_string(xfer_mask)); > - ata_dev_info(dev, > - "%llu sectors, multi %u: %s %s\n", > - (unsigned long long)dev->n_sectors, > - dev->multi_count, lba_desc, ncq_desc); > - } > } else { > - /* CHS */ > - > - /* Default translation */ > - dev->cylinders = id[1]; > - dev->heads = id[3]; > - dev->sectors = id[6]; > - > - if (ata_id_current_chs_valid(id)) { > - /* Current CHS translation is valid. */ > - dev->cylinders = id[54]; > - dev->heads = id[55]; > - dev->sectors = id[56]; > - } > + ata_dev_config_chs(dev, lba_info, sizeof(lba_info)); > + } > > - /* print device info to dmesg */ > - if (ata_msg_drv(ap) && print_info) { > - ata_dev_info(dev, "%s: %s, %s, max %s\n", > - revbuf, modelbuf, fwrevbuf, > - ata_mode_string(xfer_mask)); > - ata_dev_info(dev, > - "%llu sectors, multi %u, CHS %u/%u/%u\n", > - (unsigned long long)dev->n_sectors, > - dev->multi_count, dev->cylinders, > - dev->heads, dev->sectors); > - } > + /* print device info to dmesg */ > + if (ata_msg_drv(ap) && print_info) { > + ata_dev_info(dev, "%s: %s, %s, max %s\n", > + revbuf, modelbuf, fwrevbuf, > + ata_mode_string(xfer_mask)); > + ata_dev_info(dev, > + "%llu sectors, multi %u, %s\n", > + (unsigned long long)dev->n_sectors, > + dev->multi_count, lba_info); > } > > ata_dev_config_devslp(dev); > Hmm. Can't say I like it. Can't you move the second 'ata_dev_info()' call into the respective functions, and kill the temporary buffer? Cheers, Hannes -- Dr. Hannes Reinecke Kernel Storage Architect hare@xxxxxxx +49 911 74053 688 SUSE Software Solutions Germany GmbH, Maxfeldstr. 5, 90409 Nürnberg HRB 36809 (AG Nürnberg), GF: Felix Imendörffer