@@ -60,6 +60,7 @@ enum modem_cellular_state {
60
60
MODEM_CELLULAR_STATE_RUN_DIAL_SCRIPT ,
61
61
MODEM_CELLULAR_STATE_AWAIT_REGISTERED ,
62
62
MODEM_CELLULAR_STATE_CARRIER_ON ,
63
+ MODEM_CELLULAR_STATE_DORMANT ,
63
64
MODEM_CELLULAR_STATE_INIT_POWER_OFF ,
64
65
MODEM_CELLULAR_STATE_RUN_SHUTDOWN_SCRIPT ,
65
66
MODEM_CELLULAR_STATE_POWER_OFF_PULSE ,
@@ -79,6 +80,7 @@ enum modem_cellular_event {
79
80
MODEM_CELLULAR_EVENT_DEREGISTERED ,
80
81
MODEM_CELLULAR_EVENT_BUS_OPENED ,
81
82
MODEM_CELLULAR_EVENT_BUS_CLOSED ,
83
+ MODEM_CELLULAR_EVENT_PPP_DEAD ,
82
84
};
83
85
84
86
struct modem_cellular_data {
@@ -126,6 +128,7 @@ struct modem_cellular_data {
126
128
127
129
/* PPP */
128
130
struct modem_ppp * ppp ;
131
+ struct net_mgmt_event_callback net_mgmt_event_callback ;
129
132
130
133
enum modem_cellular_state state ;
131
134
const struct device * dev ;
@@ -196,6 +199,8 @@ static const char *modem_cellular_state_str(enum modem_cellular_state state)
196
199
return "run dial script" ;
197
200
case MODEM_CELLULAR_STATE_CARRIER_ON :
198
201
return "carrier on" ;
202
+ case MODEM_CELLULAR_STATE_DORMANT :
203
+ return "dormant" ;
199
204
case MODEM_CELLULAR_STATE_INIT_POWER_OFF :
200
205
return "init power off" ;
201
206
case MODEM_CELLULAR_STATE_RUN_SHUTDOWN_SCRIPT :
@@ -236,6 +241,8 @@ static const char *modem_cellular_event_str(enum modem_cellular_event event)
236
241
return "bus opened" ;
237
242
case MODEM_CELLULAR_EVENT_BUS_CLOSED :
238
243
return "bus closed" ;
244
+ case MODEM_CELLULAR_EVENT_PPP_DEAD :
245
+ return "ppp dead" ;
239
246
}
240
247
241
248
return "" ;
@@ -1021,7 +1028,9 @@ static void modem_cellular_run_dial_script_event_handler(struct modem_cellular_d
1021
1028
modem_chat_attach (& data -> chat , data -> dlci1_pipe );
1022
1029
modem_chat_run_script_async (& data -> chat , config -> dial_chat_script );
1023
1030
break ;
1024
-
1031
+ case MODEM_CELLULAR_EVENT_SCRIPT_FAILED :
1032
+ modem_cellular_start_timer (data , MODEM_CELLULAR_PERIODIC_SCRIPT_TIMEOUT );
1033
+ break ;
1025
1034
case MODEM_CELLULAR_EVENT_SCRIPT_SUCCESS :
1026
1035
modem_cellular_enter_state (data , MODEM_CELLULAR_STATE_AWAIT_REGISTERED );
1027
1036
break ;
@@ -1110,7 +1119,7 @@ static void modem_cellular_carrier_on_event_handler(struct modem_cellular_data *
1110
1119
break ;
1111
1120
1112
1121
case MODEM_CELLULAR_EVENT_DEREGISTERED :
1113
- modem_cellular_enter_state (data , MODEM_CELLULAR_STATE_RUN_DIAL_SCRIPT );
1122
+ modem_cellular_enter_state (data , MODEM_CELLULAR_STATE_DORMANT );
1114
1123
break ;
1115
1124
1116
1125
case MODEM_CELLULAR_EVENT_SUSPEND :
@@ -1125,9 +1134,37 @@ static void modem_cellular_carrier_on_event_handler(struct modem_cellular_data *
1125
1134
static int modem_cellular_on_carrier_on_state_leave (struct modem_cellular_data * data )
1126
1135
{
1127
1136
modem_cellular_stop_timer (data );
1137
+
1138
+ return 0 ;
1139
+ }
1140
+
1141
+ static int modem_cellular_on_dormant_state_enter (struct modem_cellular_data * data )
1142
+ {
1143
+ net_if_dormant_on (modem_ppp_get_iface (data -> ppp ));
1144
+
1145
+ return 0 ;
1146
+ }
1147
+
1148
+ static void modem_cellular_dormant_event_handler (struct modem_cellular_data * data ,
1149
+ enum modem_cellular_event evt )
1150
+ {
1151
+ switch (evt ) {
1152
+ case MODEM_CELLULAR_EVENT_PPP_DEAD :
1153
+ modem_cellular_enter_state (data , MODEM_CELLULAR_STATE_RUN_DIAL_SCRIPT );
1154
+ break ;
1155
+
1156
+ default :
1157
+ break ;
1158
+ }
1159
+ }
1160
+
1161
+ static int modem_cellular_on_dormant_state_leave (struct modem_cellular_data * data )
1162
+ {
1128
1163
net_if_carrier_off (modem_ppp_get_iface (data -> ppp ));
1129
1164
modem_chat_release (& data -> chat );
1130
1165
modem_ppp_release (data -> ppp );
1166
+ net_if_dormant_off (modem_ppp_get_iface (data -> ppp ));
1167
+
1131
1168
return 0 ;
1132
1169
}
1133
1170
@@ -1316,6 +1353,10 @@ static int modem_cellular_on_state_enter(struct modem_cellular_data *data)
1316
1353
ret = modem_cellular_on_carrier_on_state_enter (data );
1317
1354
break ;
1318
1355
1356
+ case MODEM_CELLULAR_STATE_DORMANT :
1357
+ ret = modem_cellular_on_dormant_state_enter (data );
1358
+ break ;
1359
+
1319
1360
case MODEM_CELLULAR_STATE_INIT_POWER_OFF :
1320
1361
ret = modem_cellular_on_init_power_off_state_enter (data );
1321
1362
break ;
@@ -1377,6 +1418,10 @@ static int modem_cellular_on_state_leave(struct modem_cellular_data *data)
1377
1418
ret = modem_cellular_on_carrier_on_state_leave (data );
1378
1419
break ;
1379
1420
1421
+ case MODEM_CELLULAR_STATE_DORMANT :
1422
+ ret = modem_cellular_on_dormant_state_leave (data );
1423
+ break ;
1424
+
1380
1425
case MODEM_CELLULAR_STATE_INIT_POWER_OFF :
1381
1426
ret = modem_cellular_on_init_power_off_state_leave (data );
1382
1427
break ;
@@ -1476,6 +1521,10 @@ static void modem_cellular_event_handler(struct modem_cellular_data *data,
1476
1521
modem_cellular_carrier_on_event_handler (data , evt );
1477
1522
break ;
1478
1523
1524
+ case MODEM_CELLULAR_STATE_DORMANT :
1525
+ modem_cellular_dormant_event_handler (data , evt );
1526
+ break ;
1527
+
1479
1528
case MODEM_CELLULAR_STATE_INIT_POWER_OFF :
1480
1529
modem_cellular_init_power_off_event_handler (data , evt );
1481
1530
break ;
@@ -1719,6 +1768,22 @@ static int modem_cellular_pm_action(const struct device *dev, enum pm_device_act
1719
1768
}
1720
1769
#endif /* CONFIG_PM_DEVICE */
1721
1770
1771
+ static void net_mgmt_event_handler (struct net_mgmt_event_callback * cb , uint32_t mgmt_event ,
1772
+ struct net_if * iface )
1773
+ {
1774
+ struct modem_cellular_data * data =
1775
+ CONTAINER_OF (cb , struct modem_cellular_data , net_mgmt_event_callback );
1776
+
1777
+ switch (mgmt_event ) {
1778
+ case NET_EVENT_PPP_PHASE_DEAD :
1779
+ modem_cellular_delegate_event (data , MODEM_CELLULAR_EVENT_PPP_DEAD );
1780
+ break ;
1781
+
1782
+ default :
1783
+ break ;
1784
+ }
1785
+ }
1786
+
1722
1787
static int modem_cellular_init (const struct device * dev )
1723
1788
{
1724
1789
struct modem_cellular_data * data = (struct modem_cellular_data * )dev -> data ;
@@ -1827,6 +1892,13 @@ static int modem_cellular_init(const struct device *dev)
1827
1892
modem_chat_init (& data -> chat , & chat_config );
1828
1893
}
1829
1894
1895
+ {
1896
+ net_mgmt_init_event_callback (& data -> net_mgmt_event_callback , net_mgmt_event_handler ,
1897
+ NET_EVENT_PPP_PHASE_DEAD );
1898
+ net_mgmt_add_event_callback (& data -> net_mgmt_event_callback );
1899
+ }
1900
+
1901
+
1830
1902
#ifndef CONFIG_PM_DEVICE
1831
1903
modem_cellular_delegate_event (data , MODEM_CELLULAR_EVENT_RESUME );
1832
1904
#else
0 commit comments