Skip to content

Commit a2640e1

Browse files
committed
drivers: ethernet: phy: ksz9131: add getting status for gigabit mode
Read gigabit status from Master Slave Status Register. Signed-off-by: Tony Han <tony.han@microchip.com>
1 parent dc8ed73 commit a2640e1

File tree

1 file changed

+56
-0
lines changed

1 file changed

+56
-0
lines changed

drivers/ethernet/phy/phy_microchip_ksz9131.c

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -339,6 +339,28 @@ static int phy_mchp_ksz9131_cfg_link(const struct device *dev, enum phy_link_spe
339339
goto done;
340340
}
341341

342+
ret = ksz9131_read(dev, MII_1KTCR, &c1kt);
343+
if (ret < 0) {
344+
goto done;
345+
}
346+
347+
if (adv_speeds & LINK_FULL_1000BASE) {
348+
c1kt |= MII_ADVERTISE_1000_FULL;
349+
} else {
350+
c1kt &= ~MII_ADVERTISE_1000_FULL;
351+
}
352+
353+
if (adv_speeds & LINK_HALF_1000BASE) {
354+
c1kt |= MII_ADVERTISE_1000_HALF;
355+
} else {
356+
c1kt &= ~MII_ADVERTISE_1000_HALF;
357+
}
358+
359+
ret = ksz9131_write(dev, MII_1KTCR, c1kt);
360+
if (ret < 0) {
361+
goto done;
362+
}
363+
342364
ret = phy_mchp_ksz9131_autonegotiate(dev);
343365
done:
344366
k_sem_give(&data->sem);
@@ -355,6 +377,36 @@ static int phy_mchp_ksz9131_cfg_link(const struct device *dev, enum phy_link_spe
355377
return ret;
356378
}
357379

380+
static bool phy_mchp_ksz9131_gigabit(const struct device *dev, enum phy_link_speed *speed, int *ret)
381+
{
382+
uint16_t mutual_capabilities = 0;
383+
uint16_t mscr = 0;
384+
uint16_t mssr = 0;
385+
386+
/* Read AUTO-NEGOTIATION MASTER SLAVE CONTROL REGISTER */
387+
*ret = ksz9131_read(dev, MII_1KTCR, &mscr);
388+
if (*ret < 0) {
389+
return true;
390+
}
391+
392+
/* Read AUTO-NEGOTIATION MASTER SLAVE STATUS REGISTER */
393+
*ret = ksz9131_read(dev, MII_1KSTSR, &mssr);
394+
if (*ret < 0) {
395+
return true;
396+
}
397+
398+
mutual_capabilities = mscr & (mssr >> 2);
399+
if (mutual_capabilities & MII_ADVERTISE_1000_FULL) {
400+
*speed = LINK_FULL_1000BASE;
401+
return true;
402+
} else if (mutual_capabilities & MII_ADVERTISE_1000_HALF) {
403+
*speed = LINK_HALF_1000BASE;
404+
return true;
405+
}
406+
407+
return false;
408+
}
409+
358410
static int phy_mchp_ksz9131_get_link(const struct device *dev, struct phy_link_state *state)
359411
{
360412
const struct mchp_ksz9131_config *config = dev->config;
@@ -374,6 +426,10 @@ static int phy_mchp_ksz9131_get_link(const struct device *dev, struct phy_link_s
374426
goto done;
375427
}
376428

429+
if (phy_mchp_ksz9131_gigabit(dev, &state->speed, &ret)) {
430+
goto done;
431+
}
432+
377433
/* Read currently configured advertising options */
378434
ret = ksz9131_read(dev, MII_ANAR, &anar);
379435
if (ret < 0) {

0 commit comments

Comments
 (0)