Skip to content

Commit 0957833

Browse files
pangqiaodnlplm
andauthored
[Intel-SIG] [Meteor Lake] Add telit modems fn990 support (#64)
* Revert "bus: mhi: host: pci_generic: add support for sc8280xp-crd SDX55 variant" This reverts commit 46af287. Removed since it binds FN980 V2 to MBIM. deepin-Intel-SIG: Revert "bus: mhi: host: pci_generic: add support for sc8280xp-crd SDX55 variant". Signed-off-by: Daniele Palmas <[email protected]> Signed-off-by: Wei Qiao <[email protected]> * wwan: add SAHARA device deepin-Intel-SIG: wwan: add SAHARA device. Signed-off-by: Daniele Palmas <[email protected]> Signed-off-by: Wei Qiao <[email protected]> * bus: mhi: host: allow SBL as initial EE There are situations in which SBL is a legitimate initial execution environment (e.g. modem stuck in SBL due to a firmware failure...), but mhi refuses to start: mhi-pci-generic 0000:01:00.0: MHI PCI device found: foxconn-sdx55 mhi-pci-generic 0000:01:00.0: BAR 0: assigned mhi-pci-generic 0000:01:00.0: enabling device (0000 -> 0002) mhi mhi0: Requested to power ON mhi mhi0: SECONDARY BOOTLOADER is not a valid EE for power on mhi-pci-generic 0000:01:00.0: failed to power up MHI controller mhi-pci-generic: probe of 0000:01:00.0 failed with error -5 Fix this by adding SBL as an allowed initial execution environment. deepin-Intel-SIG: bus: mhi: host: allow SBL as initial EE. Signed-off-by: Daniele Palmas <[email protected]> Signed-off-by: Wei Qiao <[email protected]> * drivers: bus: mhi: let userspace manage xfp fw update states After performing the firmware update in SBL through the XFP protocol, FN980 resets and is not detected anymore by the host. Add a new controller file to be used when performing the firmware update in order to: - Make the mhi stack aware of the process and not to reset the function during the update. - Force a reset of the mhi stack at the end of the process in order to detect the modem again. This file should be used both when performing the update through the USB composition 0x1055 (FN980 old hw revision) that through PCIe (both FN980 and FN990). For PCIe the flow is the following: - Disable runtime power management on the mhi pci device - Write 1 to the fw_update sysfs file to races between the recovery work and other mhi operations - Start the firmware update - Write 0 to the fw_update sysfs file to reset the mhi stack Firmware update requires also upstream commit d651ce8("bus: mhi: core: Fix race while handling SYS_ERR at power up") deepin-Intel-SIG: drivers: bus: mhi: let userspace manage xfp fw update states. Signed-off-by: Daniele Palmas <[email protected]> Signed-off-by: Wei Qiao <[email protected]> * wwan: add NMEA type deepin-Intel-SIG: wwan: add NMEA type. Signed-off-by: Daniele Palmas <[email protected]> Signed-off-by: Wei Qiao <[email protected]> * drivers: bus: mhi: add FN980 v2 support deepin-Intel-SIG: drivers: bus: mhi: add FN980 v2 support. Signed-off-by: Daniele Palmas <[email protected]> Signed-off-by: Wei Qiao <[email protected]> * drivers: bus: mhi: add FN990 NMEA and DIAG in SBL devices deepin-Intel-SIG: drivers: bus: mhi: add FN990 NMEA and DIAG in SBL devices. Signed-off-by: Daniele Palmas <[email protected]> Signed-off-by: Wei Qiao <[email protected]> * drivers: net: wwan: add simple DTR driver Telit modem requires DTR to be set in virtual serial ports for properly receiving unsolicited indications. Add a simple WWAN driver for setting DTR and RTS at port opening and removing at port closing (just AT channels). deepin-Intel-SIG: drivers: net: wwan: add simple DTR driver. Signed-off-by: Daniele Palmas <[email protected]> Signed-off-by: Wei Qiao <[email protected]> * drivers: bus: mhi: host: fix recovery process when modem reboots It could happen that when the modem reboots it is not immediately able to cope with PCIe requests. Add a delay in the recovery procedure as a safe guard. deepin-Intel-SIG: drivers: bus: mhi: host: fix recovery process when modem reboots. Signed-off-by: Daniele Palmas <[email protected]> Signed-off-by: Wei Qiao <[email protected]> --------- Signed-off-by: Daniele Palmas <[email protected]> Signed-off-by: Wei Qiao <[email protected]> Co-authored-by: Daniele Palmas <[email protected]>
1 parent 821127d commit 0957833

File tree

12 files changed

+349
-9
lines changed

12 files changed

+349
-9
lines changed

drivers/bus/mhi/host/init.c

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,29 @@ const char *to_mhi_pm_state_str(u32 state)
7979
return mhi_pm_state_str[index];
8080
}
8181

