1*4882a593Smuzhiyun /******************************************************************************
2*4882a593Smuzhiyun @file qmap_bridge_mode.c
3*4882a593Smuzhiyun @brief Connectivity bridge manager.
4*4882a593Smuzhiyun
5*4882a593Smuzhiyun DESCRIPTION
6*4882a593Smuzhiyun Connectivity Management Tool for USB network adapter of Quectel wireless cellular modules.
7*4882a593Smuzhiyun
8*4882a593Smuzhiyun INITIALIZATION AND SEQUENCING REQUIREMENTS
9*4882a593Smuzhiyun None.
10*4882a593Smuzhiyun
11*4882a593Smuzhiyun ---------------------------------------------------------------------------
12*4882a593Smuzhiyun Copyright (c) 2016 - 2020 Quectel Wireless Solution, Co., Ltd. All Rights Reserved.
13*4882a593Smuzhiyun Quectel Wireless Solution Proprietary and Confidential.
14*4882a593Smuzhiyun ---------------------------------------------------------------------------
15*4882a593Smuzhiyun ******************************************************************************/
16*4882a593Smuzhiyun #include "QMIThread.h"
17*4882a593Smuzhiyun
ql_fread(const char * filename,void * buf,size_t size)18*4882a593Smuzhiyun static size_t ql_fread(const char *filename, void *buf, size_t size) {
19*4882a593Smuzhiyun FILE *fp = fopen(filename , "r");
20*4882a593Smuzhiyun size_t n = 0;
21*4882a593Smuzhiyun
22*4882a593Smuzhiyun memset(buf, 0x00, size);
23*4882a593Smuzhiyun
24*4882a593Smuzhiyun if (fp) {
25*4882a593Smuzhiyun n = fread(buf, 1, size, fp);
26*4882a593Smuzhiyun if (n <= 0 || n == size) {
27*4882a593Smuzhiyun dbg_time("warnning: fail to fread(%s), fread=%zu, buf_size=%zu: (%s)", filename, n, size, strerror(errno));
28*4882a593Smuzhiyun }
29*4882a593Smuzhiyun fclose(fp);
30*4882a593Smuzhiyun }
31*4882a593Smuzhiyun
32*4882a593Smuzhiyun return n > 0 ? n : 0;
33*4882a593Smuzhiyun }
34*4882a593Smuzhiyun
ql_fwrite(const char * filename,const void * buf,size_t size)35*4882a593Smuzhiyun static size_t ql_fwrite(const char *filename, const void *buf, size_t size) {
36*4882a593Smuzhiyun FILE *fp = fopen(filename , "w");
37*4882a593Smuzhiyun size_t n = 0;
38*4882a593Smuzhiyun
39*4882a593Smuzhiyun if (fp) {
40*4882a593Smuzhiyun n = fwrite(buf, 1, size, fp);
41*4882a593Smuzhiyun if (n != size) {
42*4882a593Smuzhiyun dbg_time("warnning: fail to fwrite(%s), fwrite=%zu, buf_size=%zu: (%s)", filename, n, size, strerror(errno));
43*4882a593Smuzhiyun }
44*4882a593Smuzhiyun fclose(fp);
45*4882a593Smuzhiyun }
46*4882a593Smuzhiyun
47*4882a593Smuzhiyun return n > 0 ? n : 0;
48*4882a593Smuzhiyun }
49*4882a593Smuzhiyun
ql_bridge_mode_detect(PROFILE_T * profile)50*4882a593Smuzhiyun int ql_bridge_mode_detect(PROFILE_T *profile) {
51*4882a593Smuzhiyun const char *ifname = profile->qmapnet_adapter[0] ? profile->qmapnet_adapter : profile->usbnet_adapter;
52*4882a593Smuzhiyun const char *driver;
53*4882a593Smuzhiyun char bridge_mode[128];
54*4882a593Smuzhiyun char bridge_ipv4[128];
55*4882a593Smuzhiyun char ipv4[128];
56*4882a593Smuzhiyun char buf[64];
57*4882a593Smuzhiyun size_t n;
58*4882a593Smuzhiyun int in_bridge = 0;
59*4882a593Smuzhiyun
60*4882a593Smuzhiyun driver = profile->driver_name;
61*4882a593Smuzhiyun snprintf(bridge_mode, sizeof(bridge_mode), "/sys/class/net/%s/bridge_mode", ifname);
62*4882a593Smuzhiyun snprintf(bridge_ipv4, sizeof(bridge_ipv4), "/sys/class/net/%s/bridge_ipv4", ifname);
63*4882a593Smuzhiyun
64*4882a593Smuzhiyun if (access(bridge_ipv4, R_OK)) {
65*4882a593Smuzhiyun if (errno != ENOENT) {
66*4882a593Smuzhiyun dbg_time("fail to access %s, errno: %d (%s)", bridge_mode, errno, strerror(errno));
67*4882a593Smuzhiyun return 0;
68*4882a593Smuzhiyun }
69*4882a593Smuzhiyun
70*4882a593Smuzhiyun snprintf(bridge_mode, sizeof(bridge_mode), "/sys/module/%s/parameters/bridge_mode", driver);
71*4882a593Smuzhiyun snprintf(bridge_ipv4, sizeof(bridge_ipv4), "/sys/module/%s/parameters/bridge_ipv4", driver);
72*4882a593Smuzhiyun
73*4882a593Smuzhiyun if (access(bridge_mode, R_OK)) {
74*4882a593Smuzhiyun if (errno != ENOENT) {
75*4882a593Smuzhiyun dbg_time("fail to access %s, errno: %d (%s)", bridge_mode, errno, strerror(errno));
76*4882a593Smuzhiyun }
77*4882a593Smuzhiyun return 0;
78*4882a593Smuzhiyun }
79*4882a593Smuzhiyun }
80*4882a593Smuzhiyun
81*4882a593Smuzhiyun n = ql_fread(bridge_mode, buf, sizeof(buf));
82*4882a593Smuzhiyun if (n > 0) {
83*4882a593Smuzhiyun in_bridge = (buf[0] != '0');
84*4882a593Smuzhiyun }
85*4882a593Smuzhiyun if (!in_bridge)
86*4882a593Smuzhiyun return 0;
87*4882a593Smuzhiyun
88*4882a593Smuzhiyun memset(ipv4, 0, sizeof(ipv4));
89*4882a593Smuzhiyun
90*4882a593Smuzhiyun if (strstr(bridge_ipv4, "/sys/class/net/") || profile->qmap_mode == 0 || profile->qmap_mode == 1) {
91*4882a593Smuzhiyun snprintf(ipv4, sizeof(ipv4), "0x%x", profile->ipv4.Address);
92*4882a593Smuzhiyun dbg_time("echo '%s' > %s", ipv4, bridge_ipv4);
93*4882a593Smuzhiyun ql_fwrite(bridge_ipv4, ipv4, strlen(ipv4));
94*4882a593Smuzhiyun }
95*4882a593Smuzhiyun else {
96*4882a593Smuzhiyun snprintf(ipv4, sizeof(ipv4), "0x%x:%d", profile->ipv4.Address, profile->muxid);
97*4882a593Smuzhiyun dbg_time("echo '%s' > %s", ipv4, bridge_ipv4);
98*4882a593Smuzhiyun ql_fwrite(bridge_ipv4, ipv4, strlen(ipv4));
99*4882a593Smuzhiyun }
100*4882a593Smuzhiyun
101*4882a593Smuzhiyun return in_bridge;
102*4882a593Smuzhiyun }
103*4882a593Smuzhiyun
ql_enable_qmi_wwan_rawip_mode(PROFILE_T * profile)104*4882a593Smuzhiyun int ql_enable_qmi_wwan_rawip_mode(PROFILE_T *profile) {
105*4882a593Smuzhiyun char filename[256];
106*4882a593Smuzhiyun char buf[4];
107*4882a593Smuzhiyun size_t n;
108*4882a593Smuzhiyun FILE *fp;
109*4882a593Smuzhiyun
110*4882a593Smuzhiyun if (!qmidev_is_qmiwwan(profile->qmichannel))
111*4882a593Smuzhiyun return 0;
112*4882a593Smuzhiyun
113*4882a593Smuzhiyun snprintf(filename, sizeof(filename), "/sys/class/net/%s/qmi/rawip", profile->usbnet_adapter);
114*4882a593Smuzhiyun n = ql_fread(filename, buf, sizeof(buf));
115*4882a593Smuzhiyun
116*4882a593Smuzhiyun if (n == 0)
117*4882a593Smuzhiyun return 0;
118*4882a593Smuzhiyun
119*4882a593Smuzhiyun if (buf[0] == '1' || buf[0] == 'Y')
120*4882a593Smuzhiyun return 0;
121*4882a593Smuzhiyun
122*4882a593Smuzhiyun fp = fopen(filename , "w");
123*4882a593Smuzhiyun if (fp == NULL) {
124*4882a593Smuzhiyun dbg_time("Fail to fopen(%s, \"w\"), errno: %d (%s)", filename, errno, strerror(errno));
125*4882a593Smuzhiyun return 1;
126*4882a593Smuzhiyun }
127*4882a593Smuzhiyun
128*4882a593Smuzhiyun buf[0] = 'Y';
129*4882a593Smuzhiyun n = fwrite(buf, 1, 1, fp);
130*4882a593Smuzhiyun if (n != 1) {
131*4882a593Smuzhiyun dbg_time("Fail to fwrite(%s), errno: %d (%s)", filename, errno, strerror(errno));
132*4882a593Smuzhiyun fclose(fp);
133*4882a593Smuzhiyun return 1;
134*4882a593Smuzhiyun }
135*4882a593Smuzhiyun fclose(fp);
136*4882a593Smuzhiyun
137*4882a593Smuzhiyun return 0;
138*4882a593Smuzhiyun }
139*4882a593Smuzhiyun
ql_driver_type_detect(PROFILE_T * profile)140*4882a593Smuzhiyun int ql_driver_type_detect(PROFILE_T *profile) {
141*4882a593Smuzhiyun if (qmidev_is_gobinet(profile->qmichannel)) {
142*4882a593Smuzhiyun profile->qmi_ops = &gobi_qmidev_ops;
143*4882a593Smuzhiyun }
144*4882a593Smuzhiyun else {
145*4882a593Smuzhiyun profile->qmi_ops = &qmiwwan_qmidev_ops;
146*4882a593Smuzhiyun }
147*4882a593Smuzhiyun qmidev_send = profile->qmi_ops->send;
148*4882a593Smuzhiyun
149*4882a593Smuzhiyun return 0;
150*4882a593Smuzhiyun }
151*4882a593Smuzhiyun
ql_set_driver_bridge_mode(PROFILE_T * profile)152*4882a593Smuzhiyun void ql_set_driver_bridge_mode(PROFILE_T *profile) {
153*4882a593Smuzhiyun char enable[16];
154*4882a593Smuzhiyun char filename[256];
155*4882a593Smuzhiyun
156*4882a593Smuzhiyun if(profile->qmap_mode)
157*4882a593Smuzhiyun snprintf(filename, sizeof(filename), "/sys/class/net/%s/bridge_mode", profile->qmapnet_adapter);
158*4882a593Smuzhiyun else
159*4882a593Smuzhiyun snprintf(filename, sizeof(filename), "/sys/class/net/%s/bridge_mode", profile->usbnet_adapter);
160*4882a593Smuzhiyun snprintf(enable, sizeof(enable), "%02d\n", profile->enable_bridge);
161*4882a593Smuzhiyun ql_fwrite(filename, enable, sizeof(enable));
162*4882a593Smuzhiyun }
163*4882a593Smuzhiyun
ql_qmi_qmap_mode_detect(PROFILE_T * profile)164*4882a593Smuzhiyun static int ql_qmi_qmap_mode_detect(PROFILE_T *profile) {
165*4882a593Smuzhiyun char buf[128];
166*4882a593Smuzhiyun int n;
167*4882a593Smuzhiyun struct {
168*4882a593Smuzhiyun char filename[255 * 2];
169*4882a593Smuzhiyun char linkname[255 * 2];
170*4882a593Smuzhiyun } *pl;
171*4882a593Smuzhiyun
172*4882a593Smuzhiyun pl = (typeof(pl)) malloc(sizeof(*pl));
173*4882a593Smuzhiyun
174*4882a593Smuzhiyun snprintf(pl->linkname, sizeof(pl->linkname), "/sys/class/net/%s/device/driver", profile->usbnet_adapter);
175*4882a593Smuzhiyun n = readlink(pl->linkname, pl->filename, sizeof(pl->filename));
176*4882a593Smuzhiyun pl->filename[n] = '\0';
177*4882a593Smuzhiyun while (pl->filename[n] != '/')
178*4882a593Smuzhiyun n--;
179*4882a593Smuzhiyun strncpy(profile->driver_name, &pl->filename[n+1], sizeof(profile->driver_name));
180*4882a593Smuzhiyun
181*4882a593Smuzhiyun ql_get_driver_rmnet_info(profile, &profile->rmnet_info);
182*4882a593Smuzhiyun if (profile->rmnet_info.size) {
183*4882a593Smuzhiyun profile->qmap_mode = profile->rmnet_info.qmap_mode;
184*4882a593Smuzhiyun if (profile->qmap_mode) {
185*4882a593Smuzhiyun int offset_id = (profile->muxid == 0)? profile->pdp - 1 : profile->muxid - 0x81;
186*4882a593Smuzhiyun
187*4882a593Smuzhiyun if (profile->qmap_mode == 1)
188*4882a593Smuzhiyun offset_id = 0;
189*4882a593Smuzhiyun profile->muxid = profile->rmnet_info.mux_id[offset_id];
190*4882a593Smuzhiyun strncpy(profile->qmapnet_adapter, profile->rmnet_info.ifname[offset_id], sizeof(profile->qmapnet_adapter));
191*4882a593Smuzhiyun profile->qmap_size = profile->rmnet_info.rx_urb_size;
192*4882a593Smuzhiyun profile->qmap_version = profile->rmnet_info.qmap_version;
193*4882a593Smuzhiyun }
194*4882a593Smuzhiyun
195*4882a593Smuzhiyun goto _out;
196*4882a593Smuzhiyun }
197*4882a593Smuzhiyun
198*4882a593Smuzhiyun snprintf(pl->filename, sizeof(pl->filename), "/sys/class/net/%s/qmap_mode", profile->usbnet_adapter);
199*4882a593Smuzhiyun if (access(pl->filename, R_OK)) {
200*4882a593Smuzhiyun if (errno != ENOENT) {
201*4882a593Smuzhiyun dbg_time("fail to access %s, errno: %d (%s)", pl->filename, errno, strerror(errno));
202*4882a593Smuzhiyun goto _out;
203*4882a593Smuzhiyun }
204*4882a593Smuzhiyun
205*4882a593Smuzhiyun snprintf(pl->filename, sizeof(pl->filename), "/sys/module/%s/parameters/qmap_mode", profile->driver_name);
206*4882a593Smuzhiyun if (access(pl->filename, R_OK)) {
207*4882a593Smuzhiyun if (errno != ENOENT) {
208*4882a593Smuzhiyun dbg_time("fail to access %s, errno: %d (%s)", pl->filename, errno, strerror(errno));
209*4882a593Smuzhiyun goto _out;
210*4882a593Smuzhiyun }
211*4882a593Smuzhiyun
212*4882a593Smuzhiyun snprintf(pl->filename, sizeof(pl->filename), "/sys/class/net/%s/device/driver/module/parameters/qmap_mode", profile->usbnet_adapter);
213*4882a593Smuzhiyun if (access(pl->filename, R_OK)) {
214*4882a593Smuzhiyun if (errno != ENOENT) {
215*4882a593Smuzhiyun dbg_time("fail to access %s, errno: %d (%s)", pl->filename, errno, strerror(errno));
216*4882a593Smuzhiyun goto _out;
217*4882a593Smuzhiyun }
218*4882a593Smuzhiyun }
219*4882a593Smuzhiyun }
220*4882a593Smuzhiyun }
221*4882a593Smuzhiyun
222*4882a593Smuzhiyun if (!access(pl->filename, R_OK)) {
223*4882a593Smuzhiyun n = ql_fread(pl->filename, buf, sizeof(buf));
224*4882a593Smuzhiyun if (n > 0) {
225*4882a593Smuzhiyun profile->qmap_mode = atoi(buf);
226*4882a593Smuzhiyun
227*4882a593Smuzhiyun if (profile->qmap_mode > 1) {
228*4882a593Smuzhiyun if(!profile->muxid)
229*4882a593Smuzhiyun profile->muxid = profile->pdp + 0x80; //muxis is 0x8X for PDN-X
230*4882a593Smuzhiyun snprintf(profile->qmapnet_adapter, sizeof(profile->qmapnet_adapter),
231*4882a593Smuzhiyun "%.16s.%d", profile->usbnet_adapter, profile->muxid - 0x80);
232*4882a593Smuzhiyun } if (profile->qmap_mode == 1) {
233*4882a593Smuzhiyun profile->muxid = 0x81;
234*4882a593Smuzhiyun strncpy(profile->qmapnet_adapter, profile->usbnet_adapter, sizeof(profile->qmapnet_adapter));
235*4882a593Smuzhiyun }
236*4882a593Smuzhiyun }
237*4882a593Smuzhiyun }
238*4882a593Smuzhiyun else if (qmidev_is_qmiwwan(profile->qmichannel)) {
239*4882a593Smuzhiyun snprintf(pl->filename, sizeof(pl->filename), "/sys/class/net/qmimux%d", profile->pdp - 1);
240*4882a593Smuzhiyun if (access(pl->filename, R_OK)) {
241*4882a593Smuzhiyun if (errno != ENOENT) {
242*4882a593Smuzhiyun dbg_time("fail to access %s, errno: %d (%s)", pl->filename, errno, strerror(errno));
243*4882a593Smuzhiyun }
244*4882a593Smuzhiyun goto _out;
245*4882a593Smuzhiyun }
246*4882a593Smuzhiyun
247*4882a593Smuzhiyun //upstream Kernel Style QMAP qmi_wwan.c
248*4882a593Smuzhiyun snprintf(pl->filename, sizeof(pl->filename), "/sys/class/net/%s/qmi/add_mux", profile->usbnet_adapter);
249*4882a593Smuzhiyun n = ql_fread(pl->filename, buf, sizeof(buf));
250*4882a593Smuzhiyun if (n >= 5) {
251*4882a593Smuzhiyun dbg_time("If use QMAP by /sys/class/net/%s/qmi/add_mux", profile->usbnet_adapter);
252*4882a593Smuzhiyun dbg_time("File:%s Line:%d Please make sure add next patch to qmi_wwan.c", __func__, __LINE__);
253*4882a593Smuzhiyun /*
254*4882a593Smuzhiyun diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c
255*4882a593Smuzhiyun index 74bebbd..db8a777 100644
256*4882a593Smuzhiyun --- a/drivers/net/usb/qmi_wwan.c
257*4882a593Smuzhiyun +++ b/drivers/net/usb/qmi_wwan.c
258*4882a593Smuzhiyun @@ -379,6 +379,24 @@ static ssize_t add_mux_store(struct device *d, struct device_attribute *attr, c
259*4882a593Smuzhiyun if (!ret) {
260*4882a593Smuzhiyun info->flags |= QMI_WWAN_FLAG_MUX;
261*4882a593Smuzhiyun ret = len;
262*4882a593Smuzhiyun +#if 1 //Add by Quectel
263*4882a593Smuzhiyun + if (le16_to_cpu(dev->udev->descriptor.idVendor) == 0x2c7c) {
264*4882a593Smuzhiyun + int idProduct = le16_to_cpu(dev->udev->descriptor.idProduct);
265*4882a593Smuzhiyun +
266*4882a593Smuzhiyun + if (idProduct == 0x0121 || idProduct == 0x0125 || idProduct == 0x0435) //MDM9x07
267*4882a593Smuzhiyun + dev->rx_urb_size = 4*1024;
268*4882a593Smuzhiyun + else if (idProduct == 0x0306) //MDM9x40
269*4882a593Smuzhiyun + dev->rx_urb_size = 16*1024;
270*4882a593Smuzhiyun + else if (idProduct == 0x0512) //SDX20
271*4882a593Smuzhiyun + dev->rx_urb_size = 32*1024;
272*4882a593Smuzhiyun + else if (idProduct == 0x0620) //SDX24
273*4882a593Smuzhiyun + dev->rx_urb_size = 32*1024;
274*4882a593Smuzhiyun + else if (idProduct == 0x0800) //SDX55
275*4882a593Smuzhiyun + dev->rx_urb_size = 32*1024;
276*4882a593Smuzhiyun + else
277*4882a593Smuzhiyun + dev->rx_urb_size = 32*1024;
278*4882a593Smuzhiyun + }
279*4882a593Smuzhiyun +#endif
280*4882a593Smuzhiyun }
281*4882a593Smuzhiyun err:
282*4882a593Smuzhiyun rtnl_unlock();
283*4882a593Smuzhiyun */
284*4882a593Smuzhiyun profile->qmap_mode = n/5; //0x11\n0x22\n0x33\n
285*4882a593Smuzhiyun if (profile->qmap_mode > 1) {
286*4882a593Smuzhiyun //PDN-X map to qmimux-X
287*4882a593Smuzhiyun if(!profile->muxid) {
288*4882a593Smuzhiyun profile->muxid = (buf[5*(profile->pdp - 1) + 2] - '0')*16 + (buf[5*(profile->pdp - 1) + 3] - '0');
289*4882a593Smuzhiyun snprintf(profile->qmapnet_adapter, sizeof(profile->qmapnet_adapter), "qmimux%d", profile->pdp - 1);
290*4882a593Smuzhiyun } else {
291*4882a593Smuzhiyun profile->muxid = (buf[5*(profile->muxid - 0x81) + 2] - '0')*16 + (buf[5*(profile->muxid - 0x81) + 3] - '0');
292*4882a593Smuzhiyun snprintf(profile->qmapnet_adapter, sizeof(profile->qmapnet_adapter), "qmimux%d", profile->muxid - 0x81);
293*4882a593Smuzhiyun }
294*4882a593Smuzhiyun } else if (profile->qmap_mode == 1) {
295*4882a593Smuzhiyun profile->muxid = (buf[5*0 + 2] - '0')*16 + (buf[5*0 + 3] - '0');
296*4882a593Smuzhiyun snprintf(profile->qmapnet_adapter, sizeof(profile->qmapnet_adapter),
297*4882a593Smuzhiyun "qmimux%d", 0);
298*4882a593Smuzhiyun }
299*4882a593Smuzhiyun }
300*4882a593Smuzhiyun }
301*4882a593Smuzhiyun
302*4882a593Smuzhiyun _out:
303*4882a593Smuzhiyun if (profile->qmap_mode) {
304*4882a593Smuzhiyun if (profile->qmap_size == 0) {
305*4882a593Smuzhiyun profile->qmap_size = 16*1024;
306*4882a593Smuzhiyun snprintf(pl->filename, sizeof(pl->filename), "/sys/class/net/%s/qmap_size", profile->usbnet_adapter);
307*4882a593Smuzhiyun if (!access(pl->filename, R_OK)) {
308*4882a593Smuzhiyun size_t n;
309*4882a593Smuzhiyun char buf[32];
310*4882a593Smuzhiyun n = ql_fread(pl->filename, buf, sizeof(buf));
311*4882a593Smuzhiyun if (n > 0) {
312*4882a593Smuzhiyun profile->qmap_size = atoi(buf);
313*4882a593Smuzhiyun }
314*4882a593Smuzhiyun }
315*4882a593Smuzhiyun }
316*4882a593Smuzhiyun
317*4882a593Smuzhiyun if (profile->qmap_version == 0) {
318*4882a593Smuzhiyun profile->qmap_version = WDA_DL_DATA_AGG_QMAP_ENABLED;
319*4882a593Smuzhiyun }
320*4882a593Smuzhiyun
321*4882a593Smuzhiyun dbg_time("qmap_mode = %d, qmap_version = %d, qmap_size = %d, muxid = 0x%02x, qmap_netcard = %s",
322*4882a593Smuzhiyun profile->qmap_mode, profile->qmap_version, profile->qmap_size, profile->muxid, profile->qmapnet_adapter);
323*4882a593Smuzhiyun }
324*4882a593Smuzhiyun ql_set_driver_bridge_mode(profile);
325*4882a593Smuzhiyun free(pl);
326*4882a593Smuzhiyun
327*4882a593Smuzhiyun return 0;
328*4882a593Smuzhiyun }
329*4882a593Smuzhiyun
ql_mbim_usb_vlan_mode_detect(PROFILE_T * profile)330*4882a593Smuzhiyun static int ql_mbim_usb_vlan_mode_detect(PROFILE_T *profile) {
331*4882a593Smuzhiyun char tmp[128];
332*4882a593Smuzhiyun
333*4882a593Smuzhiyun snprintf(tmp, sizeof(tmp), "/sys/class/net/%s.%d", profile->usbnet_adapter, profile->pdp);
334*4882a593Smuzhiyun if (!access(tmp, F_OK)) {
335*4882a593Smuzhiyun profile->qmap_mode = 4;
336*4882a593Smuzhiyun profile->muxid = profile->pdp;
337*4882a593Smuzhiyun strncpy(profile->qmapnet_adapter, &tmp[strlen("/sys/class/net/")], sizeof(profile->qmapnet_adapter));
338*4882a593Smuzhiyun
339*4882a593Smuzhiyun dbg_time("mbim_qmap_mode = %d, vlan_id = 0x%02x, qmap_netcard = %s",
340*4882a593Smuzhiyun profile->qmap_mode, profile->muxid, profile->qmapnet_adapter);
341*4882a593Smuzhiyun }
342*4882a593Smuzhiyun
343*4882a593Smuzhiyun return 0;
344*4882a593Smuzhiyun }
345*4882a593Smuzhiyun
ql_mbim_mhi_qmap_mode_detect(PROFILE_T * profile)346*4882a593Smuzhiyun static int ql_mbim_mhi_qmap_mode_detect(PROFILE_T *profile) {
347*4882a593Smuzhiyun ql_get_driver_rmnet_info(profile, &profile->rmnet_info);
348*4882a593Smuzhiyun if (profile->rmnet_info.size) {
349*4882a593Smuzhiyun profile->qmap_mode = profile->rmnet_info.qmap_mode;
350*4882a593Smuzhiyun if (profile->qmap_mode) {
351*4882a593Smuzhiyun int offset_id = profile->pdp - 1;
352*4882a593Smuzhiyun
353*4882a593Smuzhiyun if (profile->qmap_mode == 1)
354*4882a593Smuzhiyun offset_id = 0;
355*4882a593Smuzhiyun profile->muxid = offset_id;
356*4882a593Smuzhiyun strcpy(profile->qmapnet_adapter, profile->rmnet_info.ifname[offset_id]);
357*4882a593Smuzhiyun profile->qmap_size = profile->rmnet_info.rx_urb_size;
358*4882a593Smuzhiyun profile->qmap_version = profile->rmnet_info.qmap_version;
359*4882a593Smuzhiyun
360*4882a593Smuzhiyun dbg_time("mbim_qmap_mode = %d, vlan_id = 0x%02x, qmap_netcard = %s",
361*4882a593Smuzhiyun profile->qmap_mode, profile->muxid, profile->qmapnet_adapter);
362*4882a593Smuzhiyun }
363*4882a593Smuzhiyun
364*4882a593Smuzhiyun goto _out;
365*4882a593Smuzhiyun }
366*4882a593Smuzhiyun
367*4882a593Smuzhiyun _out:
368*4882a593Smuzhiyun return 0;
369*4882a593Smuzhiyun }
370*4882a593Smuzhiyun
ql_qmap_mode_detect(PROFILE_T * profile)371*4882a593Smuzhiyun int ql_qmap_mode_detect(PROFILE_T *profile) {
372*4882a593Smuzhiyun if (profile->software_interface == SOFTWARE_MBIM) {
373*4882a593Smuzhiyun if (profile->hardware_interface == HARDWARE_USB)
374*4882a593Smuzhiyun return ql_mbim_usb_vlan_mode_detect(profile);
375*4882a593Smuzhiyun else if (profile->hardware_interface == HARDWARE_PCIE)
376*4882a593Smuzhiyun return ql_mbim_mhi_qmap_mode_detect(profile);
377*4882a593Smuzhiyun } else if (profile->software_interface == SOFTWARE_QMI) {
378*4882a593Smuzhiyun return ql_qmi_qmap_mode_detect(profile);
379*4882a593Smuzhiyun }
380*4882a593Smuzhiyun return 0;
381*4882a593Smuzhiyun }
382