ModemManager with Sierra EM7305 and GPS

Dan Williams dcbw at redhat.com
Mon Jun 12 18:27:09 UTC 2017


On Mon, 2017-06-12 at 12:41 +0000, Petr Kloc wrote:
> Dear developers.
> 
> 
> I have a device with embedded Sierra Wireless EM7305 modem. The
> device is running custom based linux alongside MS Windows (dualboot).
> I am trying to use the full modem capability in linux while retaining
> its basic functionality in MS Windows.
> 
> The EM7305 modem has several USB compositions it can be switched to
> (see list at the end of the email). Unfortunately switching it to
> different composition than the default #14 cause the modem to stop
> working in MS Windows. 
> 
> By default the modem is switched to Configuration 2 (MBIM only) and
> supported by cdc_mbim module. In this state the networking part does
> work flawlessly. But I did not find a way how to enable the GPS
> functionality.

Yes, the MBIM standard does not define any kind of location API, so we
are left with non-standard/proprietary mechanism when the modem
supports MBIM.  That could be via AT commands if the modem also exposes
an AT port, or it could be that we have to reverse-engineer an MBIM
proprietary device service.

> I can switch the module to Configuration 1 (DM NMEA AT QMI) and use
> either qcserial or qmi_wwan module to grab the device. Unfortunately
> here I run into problems. The qmi_wwan does grab 3 out of 4 exposed
> interfaces, but the ModemManager still claims, that no modem is
> present.

Can you share ModemManager debug logs when the modem does not work
correctly in this configuration?  Assuming the modem is always
connected, you can run ModemManager like so:

sudo ModemManager --debug &> /tmp/mm.log

and then attach mm.log to a reply (don't copy and paste into the mail,
as that adds line breaks and makes it hard to read...).

If you want GPS, then a mode that includes QMI would be easiest for
you.  ModemManager will then read location details through QMI and
provide those for you via the D-Bus interface, eg something like:

mmcli -m 0 --location-enable-gps-nmea
mmcli -m 0 --location-set-gps-refresh-rate=5 (refresh every 5 seconds)
mmcli -m 0 --location-get-gps-nmea (report NMEA traces)

Alternatively when you're in this mode, you may be able to use the NMEA
port directly by doing what is suggested in:

http://www.thinkwiki.org/wiki/Qualcomm_Gobi_2000#GPS

Dan

