amd-xgbe: Move the PHY support into amd-xgbe
The AMD XGBE device is intended to work with a specific integrated PHY and that PHY is not meant to be a standalone PHY for use by other devices. As such this patch removes the phylib driver and implements the PHY support in the amd-xgbe driver (the majority of the logic from the phylib driver is moved into the amd-xgbe driver). Update the driver version to 1.0.1. Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
7d9ca345b5
commit
7c12aa0877
@@ -129,7 +129,7 @@
|
||||
#include <net/dcbnl.h>
|
||||
|
||||
#define XGBE_DRV_NAME "amd-xgbe"
|
||||
#define XGBE_DRV_VERSION "1.0.0-a"
|
||||
#define XGBE_DRV_VERSION "1.0.1"
|
||||
#define XGBE_DRV_DESC "AMD 10 Gigabit Ethernet Driver"
|
||||
|
||||
/* Descriptor related defines */
|
||||
@@ -178,14 +178,17 @@
|
||||
#define XGMAC_JUMBO_PACKET_MTU 9000
|
||||
#define XGMAC_MAX_JUMBO_PACKET 9018
|
||||
|
||||
/* MDIO bus phy name */
|
||||
#define XGBE_PHY_NAME "amd_xgbe_phy"
|
||||
#define XGBE_PRTAD 0
|
||||
|
||||
/* Common property names */
|
||||
#define XGBE_MAC_ADDR_PROPERTY "mac-address"
|
||||
#define XGBE_PHY_MODE_PROPERTY "phy-mode"
|
||||
#define XGBE_DMA_IRQS_PROPERTY "amd,per-channel-interrupt"
|
||||
#define XGBE_SPEEDSET_PROPERTY "amd,speed-set"
|
||||
#define XGBE_BLWC_PROPERTY "amd,serdes-blwc"
|
||||
#define XGBE_CDR_RATE_PROPERTY "amd,serdes-cdr-rate"
|
||||
#define XGBE_PQ_SKEW_PROPERTY "amd,serdes-pq-skew"
|
||||
#define XGBE_TX_AMP_PROPERTY "amd,serdes-tx-amp"
|
||||
#define XGBE_DFE_CFG_PROPERTY "amd,serdes-dfe-tap-config"
|
||||
#define XGBE_DFE_ENA_PROPERTY "amd,serdes-dfe-tap-enable"
|
||||
|
||||
/* Device-tree clock names */
|
||||
#define XGBE_DMA_CLOCK "dma_clk"
|
||||
@@ -241,6 +244,49 @@
|
||||
#define XGBE_RSS_LOOKUP_TABLE_TYPE 0
|
||||
#define XGBE_RSS_HASH_KEY_TYPE 1
|
||||
|
||||
/* Auto-negotiation */
|
||||
#define XGBE_AN_MS_TIMEOUT 500
|
||||
#define XGBE_LINK_TIMEOUT 10
|
||||
|
||||
#define XGBE_AN_INT_CMPLT 0x01
|
||||
#define XGBE_AN_INC_LINK 0x02
|
||||
#define XGBE_AN_PG_RCV 0x04
|
||||
#define XGBE_AN_INT_MASK 0x07
|
||||
|
||||
/* Rate-change complete wait/retry count */
|
||||
#define XGBE_RATECHANGE_COUNT 500
|
||||
|
||||
/* Default SerDes settings */
|
||||
#define XGBE_SPEED_10000_BLWC 0
|
||||
#define XGBE_SPEED_10000_CDR 0x7
|
||||
#define XGBE_SPEED_10000_PLL 0x1
|
||||
#define XGBE_SPEED_10000_PQ 0x12
|
||||
#define XGBE_SPEED_10000_RATE 0x0
|
||||
#define XGBE_SPEED_10000_TXAMP 0xa
|
||||
#define XGBE_SPEED_10000_WORD 0x7
|
||||
#define XGBE_SPEED_10000_DFE_TAP_CONFIG 0x1
|
||||
#define XGBE_SPEED_10000_DFE_TAP_ENABLE 0x7f
|
||||
|
||||
#define XGBE_SPEED_2500_BLWC 1
|
||||
#define XGBE_SPEED_2500_CDR 0x2
|
||||
#define XGBE_SPEED_2500_PLL 0x0
|
||||
#define XGBE_SPEED_2500_PQ 0xa
|
||||
#define XGBE_SPEED_2500_RATE 0x1
|
||||
#define XGBE_SPEED_2500_TXAMP 0xf
|
||||
#define XGBE_SPEED_2500_WORD 0x1
|
||||
#define XGBE_SPEED_2500_DFE_TAP_CONFIG 0x3
|
||||
#define XGBE_SPEED_2500_DFE_TAP_ENABLE 0x0
|
||||
|
||||
#define XGBE_SPEED_1000_BLWC 1
|
||||
#define XGBE_SPEED_1000_CDR 0x2
|
||||
#define XGBE_SPEED_1000_PLL 0x0
|
||||
#define XGBE_SPEED_1000_PQ 0xa
|
||||
#define XGBE_SPEED_1000_RATE 0x3
|
||||
#define XGBE_SPEED_1000_TXAMP 0xf
|
||||
#define XGBE_SPEED_1000_WORD 0x1
|
||||
#define XGBE_SPEED_1000_DFE_TAP_CONFIG 0x3
|
||||
#define XGBE_SPEED_1000_DFE_TAP_ENABLE 0x0
|
||||
|
||||
struct xgbe_prv_data;
|
||||
|
||||
struct xgbe_packet_data {
|
||||
@@ -412,6 +458,13 @@ struct xgbe_channel {
|
||||
struct xgbe_ring *rx_ring;
|
||||
} ____cacheline_aligned;
|
||||
|
||||
enum xgbe_state {
|
||||
XGBE_DOWN,
|
||||
XGBE_LINK,
|
||||
XGBE_LINK_INIT,
|
||||
XGBE_LINK_ERR,
|
||||
};
|
||||
|
||||
enum xgbe_int {
|
||||
XGMAC_INT_DMA_CH_SR_TI,
|
||||
XGMAC_INT_DMA_CH_SR_TPS,
|
||||
@@ -443,6 +496,55 @@ enum xgbe_mtl_fifo_size {
|
||||
XGMAC_MTL_FIFO_SIZE_256K = 0x3ff,
|
||||
};
|
||||
|
||||
enum xgbe_speed {
|
||||
XGBE_SPEED_1000 = 0,
|
||||
XGBE_SPEED_2500,
|
||||
XGBE_SPEED_10000,
|
||||
XGBE_SPEEDS,
|
||||
};
|
||||
|
||||
enum xgbe_an {
|
||||
XGBE_AN_READY = 0,
|
||||
XGBE_AN_PAGE_RECEIVED,
|
||||
XGBE_AN_INCOMPAT_LINK,
|
||||
XGBE_AN_COMPLETE,
|
||||
XGBE_AN_NO_LINK,
|
||||
XGBE_AN_ERROR,
|
||||
};
|
||||
|
||||
enum xgbe_rx {
|
||||
XGBE_RX_BPA = 0,
|
||||
XGBE_RX_XNP,
|
||||
XGBE_RX_COMPLETE,
|
||||
XGBE_RX_ERROR,
|
||||
};
|
||||
|
||||
enum xgbe_mode {
|
||||
XGBE_MODE_KR = 0,
|
||||
XGBE_MODE_KX,
|
||||
};
|
||||
|
||||
enum xgbe_speedset {
|
||||
XGBE_SPEEDSET_1000_10000 = 0,
|
||||
XGBE_SPEEDSET_2500_10000,
|
||||
};
|
||||
|
||||
struct xgbe_phy {
|
||||
u32 supported;
|
||||
u32 advertising;
|
||||
u32 lp_advertising;
|
||||
|
||||
int address;
|
||||
|
||||
int autoneg;
|
||||
int speed;
|
||||
int duplex;
|
||||
int pause;
|
||||
int asym_pause;
|
||||
|
||||
int link;
|
||||
};
|
||||
|
||||
struct xgbe_mmc_stats {
|
||||
/* Tx Stats */
|
||||
u64 txoctetcount_gb;
|
||||
@@ -594,6 +696,20 @@ struct xgbe_hw_if {
|
||||
int (*set_rss_lookup_table)(struct xgbe_prv_data *, const u32 *);
|
||||
};
|
||||
|
||||
struct xgbe_phy_if {
|
||||
/* For initial PHY setup */
|
||||
void (*phy_init)(struct xgbe_prv_data *);
|
||||
|
||||
/* For PHY support when setting device up/down */
|
||||
int (*phy_reset)(struct xgbe_prv_data *);
|
||||
int (*phy_start)(struct xgbe_prv_data *);
|
||||
void (*phy_stop)(struct xgbe_prv_data *);
|
||||
|
||||
/* For PHY support while device is up */
|
||||
void (*phy_status)(struct xgbe_prv_data *);
|
||||
int (*phy_config_aneg)(struct xgbe_prv_data *);
|
||||
};
|
||||
|
||||
struct xgbe_desc_if {
|
||||
int (*alloc_ring_resources)(struct xgbe_prv_data *);
|
||||
void (*free_ring_resources)(struct xgbe_prv_data *);
|
||||
@@ -663,6 +779,9 @@ struct xgbe_prv_data {
|
||||
/* XGMAC/XPCS related mmio registers */
|
||||
void __iomem *xgmac_regs; /* XGMAC CSRs */
|
||||
void __iomem *xpcs_regs; /* XPCS MMD registers */
|
||||
void __iomem *rxtx_regs; /* SerDes Rx/Tx CSRs */
|
||||
void __iomem *sir0_regs; /* SerDes integration registers (1/2) */
|
||||
void __iomem *sir1_regs; /* SerDes integration registers (2/2) */
|
||||
|
||||
/* Overall device lock */
|
||||
spinlock_t lock;
|
||||
@@ -673,10 +792,14 @@ struct xgbe_prv_data {
|
||||
/* RSS addressing mutex */
|
||||
struct mutex rss_mutex;
|
||||
|
||||
/* Flags representing xgbe_state */
|
||||
unsigned long dev_state;
|
||||
|
||||
int dev_irq;
|
||||
unsigned int per_channel_irq;
|
||||
|
||||
struct xgbe_hw_if hw_if;
|
||||
struct xgbe_phy_if phy_if;
|
||||
struct xgbe_desc_if desc_if;
|
||||
|
||||
/* AXI DMA settings */
|
||||
@@ -685,6 +808,11 @@ struct xgbe_prv_data {
|
||||
unsigned int arcache;
|
||||
unsigned int awcache;
|
||||
|
||||
/* Service routine support */
|
||||
struct workqueue_struct *dev_workqueue;
|
||||
struct work_struct service_work;
|
||||
struct timer_list service_timer;
|
||||
|
||||
/* Rings for Tx/Rx on a DMA channel */
|
||||
struct xgbe_channel *channel;
|
||||
unsigned int channel_count;
|
||||
@@ -732,22 +860,6 @@ struct xgbe_prv_data {
|
||||
u32 rss_table[XGBE_RSS_MAX_TABLE_SIZE];
|
||||
u32 rss_options;
|
||||
|
||||
/* MDIO settings */
|
||||
struct module *phy_module;
|
||||
char *mii_bus_id;
|
||||
struct mii_bus *mii;
|
||||
int mdio_mmd;
|
||||
struct phy_device *phydev;
|
||||
int default_autoneg;
|
||||
int default_speed;
|
||||
|
||||
/* Current PHY settings */
|
||||
phy_interface_t phy_mode;
|
||||
int phy_link;
|
||||
int phy_speed;
|
||||
unsigned int phy_tx_pause;
|
||||
unsigned int phy_rx_pause;
|
||||
|
||||
/* Netdev related settings */
|
||||
unsigned char mac_addr[ETH_ALEN];
|
||||
netdev_features_t netdev_features;
|
||||
@@ -794,6 +906,53 @@ struct xgbe_prv_data {
|
||||
/* Network interface message level setting */
|
||||
u32 msg_enable;
|
||||
|
||||
/* Current PHY settings */
|
||||
phy_interface_t phy_mode;
|
||||
int phy_link;
|
||||
int phy_speed;
|
||||
unsigned int phy_tx_pause;
|
||||
unsigned int phy_rx_pause;
|
||||
|
||||
/* MDIO/PHY related settings */
|
||||
struct xgbe_phy phy;
|
||||
int mdio_mmd;
|
||||
unsigned long link_check;
|
||||
|
||||
char an_name[IFNAMSIZ + 32];
|
||||
struct workqueue_struct *an_workqueue;
|
||||
|
||||
int an_irq;
|
||||
struct work_struct an_irq_work;
|
||||
|
||||
unsigned int speed_set;
|
||||
|
||||
/* SerDes UEFI configurable settings.
|
||||
* Switching between modes/speeds requires new values for some
|
||||
* SerDes settings. The values can be supplied as device
|
||||
* properties in array format. The first array entry is for
|
||||
* 1GbE, second for 2.5GbE and third for 10GbE
|
||||
*/
|
||||
u32 serdes_blwc[XGBE_SPEEDS];
|
||||
u32 serdes_cdr_rate[XGBE_SPEEDS];
|
||||
u32 serdes_pq_skew[XGBE_SPEEDS];
|
||||
u32 serdes_tx_amp[XGBE_SPEEDS];
|
||||
u32 serdes_dfe_tap_cfg[XGBE_SPEEDS];
|
||||
u32 serdes_dfe_tap_ena[XGBE_SPEEDS];
|
||||
|
||||
/* Auto-negotiation state machine support */
|
||||
struct mutex an_mutex;
|
||||
enum xgbe_an an_result;
|
||||
enum xgbe_an an_state;
|
||||
enum xgbe_rx kr_state;
|
||||
enum xgbe_rx kx_state;
|
||||
struct work_struct an_work;
|
||||
unsigned int an_supported;
|
||||
unsigned int parallel_detect;
|
||||
unsigned int fec_ability;
|
||||
unsigned long an_start;
|
||||
|
||||
unsigned int lpm_ctrl; /* CTRL1 for resume */
|
||||
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
struct dentry *xgbe_debugfs;
|
||||
|
||||
@@ -807,6 +966,7 @@ struct xgbe_prv_data {
|
||||
/* Function prototypes*/
|
||||
|
||||
void xgbe_init_function_ptrs_dev(struct xgbe_hw_if *);
|
||||
void xgbe_init_function_ptrs_phy(struct xgbe_phy_if *);
|
||||
void xgbe_init_function_ptrs_desc(struct xgbe_desc_if *);
|
||||
struct net_device_ops *xgbe_get_netdev_ops(void);
|
||||
struct ethtool_ops *xgbe_get_ethtool_ops(void);
|
||||
@@ -814,9 +974,6 @@ struct ethtool_ops *xgbe_get_ethtool_ops(void);
|
||||
const struct dcbnl_rtnl_ops *xgbe_get_dcbnl_ops(void);
|
||||
#endif
|
||||
|
||||
int xgbe_mdio_register(struct xgbe_prv_data *);
|
||||
void xgbe_mdio_unregister(struct xgbe_prv_data *);
|
||||
void xgbe_dump_phy_registers(struct xgbe_prv_data *);
|
||||
void xgbe_ptp_register(struct xgbe_prv_data *);
|
||||
void xgbe_ptp_unregister(struct xgbe_prv_data *);
|
||||
void xgbe_dump_tx_desc(struct xgbe_prv_data *, struct xgbe_ring *,
|
||||
|
Reference in New Issue
Block a user