Skip to content

Commit 3f66f0b

Browse files
decsnycfriedt
authored andcommitted
drivers: ksz8081: Fix fault on boot in handler thread
Issue was that the gpio interrupt was happening before the work item was initialized, and then trying to schedule it, resulting null pointer dereference and fault occurring. Signed-off-by: Declan Snyder <declan.snyder@nxp.com>
1 parent 57312ac commit 3f66f0b

File tree

1 file changed

+13
-6
lines changed

1 file changed

+13
-6
lines changed

drivers/ethernet/phy/phy_microchip_ksz8081.c

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ struct mc_ksz8081_config {
6161
#define KSZ8081_DO_AUTONEG_FLAG BIT(0)
6262
#define KSZ8081_SILENCE_DEBUG_LOGS BIT(1)
6363
#define KSZ8081_LINK_STATE_VALID BIT(2)
64+
#define KSZ8081_INITIALIZED BIT(3)
6465

6566
#define USING_INTERRUPT_GPIO \
6667
UTIL_OR(DT_ALL_INST_HAS_PROP_STATUS_OKAY(int_gpios), \
@@ -183,7 +184,11 @@ static void phy_mc_ksz8081_interrupt_handler(const struct device *port, struct g
183184
gpio_port_pins_t pins)
184185
{
185186
struct mc_ksz8081_data *data = CONTAINER_OF(cb, struct mc_ksz8081_data, gpio_callback);
186-
int ret = k_work_reschedule(&data->phy_monitor_work, K_NO_WAIT);
187+
int ret = -ESRCH;
188+
189+
if (data->flags & KSZ8081_INITIALIZED) {
190+
ret = k_work_reschedule(&data->phy_monitor_work, K_NO_WAIT);
191+
}
187192

188193
if (ret < 0) {
189194
LOG_ERR("Failed to schedule monitor_work from ISR");
@@ -689,17 +694,19 @@ static int phy_mc_ksz8081_init(const struct device *dev)
689694
return ret;
690695
}
691696

692-
ret = ksz8081_init_int_gpios(dev);
693-
if (ret < 0) {
694-
return ret;
695-
}
696-
697697
k_work_init_delayable(&data->phy_monitor_work,
698698
phy_mc_ksz8081_monitor_work_handler);
699699

700700
/* Advertise default speeds */
701701
phy_mc_ksz8081_cfg_link(dev, config->default_speeds, 0);
702702

703+
ret = ksz8081_init_int_gpios(dev);
704+
if (ret < 0) {
705+
return ret;
706+
}
707+
708+
data->flags |= KSZ8081_INITIALIZED;
709+
703710
return 0;
704711
}
705712

0 commit comments

Comments
 (0)