82+
static ssize_t fw_update_show(struct device *dev, struct device_attribute *attr, char *buf)
83+
{
84+
struct mhi_device *mhi_dev = to_mhi_device(dev);
85+
struct mhi_controller *mhi_cntrl = mhi_dev->mhi_cntrl;
86+
87+
return sysfs_emit(buf, "%u\n", mhi_cntrl->xfp);
88+
}
89+
90+
static ssize_t fw_update_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t len)
91+
{
92+
struct mhi_device *mhi_dev = to_mhi_device(dev);
93+
struct mhi_controller *mhi_cntrl = mhi_dev->mhi_cntrl;
94+
bool enable;
95+
96+
if (strtobool(buf, &enable))
97+
return -EINVAL;
98+
99+
mhi_cntrl->xfp = enable ? XFP_STATE_FLASHING : XFP_STATE_NEED_RESET;
100+
101+
return len;
102+
}
103+
static DEVICE_ATTR_RW(fw_update);
104+
82105
static ssize_t serial_number_show(struct device *dev,
83106
struct device_attribute *attr,
84107
char *buf)
@@ -124,6 +147,7 @@ static struct attribute *mhi_dev_attrs[] = {
124147
&dev_attr_serial_number.attr,
125148
&dev_attr_oem_pk_hash.attr,
126149
&dev_attr_soc_reset.attr,
150+
&dev_attr_fw_update.attr,
127151
NULL,
128152
};
129153
ATTRIBUTE_GROUPS(mhi_dev);

drivers/bus/mhi/host/internal.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ extern const char * const mhi_ee_str[MHI_EE_MAX];
5656

5757
#define MHI_IN_PBL(ee) (ee == MHI_EE_PBL || ee == MHI_EE_PTHRU || \
5858
ee == MHI_EE_EDL)
59-
#define MHI_POWER_UP_CAPABLE(ee) (MHI_IN_PBL(ee) || ee == MHI_EE_AMSS)
59+
#define MHI_POWER_UP_CAPABLE(ee) (MHI_IN_PBL(ee) || ee == MHI_EE_AMSS || ee == MHI_EE_SBL)
6060
#define MHI_FW_LOAD_CAPABLE(ee) (ee == MHI_EE_PBL || ee == MHI_EE_EDL)
6161
#define MHI_IN_MISSION_MODE(ee) (ee == MHI_EE_AMSS || ee == MHI_EE_WFW || \
6262
ee == MHI_EE_FP)

drivers/bus/mhi/host/main.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -323,6 +323,11 @@ int mhi_destroy_device(struct device *dev, void *data)
323323
dev_dbg(&mhi_cntrl->mhi_dev->dev, "destroy device for chan:%s\n",
324324
mhi_dev->name);
325325

326+
if (!strcmp(mhi_dev->name, "IP_CTRL")) {
327+
dev_dbg(dev, "destroying IP_CTRL\n");
328+
mhi_cntrl->mhi_dev_ip_ctrl = NULL;
329+
}
330+
326331
/* Notify the client and remove the device from MHI bus */
327332
device_del(dev);
328333
put_device(dev);
@@ -423,6 +428,12 @@ void mhi_create_devices(struct mhi_controller *mhi_cntrl)
423428
ret = device_add(&mhi_dev->dev);
424429
if (ret)
425430
put_device(&mhi_dev->dev);
431+
else {
432+
if (!strcmp(mhi_dev->name, "IP_CTRL")) {
433+
dev_dbg(dev, "IP_CTRL supported\n");
434+
mhi_cntrl->mhi_dev_ip_ctrl = mhi_dev;
435+
}
436+
}
426437
}
427438
}
428439

