Changeset View
Changeset View
Standalone View
Standalone View
sys/dev/axgbe/xgbe-phy-v2.c
Show First 20 Lines • Show All 207 Lines • ▼ Show 20 Lines | |||||
/* SFP Serial ID Base ID values relative to an offset of 0 */ | /* SFP Serial ID Base ID values relative to an offset of 0 */ | ||||
#define XGBE_SFP_BASE_ID 0 | #define XGBE_SFP_BASE_ID 0 | ||||
#define XGBE_SFP_ID_SFP 0x03 | #define XGBE_SFP_ID_SFP 0x03 | ||||
#define XGBE_SFP_BASE_EXT_ID 1 | #define XGBE_SFP_BASE_EXT_ID 1 | ||||
#define XGBE_SFP_EXT_ID_SFP 0x04 | #define XGBE_SFP_EXT_ID_SFP 0x04 | ||||
#define XGBE_SFP_BASE_CV 2 | |||||
#define XGBE_SFP_BASE_CV_CP 0x21 | |||||
#define XGBE_SFP_BASE_10GBE_CC 3 | #define XGBE_SFP_BASE_10GBE_CC 3 | ||||
#define XGBE_SFP_BASE_10GBE_CC_SR BIT(4) | #define XGBE_SFP_BASE_10GBE_CC_SR BIT(4) | ||||
#define XGBE_SFP_BASE_10GBE_CC_LR BIT(5) | #define XGBE_SFP_BASE_10GBE_CC_LR BIT(5) | ||||
#define XGBE_SFP_BASE_10GBE_CC_LRM BIT(6) | #define XGBE_SFP_BASE_10GBE_CC_LRM BIT(6) | ||||
#define XGBE_SFP_BASE_10GBE_CC_ER BIT(7) | #define XGBE_SFP_BASE_10GBE_CC_ER BIT(7) | ||||
#define XGBE_SFP_BASE_1GBE_CC 6 | #define XGBE_SFP_BASE_1GBE_CC 6 | ||||
#define XGBE_SFP_BASE_1GBE_CC_SX BIT(0) | #define XGBE_SFP_BASE_1GBE_CC_SX BIT(0) | ||||
▲ Show 20 Lines • Show All 151 Lines • ▼ Show 20 Lines | struct xgbe_phy_data { | ||||
/* KR AN support */ | /* KR AN support */ | ||||
unsigned int phy_cdr_notrack; | unsigned int phy_cdr_notrack; | ||||
unsigned int phy_cdr_delay; | unsigned int phy_cdr_delay; | ||||
uint8_t port_sfp_inputs; | uint8_t port_sfp_inputs; | ||||
}; | }; | ||||
static enum xgbe_an_mode xgbe_phy_an_mode(struct xgbe_prv_data *pdata); | static enum xgbe_an_mode xgbe_phy_an_mode(struct xgbe_prv_data *pdata); | ||||
static int xgbe_phy_reset(struct xgbe_prv_data *pdata); | |||||
static int | static int | ||||
xgbe_phy_i2c_xfer(struct xgbe_prv_data *pdata, struct xgbe_i2c_op *i2c_op) | xgbe_phy_i2c_xfer(struct xgbe_prv_data *pdata, struct xgbe_i2c_op *i2c_op) | ||||
{ | { | ||||
return (pdata->i2c_if.i2c_xfer(pdata, i2c_op)); | return (pdata->i2c_if.i2c_xfer(pdata, i2c_op)); | ||||
} | } | ||||
static int | static int | ||||
▲ Show 20 Lines • Show All 813 Lines • ▼ Show 20 Lines | xgbe_phy_sfp_parse_eeprom(struct xgbe_prv_data *pdata) | ||||
/* Assume ACTIVE cable unless told it is PASSIVE */ | /* Assume ACTIVE cable unless told it is PASSIVE */ | ||||
if (sfp_base[XGBE_SFP_BASE_CABLE] & XGBE_SFP_BASE_CABLE_PASSIVE) { | if (sfp_base[XGBE_SFP_BASE_CABLE] & XGBE_SFP_BASE_CABLE_PASSIVE) { | ||||
phy_data->sfp_cable = XGBE_SFP_CABLE_PASSIVE; | phy_data->sfp_cable = XGBE_SFP_CABLE_PASSIVE; | ||||
phy_data->sfp_cable_len = sfp_base[XGBE_SFP_BASE_CU_CABLE_LEN]; | phy_data->sfp_cable_len = sfp_base[XGBE_SFP_BASE_CU_CABLE_LEN]; | ||||
} else | } else | ||||
phy_data->sfp_cable = XGBE_SFP_CABLE_ACTIVE; | phy_data->sfp_cable = XGBE_SFP_CABLE_ACTIVE; | ||||
/* Determine the type of SFP */ | /* | ||||
if (sfp_base[XGBE_SFP_BASE_10GBE_CC] & XGBE_SFP_BASE_10GBE_CC_SR) | * Determine the type of SFP. Certain 10G SFP+ modules read as | ||||
* 1000BASE-CX. To prevent 10G DAC cables to be recognized as | |||||
* 1G, we first check if it is a DAC and the bitrate is 10G. | |||||
*/ | |||||
if (((sfp_base[XGBE_SFP_BASE_CV] & XGBE_SFP_BASE_CV_CP) || | |||||
(phy_data->sfp_cable == XGBE_SFP_CABLE_PASSIVE)) && | |||||
xgbe_phy_sfp_bit_rate(sfp_eeprom, XGBE_SFP_SPEED_10000)) | |||||
phy_data->sfp_base = XGBE_SFP_BASE_10000_CR; | |||||
else if (sfp_base[XGBE_SFP_BASE_10GBE_CC] & XGBE_SFP_BASE_10GBE_CC_SR) | |||||
phy_data->sfp_base = XGBE_SFP_BASE_10000_SR; | phy_data->sfp_base = XGBE_SFP_BASE_10000_SR; | ||||
else if (sfp_base[XGBE_SFP_BASE_10GBE_CC] & XGBE_SFP_BASE_10GBE_CC_LR) | else if (sfp_base[XGBE_SFP_BASE_10GBE_CC] & XGBE_SFP_BASE_10GBE_CC_LR) | ||||
phy_data->sfp_base = XGBE_SFP_BASE_10000_LR; | phy_data->sfp_base = XGBE_SFP_BASE_10000_LR; | ||||
else if (sfp_base[XGBE_SFP_BASE_10GBE_CC] & XGBE_SFP_BASE_10GBE_CC_LRM) | else if (sfp_base[XGBE_SFP_BASE_10GBE_CC] & XGBE_SFP_BASE_10GBE_CC_LRM) | ||||
phy_data->sfp_base = XGBE_SFP_BASE_10000_LRM; | phy_data->sfp_base = XGBE_SFP_BASE_10000_LRM; | ||||
else if (sfp_base[XGBE_SFP_BASE_10GBE_CC] & XGBE_SFP_BASE_10GBE_CC_ER) | else if (sfp_base[XGBE_SFP_BASE_10GBE_CC] & XGBE_SFP_BASE_10GBE_CC_ER) | ||||
phy_data->sfp_base = XGBE_SFP_BASE_10000_ER; | phy_data->sfp_base = XGBE_SFP_BASE_10000_ER; | ||||
else if (sfp_base[XGBE_SFP_BASE_1GBE_CC] & XGBE_SFP_BASE_1GBE_CC_SX) | else if (sfp_base[XGBE_SFP_BASE_1GBE_CC] & XGBE_SFP_BASE_1GBE_CC_SX) | ||||
phy_data->sfp_base = XGBE_SFP_BASE_1000_SX; | phy_data->sfp_base = XGBE_SFP_BASE_1000_SX; | ||||
else if (sfp_base[XGBE_SFP_BASE_1GBE_CC] & XGBE_SFP_BASE_1GBE_CC_LX) | else if (sfp_base[XGBE_SFP_BASE_1GBE_CC] & XGBE_SFP_BASE_1GBE_CC_LX) | ||||
phy_data->sfp_base = XGBE_SFP_BASE_1000_LX; | phy_data->sfp_base = XGBE_SFP_BASE_1000_LX; | ||||
else if (sfp_base[XGBE_SFP_BASE_1GBE_CC] & XGBE_SFP_BASE_1GBE_CC_CX) | else if (sfp_base[XGBE_SFP_BASE_1GBE_CC] & XGBE_SFP_BASE_1GBE_CC_CX) | ||||
phy_data->sfp_base = XGBE_SFP_BASE_1000_CX; | phy_data->sfp_base = XGBE_SFP_BASE_1000_CX; | ||||
else if (sfp_base[XGBE_SFP_BASE_1GBE_CC] & XGBE_SFP_BASE_1GBE_CC_T) | else if (sfp_base[XGBE_SFP_BASE_1GBE_CC] & XGBE_SFP_BASE_1GBE_CC_T) | ||||
phy_data->sfp_base = XGBE_SFP_BASE_1000_T; | phy_data->sfp_base = XGBE_SFP_BASE_1000_T; | ||||
else if ((phy_data->sfp_cable == XGBE_SFP_CABLE_PASSIVE) && | |||||
xgbe_phy_sfp_bit_rate(sfp_eeprom, XGBE_SFP_SPEED_10000)) | |||||
phy_data->sfp_base = XGBE_SFP_BASE_10000_CR; | |||||
switch (phy_data->sfp_base) { | switch (phy_data->sfp_base) { | ||||
case XGBE_SFP_BASE_1000_T: | case XGBE_SFP_BASE_1000_T: | ||||
phy_data->sfp_speed = XGBE_SFP_SPEED_100_1000; | phy_data->sfp_speed = XGBE_SFP_SPEED_100_1000; | ||||
break; | break; | ||||
case XGBE_SFP_BASE_1000_SX: | case XGBE_SFP_BASE_1000_SX: | ||||
case XGBE_SFP_BASE_1000_LX: | case XGBE_SFP_BASE_1000_LX: | ||||
case XGBE_SFP_BASE_1000_CX: | case XGBE_SFP_BASE_1000_CX: | ||||
▲ Show 20 Lines • Show All 1,634 Lines • ▼ Show 20 Lines | xgbe_phy_link_status(struct xgbe_prv_data *pdata, int *an_restart) | ||||
if (reg & MDIO_STAT1_LSTATUS) | if (reg & MDIO_STAT1_LSTATUS) | ||||
return (1); | return (1); | ||||
/* No link, attempt a receiver reset cycle */ | /* No link, attempt a receiver reset cycle */ | ||||
if (phy_data->rrc_count++ > XGBE_RRC_FREQUENCY) { | if (phy_data->rrc_count++ > XGBE_RRC_FREQUENCY) { | ||||
axgbe_printf(1, "ENTERED RRC: rrc_count: %d\n", | axgbe_printf(1, "ENTERED RRC: rrc_count: %d\n", | ||||
phy_data->rrc_count); | phy_data->rrc_count); | ||||
phy_data->rrc_count = 0; | phy_data->rrc_count = 0; | ||||
if (pdata->link_workaround) { | |||||
ret = xgbe_phy_reset(pdata); | |||||
if (ret) | |||||
axgbe_error("Error resetting phy\n"); | |||||
} else | |||||
xgbe_phy_rrc(pdata); | xgbe_phy_rrc(pdata); | ||||
} | } | ||||
return (0); | return (0); | ||||
} | } | ||||
static void | static void | ||||
xgbe_phy_sfp_gpio_setup(struct xgbe_prv_data *pdata) | xgbe_phy_sfp_gpio_setup(struct xgbe_prv_data *pdata) | ||||
{ | { | ||||
▲ Show 20 Lines • Show All 881 Lines • Show Last 20 Lines |