net: wwan: iosm: allow trace port be uninitialized
authorSergey Ryazanov <ryazanov.s.a@gmail.com>
Tue, 7 Dec 2021 09:21:38 +0000 (12:21 +0300)
committerJakub Kicinski <kuba@kernel.org>
Thu, 9 Dec 2021 01:58:58 +0000 (17:58 -0800)
Collecting modem firmware traces is optional for the regular modem use.
There are not many reasons for aborting device initialization due to an
inability to initialize the trace port and (or) its debugfs interface.
So, demote the initialization failure erro message into a warning and do
not break the initialization sequence in this case. Rework packet
processing and deinitialization so that they do not crash in case of
uninitialized trace port.

This change is mainly a preparation for an upcoming configuration option
introduction that will help disable driver debugfs functionality.

Signed-off-by: Sergey Ryazanov <ryazanov.s.a@gmail.com>
Reviewed-by: Loic Poulain <loic.poulain@linaro.org>
Acked-by: M Chetan Kumar <m.chetan.kumar@intel.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/wwan/iosm/iosm_ipc_imem.c
drivers/net/wwan/iosm/iosm_ipc_trace.c
drivers/net/wwan/iosm/iosm_ipc_trace.h

index 49bdadb855e55fb4f84c19ab40fea04cb48d0932..a60b93cefd2e32c90a27b6ede112b77ffd3c435b 100644 (file)
@@ -272,7 +272,7 @@ static void ipc_imem_dl_skb_process(struct iosm_imem *ipc_imem,
                if (port_id == IPC_MEM_CTRL_CHL_ID_7)
                        ipc_imem_sys_devlink_notify_rx(ipc_imem->ipc_devlink,
                                                       skb);
-               else if (port_id == ipc_imem->trace->chl_id)
+               else if (ipc_is_trace_channel(ipc_imem, port_id))
                        ipc_trace_port_rx(ipc_imem->trace, skb);
                else
                        wwan_port_rx(ipc_imem->ipc_port[port_id]->iosm_port,
@@ -555,10 +555,8 @@ static void ipc_imem_run_state_worker(struct work_struct *instance)
        }
 
        ipc_imem->trace = ipc_trace_init(ipc_imem);
-       if (!ipc_imem->trace) {
-               dev_err(ipc_imem->dev, "trace channel init failed");
-               return;
-       }
+       if (!ipc_imem->trace)
+               dev_warn(ipc_imem->dev, "trace channel init failed");
 
        ipc_task_queue_send_task(ipc_imem, ipc_imem_send_mdm_rdy_cb, 0, NULL, 0,
                                 false);
index 5f5cfd39bede0d0d69b435f31c1cccd5a9d381f2..c588a394cd94fda7de359a14b441442914233bfe 100644 (file)
@@ -172,6 +172,9 @@ struct iosm_trace *ipc_trace_init(struct iosm_imem *ipc_imem)
  */
 void ipc_trace_deinit(struct iosm_trace *ipc_trace)
 {
+       if (!ipc_trace)
+               return;
+
        debugfs_remove(ipc_trace->ctrl_file);
        relay_close(ipc_trace->ipc_rchan);
        mutex_destroy(&ipc_trace->trc_mutex);
index 53346183af9ccc2080f356458faaf6d979924511..419540c91219d442c017239517260a7fcd7498d8 100644 (file)
@@ -45,6 +45,11 @@ struct iosm_trace {
        enum trace_ctrl_mode mode;
 };
 
+static inline bool ipc_is_trace_channel(struct iosm_imem *ipc_mem, u16 chl_id)
+{
+       return ipc_mem->trace && ipc_mem->trace->chl_id == chl_id;
+}
+
 struct iosm_trace *ipc_trace_init(struct iosm_imem *ipc_imem);
 void ipc_trace_deinit(struct iosm_trace *ipc_trace);
 void ipc_trace_port_rx(struct iosm_trace *ipc_trace, struct sk_buff *skb);