drivers/bus/mhi/host/pci_generic.c

Lines changed: 103 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121

2222
#define MHI_POST_RESET_DELAY_MS 2000
2323

24-
#define HEALTH_CHECK_PERIOD (HZ * 2)
24+
#define HEALTH_CHECK_PERIOD (HZ / 2)
2525

2626
/* PCI VID definitions */
2727
#define PCI_VENDOR_ID_THALES 0x1269
@@ -50,6 +50,36 @@ struct mhi_pci_dev_info {
5050
bool sideband_wake;
5151
};
5252

53+
#define MHI_CHANNEL_CONFIG_AMSS_SBL_UL(ch_num, ch_name, el_count, ev_ring) \
54+
{ \
55+
.num = ch_num, \
56+
.name = ch_name, \
57+
.num_elements = el_count, \
58+
.event_ring = ev_ring, \
59+
.dir = DMA_TO_DEVICE, \
60+
.ee_mask = BIT(MHI_EE_SBL) | BIT(MHI_EE_AMSS), \
61+
.pollcfg = 0, \
62+
.doorbell = MHI_DB_BRST_DISABLE, \
63+
.lpm_notify = false, \
64+
.offload_channel = false, \
65+
.doorbell_mode_switch = false, \
66+
} \
67+
68+
#define MHI_CHANNEL_CONFIG_AMSS_SBL_DL(ch_num, ch_name, el_count, ev_ring) \
69+
{ \
70+
.num = ch_num, \
71+
.name = ch_name, \
72+
.num_elements = el_count, \
73+
.event_ring = ev_ring, \
74+
.dir = DMA_FROM_DEVICE, \
75+
.ee_mask = BIT(MHI_EE_SBL) | BIT(MHI_EE_AMSS), \
76+
.pollcfg = 0, \
77+
.doorbell = MHI_DB_BRST_DISABLE, \
78+
.lpm_notify = false, \
79+
.offload_channel = false, \
80+
.doorbell_mode_switch = false, \
81+
}
82+
5383
#define MHI_CHANNEL_CONFIG_UL(ch_num, ch_name, el_count, ev_ring) \
5484
{ \
5585
.num = ch_num, \
@@ -538,17 +568,69 @@ static const struct mhi_pci_dev_info mhi_telit_fn980_hw_v1_info = {
538568
.sideband_wake = false,
539569
};
540570

571+
static const struct mhi_channel_config mhi_telit_fn980_hw_v2_channels[] = {
572+
MHI_CHANNEL_CONFIG_UL_SBL(2, "SAHARA", 32, 0),
573+
MHI_CHANNEL_CONFIG_DL_SBL(3, "SAHARA", 32, 0),
574+
MHI_CHANNEL_CONFIG_AMSS_SBL_UL(4, "DIAG", 64, 1),
575+
MHI_CHANNEL_CONFIG_AMSS_SBL_DL(5, "DIAG", 64, 1),
576+
MHI_CHANNEL_CONFIG_UL(14, "QMI", 32, 0),
577+
MHI_CHANNEL_CONFIG_DL(15, "QMI", 32, 0),
578+
MHI_CHANNEL_CONFIG_UL(18, "IP_CTRL", 8, 1),
579+
MHI_CHANNEL_CONFIG_DL_AUTOQUEUE(19, "IP_CTRL", 8, 1),
580+
MHI_CHANNEL_CONFIG_UL(20, "IPCR", 16, 0),
581+
MHI_CHANNEL_CONFIG_DL_AUTOQUEUE(21, "IPCR", 16, 0),
582+
MHI_CHANNEL_CONFIG_UL(32, "DUN", 8, 1),
583+
MHI_CHANNEL_CONFIG_DL(33, "DUN", 8, 1),
584+
MHI_CHANNEL_CONFIG_UL(92, "DUN2", 8, 1),
585+
MHI_CHANNEL_CONFIG_DL(93, "DUN2", 8, 1),
586+
MHI_CHANNEL_CONFIG_UL(94, "NMEA", 8, 1),
587+
MHI_CHANNEL_CONFIG_DL(95, "NMEA", 8, 1),
588+
MHI_CHANNEL_CONFIG_HW_UL(100, "IP_HW0", 128, 2),
589+
MHI_CHANNEL_CONFIG_HW_DL(101, "IP_HW0", 128, 3),
590+
};
591+
592+
static struct mhi_event_config mhi_telit_fn980_hw_v2_events[] = {
593+
MHI_EVENT_CONFIG_CTRL(0, 128),
594+
MHI_EVENT_CONFIG_DATA(1, 128),
595+
MHI_EVENT_CONFIG_HW_DATA(2, 1024, 100),
596+
MHI_EVENT_CONFIG_HW_DATA(3, 2048, 101),
597+
};
598+
599+
static struct mhi_controller_config modem_telit_fn980_hw_v2_config = {
600+
.max_channels = 128,
601+
.timeout_ms = 20000,
602+
.num_channels = ARRAY_SIZE(mhi_telit_fn980_hw_v2_channels),
603+
.ch_cfg = mhi_telit_fn980_hw_v2_channels,
604+
.num_events = ARRAY_SIZE(mhi_telit_fn980_hw_v2_events),
605+
.event_cfg = mhi_telit_fn980_hw_v2_events,
606+
};
607+
608+
static const struct mhi_pci_dev_info mhi_telit_fn980_hw_v2_info = {
609+
.name = "telit-fn980",
610+
.fw = "qcom/sdx55m/sbl1.mbn",
611+
.edl = "qcom/sdx55m/edl.mbn",
612+
.config = &modem_telit_fn980_hw_v2_config,
613+
.bar_num = MHI_PCI_DEFAULT_BAR_NUM,
614+
.dma_data_width = 32,
615+
.mru_default = 32768,
616+
.sideband_wake = false,
617+
};
618+
541619
static const struct mhi_channel_config mhi_telit_fn990_channels[] = {
542620
MHI_CHANNEL_CONFIG_UL_SBL(2, "SAHARA", 32, 0),
543621
MHI_CHANNEL_CONFIG_DL_SBL(3, "SAHARA", 32, 0),
544-
MHI_CHANNEL_CONFIG_UL(4, "DIAG", 64, 1),
545-
MHI_CHANNEL_CONFIG_DL(5, "DIAG", 64, 1),
622+
MHI_CHANNEL_CONFIG_AMSS_SBL_UL(4, "DIAG", 64, 1),
623+
MHI_CHANNEL_CONFIG_AMSS_SBL_DL(5, "DIAG", 64, 1),
546624
MHI_CHANNEL_CONFIG_UL(12, "MBIM", 32, 0),
547625
MHI_CHANNEL_CONFIG_DL(13, "MBIM", 32, 0),
626+
MHI_CHANNEL_CONFIG_UL(18, "IP_CTRL", 8, 1),
627+
MHI_CHANNEL_CONFIG_DL_AUTOQUEUE(19, "IP_CTRL", 8, 1),
548628
MHI_CHANNEL_CONFIG_UL(32, "DUN", 32, 0),
549629
MHI_CHANNEL_CONFIG_DL(33, "DUN", 32, 0),
550630
MHI_CHANNEL_CONFIG_UL(92, "DUN2", 32, 1),
551631
MHI_CHANNEL_CONFIG_DL(93, "DUN2", 32, 1),
632+
MHI_CHANNEL_CONFIG_UL(94, "NMEA", 8, 1),
633+
MHI_CHANNEL_CONFIG_DL(95, "NMEA", 8, 1),
552634
MHI_CHANNEL_CONFIG_HW_UL(100, "IP_HW0_MBIM", 128, 2),
553635
MHI_CHANNEL_CONFIG_HW_DL(101, "IP_HW0_MBIM", 128, 3),
554636
};
@@ -582,16 +664,15 @@ static const struct mhi_pci_dev_info mhi_telit_fn990_info = {
582664
static const struct pci_device_id mhi_pci_id_table[] = {
583665
{ PCI_DEVICE(PCI_VENDOR_ID_QCOM, 0x0304),
584666
.driver_data = (kernel_ulong_t) &mhi_qcom_sdx24_info },
585-
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_QCOM, 0x0306, PCI_VENDOR_ID_QCOM, 0x010c),
586-
.driver_data = (kernel_ulong_t) &mhi_foxconn_sdx55_info },
587667
/* EM919x (sdx55), use the same vid:pid as qcom-sdx55m */
588668
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_QCOM, 0x0306, 0x18d7, 0x0200),
589669
.driver_data = (kernel_ulong_t) &mhi_sierra_em919x_info },
590670
/* Telit FN980 hardware revision v1 */
591671
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_QCOM, 0x0306, 0x1C5D, 0x2000),
592672
.driver_data = (kernel_ulong_t) &mhi_telit_fn980_hw_v1_info },
673+
/* Modified Qualcomm default entry for FN980 firmware release without Telit SSIDs */
593674
{ PCI_DEVICE(PCI_VENDOR_ID_QCOM, 0x0306),
594-
.driver_data = (kernel_ulong_t) &mhi_qcom_sdx55_info },
675+
.driver_data = (kernel_ulong_t) &mhi_telit_fn980_hw_v2_info },
595676
/* Telit FN990 */
596677
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_QCOM, 0x0308, 0x1c5d, 0x2010),
597678
.driver_data = (kernel_ulong_t) &mhi_telit_fn990_info },
@@ -859,6 +940,10 @@ static void mhi_pci_recovery_work(struct work_struct *work)
859940
mhi_unprepare_after_power_down(mhi_cntrl);
860941
}
861942

