Skip to content

Commit c5fe7be

Browse files
maass-hamburgrobhancocksed
authored andcommitted
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 b977f87 commit c5fe7be

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
@@ -289,6 +289,8 @@ static int phy_mc_vsc8541_init(const struct device *dev)
289289

290290
data->active_page = -1;
291291

292+
k_mutex_init(&data->mutex);
293+
292294
/* Reset PHY */
293295
ret = phy_mc_vsc8541_reset(dev);
294296
if (ret < 0) {
@@ -366,8 +368,6 @@ static int phy_mc_vsc8541_link_cb_set(const struct device *dev, phy_callback_t c
366368
data->cb = cb;
367369
data->cb_data = user_data;
368370

369-
phy_mc_vsc8541_get_link(dev, &data->state);
370-
371371
data->cb(dev, &data->state, data->cb_data);
372372

373373
return 0;
@@ -427,22 +427,24 @@ static int phy_mc_vsc8541_read(const struct device *dev, uint16_t reg_addr, uint
427427
/* mask out lower byte */
428428
reg_addr &= 0x00ff;
429429

430+
k_mutex_lock(&dev_data->mutex, K_FOREVER);
431+
430432
/* select page, given by register upper byte */
431433
if (dev_data->active_page != page) {
432434
ret = mdio_write(cfg->mdio_dev, cfg->addr, PHY_REG_PAGE_SELECTOR, (uint16_t)page);
433-
if (ret) {
434-
return ret;
435+
if (ret < 0) {
436+
goto read_end;
435437
}
436438
dev_data->active_page = (int)page;
437439
}
438440

439441
/* select register, given by register lower byte */
440442
ret = mdio_read(cfg->mdio_dev, cfg->addr, reg_addr, (uint16_t *)data);
441-
if (ret) {
442-
return ret;
443-
}
444443

445-
return 0;
444+
read_end:
445+
k_mutex_unlock(&dev_data->mutex);
446+
447+
return ret;
446448
}
447449

448450
/**
@@ -465,22 +467,24 @@ static int phy_mc_vsc8541_write(const struct device *dev, uint16_t reg_addr, uin
465467
/* mask out lower byte */
466468
reg_addr &= 0x00ff;
467469

470+
k_mutex_lock(&dev_data->mutex, K_FOREVER);
471+
468472
/* select page, given by register upper byte */
469473
if (dev_data->active_page != page) {
470474
ret = mdio_write(cfg->mdio_dev, cfg->addr, PHY_REG_PAGE_SELECTOR, (uint16_t)page);
471-
if (ret) {
472-
return ret;
475+
if (ret < 0) {
476+
goto write_end;
473477
}
474478
dev_data->active_page = (int)page;
475479
}
476480

477481
/* write register, given by lower byte */
478482
ret = mdio_write(cfg->mdio_dev, cfg->addr, reg_addr, (uint16_t)data);
479-
if (ret) {
480-
return ret;
481-
}
482483

483-
return 0;
484+
write_end:
485+
k_mutex_unlock(&dev_data->mutex);
486+
487+
return ret;
484488
}
485489

486490
static DEVICE_API(ethphy, mc_vsc8541_phy_api) = {

0 commit comments

Comments
 (0)