Skip to content

Commit a762fa7

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 cb5e167 commit a762fa7

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
@@ -336,6 +336,28 @@ static int phy_mchp_ksz9131_cfg_link(const struct device *dev, enum phy_link_spe
336336
goto done;
337337
}
338338

339+
ret = ksz9131_read(dev, MII_1KTCR, &c1kt);
340+
if (ret < 0) {
341+
goto done;
342+
}
343+
344+
if (adv_speeds & LINK_FULL_1000BASE) {
345+
c1kt |= MII_ADVERTISE_1000_FULL;
346+
} else {
347+
c1kt &= ~MII_ADVERTISE_1000_FULL;
348+
}
349+
350+
if (adv_speeds & LINK_HALF_1000BASE) {
351+
c1kt |= MII_ADVERTISE_1000_HALF;
352+
} else {
353+
c1kt &= ~MII_ADVERTISE_1000_HALF;
354+
}
355+
356+
ret = ksz9131_write(dev, MII_1KTCR, c1kt);
357+
if (ret < 0) {
358+
goto done;
359+
}
360+
339361
ret = phy_mchp_ksz9131_autonegotiate(dev);
340362
done:
341363
k_sem_give(&data->sem);
@@ -352,6 +374,36 @@ static int phy_mchp_ksz9131_cfg_link(const struct device *dev, enum phy_link_spe
352374
return ret;
353375
}
354376

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

426+
if (phy_mchp_ksz9131_gigabit(dev, &state->speed, &ret)) {
427+
goto done;
428+
}
429+
374430
/* Read currently configured advertising options */
375431
ret = ksz9131_read(dev, MII_ANAR, &anar);
376432
if (ret < 0) {

0 commit comments

Comments
 (0)