943+
dev_dbg(&pdev->dev, "Waiting 40 seconds for allowing the modem to restore PCIe\n");
944+
msleep(40000);
945+
dev_dbg(&pdev->dev, "Restoring PCI saved state\n");
946+
862947
pci_set_power_state(pdev, PCI_D0);
863948
pci_load_saved_state(pdev, mhi_pdev->pci_state);
864949
pci_restore_state(pdev);
@@ -896,6 +981,18 @@ static void health_check(struct timer_list *t)
896981
test_bit(MHI_PCI_DEV_SUSPENDED, &mhi_pdev->status))
897982
return;
898983

984+
if (mhi_cntrl->xfp == XFP_STATE_FLASHING) {
985+
mod_timer(&mhi_pdev->health_check_timer, jiffies + HEALTH_CHECK_PERIOD);
986+
return;
987+
}
988+
989+
if (mhi_cntrl->xfp == XFP_STATE_NEED_RESET) {
990+
mhi_cntrl->xfp = XFP_STATE_IDLE;
991+
dev_dbg(mhi_cntrl->cntrl_dev, "Device needs to be resetted EE = %d\n", mhi_cntrl->ee);
992+
queue_work(system_long_wq, &mhi_pdev->recovery_work);
993+
return;
994+
}
995+
899996
if (!mhi_pci_is_alive(mhi_cntrl)) {
900997
dev_err(mhi_cntrl->cntrl_dev, "Device died\n");
901998
queue_work(system_long_wq, &mhi_pdev->recovery_work);

drivers/bus/mhi/host/pm.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1208,10 +1208,11 @@ int mhi_sync_power_up(struct mhi_controller *mhi_cntrl)
12081208

12091209
wait_event_timeout(mhi_cntrl->state_event,
12101210
MHI_IN_MISSION_MODE(mhi_cntrl->ee) ||
1211+
mhi_cntrl->ee == MHI_EE_SBL ||
12111212
MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state),
12121213
msecs_to_jiffies(mhi_cntrl->timeout_ms));
12131214

