ata: move *sata_set_spd*() to libata-sata.c
* move *sata_set_spd*() to libata-sata.c * add static inlines for CONFIG_SATA_HOST=n case Code size savings on m68k arch using (modified) atari_defconfig: text data bss dec hex filename before: 32842 572 40 33458 82ae drivers/ata/libata-core.o after: 32812 572 40 33428 8290 drivers/ata/libata-core.o Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com> Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
6eab1bc0ee
commit
ab4117cf24
|
@ -3050,87 +3050,6 @@ int sata_down_spd_limit(struct ata_link *link, u32 spd_limit)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int __sata_set_spd_needed(struct ata_link *link, u32 *scontrol)
|
||||
{
|
||||
struct ata_link *host_link = &link->ap->link;
|
||||
u32 limit, target, spd;
|
||||
|
||||
limit = link->sata_spd_limit;
|
||||
|
||||
/* Don't configure downstream link faster than upstream link.
|
||||
* It doesn't speed up anything and some PMPs choke on such
|
||||
* configuration.
|
||||
*/
|
||||
if (!ata_is_host_link(link) && host_link->sata_spd)
|
||||
limit &= (1 << host_link->sata_spd) - 1;
|
||||
|
||||
if (limit == UINT_MAX)
|
||||
target = 0;
|
||||
else
|
||||
target = fls(limit);
|
||||
|
||||
spd = (*scontrol >> 4) & 0xf;
|
||||
*scontrol = (*scontrol & ~0xf0) | ((target & 0xf) << 4);
|
||||
|
||||
return spd != target;
|
||||
}
|
||||
|
||||
/**
|
||||
* sata_set_spd_needed - is SATA spd configuration needed
|
||||
* @link: Link in question
|
||||
*
|
||||
* Test whether the spd limit in SControl matches
|
||||
* @link->sata_spd_limit. This function is used to determine
|
||||
* whether hardreset is necessary to apply SATA spd
|
||||
* configuration.
|
||||
*
|
||||
* LOCKING:
|
||||
* Inherited from caller.
|
||||
*
|
||||
* RETURNS:
|
||||
* 1 if SATA spd configuration is needed, 0 otherwise.
|
||||
*/
|
||||
static int sata_set_spd_needed(struct ata_link *link)
|
||||
{
|
||||
u32 scontrol;
|
||||
|
||||
if (sata_scr_read(link, SCR_CONTROL, &scontrol))
|
||||
return 1;
|
||||
|
||||
return __sata_set_spd_needed(link, &scontrol);
|
||||
}
|
||||
|
||||
/**
|
||||
* sata_set_spd - set SATA spd according to spd limit
|
||||
* @link: Link to set SATA spd for
|
||||
*
|
||||
* Set SATA spd of @link according to sata_spd_limit.
|
||||
*
|
||||
* LOCKING:
|
||||
* Inherited from caller.
|
||||
*
|
||||
* RETURNS:
|
||||
* 0 if spd doesn't need to be changed, 1 if spd has been
|
||||
* changed. Negative errno if SCR registers are inaccessible.
|
||||
*/
|
||||
int sata_set_spd(struct ata_link *link)
|
||||
{
|
||||
u32 scontrol;
|
||||
int rc;
|
||||
|
||||
if ((rc = sata_scr_read(link, SCR_CONTROL, &scontrol)))
|
||||
return rc;
|
||||
|
||||
if (!__sata_set_spd_needed(link, &scontrol))
|
||||
return 0;
|
||||
|
||||
if ((rc = sata_scr_write(link, SCR_CONTROL, scontrol)))
|
||||
return rc;
|
||||
|
||||
return 1;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(sata_set_spd);
|
||||
|
||||
#ifdef CONFIG_ATA_ACPI
|
||||
/**
|
||||
* ata_timing_cycle2mode - find xfer mode for the specified cycle duration
|
||||
|
|
|
@ -271,6 +271,87 @@ int sata_link_scr_lpm(struct ata_link *link, enum ata_lpm_policy policy,
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(sata_link_scr_lpm);
|
||||
|
||||
static int __sata_set_spd_needed(struct ata_link *link, u32 *scontrol)
|
||||
{
|
||||
struct ata_link *host_link = &link->ap->link;
|
||||
u32 limit, target, spd;
|
||||
|
||||
limit = link->sata_spd_limit;
|
||||
|
||||
/* Don't configure downstream link faster than upstream link.
|
||||
* It doesn't speed up anything and some PMPs choke on such
|
||||
* configuration.
|
||||
*/
|
||||
if (!ata_is_host_link(link) && host_link->sata_spd)
|
||||
limit &= (1 << host_link->sata_spd) - 1;
|
||||
|
||||
if (limit == UINT_MAX)
|
||||
target = 0;
|
||||
else
|
||||
target = fls(limit);
|
||||
|
||||
spd = (*scontrol >> 4) & 0xf;
|
||||
*scontrol = (*scontrol & ~0xf0) | ((target & 0xf) << 4);
|
||||
|
||||
return spd != target;
|
||||
}
|
||||
|
||||
/**
|
||||
* sata_set_spd_needed - is SATA spd configuration needed
|
||||
* @link: Link in question
|
||||
*
|
||||
* Test whether the spd limit in SControl matches
|
||||
* @link->sata_spd_limit. This function is used to determine
|
||||
* whether hardreset is necessary to apply SATA spd
|
||||
* configuration.
|
||||
*
|
||||
* LOCKING:
|
||||
* Inherited from caller.
|
||||
*
|
||||
* RETURNS:
|
||||
* 1 if SATA spd configuration is needed, 0 otherwise.
|
||||
*/
|
||||
int sata_set_spd_needed(struct ata_link *link)
|
||||
{
|
||||
u32 scontrol;
|
||||
|
||||
if (sata_scr_read(link, SCR_CONTROL, &scontrol))
|
||||
return 1;
|
||||
|
||||
return __sata_set_spd_needed(link, &scontrol);
|
||||
}
|
||||
|
||||
/**
|
||||
* sata_set_spd - set SATA spd according to spd limit
|
||||
* @link: Link to set SATA spd for
|
||||
*
|
||||
* Set SATA spd of @link according to sata_spd_limit.
|
||||
*
|
||||
* LOCKING:
|
||||
* Inherited from caller.
|
||||
*
|
||||
* RETURNS:
|
||||
* 0 if spd doesn't need to be changed, 1 if spd has been
|
||||
* changed. Negative errno if SCR registers are inaccessible.
|
||||
*/
|
||||
int sata_set_spd(struct ata_link *link)
|
||||
{
|
||||
u32 scontrol;
|
||||
int rc;
|
||||
|
||||
if ((rc = sata_scr_read(link, SCR_CONTROL, &scontrol)))
|
||||
return rc;
|
||||
|
||||
if (!__sata_set_spd_needed(link, &scontrol))
|
||||
return 0;
|
||||
|
||||
if ((rc = sata_scr_write(link, SCR_CONTROL, scontrol)))
|
||||
return rc;
|
||||
|
||||
return 1;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(sata_set_spd);
|
||||
|
||||
/**
|
||||
* ata_slave_link_init - initialize slave link
|
||||
* @ap: port to initialize slave link for
|
||||
|
|
|
@ -87,6 +87,13 @@ 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 sata_set_spd_needed(struct ata_link *link);
|
||||
#else
|
||||
static inline int sata_set_spd_needed(struct ata_link *link) { return 1; }
|
||||
#endif
|
||||
|
||||
/* libata-acpi.c */
|
||||
#ifdef CONFIG_ATA_ACPI
|
||||
extern unsigned int ata_acpi_gtf_filter;
|
||||
|
|
|
@ -1074,7 +1074,6 @@ static inline int ata_port_is_dummy(struct ata_port *ap)
|
|||
return ap->ops == &ata_dummy_port_ops;
|
||||
}
|
||||
|
||||
extern int sata_set_spd(struct ata_link *link);
|
||||
extern int ata_std_prereset(struct ata_link *link, unsigned long deadline);
|
||||
extern int ata_wait_after_reset(struct ata_link *link, unsigned long deadline,
|
||||
int (*check_ready)(struct ata_link *link));
|
||||
|
@ -1194,6 +1193,7 @@ extern int sata_scr_valid(struct ata_link *link);
|
|||
extern int sata_scr_read(struct ata_link *link, int reg, u32 *val);
|
||||
extern int sata_scr_write(struct ata_link *link, int reg, u32 val);
|
||||
extern int sata_scr_write_flush(struct ata_link *link, int reg, u32 val);
|
||||
extern int sata_set_spd(struct ata_link *link);
|
||||
#else
|
||||
static inline int sata_scr_valid(struct ata_link *link) { return 0; }
|
||||
static inline int sata_scr_read(struct ata_link *link, int reg, u32 *val)
|
||||
|
@ -1208,6 +1208,7 @@ static inline int sata_scr_write_flush(struct ata_link *link, int reg, u32 val)
|
|||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
static inline int sata_set_spd(struct ata_link *link) { return -EOPNOTSUPP; }
|
||||
#endif
|
||||
extern int sata_link_scr_lpm(struct ata_link *link, enum ata_lpm_policy policy,
|
||||
bool spm_wakeup);
|
||||
|
|
Loading…
Reference in New Issue