@@ -130,6 +130,12 @@ enum socket_state {
130
130
SOCK_CONNECTED ,
131
131
};
132
132
133
+ enum hl7800_lpm {
134
+ HL7800_LPM_NONE ,
135
+ HL7800_LPM_EDRX ,
136
+ HL7800_LPM_PSM ,
137
+ };
138
+
133
139
struct mdm_control_pinconfig {
134
140
char * dev_name ;
135
141
gpio_pin_t pin ;
@@ -515,6 +521,7 @@ struct hl7800_iface_ctx {
515
521
bool allow_sleep ;
516
522
bool uart_on ;
517
523
enum mdm_hl7800_sleep_state sleep_state ;
524
+ enum hl7800_lpm low_power_mode ;
518
525
enum mdm_hl7800_network_state network_state ;
519
526
enum net_operator_status operator_status ;
520
527
void (* event_callback )(enum mdm_hl7800_event event , void * event_data );
@@ -2901,14 +2908,17 @@ static void iface_status_work_cb(struct k_work *work)
2901
2908
break ;
2902
2909
case HL7800_OUT_OF_COVERAGE :
2903
2910
default :
2904
- if (ictx .iface && net_if_is_up (ictx .iface )) {
2911
+ if (ictx .iface && net_if_is_up (ictx .iface ) &&
2912
+ (ictx .low_power_mode != HL7800_LPM_PSM )) {
2905
2913
LOG_DBG ("HL7800 iface DOWN" );
2906
2914
net_if_down (ictx .iface );
2907
2915
}
2908
2916
break ;
2909
2917
}
2910
2918
2911
- if (ictx .iface && !net_if_is_up (ictx .iface )) {
2919
+ if ((ictx .iface && !net_if_is_up (ictx .iface )) ||
2920
+ (ictx .low_power_mode == HL7800_LPM_PSM &&
2921
+ ictx .network_state == HL7800_OUT_OF_COVERAGE )) {
2912
2922
hl7800_stop_rssi_work ();
2913
2923
notify_all_tcp_sockets_closed ();
2914
2924
} else if (ictx .iface && net_if_is_up (ictx .iface )) {
@@ -3516,7 +3526,8 @@ static void sockreadrecv_cb_work(struct k_work *work)
3516
3526
3517
3527
sock = CONTAINER_OF (work , struct hl7800_socket , recv_cb_work );
3518
3528
3519
- LOG_DBG ("Sock %d RX CB" , sock -> socket_id );
3529
+ LOG_DBG ("Sock %d RX CB (size: %zd)" , sock -> socket_id ,
3530
+ (sock -> recv_pkt != NULL ) ? net_pkt_get_len (sock -> recv_pkt ) : 0 );
3520
3531
/* return data */
3521
3532
pkt = sock -> recv_pkt ;
3522
3533
sock -> recv_pkt = NULL ;
@@ -4311,8 +4322,8 @@ static void mdm_vgpio_work_cb(struct k_work *item)
4311
4322
if (ictx .sleep_state != HL7800_SLEEP_STATE_ASLEEP ) {
4312
4323
set_sleep_state (HL7800_SLEEP_STATE_ASLEEP );
4313
4324
}
4314
- if (ictx .iface && ictx .initialized &&
4315
- net_if_is_up ( ictx .iface ) ) {
4325
+ if (ictx .iface && ictx .initialized && net_if_is_up ( ictx . iface ) &&
4326
+ ictx .low_power_mode != HL7800_LPM_PSM ) {
4316
4327
net_if_down (ictx .iface );
4317
4328
}
4318
4329
}
@@ -4736,20 +4747,22 @@ static int modem_reset_and_configure(void)
4736
4747
}
4737
4748
#endif
4738
4749
4750
+ ictx .low_power_mode = HL7800_LPM_NONE ;
4739
4751
#ifdef CONFIG_MODEM_HL7800_LOW_POWER_MODE
4740
-
4741
4752
/* enable GPIO6 low power monitoring */
4742
4753
SEND_AT_CMD_EXPECT_OK ("AT+KHWIOCFG=3,1,6" );
4743
4754
4744
4755
/* Turn on sleep mode */
4745
4756
SEND_AT_CMD_EXPECT_OK ("AT+KSLEEP=1,2,10" );
4746
4757
4747
4758
#if CONFIG_MODEM_HL7800_PSM
4759
+ ictx .low_power_mode = HL7800_LPM_PSM ;
4748
4760
/* Turn off eDRX */
4749
4761
SEND_AT_CMD_EXPECT_OK ("AT+CEDRXS=0" );
4750
4762
4751
4763
SEND_AT_CMD_EXPECT_OK (TURN_ON_PSM );
4752
4764
#elif CONFIG_MODEM_HL7800_EDRX
4765
+ ictx .low_power_mode = HL7800_LPM_EDRX ;
4753
4766
/* Turn off PSM */
4754
4767
SEND_AT_CMD_EXPECT_OK ("AT+CPSMS=0" );
4755
4768
0 commit comments