1214-
ret = (MHI_IN_MISSION_MODE(mhi_cntrl->ee)) ? 0 : -ETIMEDOUT;
1215+
ret = (MHI_IN_MISSION_MODE(mhi_cntrl->ee) || mhi_cntrl->ee == MHI_EE_SBL) ? 0 : -ETIMEDOUT;
12151216
if (ret)
12161217
mhi_power_down(mhi_cntrl, false);
12171218

drivers/net/wwan/Kconfig

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ config WWAN_HWSIM
3939
config MHI_WWAN_CTRL
4040
tristate "MHI WWAN control driver for QCOM-based PCIe modems"
4141
depends on MHI_BUS
42+
select MHI_WWAN_DTR
4243
help
4344
MHI WWAN CTRL allows QCOM-based PCIe modems to expose different modem
4445
control protocols/ports to userspace, including AT, MBIM, QMI, DIAG
@@ -49,6 +50,16 @@ config MHI_WWAN_CTRL
4950
To compile this driver as a module, choose M here: the module will be
5051
called mhi_wwan_ctrl.
5152

53+
config MHI_WWAN_DTR
54+
tristate "MHI WWAN DTR driver for QCOM-based PCIe modems"
55+
depends on MHI_BUS
56+
help
57+
MHI WWAN DTR allows to set DTR and RTS signals on QCOM-based PCIe
58+
DUN ports.
59+
60+
To compile this driver as a module, choose M here: the module will be
61+
called mhi_wwan_dtr.
62+
5263
config MHI_WWAN_MBIM
5364
tristate "MHI WWAN MBIM network driver for QCOM-based PCIe modems"
5465
depends on MHI_BUS

