Skip to content

Commit dda4d30

Browse files
committed
drivers: ethernet: phy: microchip_vsc8541: use mutex
use mutex to protect page register phy_mc_vsc8541_get_link got removed from phy_mc_vsc8541_link_cb_set so, that phy_mc_vsc8541_link_monitor (own thread) is the only one to change data->state Signed-off-by: Fin Maaß <f.maass@vogl-electronic.com>
1 parent 04dd670 commit dda4d30

File tree

1 file changed

+18
-14
lines changed

1 file changed

+18
-14
lines changed

drivers/ethernet/phy/phy_microchip_vsc8541.c

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,8 @@ static int phy_mc_vsc8541_init(const struct device *dev)
291291

292292
data->active_page = -1;
293293

294+
k_mutex_init(&data->mutex);
295+
294296
/* Reset PHY */
295297
ret = phy_mc_vsc8541_reset(dev);
296298
if (ret < 0) {
@@ -370,8 +372,6 @@ static int phy_mc_vsc8541_link_cb_set(const struct device *dev, phy_callback_t c
370372
data->cb = cb;
371373
data->cb_data = user_data;
372374

373-
phy_mc_vsc8541_get_link(dev, &data->state);
374-
375375
data->cb(dev, &data->state, data->cb_data);
376376

377377
return 0;
@@ -431,22 +431,24 @@ static int phy_mc_vsc8541_read(const struct device *dev, uint16_t reg_addr, uint
431431
/* mask out lower byte */
432432
reg_addr &= 0x00ff;
433433

434+
k_mutex_lock(&dev_data->mutex, K_FOREVER);
435+
434436
/* select page, given by register upper byte */
435437
if (dev_data->active_page != page) {
436438
ret = mdio_write(cfg->mdio_dev, cfg->addr, PHY_REG_PAGE_SELECTOR, (uint16_t)page);
437-
if (ret) {
438-
return ret;
439+
if (ret < 0) {
440+
goto read_end;
439441
}
440442
dev_data->active_page = (int)page;
441443
}
442444

443445
/* select register, given by register lower byte */
444446
ret = mdio_read(cfg->mdio_dev, cfg->addr, reg_addr, (uint16_t *)data);
445-
if (ret) {
446-
return ret;
447-
}
448447

449-
return 0;
448+
read_end:
449+
k_mutex_unlock(&dev_data->mutex);
450+
451+
return ret;
450452
}
451453

452454
/**
@@ -469,22 +471,24 @@ static int phy_mc_vsc8541_write(const struct device *dev, uint16_t reg_addr, uin
469471
/* mask out lower byte */
470472
reg_addr &= 0x00ff;
471473

474+
k_mutex_lock(&dev_data->mutex, K_FOREVER);
475+
472476
/* select page, given by register upper byte */
473477
if (dev_data->active_page != page) {
474478
ret = mdio_write(cfg->mdio_dev, cfg->addr, PHY_REG_PAGE_SELECTOR, (uint16_t)page);
475-
if (ret) {
476-
return ret;
479+
if (ret < 0) {
480+
goto write_end;
477481
}
478482
dev_data->active_page = (int)page;
479483
}
480484

481485
/* write register, given by lower byte */
482486
ret = mdio_write(cfg->mdio_dev, cfg->addr, reg_addr, (uint16_t)data);
483-
if (ret) {
484-
return ret;
485-
}
486487

487-
return 0;
488+
write_end:
489+
k_mutex_unlock(&dev_data->mutex);
490+
491+
return ret;
488492
}
489493

490494
static DEVICE_API(ethphy, mc_vsc8541_phy_api) = {

0 commit comments

Comments
 (0)