drivers/net/phy/qcom/qca807x.c

Source file repositories/reference/linux-study-clean/drivers/net/phy/qcom/qca807x.c

File Facts

System
Linux kernel
Corpus path
drivers/net/phy/qcom/qca807x.c
Extension
.c
Size
24198 bytes
Lines
857
Domain
Driver Families
Bucket
drivers/net
Inferred role
Driver Families: implementation source
Status
source implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

struct qca807x_shared_priv {
	unsigned int package_mode;
	u32 tx_drive_strength;
};

struct qca807x_gpio_priv {
	struct phy_device *phy;
};

struct qca807x_priv {
	bool dac_full_amplitude;
	bool dac_full_bias_current;
	bool dac_disable_bias_current_tweak;
	struct qcom_phy_hw_stats hw_stats;
};

static int qca807x_cable_test_start(struct phy_device *phydev)
{
	/* we do all the (time consuming) work later */
	return 0;
}

static int qca807x_led_parse_netdev(struct phy_device *phydev, unsigned long rules,
				    u16 *offload_trigger)
{
	/* Parsing specific to netdev trigger */
	switch (phydev->port) {
	case PORT_TP:
		if (test_bit(TRIGGER_NETDEV_TX, &rules))
			*offload_trigger |= QCA808X_LED_TX_BLINK;
		if (test_bit(TRIGGER_NETDEV_RX, &rules))
			*offload_trigger |= QCA808X_LED_RX_BLINK;
		if (test_bit(TRIGGER_NETDEV_LINK_10, &rules))
			*offload_trigger |= QCA808X_LED_SPEED10_ON;
		if (test_bit(TRIGGER_NETDEV_LINK_100, &rules))
			*offload_trigger |= QCA808X_LED_SPEED100_ON;
		if (test_bit(TRIGGER_NETDEV_LINK_1000, &rules))
			*offload_trigger |= QCA808X_LED_SPEED1000_ON;
		if (test_bit(TRIGGER_NETDEV_HALF_DUPLEX, &rules))
			*offload_trigger |= QCA808X_LED_HALF_DUPLEX_ON;
		if (test_bit(TRIGGER_NETDEV_FULL_DUPLEX, &rules))
			*offload_trigger |= QCA808X_LED_FULL_DUPLEX_ON;
		break;
	case PORT_FIBRE:
		if (test_bit(TRIGGER_NETDEV_TX, &rules))
			*offload_trigger |= QCA807X_LED_FIBER_TXACT_BLK_EN;
		if (test_bit(TRIGGER_NETDEV_RX, &rules))
			*offload_trigger |= QCA807X_LED_FIBER_RXACT_BLK_EN;
		if (test_bit(TRIGGER_NETDEV_LINK_100, &rules))
			*offload_trigger |= QCA807X_LED_FIBER_100FX_ON_EN;
		if (test_bit(TRIGGER_NETDEV_LINK_1000, &rules))
			*offload_trigger |= QCA807X_LED_FIBER_1000BX_ON_EN;
		if (test_bit(TRIGGER_NETDEV_HALF_DUPLEX, &rules))
			*offload_trigger |= QCA807X_LED_FIBER_HDX_ON_EN;
		if (test_bit(TRIGGER_NETDEV_FULL_DUPLEX, &rules))
			*offload_trigger |= QCA807X_LED_FIBER_FDX_ON_EN;
		break;
	default:
		return -EOPNOTSUPP;
	}

	if (rules && !*offload_trigger)
		return -EOPNOTSUPP;

	return 0;
}

static int qca807x_led_hw_control_enable(struct phy_device *phydev, u8 index)
{
	u16 reg;

	if (index > 1)
		return -EINVAL;

	reg = QCA807X_MMD7_LED_FORCE_CTRL(index);
	return qca808x_led_reg_hw_control_enable(phydev, reg);
}

static int qca807x_led_hw_is_supported(struct phy_device *phydev, u8 index,
				       unsigned long rules)
{
	u16 offload_trigger = 0;

	if (index > 1)
		return -EINVAL;

	return qca807x_led_parse_netdev(phydev, rules, &offload_trigger);
}

static int qca807x_led_hw_control_set(struct phy_device *phydev, u8 index,

Annotation

Implementation Notes