@@ -339,6 +339,28 @@ static int phy_mchp_ksz9131_cfg_link(const struct device *dev, enum phy_link_spe
339
339
goto done ;
340
340
}
341
341
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
+
342
364
ret = phy_mchp_ksz9131_autonegotiate (dev );
343
365
done :
344
366
k_sem_give (& data -> sem );
@@ -355,6 +377,36 @@ static int phy_mchp_ksz9131_cfg_link(const struct device *dev, enum phy_link_spe
355
377
return ret ;
356
378
}
357
379
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
+
358
410
static int phy_mchp_ksz9131_get_link (const struct device * dev , struct phy_link_state * state )
359
411
{
360
412
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
374
426
goto done ;
375
427
}
376
428
429
+ if (phy_mchp_ksz9131_gigabit (dev , & state -> speed , & ret )) {
430
+ goto done ;
431
+ }
432
+
377
433
/* Read currently configured advertising options */
378
434
ret = ksz9131_read (dev , MII_ANAR , & anar );
379
435
if (ret < 0 ) {
0 commit comments