> The qcserial module exposes AT command interface and i can issue
> commands to the modem. The modem is even recognized and can be
> controlled using AT command. Unfortunately an attempt to establish
> connection via NetworkManager result in failure and rejection of
> successive commands. The logs are also included at the end of this
> email. 
> 
> I would appreciate any advice how to get both GPS and modem
> capability working. 
> 
> On the unrelated not I did not manage to find out which kernel module
> is responsible for handling the NMEA interface. If I force-load
> qcserail, it grabs 3 out of the 4 exposed interfaces, but neither of
> the associated device nodes seems to be NMEA port.
> 
> I would appreciate any help on this topic.
> 
> Regards
> Petr Kloc 
> 
> 
> 
> 
> 
> 
> USB compositions:
>    0 - HIP  DM    NMEA  AT    MDM1  MDM2  MDM3  MS      NOT SUPPORTED
>    1 - HIP  DM    NMEA  AT    MDM1  MS                  SUPPORTED
>    2 - HIP  DM    NMEA  AT    NIC1  MS                  NOT SUPPORTED
>    3 - HIP  DM    NMEA  AT    MDM1  NIC1  MS            NOT SUPPORTED
>    4 - HIP  DM    NMEA  AT    NIC1  NIC2  NIC3  MS      NOT SUPPORTED
>    5 - HIP  DM    NMEA  AT    ECM1  MS                  NOT SUPPORTED
>    6 - DM   NMEA  AT    QMI                             SUPPORTED
>    7 - DM   NMEA  AT    RMNET1 RMNET2 RMNET3            SUPPORTED
>    8 - DM   NMEA  AT    MBIM                            SUPPORTED
>    9 - MBIM                                             SUPPORTED
>   10 - NMEA MBIM                                        SUPPORTED
>   11 - DM   MBIM                                        SUPPORTED
>   12 - DM   NMEA  MBIM                                  SUPPORTED
>   13 - Config1: comp6    Config2: comp8                 NOT SUPPORTED
> * 14 - Config1: comp6    Config2: comp9                 SUPPORTED
>   15 - Config1: comp6    Config2: comp10                NOT SUPPORTED
>   16 - Config1: comp6    Config2: comp11                NOT SUPPORTED
>   17 - Config1: comp6    Config2: comp12                NOT SUPPORTED
>   18 - Config1: comp7    Config2: comp8                 NOT SUPPORTED
>   19 - Config1: comp7    Config2: comp9                 SUPPORTED
>   20 - Config1: comp7    Config2: comp10                NOT SUPPORTED
>   21 - Config1: comp7    Config2: comp11                NOT SUPPORTED
>   22 - Config1: comp7    Config2: comp12                NOT SUPPORTED
> 
> 
> ModemManager --debug log part:
> ModemManager[1463]: <info>  [1497037357.892382] [mm-iface-modem-
> simple.c:641] connect_auth_ready(): Simple connect started...
> ModemManager[1463]: <debug> [1497037357.892412] [mm-iface-modem-
> simple.c:651] connect_auth_ready():    PIN: unspecified
> ModemManager[1463]: <debug> [1497037357.892423] [mm-iface-modem-
> simple.c:653] connect_auth_ready():    Operator ID: unspecified
> ModemManager[1463]: <debug> [1497037357.892434] [mm-iface-modem-
> simple.c:655] connect_auth_ready():    Allowed roaming: yes
> ModemManager[1463]: <debug> [1497037357.892444] [mm-iface-modem-
> simple.c:657] connect_auth_ready():    APN: internet.t-mobile.cz
> ModemManager[1463]: <debug> [1497037357.892458] [mm-iface-modem-
> simple.c:662] connect_auth_ready():    IP family: ipv4v6
> ModemManager[1463]: <debug> [1497037357.892470] [mm-iface-modem-
> simple.c:673] connect_auth_ready():    Allowed authentication:
> unspecified
> ModemManager[1463]: <debug> [1497037357.892499] [mm-iface-modem-
> simple.c:675] connect_auth_ready():    User: unspecified
> ModemManager[1463]: <debug> [1497037357.892511] [mm-iface-modem-
> simple.c:677] connect_auth_ready():    Password: unspecified
> ModemManager[1463]: <debug> [1497037357.892528] [mm-iface-modem-
> simple.c:679] connect_auth_ready():    Number: *99#
> ModemManager[1463]: <info>  [1497037357.892537] [mm-iface-modem-
> simple.c:469] connection_step(): Simple connect state (4/8): Wait to
> get fully enabled
> ModemManager[1463]: <info>  [1497037357.892581] [mm-iface-modem-
> simple.c:478] connection_step(): Simple connect state (5/8): Register
> ModemManager[1463]: <debug> [1497037357.892607] [mm-iface-modem-
> 3gpp.c:400] mm_iface_modem_3gpp_register_in_network(): Already
> registered in network '23001', automatic registration not launched...
> ModemManager[1463]: <info>  [1497037357.892631] [mm-iface-modem-
> simple.c:501] connection_step(): Simple connect state (6/8): Bearer
> ModemManager[1463]: <debug> [1497037357.892645] [mm-iface-modem-
> simple.c:521] connection_step(): Creating new bearer...
> ModemManager[1463]: <debug> [1497037357.892656] [mm-broadband-
> modem.c:297] modem_create_bearer(): Creating Broadband bearer in
> broadband modem
> ModemManager[1463]: <debug> [1497037357.892878] [mm-port-
> serial.c:1292] mm_port_serial_open(): (ttyUSB1) device open count is
> 2 (open)
> ModemManager[1463]: <debug> [1497037357.892902] [mm-port-
> serial.c:1349] _close_internal(): (ttyUSB1) device open count is 1
> (close)
> ModemManager[1463]: <debug> [1497037357.892950] [mm-broadband-
> modem.c:258] modem_create_bearer_finish(): New bearer created at DBus
> path '/org/freedesktop/ModemManager1/Bearer/0'
> ModemManager[1463]: <info>  [1497037357.893053] [mm-iface-modem-
> simple.c:583] connection_step(): Simple connect state (7/8): Connect
> ModemManager[1463]: <debug> [1497037357.893076] [mm-base-
> bearer.c:703] mm_base_bearer_connect(): Connecting bearer
> '/org/freedesktop/ModemManager1/Bearer/0'
> ModemManager[1463]: <info>  [1497037357.893096] [mm-iface-
> modem.c:1433] __iface_modem_update_state_internal(): Modem
> /org/freedesktop/ModemManager1/Modem/0: state changed (registered ->
> connecting)
> ModemManager[1463]: <debug> [1497037357.893279] [mm-broadband-
> bearer.c:1263] connect(): Launching 3GPP connection attempt with APN
> 'internet.t-mobile.cz'
> ModemManager[1463]: <debug> [1497037357.893298] [mm-broadband-
> bearer.c:1052] connect_3gpp(): Looking for best CID...
> ModemManager[1463]: <debug> [1497037357.893313] [mm-port-
> serial.c:1292] mm_port_serial_open(): (ttyUSB1) device open count is
> 2 (open)
> ModemManager[1463]: <debug> [1497037357.893340] [mm-port-serial-
> at.c:459] debug_log(): (ttyUSB1): --> 'AT+CGDCONT?<CR>'
> ModemManager[1463]: <debug> [1497037357.908702] [mm-port-serial-
> at.c:459] debug_log(): (ttyUSB1): <-- '<CR><LF>+CGDCONT:
> 1,"IP","internet.t-mobile.cz","0.0.0.0",0,0<CR><LF>+CGDCONT:
> 2,"IPV4V6","internet.t-mobile.cz","0.0.0.0",0,0<CR><LF>+CGDCONT:
> 3,"IPV4V6","","0.0.0.0",0,0<CR><LF><CR><LF>OK<CR><LF>'
> ModemManager[1463]: <debug> [1497037357.909020] [mm-broadband-
> bearer.c:969] parse_pdp_list(): Found '3' PDP contexts
> ModemManager[1463]: <debug> [1497037357.909053] [mm-broadband-
> bearer.c:978] parse_pdp_list():   PDP context [cid=1] [type='ipv4']
> [apn='internet.t-mobile.cz']
> ModemManager[1463]: <debug> [1497037357.909065] [mm-broadband-
> bearer.c:978] parse_pdp_list():   PDP context [cid=2] [type='ipv4v6']
> [apn='internet.t-mobile.cz']
> ModemManager[1463]: <debug> [1497037357.909074] [mm-broadband-
> bearer.c:978] parse_pdp_list():   PDP context [cid=3] [type='ipv4v6']
> [apn='']
> ModemManager[1463]: <debug> [1497037357.909085] [mm-broadband-
> bearer.c:1002] parse_pdp_list(): Found PDP context with CID 2 and PDP
> type ipv4v6 for APN 'internet.t-mobile.cz'
> ModemManager[1463]: <debug> [1497037357.909114] [mm-port-
> serial.c:1292] mm_port_serial_open(): (ttyUSB1) device open count is
> 3 (open)
> ModemManager[1463]: <debug> [1497037357.909127] [mm-broadband-
> bearer.c:214] common_get_at_data_port(): Connection through a plain
> serial AT port (ttyUSB1)
> ModemManager[1463]: <debug> [1497037357.909152] [mm-port-
> serial.c:1292] mm_port_serial_open(): (ttyUSB1) device open count is
> 4 (open)
> ModemManager[1463]: <debug> [1497037357.909182] [mm-port-
> serial.c:1349] _close_internal(): (ttyUSB1) device open count is 3
> (close)
> ModemManager[1463]: <debug> [1497037357.909212] [mm-port-serial-
> at.c:459] debug_log(): (ttyUSB1): --> 'ATD*99***2#<CR>'
> ModemManager[1463]: <debug> [1497037357.924504] [mm-port-serial-
> at.c:459] debug_log(): (ttyUSB1): <-- '<CR><LF>CONNECT
> 100000000<CR><LF>'
> ModemManager[1463]: <debug> [1497037357.924688] [mm-port.c:95]
> mm_port_set_connected(): (ttyUSB1): port now connected
> ModemManager[1463]: <debug> [1497037357.924811] [mm-port-
> serial.c:1349] _close_internal(): (ttyUSB1) device open count is 2
> (close)
> ModemManager[1463]: <debug> [1497037357.924911] [mm-base-
> bearer.c:601] connect_ready(): Connected bearer
> '/org/freedesktop/ModemManager1/Bearer/0'
> ModemManager[1463]: <info>  [1497037357.925197] [mm-iface-
> modem.c:1433] __iface_modem_update_state_internal(): Modem
> /org/freedesktop/ModemManager1/Modem/0: state changed (connecting ->
> connected)
> ModemManager[1463]: <info>  [1497037357.925555] [mm-iface-modem-
> simple.c:602] connection_step(): Simple connect state (8/8): All done
> ModemManager[1463]: <debug> [1497037357.942041] [mm-base-
> bearer.c:874] mm_base_bearer_disconnect(): Disconnecting bearer
> '/org/freedesktop/ModemManager1/Bearer/0'
> ModemManager[1463]: <info>  [1497037357.942129] [mm-iface-
> modem.c:1433] __iface_modem_update_state_internal(): Modem
> /org/freedesktop/ModemManager1/Modem/0: state changed (connected ->
> disconnecting)
> ModemManager[1463]: <debug> [1497037357.942491] [mm-broadband-
> bearer.c:1571] data_reopen_3gpp(): Reopening data port (ttyUSB1)...
> ModemManager[1463]: <debug> [1497037357.942541] [mm-port-
> serial.c:1612] mm_port_serial_reopen(): (ttyUSB1) reopening port (2)
> ModemManager[1463]: <debug> [1497037357.942607] [mm-port-
> serial.c:1349] _close_internal(): (ttyUSB1) device open count is 1
> (close)
> ModemManager[1463]: <debug> [1497037357.942621] [mm-port-
> serial.c:1349] _close_internal(): (ttyUSB1) device open count is 0
> (close)
> ModemManager[1463]: <debug> [1497037357.942649] [mm-port-
> serial.c:1365] _close_internal(): (ttyUSB1) closing serial port...
> ModemManager[1463]: <debug> [1497037357.942672] [mm-port.c:95]
> mm_port_set_connected(): (ttyUSB1): port now disconnected
> ModemManager[1463]: <debug> [1497037357.943118] [mm-port-
> serial.c:1413] _close_internal(): (ttyUSB1) serial port closed
> ModemManager[1463]: <debug> [1497037358.945191] [mm-port-
> serial.c:1162] mm_port_serial_open(): (ttyUSB1) opening serial
> port...
> ModemManager[1463]: <warn>  [1497037358.945578] [mm-port-
> serial.c:513] real_config_fd(): (ttyUSB1): port attributes not fully
> set
> ModemManager[1463]: <debug> [1497037358.945699] [mm-port-
> serial.c:1292] mm_port_serial_open(): (ttyUSB1) device open count is
> 1 (open)
> ModemManager[1463]: <debug> [1497037358.945753] [mm-port-serial-
> at.c:495] mm_port_serial_at_run_init_sequence(): (ttyUSB1): running
> init sequence...
> ModemManager[1463]: <debug> [1497037358.945865] [mm-port-
> serial.c:1292] mm_port_serial_open(): (ttyUSB1) device open count is
> 2 (open)
> ModemManager[1463]: <debug> [1497037358.945983] [mm-broadband-
> bearer.c:1559] data_reopen_3gpp_ready(): Flashing data port
> (ttyUSB1)...
> ModemManager[1463]: <debug> [1497037358.946112] [mm-port-serial-
> at.c:459] debug_log(): (ttyUSB1): --> 'ATE0<CR>'
> ModemManager[1463]: <debug> [1497037359.948294] [mm-port-
> serial.c:1349] _close_internal(): (ttyUSB1) device open count is 1
> (close)
> ModemManager[1463]: <debug> [1497037359.948396] [mm-broadband-
> bearer.c:1529] data_flash_3gpp_ready(): Sending PDP context
> deactivation in primary/data port...
> ModemManager[1463]: <debug> [1497037359.948547] [mm-port-
> serial.c:1292] mm_port_serial_open(): (ttyUSB1) device open count is
> 2 (open)
> ModemManager[1463]: <debug> [1497037361.923992] [mm-port-serial-
> at.c:459] debug_log(): (ttyUSB1): --> 'ATV1<CR>'
> ModemManager[1463]: <debug> [1497037364.925279] [mm-port-serial-
> at.c:459] debug_log(): (ttyUSB1): --> 'AT+CMEE=1<CR>'
> ModemManager[1463]: <debug> [1497037367.924638] [mm-port-serial-
> at.c:459] debug_log(): (ttyUSB1): --> 'ATX4<CR>'
> ModemManager[1463]: <debug> [1497037370.924851] [mm-port-serial-
> at.c:459] debug_log(): (ttyUSB1): --> 'AT&C1<CR>'
> ModemManager[1463]: <debug> [1497037373.925172] [mm-port-serial-
> at.c:459] debug_log(): (ttyUSB1): --> 'AT+CGACT=0,2<CR>'
> ModemManager[1463]: <debug> [1497037380.929008] [mm-broadband-
> modem.c:1991] modem_load_signal_quality(): loading signal quality...
> ModemManager[1463]: <debug> [1497037380.929133] [mm-port-
> serial.c:1292] mm_port_serial_open(): (ttyUSB1) device open count is
> 3 (open)
> ModemManager[1463]: <debug> [1497037383.924600] [mm-broadband-
> bearer.c:1470] cgact_data_ready(): PDP context deactivation failed
> (not fatal): Serial command timed out
> ModemManager[1463]: <debug> [1497037383.924727] [mm-port-
> serial.c:1349] _close_internal(): (ttyUSB1) device open count is 2
> (close)
> ModemManager[1463]: <debug> [1497037383.924899] [mm-base-
> bearer.c:807] disconnect_ready(): Disconnected bearer
> '/org/freedesktop/ModemManager1/Bearer/0'
> ModemManager[1463]: <info>  [1497037383.925039] [mm-iface-
> modem.c:1433] __iface_modem_update_state_internal(): Modem
> /org/freedesktop/ModemManager1/Modem/0: state changed (disconnecting
> -> registered)
> ModemManager[1463]: <debug> [1497037383.927719] [mm-port-serial-
> at.c:459] debug_log(): (ttyUSB1): --> 'AT+CIND?<CR>'
> ModemManager[1463]: <debug> [1497037386.924734] [mm-port-
> serial.c:1292] mm_port_serial_open(): (ttyUSB1) device open count is
> 3 (open)
> ModemManager[1463]: <debug> [1497037386.924899] [mm-port-
> serial.c:1349] _close_internal(): (ttyUSB1) device open count is 2
> (close)
> ModemManager[1463]: <debug> [1497037386.925032] [mm-port-serial-
> at.c:459] debug_log(): (ttyUSB1): --> 'AT+CSQ<CR>'
> ModemManager[1463]: <debug> [1497037389.924885] [mm-port-
> serial.c:1349] _close_internal(): (ttyUSB1) device open count is 1
> (close)
> ModemManager[1463]: <debug> [1497037389.925056] [mm-iface-
> modem.c:1262] signal_quality_check_ready(): Couldn't refresh signal
> quality: 'Serial command timed out'
> ModemManager[1463]: <debug> [1497037410.923033] [mm-broadband-
> modem.c:1991] modem_load_signal_quality(): loading signal quality...
> ModemManager[1463]: <debug> [1497037410.923173] [mm-port-
> serial.c:1292] mm_port_serial_open(): (ttyUSB1) device open count is
> 2 (open)
> ModemManager[1463]: <debug> [1497037410.923285] [mm-iface-
> modem.c:1142] expire_signal_quality(): Signal quality value not
> updated in 60s, marking as not being recent
> ModemManager[1463]: <debug> [1497037410.924333] [mm-port-serial-
> at.c:459] debug_log(): (ttyUSB1): --> 'AT+CIND?<CR>'
> ModemManager[1463]: <info>  [1497037411.530741] [mm-iface-modem-
> simple.c:641] connect_auth_ready(): Simple connect started...
> ModemManager[1463]: <debug> [1497037411.530838] [mm-iface-modem-
> simple.c:651] connect_auth_ready():    PIN: unspecified
> ModemManager[1463]: <debug> [1497037411.530862] [mm-iface-modem-
> simple.c:653] connect_auth_ready():    Operator ID: unspecified
> ModemManager[1463]: <debug> [1497037411.530885] [mm-iface-modem-
> simple.c:655] connect_auth_ready():    Allowed roaming: yes
> ModemManager[1463]: <debug> [1497037411.530908] [mm-iface-modem-
> simple.c:657] connect_auth_ready():    APN: internet.t-mobile.cz
> ModemManager[1463]: <debug> [1497037411.530931] [mm-iface-modem-
> simple.c:662] connect_auth_ready():    IP family: ipv4v6
> ModemManager[1463]: <debug> [1497037411.530954] [mm-iface-modem-
> simple.c:673] connect_auth_ready():    Allowed authentication:
> unspecified
> ModemManager[1463]: <debug> [1497037411.530974] [mm-iface-modem-
> simple.c:675] connect_auth_ready():    User: unspecified
> ModemManager[1463]: <debug> [1497037411.530994] [mm-iface-modem-
> simple.c:677] connect_auth_ready():    Password: unspecified
> ModemManager[1463]: <debug> [1497037411.531014] [mm-iface-modem-
> simple.c:679] connect_auth_ready():    Number: *99#
> ModemManager[1463]: <info>  [1497037411.531123] [mm-iface-modem-
> simple.c:469] connection_step(): Simple connect state (4/8): Wait to
> get fully enabled
> ModemManager[1463]: <info>  [1497037411.531321] [mm-iface-modem-
> simple.c:478] connection_step(): Simple connect state (5/8): Register
> ModemManager[1463]: <debug> [1497037411.531467] [mm-iface-modem-
> 3gpp.c:400] mm_iface_modem_3gpp_register_in_network(): Already
> registered in network '23001', automatic registration not launched...
> ModemManager[1463]: <info>  [1497037411.531643] [mm-iface-modem-
> simple.c:501] connection_step(): Simple connect state (6/8): Bearer
> ModemManager[1463]: <debug> [1497037411.531746] [mm-iface-modem-
> simple.c:574] connection_step(): Using already existing bearer at
> '/org/freedesktop/ModemManager1/Bearer/0'...
> ModemManager[1463]: <info>  [1497037411.531811] [mm-iface-modem-
> simple.c:583] connection_step(): Simple connect state (7/8): Connect
> ModemManager[1463]: <debug> [1497037411.531889] [mm-base-
> bearer.c:703] mm_base_bearer_connect(): Connecting bearer
> '/org/freedesktop/ModemManager1/Bearer/0'
> ModemManager[1463]: <info>  [1497037411.531990] [mm-iface-
> modem.c:1433] __iface_modem_update_state_internal(): Modem
> /org/freedesktop/ModemManager1/Modem/0: state changed (registered ->
> connecting)
> ModemManager[1463]: <debug> [1497037411.532642] [mm-broadband-
> bearer.c:1263] connect(): Launching 3GPP connection attempt with APN
> 'internet.t-mobile.cz'
> ModemManager[1463]: <debug> [1497037411.532703] [mm-broadband-
> bearer.c:1052] connect_3gpp(): Looking for best CID...
> ModemManager[1463]: <debug> [1497037411.532748] [mm-port-
> serial.c:1292] mm_port_serial_open(): (ttyUSB1) device open count is
> 3 (open)
> ModemManager[1463]: <debug> [1497037413.924638] [mm-port-
> serial.c:1292] mm_port_serial_open(): (ttyUSB1) device open count is
> 4 (open)
> ModemManager[1463]: <debug> [1497037413.924770] [mm-port-
> serial.c:1349] _close_internal(): (ttyUSB1) device open count is 3
> (close)
> ModemManager[1463]: <debug> [1497037413.924891] [mm-port-serial-
> at.c:459] debug_log(): (ttyUSB1): --> 'AT+CGDCONT?<CR>'
> ModemManager[1463]: <debug> [1497037416.923658] [mm-broadband-
> bearer.c:950] parse_pdp_list(): Unexpected +CGDCONT? error: 'Serial
> command timed out'
> ModemManager[1463]: <debug> [1497037416.923824] [mm-port-serial-
> at.c:459] debug_log(): (ttyUSB1): --> 'AT+CSQ<CR>'
> ModemManager[1463]: <debug> [1497037419.924451] [mm-port-
> serial.c:1349] _close_internal(): (ttyUSB1) device open count is 2
> (close)
> _______________________________________________
> ModemManager-devel mailing list
> ModemManager-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/modemmanager-devel


More information about the ModemManager-devel mailing list