Commit c9b5be90 authored by Damien Le Moal's avatar Damien Le Moal
Browse files

ahci: Introduce ahci_ignore_port() helper



libahci and AHCI drivers may ignore some ports if the port is invalid
(its ID does not correspond to a valid physical port) or if the user
explicitly requested the port to be ignored with the mask_port_map
ahci module parameter. Such port that shall be ignored can be identified
by checking that the bit corresponding to the port ID is not set in the
mask_port_map field of struct ahci_host_priv. E.g. code such as:
"if (!(hpriv->mask_port_map & (1 << portid)))".

Replace all direct use of the mask_port_map field to detect such port
with the new helper inline function ahci_ignore_port() to make the code
more readable/easier to understand.

The comment describing the mask_port_map field of struct ahci_host_priv
is also updated to be more accurate.

Signed-off-by: default avatarDamien Le Moal <dlemoal@kernel.org>
Reviewed-by: default avatarNiklas Cassel <cassel@kernel.org>
parent 8c87215d
Loading
Loading
Loading
Loading
+12 −1
Original line number Diff line number Diff line
@@ -328,7 +328,7 @@ struct ahci_port_priv {
struct ahci_host_priv {
	/* Input fields */
	unsigned int		flags;		/* AHCI_HFLAG_* */
	u32			mask_port_map;	/* mask out particular bits */
	u32			mask_port_map;	/* Mask of valid ports */

	void __iomem *		mmio;		/* bus-independent mem map */
	u32			cap;		/* cap to use */
@@ -379,6 +379,17 @@ struct ahci_host_priv {
						  int port);
};

/*
 * Return true if a port should be ignored because it is excluded from
 * the host port map.
 */
static inline bool ahci_ignore_port(struct ahci_host_priv *hpriv,
				    unsigned int portid)
{
	return portid >= hpriv->nports ||
		!(hpriv->mask_port_map & (1 << portid));
}

extern int ahci_ignore_sss;

extern const struct attribute_group *ahci_shost_groups[];
+1 −1
Original line number Diff line number Diff line
@@ -288,7 +288,7 @@ static unsigned int brcm_ahci_read_id(struct ata_device *dev,

	/* Re-initialize and calibrate the PHY */
	for (i = 0; i < hpriv->nports; i++) {
		if (!(hpriv->mask_port_map & (1 << i)))
		if (ahci_ignore_port(hpriv, i))
			continue;

		rc = phy_init(hpriv->phys[i]);
+2 −2
Original line number Diff line number Diff line
@@ -206,7 +206,7 @@ static int ceva_ahci_platform_enable_resources(struct ahci_host_priv *hpriv)
		goto disable_clks;

	for (i = 0; i < hpriv->nports; i++) {
		if (!(hpriv->mask_port_map & (1 << i)))
		if (ahci_ignore_port(hpriv, i))
			continue;

		rc = phy_init(hpriv->phys[i]);
@@ -218,7 +218,7 @@ static int ceva_ahci_platform_enable_resources(struct ahci_host_priv *hpriv)
	ahci_platform_deassert_rsts(hpriv);

	for (i = 0; i < hpriv->nports; i++) {
		if (!(hpriv->mask_port_map & (1 << i)))
		if (ahci_ignore_port(hpriv, i))
			continue;

		rc = phy_power_on(hpriv->phys[i]);
+3 −3
Original line number Diff line number Diff line
@@ -49,7 +49,7 @@ int ahci_platform_enable_phys(struct ahci_host_priv *hpriv)
	int rc, i;

	for (i = 0; i < hpriv->nports; i++) {
		if (!(hpriv->mask_port_map & (1 << i)))
		if (ahci_ignore_port(hpriv, i))
			continue;

		rc = phy_init(hpriv->phys[i]);
@@ -73,7 +73,7 @@ int ahci_platform_enable_phys(struct ahci_host_priv *hpriv)

disable_phys:
	while (--i >= 0) {
		if (!(hpriv->mask_port_map & (1 << i)))
		if (ahci_ignore_port(hpriv, i))
			continue;

		phy_power_off(hpriv->phys[i]);
@@ -94,7 +94,7 @@ void ahci_platform_disable_phys(struct ahci_host_priv *hpriv)
	int i;

	for (i = 0; i < hpriv->nports; i++) {
		if (!(hpriv->mask_port_map & (1 << i)))
		if (ahci_ignore_port(hpriv, i))
			continue;

		phy_power_off(hpriv->phys[i]);