@@ -336,6 +336,28 @@ static int phy_mchp_ksz9131_cfg_link(const struct device *dev, enum phy_link_spe
336
336
goto done ;
337
337
}
338
338
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
+
339
361
ret = phy_mchp_ksz9131_autonegotiate (dev );
340
362
done :
341
363
k_sem_give (& data -> sem );
@@ -352,6 +374,36 @@ static int phy_mchp_ksz9131_cfg_link(const struct device *dev, enum phy_link_spe
352
374
return ret ;
353
375
}
354
376
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
+
355
407
static int phy_mchp_ksz9131_get_link (const struct device * dev , struct phy_link_state * state )
356
408
{
357
409
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
371
423
goto done ;
372
424
}
373
425
426
+ if (phy_mchp_ksz9131_gigabit (dev , & state -> speed , & ret )) {
427
+ goto done ;
428
+ }
429
+
374
430
/* Read currently configured advertising options */
375
431
ret = ksz9131_read (dev , MII_ANAR , & anar );
376
432
if (ret < 0 ) {
0 commit comments