lkml.org 
[lkml]   [2020]   [Mar]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v4 24/27] ata: move ata_sas_*() to libata-sata.c
    Date
    * un-inline:
    - ata_scsi_dump_cdb()
    - __ata_scsi_queuecmd()

    * un-static:
    - ata_scsi_sdev_config()
    - ata_scsi_dev_config()
    - ata_scsi_dump_cdb()
    - __ata_scsi_queuecmd()

    * move ata_sas_*() to libata-sata.c:

    * add static inlines for CONFIG_SATA_HOST=n case for
    ata_sas_{allocate,free}_tag()

    Code size savings on m68k arch using (modified) atari_defconfig:

    text data bss dec hex filename
    before:
    19137 23 576 19736 4d18 drivers/ata/libata-scsi.o
    after:
    18330 23 576 18929 49f1 drivers/ata/libata-scsi.o

    Signed-off-by: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
    ---
    drivers/ata/libata-sata.c | 213 ++++++++++++++++++++++++++++++++++++
    drivers/ata/libata-scsi.c | 222 +-------------------------------------
    drivers/ata/libata.h | 19 +++-
    include/linux/libata.h | 26 ++---
    4 files changed, 246 insertions(+), 234 deletions(-)

    diff --git a/drivers/ata/libata-sata.c b/drivers/ata/libata-sata.c
    index c9760b52fb57..ad11a77a307c 100644
    --- a/drivers/ata/libata-sata.c
    +++ b/drivers/ata/libata-sata.c
    @@ -8,10 +8,12 @@

    #include <linux/kernel.h>
    #include <linux/module.h>
    +#include <scsi/scsi_cmnd.h>
    #include <scsi/scsi_device.h>
    #include <linux/libata.h>

    #include "libata.h"
    +#include "libata-transport.h"

    /* debounce timing parameters in msecs { interval, duration, timeout } */
    const unsigned long sata_deb_timing_normal[] = { 5, 100, 2000 };
    @@ -1059,3 +1061,214 @@ int ata_scsi_change_queue_depth(struct scsi_device *sdev, int queue_depth)
    return __ata_change_queue_depth(ap, sdev, queue_depth);
    }
    EXPORT_SYMBOL_GPL(ata_scsi_change_queue_depth);
    +
    +/**
    + * port_alloc - Allocate port for a SAS attached SATA device
    + * @host: ATA host container for all SAS ports
    + * @port_info: Information from low-level host driver
    + * @shost: SCSI host that the scsi device is attached to
    + *
    + * LOCKING:
    + * PCI/etc. bus probe sem.
    + *
    + * RETURNS:
    + * ata_port pointer on success / NULL on failure.
    + */
    +
    +struct ata_port *ata_sas_port_alloc(struct ata_host *host,
    + struct ata_port_info *port_info,
    + struct Scsi_Host *shost)
    +{
    + struct ata_port *ap;
    +
    + ap = ata_port_alloc(host);
    + if (!ap)
    + return NULL;
    +
    + ap->port_no = 0;
    + ap->lock = &host->lock;
    + ap->pio_mask = port_info->pio_mask;
    + ap->mwdma_mask = port_info->mwdma_mask;
    + ap->udma_mask = port_info->udma_mask;
    + ap->flags |= port_info->flags;
    + ap->ops = port_info->port_ops;
    + ap->cbl = ATA_CBL_SATA;
    +
    + return ap;
    +}
    +EXPORT_SYMBOL_GPL(ata_sas_port_alloc);
    +
    +/**
    + * ata_sas_port_start - Set port up for dma.
    + * @ap: Port to initialize
    + *
    + * Called just after data structures for each port are
    + * initialized.
    + *
    + * May be used as the port_start() entry in ata_port_operations.
    + *
    + * LOCKING:
    + * Inherited from caller.
    + */
    +int ata_sas_port_start(struct ata_port *ap)
    +{
    + /*
    + * the port is marked as frozen at allocation time, but if we don't
    + * have new eh, we won't thaw it
    + */
    + if (!ap->ops->error_handler)
    + ap->pflags &= ~ATA_PFLAG_FROZEN;
    + return 0;
    +}
    +EXPORT_SYMBOL_GPL(ata_sas_port_start);
    +
    +/**
    + * ata_port_stop - Undo ata_sas_port_start()
    + * @ap: Port to shut down
    + *
    + * May be used as the port_stop() entry in ata_port_operations.
    + *
    + * LOCKING:
    + * Inherited from caller.
    + */
    +
    +void ata_sas_port_stop(struct ata_port *ap)
    +{
    +}
    +EXPORT_SYMBOL_GPL(ata_sas_port_stop);
    +
    +/**
    + * ata_sas_async_probe - simply schedule probing and return
    + * @ap: Port to probe
    + *
    + * For batch scheduling of probe for sas attached ata devices, assumes
    + * the port has already been through ata_sas_port_init()
    + */
    +void ata_sas_async_probe(struct ata_port *ap)
    +{
    + __ata_port_probe(ap);
    +}
    +EXPORT_SYMBOL_GPL(ata_sas_async_probe);
    +
    +int ata_sas_sync_probe(struct ata_port *ap)
    +{
    + return ata_port_probe(ap);
    +}
    +EXPORT_SYMBOL_GPL(ata_sas_sync_probe);
    +
    +
    +/**
    + * ata_sas_port_init - Initialize a SATA device
    + * @ap: SATA port to initialize
    + *
    + * LOCKING:
    + * PCI/etc. bus probe sem.
    + *
    + * RETURNS:
    + * Zero on success, non-zero on error.
    + */
    +
    +int ata_sas_port_init(struct ata_port *ap)
    +{
    + int rc = ap->ops->port_start(ap);
    +
    + if (rc)
    + return rc;
    + ap->print_id = atomic_inc_return(&ata_print_id);
    + return 0;
    +}
    +EXPORT_SYMBOL_GPL(ata_sas_port_init);
    +
    +int ata_sas_tport_add(struct device *parent, struct ata_port *ap)
    +{
    + return ata_tport_add(parent, ap);
    +}
    +EXPORT_SYMBOL_GPL(ata_sas_tport_add);
    +
    +void ata_sas_tport_delete(struct ata_port *ap)
    +{
    + ata_tport_delete(ap);
    +}
    +EXPORT_SYMBOL_GPL(ata_sas_tport_delete);
    +
    +/**
    + * ata_sas_port_destroy - Destroy a SATA port allocated by ata_sas_port_alloc
    + * @ap: SATA port to destroy
    + *
    + */
    +
    +void ata_sas_port_destroy(struct ata_port *ap)
    +{
    + if (ap->ops->port_stop)
    + ap->ops->port_stop(ap);
    + kfree(ap);
    +}
    +EXPORT_SYMBOL_GPL(ata_sas_port_destroy);
    +
    +/**
    + * ata_sas_slave_configure - Default slave_config routine for libata devices
    + * @sdev: SCSI device to configure
    + * @ap: ATA port to which SCSI device is attached
    + *
    + * RETURNS:
    + * Zero.
    + */
    +
    +int ata_sas_slave_configure(struct scsi_device *sdev, struct ata_port *ap)
    +{
    + ata_scsi_sdev_config(sdev);
    + ata_scsi_dev_config(sdev, ap->link.device);
    + return 0;
    +}
    +EXPORT_SYMBOL_GPL(ata_sas_slave_configure);
    +
    +/**
    + * ata_sas_queuecmd - Issue SCSI cdb to libata-managed device
    + * @cmd: SCSI command to be sent
    + * @ap: ATA port to which the command is being sent
    + *
    + * RETURNS:
    + * Return value from __ata_scsi_queuecmd() if @cmd can be queued,
    + * 0 otherwise.
    + */
    +
    +int ata_sas_queuecmd(struct scsi_cmnd *cmd, struct ata_port *ap)
    +{
    + int rc = 0;
    +
    + ata_scsi_dump_cdb(ap, cmd);
    +
    + if (likely(ata_dev_enabled(ap->link.device)))
    + rc = __ata_scsi_queuecmd(cmd, ap->link.device);
    + else {
    + cmd->result = (DID_BAD_TARGET << 16);
    + cmd->scsi_done(cmd);
    + }
    + return rc;
    +}
    +EXPORT_SYMBOL_GPL(ata_sas_queuecmd);
    +
    +int ata_sas_allocate_tag(struct ata_port *ap)
    +{
    + unsigned int max_queue = ap->host->n_tags;
    + unsigned int i, tag;
    +
    + for (i = 0, tag = ap->sas_last_tag + 1; i < max_queue; i++, tag++) {
    + tag = tag < max_queue ? tag : 0;
    +
    + /* the last tag is reserved for internal command. */
    + if (ata_tag_internal(tag))
    + continue;
    +
    + if (!test_and_set_bit(tag, &ap->sas_tag_allocated)) {
    + ap->sas_last_tag = tag;
    + return tag;
    + }
    + }
    + return -1;
    +}
    +
    +void ata_sas_free_tag(unsigned int tag, struct ata_port *ap)
    +{
    + clear_bit(tag, &ap->sas_tag_allocated);
    +}
    diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c
    index 1000f7b0098b..5215761306e0 100644
    --- a/drivers/ata/libata-scsi.c
    +++ b/drivers/ata/libata-scsi.c
    @@ -988,7 +988,7 @@ static void ata_gen_ata_sense(struct ata_queued_cmd *qc)
    scsi_set_sense_information(sb, SCSI_SENSE_BUFFERSIZE, block);
    }

    -static void ata_scsi_sdev_config(struct scsi_device *sdev)
    +void ata_scsi_sdev_config(struct scsi_device *sdev)
    {
    sdev->use_10_for_rw = 1;
    sdev->use_10_for_ms = 1;
    @@ -1028,8 +1028,7 @@ static int atapi_drain_needed(struct request *rq)
    return atapi_cmd_type(scsi_req(rq)->cmd[0]) == ATAPI_MISC;
    }

    -static int ata_scsi_dev_config(struct scsi_device *sdev,
    - struct ata_device *dev)
    +int ata_scsi_dev_config(struct scsi_device *sdev, struct ata_device *dev)
    {
    struct request_queue *q = sdev->request_queue;

    @@ -3993,8 +3992,7 @@ static inline ata_xlat_func_t ata_get_xlat_func(struct ata_device *dev, u8 cmd)
    * Prints the contents of a SCSI command via printk().
    */

    -static inline void ata_scsi_dump_cdb(struct ata_port *ap,
    - struct scsi_cmnd *cmd)
    +void ata_scsi_dump_cdb(struct ata_port *ap, struct scsi_cmnd *cmd)
    {
    #ifdef ATA_VERBOSE_DEBUG
    struct scsi_device *scsidev = cmd->device;
    @@ -4006,8 +4004,7 @@ static inline void ata_scsi_dump_cdb(struct ata_port *ap,
    #endif
    }

    -static inline int __ata_scsi_queuecmd(struct scsi_cmnd *scmd,
    - struct ata_device *dev)
    +int __ata_scsi_queuecmd(struct scsi_cmnd *scmd, struct ata_device *dev)
    {
    u8 scsi_op = scmd->cmnd[0];
    ata_xlat_func_t xlat_func;
    @@ -4648,214 +4645,3 @@ void ata_scsi_dev_rescan(struct work_struct *work)
    spin_unlock_irqrestore(ap->lock, flags);
    mutex_unlock(&ap->scsi_scan_mutex);
    }
    -
    -/**
    - * ata_sas_port_alloc - Allocate port for a SAS attached SATA device
    - * @host: ATA host container for all SAS ports
    - * @port_info: Information from low-level host driver
    - * @shost: SCSI host that the scsi device is attached to
    - *
    - * LOCKING:
    - * PCI/etc. bus probe sem.
    - *
    - * RETURNS:
    - * ata_port pointer on success / NULL on failure.
    - */
    -
    -struct ata_port *ata_sas_port_alloc(struct ata_host *host,
    - struct ata_port_info *port_info,
    - struct Scsi_Host *shost)
    -{
    - struct ata_port *ap;
    -
    - ap = ata_port_alloc(host);
    - if (!ap)
    - return NULL;
    -
    - ap->port_no = 0;
    - ap->lock = &host->lock;
    - ap->pio_mask = port_info->pio_mask;
    - ap->mwdma_mask = port_info->mwdma_mask;
    - ap->udma_mask = port_info->udma_mask;
    - ap->flags |= port_info->flags;
    - ap->ops = port_info->port_ops;
    - ap->cbl = ATA_CBL_SATA;
    -
    - return ap;
    -}
    -EXPORT_SYMBOL_GPL(ata_sas_port_alloc);
    -
    -/**
    - * ata_sas_port_start - Set port up for dma.
    - * @ap: Port to initialize
    - *
    - * Called just after data structures for each port are
    - * initialized.
    - *
    - * May be used as the port_start() entry in ata_port_operations.
    - *
    - * LOCKING:
    - * Inherited from caller.
    - */
    -int ata_sas_port_start(struct ata_port *ap)
    -{
    - /*
    - * the port is marked as frozen at allocation time, but if we don't
    - * have new eh, we won't thaw it
    - */
    - if (!ap->ops->error_handler)
    - ap->pflags &= ~ATA_PFLAG_FROZEN;
    - return 0;
    -}
    -EXPORT_SYMBOL_GPL(ata_sas_port_start);
    -
    -/**
    - * ata_port_stop - Undo ata_sas_port_start()
    - * @ap: Port to shut down
    - *
    - * May be used as the port_stop() entry in ata_port_operations.
    - *
    - * LOCKING:
    - * Inherited from caller.
    - */
    -
    -void ata_sas_port_stop(struct ata_port *ap)
    -{
    -}
    -EXPORT_SYMBOL_GPL(ata_sas_port_stop);
    -
    -/**
    - * ata_sas_async_probe - simply schedule probing and return
    - * @ap: Port to probe
    - *
    - * For batch scheduling of probe for sas attached ata devices, assumes
    - * the port has already been through ata_sas_port_init()
    - */
    -void ata_sas_async_probe(struct ata_port *ap)
    -{
    - __ata_port_probe(ap);
    -}
    -EXPORT_SYMBOL_GPL(ata_sas_async_probe);
    -
    -int ata_sas_sync_probe(struct ata_port *ap)
    -{
    - return ata_port_probe(ap);
    -}
    -EXPORT_SYMBOL_GPL(ata_sas_sync_probe);
    -
    -
    -/**
    - * ata_sas_port_init - Initialize a SATA device
    - * @ap: SATA port to initialize
    - *
    - * LOCKING:
    - * PCI/etc. bus probe sem.
    - *
    - * RETURNS:
    - * Zero on success, non-zero on error.
    - */
    -
    -int ata_sas_port_init(struct ata_port *ap)
    -{
    - int rc = ap->ops->port_start(ap);
    -
    - if (rc)
    - return rc;
    - ap->print_id = atomic_inc_return(&ata_print_id);
    - return 0;
    -}
    -EXPORT_SYMBOL_GPL(ata_sas_port_init);
    -
    -int ata_sas_tport_add(struct device *parent, struct ata_port *ap)
    -{
    - return ata_tport_add(parent, ap);
    -}
    -EXPORT_SYMBOL_GPL(ata_sas_tport_add);
    -
    -void ata_sas_tport_delete(struct ata_port *ap)
    -{
    - ata_tport_delete(ap);
    -}
    -EXPORT_SYMBOL_GPL(ata_sas_tport_delete);
    -
    -/**
    - * ata_sas_port_destroy - Destroy a SATA port allocated by ata_sas_port_alloc
    - * @ap: SATA port to destroy
    - *
    - */
    -
    -void ata_sas_port_destroy(struct ata_port *ap)
    -{
    - if (ap->ops->port_stop)
    - ap->ops->port_stop(ap);
    - kfree(ap);
    -}
    -EXPORT_SYMBOL_GPL(ata_sas_port_destroy);
    -
    -/**
    - * ata_sas_slave_configure - Default slave_config routine for libata devices
    - * @sdev: SCSI device to configure
    - * @ap: ATA port to which SCSI device is attached
    - *
    - * RETURNS:
    - * Zero.
    - */
    -
    -int ata_sas_slave_configure(struct scsi_device *sdev, struct ata_port *ap)
    -{
    - ata_scsi_sdev_config(sdev);
    - ata_scsi_dev_config(sdev, ap->link.device);
    - return 0;
    -}
    -EXPORT_SYMBOL_GPL(ata_sas_slave_configure);
    -
    -/**
    - * ata_sas_queuecmd - Issue SCSI cdb to libata-managed device
    - * @cmd: SCSI command to be sent
    - * @ap: ATA port to which the command is being sent
    - *
    - * RETURNS:
    - * Return value from __ata_scsi_queuecmd() if @cmd can be queued,
    - * 0 otherwise.
    - */
    -
    -int ata_sas_queuecmd(struct scsi_cmnd *cmd, struct ata_port *ap)
    -{
    - int rc = 0;
    -
    - ata_scsi_dump_cdb(ap, cmd);
    -
    - if (likely(ata_dev_enabled(ap->link.device)))
    - rc = __ata_scsi_queuecmd(cmd, ap->link.device);
    - else {
    - cmd->result = (DID_BAD_TARGET << 16);
    - cmd->scsi_done(cmd);
    - }
    - return rc;
    -}
    -EXPORT_SYMBOL_GPL(ata_sas_queuecmd);
    -
    -int ata_sas_allocate_tag(struct ata_port *ap)
    -{
    - unsigned int max_queue = ap->host->n_tags;
    - unsigned int i, tag;
    -
    - for (i = 0, tag = ap->sas_last_tag + 1; i < max_queue; i++, tag++) {
    - tag = tag < max_queue ? tag : 0;
    -
    - /* the last tag is reserved for internal command. */
    - if (ata_tag_internal(tag))
    - continue;
    -
    - if (!test_and_set_bit(tag, &ap->sas_tag_allocated)) {
    - ap->sas_last_tag = tag;
    - return tag;
    - }
    - }
    - return -1;
    -}
    -
    -void ata_sas_free_tag(unsigned int tag, struct ata_port *ap)
    -{
    - clear_bit(tag, &ap->sas_tag_allocated);
    -}
    diff --git a/drivers/ata/libata.h b/drivers/ata/libata.h
    index ce3f3c039572..6c808cf39135 100644
    --- a/drivers/ata/libata.h
    +++ b/drivers/ata/libata.h
    @@ -87,6 +87,18 @@ extern unsigned int ata_read_log_page(struct ata_device *dev, u8 log,

    #define to_ata_port(d) container_of(d, struct ata_port, tdev)

    +/* libata-sata.c */
    +#ifdef CONFIG_SATA_HOST
    +int ata_sas_allocate_tag(struct ata_port *ap);
    +void ata_sas_free_tag(unsigned int tag, struct ata_port *ap);
    +#else
    +static inline int ata_sas_allocate_tag(struct ata_port *ap)
    +{
    + return -EOPNOTSUPP;
    +}
    +static inline void ata_sas_free_tag(unsigned int tag, struct ata_port *ap) { }
    +#endif
    +
    /* libata-acpi.c */
    #ifdef CONFIG_ATA_ACPI
    extern unsigned int ata_acpi_gtf_filter;
    @@ -130,9 +142,10 @@ extern void ata_scsi_dev_rescan(struct work_struct *work);
    extern int ata_bus_probe(struct ata_port *ap);
    extern int ata_scsi_user_scan(struct Scsi_Host *shost, unsigned int channel,
    unsigned int id, u64 lun);
    -int ata_sas_allocate_tag(struct ata_port *ap);
    -void ata_sas_free_tag(unsigned int tag, struct ata_port *ap);
    -
    +void ata_scsi_sdev_config(struct scsi_device *sdev);
    +int ata_scsi_dev_config(struct scsi_device *sdev, struct ata_device *dev);
    +void ata_scsi_dump_cdb(struct ata_port *ap, struct scsi_cmnd *cmd);
    +int __ata_scsi_queuecmd(struct scsi_cmnd *scmd, struct ata_device *dev);

    /* libata-eh.c */
    extern unsigned long ata_internal_cmd_timeout(struct ata_device *dev, u8 cmd);
    diff --git a/include/linux/libata.h b/include/linux/libata.h
    index cc14030c139e..2d81ea2ccf12 100644
    --- a/include/linux/libata.h
    +++ b/include/linux/libata.h
    @@ -1087,19 +1087,6 @@ extern int ata_scsi_ioctl(struct scsi_device *dev, unsigned int cmd,
    extern int ata_scsi_queuecmd(struct Scsi_Host *h, struct scsi_cmnd *cmd);
    extern int ata_sas_scsi_ioctl(struct ata_port *ap, struct scsi_device *dev,
    unsigned int cmd, void __user *arg);
    -extern void ata_sas_port_destroy(struct ata_port *);
    -extern struct ata_port *ata_sas_port_alloc(struct ata_host *,
    - struct ata_port_info *,
    - struct Scsi_Host *);
    -extern void ata_sas_async_probe(struct ata_port *ap);
    -extern int ata_sas_sync_probe(struct ata_port *ap);
    -extern int ata_sas_port_init(struct ata_port *);
    -extern int ata_sas_port_start(struct ata_port *ap);
    -extern int ata_sas_tport_add(struct device *parent, struct ata_port *ap);
    -extern void ata_sas_tport_delete(struct ata_port *ap);
    -extern void ata_sas_port_stop(struct ata_port *ap);
    -extern int ata_sas_slave_configure(struct scsi_device *, struct ata_port *);
    -extern int ata_sas_queuecmd(struct scsi_cmnd *cmd, struct ata_port *ap);
    extern bool ata_link_online(struct ata_link *link);
    extern bool ata_link_offline(struct ata_link *link);
    #ifdef CONFIG_PM
    @@ -1237,6 +1224,19 @@ extern int sata_link_debounce(struct ata_link *link,
    extern int sata_link_scr_lpm(struct ata_link *link, enum ata_lpm_policy policy,
    bool spm_wakeup);
    extern int ata_slave_link_init(struct ata_port *ap);
    +extern void ata_sas_port_destroy(struct ata_port *);
    +extern struct ata_port *ata_sas_port_alloc(struct ata_host *,
    + struct ata_port_info *,
    + struct Scsi_Host *);
    +extern void ata_sas_async_probe(struct ata_port *ap);
    +extern int ata_sas_sync_probe(struct ata_port *ap);
    +extern int ata_sas_port_init(struct ata_port *);
    +extern int ata_sas_port_start(struct ata_port *ap);
    +extern int ata_sas_tport_add(struct device *parent, struct ata_port *ap);
    +extern void ata_sas_tport_delete(struct ata_port *ap);
    +extern void ata_sas_port_stop(struct ata_port *ap);
    +extern int ata_sas_slave_configure(struct scsi_device *, struct ata_port *);
    +extern int ata_sas_queuecmd(struct scsi_cmnd *cmd, struct ata_port *ap);
    extern void ata_tf_to_fis(const struct ata_taskfile *tf,
    u8 pmp, int is_cmd, u8 *fis);
    extern void ata_tf_from_fis(const u8 *fis, struct ata_taskfile *tf);
    --
    2.24.1
    \
     
     \ /
      Last update: 2020-03-17 15:44    [W:2.586 / U:0.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site