68 #define CFG_CHG_INTR_MASK (VSC_INTR_LINK_CHG | VSC_INTR_NEG_ERR | \
69 VSC_INTR_DPLX_CHG | VSC_INTR_SPD_CHG | \
71 #define INTR_MASK (CFG_CHG_INTR_MASK | VSC_INTR_TX_FIFO | VSC_INTR_RX_FIFO | \
75 #define S_ACSR_ACTIPHY_TMR 0
76 #define M_ACSR_ACTIPHY_TMR 0x3
77 #define V_ACSR_ACTIPHY_TMR(x) ((x) << S_ACSR_ACTIPHY_TMR)
79 #define S_ACSR_SPEED 3
80 #define M_ACSR_SPEED 0x3
81 #define G_ACSR_SPEED(x) (((x) >> S_ACSR_SPEED) & M_ACSR_SPEED)
83 #define S_ACSR_DUPLEX 5
84 #define F_ACSR_DUPLEX (1 << S_ACSR_DUPLEX)
86 #define S_ACSR_ACTIPHY 6
87 #define F_ACSR_ACTIPHY (1 << S_ACSR_ACTIPHY)
97 static int vsc8211_intr_enable(
struct cphy *
cphy)
103 static int vsc8211_intr_disable(
struct cphy *
cphy)
108 static int vsc8211_intr_clear(
struct cphy *
cphy)
116 static int vsc8211_autoneg_enable(
struct cphy *
cphy)
123 static int vsc8211_autoneg_restart(
struct cphy *
cphy)
130 static int vsc8211_get_link_status(
struct cphy *
cphy,
int *link_ok,
133 unsigned int bmcr,
status, lpa, adv;
188 else if ((lpa & ADVERTISE_PAUSE_CAP) &&
190 (adv & ADVERTISE_PAUSE_ASYM))
192 else if ((lpa & ADVERTISE_PAUSE_ASYM) &&
193 (adv & ADVERTISE_PAUSE_CAP))
206 static int vsc8211_get_link_status_fiber(
struct cphy *cphy,
int *link_ok,
207 int *speed,
int *duplex,
int *fc)
209 unsigned int bmcr,
status, lpa, adv;
210 int err, sp = -1, dplx = -1,
pause = 0;
223 if (!(status & BMSR_LSTATUS))
230 if (!(bmcr & BMCR_ANENABLE)) {
232 if (bmcr & BMCR_SPEED1000)
238 }
else if (status & BMSR_ANEGCOMPLETE) {
257 else if ((lpa & ADVERTISE_1000XPAUSE) &&
260 else if ((lpa & ADVERTISE_1000XPSE_ASYM) &&
261 (adv & ADVERTISE_1000XPAUSE))
278 static int vsc8211_set_automdi(
struct cphy *
phy,
int enable)
290 err = t3_mdio_write(phy,
MDIO_DEVAD_NONE, 17, enable ? 0x2803 : 0x3003);
305 int vsc8211_set_speed_duplex(
struct cphy *phy,
int speed,
int duplex)
311 err = vsc8211_set_automdi(phy, 1);
316 static int vsc8211_power_down(
struct cphy *cphy,
int enable)
322 static int vsc8211_intr_handler(
struct cphy *cphy)
325 int err, cphy_cause = 0;
339 static struct cphy_ops vsc8211_ops = {
340 .reset = vsc8211_reset,
341 .intr_enable = vsc8211_intr_enable,
342 .intr_disable = vsc8211_intr_disable,
343 .intr_clear = vsc8211_intr_clear,
344 .intr_handler = vsc8211_intr_handler,
345 .autoneg_enable = vsc8211_autoneg_enable,
346 .autoneg_restart = vsc8211_autoneg_restart,
349 .get_link_status = vsc8211_get_link_status,
350 .power_down = vsc8211_power_down,
353 static struct cphy_ops vsc8211_fiber_ops = {
354 .reset = vsc8211_reset,
355 .intr_enable = vsc8211_intr_enable,
356 .intr_disable = vsc8211_intr_disable,
357 .intr_clear = vsc8211_intr_clear,
358 .intr_handler = vsc8211_intr_handler,
359 .autoneg_enable = vsc8211_autoneg_enable,
360 .autoneg_restart = vsc8211_autoneg_restart,
363 .get_link_status = vsc8211_get_link_status_fiber,
364 .power_down = vsc8211_power_down,
373 cphy_init(phy, adapter, phy_addr, &vsc8211_ops, mdio_ops,
390 phy->
desc =
"1000BASE-X";
391 phy->
ops = &vsc8211_fiber_ops;
410 err = vsc8211_reset(phy, 0);