drivers/net/wwan/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ wwan-objs += wwan_core.o
88

99
obj-$(CONFIG_WWAN_HWSIM) += wwan_hwsim.o
1010

11+
obj-$(CONFIG_MHI_WWAN_DTR) += mhi_wwan_dtr.o
1112
obj-$(CONFIG_MHI_WWAN_CTRL) += mhi_wwan_ctrl.o
1213
obj-$(CONFIG_MHI_WWAN_MBIM) += mhi_wwan_mbim.o
1314
obj-$(CONFIG_QCOM_BAM_DMUX) += qcom_bam_dmux.o

drivers/net/wwan/mhi_wwan_ctrl.c

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// SPDX-License-Identifier: GPL-2.0-only
2-
/* Copyright (c) 2021, Linaro Ltd <[email protected]> */
2+
/* Copyright (c) 2023, Linaro Ltd <[email protected]> */
33
#include <linux/kernel.h>
44
#include <linux/mhi.h>
55
#include <linux/mod_devicetable.h>
@@ -104,6 +104,8 @@ static void mhi_wwan_ctrl_refill_work(struct work_struct *work)
104104
}
105105
}
106106

107+
int mhi_wwan_dtr_set(struct wwan_port *port, int dtr, int rts);
108+
107109
static int mhi_wwan_ctrl_start(struct wwan_port *port)
108110
{
109111
struct mhi_wwan_dev *mhiwwan = wwan_port_get_drvdata(port);
@@ -123,13 +125,23 @@ static int mhi_wwan_ctrl_start(struct wwan_port *port)
123125
mhi_wwan_ctrl_refill_work(&mhiwwan->rx_refill);
124126
}
125127

128+
if (wwan_port_get_type(port) == WWAN_PORT_AT) {
129+
dev_dbg(&mhiwwan->mhi_dev->dev, "Setting DTR and RTS for port\n");
130+
mhi_wwan_dtr_set(port, 1, 1);
131+
}
132+
126133
return 0;
127134
}
128135

129136
static void mhi_wwan_ctrl_stop(struct wwan_port *port)
130137
{
131138
struct mhi_wwan_dev *mhiwwan = wwan_port_get_drvdata(port);
132139

140+
if (wwan_port_get_type(port) == WWAN_PORT_AT) {
141+
dev_dbg(&mhiwwan->mhi_dev->dev, "Unsetting DTR and RTS for port\n");
142+
mhi_wwan_dtr_set(port, 0, 0);
143+
}
144+
133145
spin_lock_bh(&mhiwwan->rx_lock);
134146
clear_bit(MHI_WWAN_RX_REFILL, &mhiwwan->flags);
135147
spin_unlock_bh(&mhiwwan->rx_lock);
@@ -263,6 +275,8 @@ static const struct mhi_device_id mhi_wwan_ctrl_match_table[] = {
263275
{ .chan = "QMI", .driver_data = WWAN_PORT_QMI },
264276
{ .chan = "DIAG", .driver_data = WWAN_PORT_QCDM },
265277
{ .chan = "FIREHOSE", .driver_data = WWAN_PORT_FIREHOSE },
278+
{ .chan = "SAHARA", .driver_data = WWAN_PORT_SAHARA },
279+
{ .chan = "NMEA", .driver_data = WWAN_PORT_NMEA },
266280
{},
267281
};
268282
MODULE_DEVICE_TABLE(mhi, mhi_wwan_ctrl_match_table);

0 commit comments

Comments
 (0)