2021-05-17 22:05:57 +08:00
|
|
|
/*
|
|
|
|
* Xilinx Processor System Gigabit Ethernet controller (GEM) driver
|
|
|
|
*
|
|
|
|
* PHY management interface and related data
|
|
|
|
*
|
|
|
|
* Copyright (c) 2021, Weidmueller Interface GmbH & Co. KG
|
|
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef _ZEPHYR_DRIVERS_ETHERNET_PHY_XLNX_GEM_H_
|
|
|
|
#define _ZEPHYR_DRIVERS_ETHERNET_PHY_XLNX_GEM_H_
|
|
|
|
|
2022-05-06 16:25:46 +08:00
|
|
|
#include <zephyr/kernel.h>
|
2021-05-17 22:05:57 +08:00
|
|
|
#include <zephyr/types.h>
|
|
|
|
|
|
|
|
/* Event codes used to indicate a particular state change to the driver */
|
|
|
|
#define PHY_XLNX_GEM_EVENT_LINK_SPEED_CHANGED (1 << 0)
|
|
|
|
#define PHY_XLNX_GEM_EVENT_LINK_STATE_CHANGED (1 << 1)
|
|
|
|
#define PHY_XLNX_GEM_EVENT_AUTONEG_COMPLETE (1 << 2)
|
|
|
|
|
|
|
|
/* PHY register addresses & constants that are not vendor-specific */
|
|
|
|
#define PHY_IDENTIFIER_1_REGISTER 2
|
|
|
|
#define PHY_IDENTIFIER_2_REGISTER 3
|
|
|
|
|
|
|
|
/* PHY registers & constants -> Marvell Alaska specific */
|
|
|
|
|
|
|
|
/* Marvell PHY ID bits [3..0] = revision -> discard during ID check */
|
|
|
|
#define PHY_MRVL_PHY_ID_MODEL_MASK 0xFFFFFFF0
|
|
|
|
#define PHY_MRVL_PHY_ID_MODEL_88E1111 0x01410CC0
|
|
|
|
#define PHY_MRVL_PHY_ID_MODEL_88E151X 0x01410DD0
|
|
|
|
|
|
|
|
#define PHY_MRVL_BASE_REGISTERS_PAGE 0
|
|
|
|
#define PHY_MRVL_COPPER_CONTROL_REGISTER 0
|
|
|
|
#define PHY_MRVL_COPPER_STATUS_REGISTER 1
|
|
|
|
#define PHY_MRVL_COPPER_AUTONEG_ADV_REGISTER 4
|
|
|
|
#define PHY_MRVL_COPPER_LINK_PARTNER_ABILITY_REGISTER 5
|
|
|
|
#define PHY_MRVL_1000BASET_CONTROL_REGISTER 9
|
|
|
|
#define PHY_MRVL_COPPER_CONTROL_1_REGISTER 16
|
|
|
|
#define PHY_MRVL_COPPER_STATUS_1_REGISTER 17
|
|
|
|
#define PHY_MRVL_COPPER_INT_ENABLE_REGISTER 18
|
|
|
|
#define PHY_MRVL_COPPER_INT_STATUS_REGISTER 19
|
|
|
|
#define PHY_MRVL_COPPER_PAGE_SWITCH_REGISTER 22
|
|
|
|
#define PHY_MRVL_GENERAL_CONTROL_1_REGISTER 20
|
|
|
|
#define PHY_MRVL_GENERAL_CONTROL_1_PAGE 18
|
|
|
|
|
|
|
|
#define PHY_MRVL_GENERAL_CONTROL_1_RESET_BIT (1 << 15)
|
|
|
|
|
|
|
|
#define PHY_MRVL_COPPER_CONTROL_RESET_BIT (1 << 15)
|
|
|
|
#define PHY_MRVL_COPPER_CONTROL_AUTONEG_ENABLE_BIT (1 << 12)
|
|
|
|
|
|
|
|
#define PHY_MRVL_ADV_1000BASET_FDX_BIT (1 << 9)
|
|
|
|
#define PHY_MRVL_ADV_1000BASET_HDX_BIT (1 << 8)
|
|
|
|
#define PHY_MRVL_ADV_100BASET_FDX_BIT (1 << 8)
|
|
|
|
#define PHY_MRVL_ADV_100BASET_HDX_BIT (1 << 7)
|
|
|
|
#define PHY_MRVL_ADV_10BASET_FDX_BIT (1 << 6)
|
|
|
|
#define PHY_MRVL_ADV_10BASET_HDX_BIT (1 << 5)
|
|
|
|
#define PHY_MRVL_ADV_SELECTOR_802_3 0x0001
|
|
|
|
|
|
|
|
#define PHY_MRVL_MDIX_CONFIG_MASK 0x0003
|
|
|
|
#define PHY_MRVL_MDIX_CONFIG_SHIFT 5
|
|
|
|
#define PHY_MRVL_MDIX_AUTO_CROSSOVER_ENABLE 0x0003
|
|
|
|
#define PHY_MRVL_MODE_CONFIG_MASK 0x0003
|
|
|
|
#define PHY_MRVL_MODE_CONFIG_SHIFT 0
|
|
|
|
|
|
|
|
#define PHY_MRVL_COPPER_SPEED_CHANGED_INT_BIT (1 << 14)
|
|
|
|
#define PHY_MRVL_COPPER_DUPLEX_CHANGED_INT_BIT (1 << 13)
|
|
|
|
#define PHY_MRVL_COPPER_AUTONEG_COMPLETED_INT_BIT (1 << 11)
|
|
|
|
#define PHY_MRVL_COPPER_LINK_STATUS_CHANGED_INT_BIT (1 << 10)
|
|
|
|
#define PHY_MRVL_COPPER_LINK_STATUS_BIT_SHIFT 5
|
|
|
|
|
|
|
|
#define PHY_MRVL_LINK_SPEED_SHIFT 14
|
|
|
|
#define PHY_MRVL_LINK_SPEED_MASK 0x3
|
|
|
|
#define PHY_MRVL_LINK_SPEED_10MBIT 0
|
|
|
|
#define PHY_MRVL_LINK_SPEED_100MBIT 1
|
|
|
|
#define PHY_MRVL_LINK_SPEED_1GBIT 2
|
|
|
|
|
|
|
|
/*TI TLK105 & DP83822*/
|
|
|
|
|
|
|
|
/* TI PHY ID bits [3..0] = revision -> discard during ID check */
|
|
|
|
#define PHY_TI_PHY_ID_MODEL_MASK 0xFFFFFFF0
|
|
|
|
#define PHY_TI_PHY_ID_MODEL_DP83822 0x2000A240
|
|
|
|
#define PHY_TI_PHY_ID_MODEL_TLK105 0x2000A210
|
|
|
|
|
|
|
|
#define PHY_TI_PHY_SPECIFIC_CONTROL_REGISTER 0x0010
|
|
|
|
#define PHY_TI_BASIC_MODE_CONTROL_REGISTER 0x0000
|
|
|
|
#define PHY_TI_BASIC_MODE_STATUS_REGISTER 0x0001
|
|
|
|
#define PHY_TI_AUTONEG_ADV_REGISTER 0x0004
|
|
|
|
#define PHY_TI_CONTROL_REGISTER_1 0x0009
|
|
|
|
#define PHY_TI_PHY_STATUS_REGISTER 0x0010
|
|
|
|
#define PHY_TI_MII_INTERRUPT_STATUS_REGISTER_1 0x0012
|
|
|
|
#define PHY_TI_LED_CONTROL_REGISTER 0x0018
|
|
|
|
#define PHY_TI_PHY_CONTROL_REGISTER 0x0019
|
|
|
|
|
|
|
|
#define PHY_TI_BASIC_MODE_CONTROL_RESET_BIT (1 << 15)
|
|
|
|
#define PHY_TI_BASIC_MODE_CONTROL_AUTONEG_ENABLE_BIT (1 << 12)
|
|
|
|
|
|
|
|
#define PHY_TI_BASIC_MODE_STATUS_LINK_STATUS_BIT (1 << 2)
|
|
|
|
|
|
|
|
#define PHY_TI_LINK_STATUS_CHANGED_INT_BIT (1 << 13)
|
|
|
|
#define PHY_TI_SPEED_CHANGED_INT_BIT (1 << 12)
|
|
|
|
#define PHY_TI_DUPLEX_CHANGED_INT_BIT (1 << 11)
|
|
|
|
#define PHY_TI_AUTONEG_COMPLETED_INT_BIT (1 << 10)
|
|
|
|
|
|
|
|
#define PHY_TI_ADV_SELECTOR_802_3 0x0001
|
|
|
|
#define PHY_TI_ADV_100BASET_FDX_BIT (1 << 8)
|
|
|
|
#define PHY_TI_ADV_100BASET_HDX_BIT (1 << 7)
|
|
|
|
#define PHY_TI_ADV_10BASET_FDX_BIT (1 << 6)
|
|
|
|
#define PHY_TI_ADV_10BASET_HDX_BIT (1 << 5)
|
|
|
|
|
|
|
|
#define PHY_TI_CR1_ROBUST_AUTO_MDIX_BIT (1 << 5)
|
|
|
|
|
|
|
|
#define PHY_TI_PHY_CONTROL_AUTO_MDIX_ENABLE_BIT (1 << 15)
|
|
|
|
#define PHY_TI_PHY_CONTROL_FORCE_MDIX_BIT (1 << 14)
|
|
|
|
#define PHY_TI_PHY_CONTROL_LED_CONFIG_LINK_ONLY_BIT (1 << 5)
|
|
|
|
|
|
|
|
#define PHY_TI_LED_CONTROL_BLINK_RATE_SHIFT 9
|
|
|
|
#define PHY_TI_LED_CONTROL_BLINK_RATE_20HZ 0
|
|
|
|
#define PHY_TI_LED_CONTROL_BLINK_RATE_10HZ 1
|
|
|
|
#define PHY_TI_LED_CONTROL_BLINK_RATE_5HZ 2
|
|
|
|
#define PHY_TI_LED_CONTROL_BLINK_RATE_2HZ 3
|
|
|
|
|
|
|
|
#define PHY_TI_PHY_STATUS_LINK_BIT (1 << 0)
|
|
|
|
#define PHY_TI_PHY_STATUS_SPEED_BIT (1 << 1)
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Vendor-specific PHY management function pointer table struct
|
|
|
|
*
|
|
|
|
* Contains the PHY management function pointers for a specific PHY
|
|
|
|
* make or model.
|
|
|
|
*/
|
|
|
|
struct phy_xlnx_gem_api {
|
|
|
|
void (*phy_reset_func)(const struct device *dev);
|
|
|
|
void (*phy_configure_func)(const struct device *dev);
|
|
|
|
uint16_t (*phy_poll_status_change_func)(const struct device *dev);
|
|
|
|
uint8_t (*phy_poll_link_status_func)(const struct device *dev);
|
|
|
|
enum eth_xlnx_link_speed (*phy_poll_link_speed_func)(const struct device *dev);
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Supported PHY list entry struct
|
|
|
|
*
|
|
|
|
* Contains the PHY management function pointers for a specific PHY
|
|
|
|
* make or model.
|
|
|
|
*/
|
|
|
|
struct phy_xlnx_gem_supported_dev {
|
|
|
|
uint32_t phy_id;
|
|
|
|
uint32_t phy_id_mask;
|
|
|
|
struct phy_xlnx_gem_api *api;
|
|
|
|
const char *identifier;
|
|
|
|
};
|
|
|
|
|
|
|
|
/* PHY identification function -> generic, not vendor-specific */
|
|
|
|
int phy_xlnx_gem_detect(const struct device *dev);
|
|
|
|
|
|
|
|
#endif /* _ZEPHYR_DRIVERS_ETHERNET_PHY_XLNX_GEM_H_ */
|