@@ -60,6 +60,7 @@ enum modem_cellular_state {
6060	MODEM_CELLULAR_STATE_RUN_DIAL_SCRIPT ,
6161	MODEM_CELLULAR_STATE_AWAIT_REGISTERED ,
6262	MODEM_CELLULAR_STATE_CARRIER_ON ,
63+ 	MODEM_CELLULAR_STATE_DORMANT ,
6364	MODEM_CELLULAR_STATE_INIT_POWER_OFF ,
6465	MODEM_CELLULAR_STATE_RUN_SHUTDOWN_SCRIPT ,
6566	MODEM_CELLULAR_STATE_POWER_OFF_PULSE ,
@@ -79,6 +80,7 @@ enum modem_cellular_event {
7980	MODEM_CELLULAR_EVENT_DEREGISTERED ,
8081	MODEM_CELLULAR_EVENT_BUS_OPENED ,
8182	MODEM_CELLULAR_EVENT_BUS_CLOSED ,
83+ 	MODEM_CELLULAR_EVENT_PPP_DEAD ,
8284};
8385
8486struct  modem_cellular_data  {
@@ -126,6 +128,7 @@ struct modem_cellular_data {
126128
127129	/* PPP */ 
128130	struct  modem_ppp  * ppp ;
131+ 	struct  net_mgmt_event_callback  net_mgmt_event_callback ;
129132
130133	enum  modem_cellular_state  state ;
131134	const  struct  device  * dev ;
@@ -196,6 +199,8 @@ static const char *modem_cellular_state_str(enum modem_cellular_state state)
196199		return  "run dial script" ;
197200	case  MODEM_CELLULAR_STATE_CARRIER_ON :
198201		return  "carrier on" ;
202+ 	case  MODEM_CELLULAR_STATE_DORMANT :
203+ 		return  "dormant" ;
199204	case  MODEM_CELLULAR_STATE_INIT_POWER_OFF :
200205		return  "init power off" ;
201206	case  MODEM_CELLULAR_STATE_RUN_SHUTDOWN_SCRIPT :
@@ -236,6 +241,8 @@ static const char *modem_cellular_event_str(enum modem_cellular_event event)
236241		return  "bus opened" ;
237242	case  MODEM_CELLULAR_EVENT_BUS_CLOSED :
238243		return  "bus closed" ;
244+ 	case  MODEM_CELLULAR_EVENT_PPP_DEAD :
245+ 		return  "ppp dead" ;
239246	}
240247
241248	return  "" ;
@@ -1021,7 +1028,9 @@ static void modem_cellular_run_dial_script_event_handler(struct modem_cellular_d
10211028		modem_chat_attach (& data -> chat , data -> dlci1_pipe );
10221029		modem_chat_run_script_async (& data -> chat , config -> dial_chat_script );
10231030		break ;
1024- 
1031+ 	case  MODEM_CELLULAR_EVENT_SCRIPT_FAILED :
1032+ 		modem_cellular_start_timer (data , MODEM_CELLULAR_PERIODIC_SCRIPT_TIMEOUT );
1033+ 		break ;
10251034	case  MODEM_CELLULAR_EVENT_SCRIPT_SUCCESS :
10261035		modem_cellular_enter_state (data , MODEM_CELLULAR_STATE_AWAIT_REGISTERED );
10271036		break ;
@@ -1110,7 +1119,7 @@ static void modem_cellular_carrier_on_event_handler(struct modem_cellular_data *
11101119		break ;
11111120
11121121	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 );
11141123		break ;
11151124
11161125	case  MODEM_CELLULAR_EVENT_SUSPEND :
@@ -1125,9 +1134,37 @@ static void modem_cellular_carrier_on_event_handler(struct modem_cellular_data *
11251134static  int  modem_cellular_on_carrier_on_state_leave (struct  modem_cellular_data  * data )
11261135{
11271136	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+ {
11281163	net_if_carrier_off (modem_ppp_get_iface (data -> ppp ));
11291164	modem_chat_release (& data -> chat );
11301165	modem_ppp_release (data -> ppp );
1166+ 	net_if_dormant_off (modem_ppp_get_iface (data -> ppp ));
1167+ 
11311168	return  0 ;
11321169}
11331170
@@ -1316,6 +1353,10 @@ static int modem_cellular_on_state_enter(struct modem_cellular_data *data)
13161353		ret  =  modem_cellular_on_carrier_on_state_enter (data );
13171354		break ;
13181355
1356+ 	case  MODEM_CELLULAR_STATE_DORMANT :
1357+ 		ret  =  modem_cellular_on_dormant_state_enter (data );
1358+ 		break ;
1359+ 
13191360	case  MODEM_CELLULAR_STATE_INIT_POWER_OFF :
13201361		ret  =  modem_cellular_on_init_power_off_state_enter (data );
13211362		break ;
@@ -1377,6 +1418,10 @@ static int modem_cellular_on_state_leave(struct modem_cellular_data *data)
13771418		ret  =  modem_cellular_on_carrier_on_state_leave (data );
13781419		break ;
13791420
1421+ 	case  MODEM_CELLULAR_STATE_DORMANT :
1422+ 		ret  =  modem_cellular_on_dormant_state_leave (data );
1423+ 		break ;
1424+ 
13801425	case  MODEM_CELLULAR_STATE_INIT_POWER_OFF :
13811426		ret  =  modem_cellular_on_init_power_off_state_leave (data );
13821427		break ;
@@ -1476,6 +1521,10 @@ static void modem_cellular_event_handler(struct modem_cellular_data *data,
14761521		modem_cellular_carrier_on_event_handler (data , evt );
14771522		break ;
14781523
1524+ 	case  MODEM_CELLULAR_STATE_DORMANT :
1525+ 		modem_cellular_dormant_event_handler (data , evt );
1526+ 		break ;
1527+ 
14791528	case  MODEM_CELLULAR_STATE_INIT_POWER_OFF :
14801529		modem_cellular_init_power_off_event_handler (data , evt );
14811530		break ;
@@ -1719,6 +1768,22 @@ static int modem_cellular_pm_action(const struct device *dev, enum pm_device_act
17191768}
17201769#endif  /* CONFIG_PM_DEVICE */ 
17211770
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+ 
17221787static  int  modem_cellular_init (const  struct  device  * dev )
17231788{
17241789	struct  modem_cellular_data  * data  =  (struct  modem_cellular_data  * )dev -> data ;
@@ -1827,6 +1892,13 @@ static int modem_cellular_init(const struct device *dev)
18271892		modem_chat_init (& data -> chat , & chat_config );
18281893	}
18291894
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+ 
18301902#ifndef  CONFIG_PM_DEVICE 
18311903	modem_cellular_delegate_event (data , MODEM_CELLULAR_EVENT_RESUME );
18321904#else 
0 commit comments