All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Bjørn Mork" <bjorn-yOkvZcmFvRU@public.gmane.org>
To: Dan Williams <dcbw-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
Cc: netdev-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	linux-usb-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
Subject: Re: [PATCH 3/3] qmi_wwan: Driver for WWAN devices requiring use of the QMI protocol
Date: Thu, 15 Dec 2011 11:02:22 +0100	[thread overview]
Message-ID: <87r506b1ap.fsf@nemi.mork.no> (raw)
In-Reply-To: <1323882501.2077.3.camel-wKZy7rqYPVb5EHUCmHmTqw@public.gmane.org> (Dan Williams's message of "Wed, 14 Dec 2011 11:08:21 -0600")

Dan Williams <dcbw-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> writes:

> So I thought the protocol acronym stood for "Qualcomm MSM/Modem
> Interface"  (see
> https://www.codeaurora.org/gitweb/quic/le/?p=kernel/msm.git;a=commitdiff;h=5f6f87b51184e13b6c493012de787895d5d18765)

That's probably correct.  Don't know where I got the messaging part
from.  Should be corrected....

> In any case, great work here.  But I'm a bit concerned about how all
> this should fit together.  QMI is a huge protocol that does everything a
> modem would ever want to do, and we'd likely want to be able to speak
> QMI from userspace to the modem too so that modem managers can expose
> the full functionality of the modems.  For example Gobi modems have a
> very minimal AT command set and most of the functionality is exposed
> over QMI or DM.  That's why the Qualcomm GobiNet driver also
> exposed /dev/qmi for userspace access.

Yes, I believe some interface should be exported.  But my primary goal
was to make something that would just work as an ethernet device with a
minimum of external userspace dependencies.  And this modem seems to
have a fairly complete set of AT commands anyway.  Ideally I would want
to stick

 auto wwan0
 iface wwan0 inet dhcp

in my /etc/network/interface and not need any application for that to
work.  But I realize that I must enter a SIM PIN1 code first (unless
disabled), and that most users will want to configure a specific APN
(although the null APN "" most likely will work just fine).

But I agree that eventually the full QMI protocol should be made
available to userspace for other uses.  That should be fairly easy to do
if you just proxy the commands.  But I'm worring about the interface.
Is the /dev/qmi from GobiNet acceptable?  Why isn't it merged yet?
Wouldn't something like netlink have been more suitable?  How about
security and the ability to control privileges on a command to command
basis?  And are there users?  Note that even the Windows application
supplied with the modem uses AT commands for SMS sending/receiving etc.
The snoop I did showed a very minimal set of QMI commands.  These were
all Windows used for startup of the network interface (partly decoded by
me):


.tf = 0x01
.len = 0x000f
.ctrl = 0x00 control point
.service = 0x00
.qmicid = 0x00
.flags = 0x00 request
.tid = 0x01
.msgid = 0x0021
.len = 0x0004
[0x01] (1)  ff	.

.tf = 0x01
.len = 0x000f
.ctrl = 0x00 control point
.service = 0x00
.qmicid = 0x00
.flags = 0x00 request
.tid = 0x02
.msgid = 0x0021
.len = 0x0004
[0x01] (1)  ff	.

.tf = 0x01
.len = 0x000f
.ctrl = 0x00 control point
.service = 0x00
.qmicid = 0x00
.flags = 0x00 request
.tid = 0x03
.msgid = 0x0021
.len = 0x0004
[0x01] (1)  ff	.

.tf = 0x01
.len = 0x000f
.ctrl = 0x00 control point
.service = 0x00
.qmicid = 0x00
.flags = 0x00 request
.tid = 0x04
.msgid = 0x0021
.len = 0x0004
[0x01] (1)  ff	.

.tf = 0x01
.len = 0x000f
.ctrl = 0x00 control point
.service = 0x00
.qmicid = 0x00
.flags = 0x00 request
.tid = 0x05
.msgid = 0x0021
.len = 0x0004
[0x01] (1)  ff	.

.tf = 0x01
.len = 0x000f
.ctrl = 0x00 control point
.service = 0x00
.qmicid = 0x00
.flags = 0x00 request
.tid = 0x06
.msgid = 0x0021
.len = 0x0004
[0x01] (1)  ff	.

.tf = 0x01
.len = 0x000f
.ctrl = 0x00 control point
.service = 0x00
.qmicid = 0x00
.flags = 0x00 request
.tid = 0x07
.msgid = 0x0021
.len = 0x0004
[0x01] (1)  ff	.

.tf = 0x01
.len = 0x000f
.ctrl = 0x00 control point
.service = 0x00
.qmicid = 0x00
.flags = 0x00 request
.tid = 0x08
.msgid = 0x0021
.len = 0x0004
[0x01] (1)  ff	.

.tf = 0x01
.len = 0x000f
.ctrl = 0x00 control point
.service = 0x00
.qmicid = 0x00
.flags = 0x00 request
.tid = 0x09
.msgid = 0x0021
.len = 0x0004
[0x01] (1)  ff	.

.tf = 0x01
.len = 0x000b
.ctrl = 0x80 service
.service = 0x00
.qmicid = 0x00
.flags = 0x02 response
.tid = 0x00
.msgid = 0x0027
.len = 000000

.tf = 0x01
.len = 0x000f
.ctrl = 0x00 control point
.service = 0x00
.qmicid = 0x00
.flags = 0x00 request
.tid = 0x0a
.msgid = 0x0021
.len = 0x0004
[0x01] (1)  ff	.

.tf = 0x01
.len = 0x0057
.ctrl = 0x80 service
.service = 0x00
.qmicid = 0x00
.flags = 0x01 invalid
.tid = 0x0a
.msgid = 0x0021
.len = 0x004c
[0x02] (4) SUCCESS (0x0000) QMI_ERR_NONE
[0x01] (66)  0d 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 d1 0e 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00	..................................................................

.tf = 0x01
.len = 0x000f
.ctrl = 0x00 control point
.service = 0x00
.qmicid = 0x00
.flags = 0x00 request
.tid = 0x0b
.msgid = 0x0022
.len = 0x0004
[0x01] (1)  02	.

.tf = 0x01
.len = 0x0017
.ctrl = 0x80 service
.service = 0x00
.qmicid = 0x00
.flags = 0x01 invalid
.tid = 0x0b
.msgid = 0x0022
.len = 0x000c
[0x02] (4) SUCCESS (0x0000) QMI_ERR_NONE
[0x01] (2)  02 01	..

.tf = 0x01
.len = 0x000c
.ctrl = 0x00 control point
.service = 0x02
.qmicid = 0x01
.flags = 0x00 request
.tid = 0x0001
.msgid = 0x0021
.len = 000000

.tf = 0x01
.len = 0x002b
.ctrl = 0x80 service
.service = 0x02
.qmicid = 0x01
.flags = 0x02 response
.tid = 0x0001
.msgid = 0x0021
.len = 0x001f
[0x02] (4) SUCCESS (0x0000) QMI_ERR_NONE
[0x01] (21)  51 55 41 4c 43 4f 4d 4d 20 49 4e 43 4f 52 50 4f 52 41 54 45 44	QUALCOMM INCORPORATED

.tf = 0x01
.len = 0x000c
.ctrl = 0x00 control point
.service = 0x02
.qmicid = 0x01
.flags = 0x00 request
.tid = 0x0002
.msgid = 0x0024
.len = 000000

.tf = 0x01
.len = 0x0013
.ctrl = 0x80 service
.service = 0x02
.qmicid = 0x01
.flags = 0x02 response
.tid = 0x0002
.msgid = 0x0024
.len = 0x0007
[0x02] (4) FAILED (0x0025) QMI_ERR_UIM_NOT_INITIALIZED

.tf = 0x01
.len = 0x000c
.ctrl = 0x00 control point
.service = 0x02
.qmicid = 0x01
.flags = 0x00 request
.tid = 0x0003
.msgid = 0x0025
.len = 000000

.tf = 0x01
.len = 0x0029
.ctrl = 0x80 service
.service = 0x02
.qmicid = 0x01
.flags = 0x02 response
.tid = 0x0003
.msgid = 0x0025
.len = 0x001d
[0x02] (4) SUCCESS (0x0000) QMI_ERR_NONE
[0x10] (1)  30	0
[0x11] (15)  38 36 30 39 39 39 30 30 30 30 32 33 37 30 37	860999000023707

.tf = 0x01
.len = 0x0010
.ctrl = 0x00 control point
.service = 0x00
.qmicid = 0x00
.flags = 0x00 request
.tid = 0x0c
.msgid = 0x0023
.len = 0x0005
[0x01] (2)  02 01	..

.tf = 0x01
.len = 0x0017
.ctrl = 0x80 service
.service = 0x00
.qmicid = 0x00
.flags = 0x01 invalid
.tid = 0x0c
.msgid = 0x0023
.len = 0x000c
[0x02] (4) SUCCESS (0x0000) QMI_ERR_NONE
[0x01] (2)  02 01	..

.tf = 0x01
.len = 0x000f
.ctrl = 0x00 control point
.service = 0x00
.qmicid = 0x00
.flags = 0x00 request
.tid = 0x0d
.msgid = 0x0022
.len = 0x0004
[0x01] (1)  01	.

.tf = 0x01
.len = 0x0017
.ctrl = 0x80 service
.service = 0x00
.qmicid = 0x00
.flags = 0x01 invalid
.tid = 0x0d
.msgid = 0x0022
.len = 0x000c
[0x02] (4) SUCCESS (0x0000) QMI_ERR_NONE
[0x01] (2)  01 01	..

.tf = 0x01
.len = 0x000f
.ctrl = 0x00 control point
.service = 0x00
.qmicid = 0x00
.flags = 0x00 request
.tid = 0x0e
.msgid = 0x0020
.len = 0x0004
[0x01] (1)  00	.

.tf = 0x01
.len = 0x0017
.ctrl = 0x80 service
.service = 0x00
.qmicid = 0x00
.flags = 0x01 invalid
.tid = 0x0e
.msgid = 0x0020
.len = 0x000c
[0x02] (4) SUCCESS (0x0000) QMI_ERR_NONE
[0x01] (2)  00 00	..

.tf = 0x01
.len = 0x000b
.ctrl = 0x80 service
.service = 0x00
.qmicid = 0x00
.flags = 0x02 response
.tid = 0x00
.msgid = 0x0027
.len = 000000

.tf = 0x01
.len = 0x000b
.ctrl = 0x80 service
.service = 0x00
.qmicid = 0x00
.flags = 0x02 response
.tid = 0x00
.msgid = 0x0027
.len = 000000

.tf = 0x01
.len = 0x000b
.ctrl = 0x80 service
.service = 0x00
.qmicid = 0x00
.flags = 0x02 response
.tid = 0x00
.msgid = 0x0027
.len = 000000

.tf = 0x01
.len = 0x000f
.ctrl = 0x00 control point
.service = 0x00
.qmicid = 0x00
.flags = 0x00 request
.tid = 0x0f
.msgid = 0x0022
.len = 0x0004
[0x01] (1)  02	.

.tf = 0x01
.len = 0x0017
.ctrl = 0x80 service
.service = 0x00
.qmicid = 0x00
.flags = 0x01 invalid
.tid = 0x0f
.msgid = 0x0022
.len = 0x000c
[0x02] (4) SUCCESS (0x0000) QMI_ERR_NONE
[0x01] (2)  02 02	..

.tf = 0x01
.len = 0x000c
.ctrl = 0x00 control point
.service = 0x02
.qmicid = 0x02
.flags = 0x00 request
.tid = 0x0001
.msgid = 0x0022
.len = 000000

.tf = 0x01
.len = 0x0017
.ctrl = 0x80 service
.service = 0x02
.qmicid = 0x02
.flags = 0x02 response
.tid = 0x0001
.msgid = 0x0022
.len = 0x000b
[0x02] (4) SUCCESS (0x0000) QMI_ERR_NONE
[0x01] (1)  30	0

.tf = 0x01
.len = 0x000f
.ctrl = 0x00 control point
.service = 0x00
.qmicid = 0x00
.flags = 0x00 request
.tid = 0x10
.msgid = 0x0022
.len = 0x0004
[0x01] (1)  01	.

.tf = 0x01
.len = 0x0017
.ctrl = 0x80 service
.service = 0x00
.qmicid = 0x00
.flags = 0x01 invalid
.tid = 0x10
.msgid = 0x0022
.len = 0x000c
[0x02] (4) SUCCESS (0x0000) QMI_ERR_NONE
[0x01] (2)  01 02	..

.tf = 0x01
.len = 0x000c
.ctrl = 0x00 control point
.service = 0x01
.qmicid = 0x02
.flags = 0x00 request
.tid = 0x0002
.msgid = 0x0022
.len = 000000

.tf = 0x01
.len = 0x0017
.ctrl = 0x80 service
.service = 0x01
.qmicid = 0x02
.flags = 0x02 response
.tid = 0x0002
.msgid = 0x0022
.len = 0x000b
[0x02] (4) SUCCESS (0x0000) QMI_ERR_NONE
[0x01] (1)  01	.



> Second, does the modem actually respond to DHCP over the ECM interface?

Yes.  And IMHO that's the only sensible thing to do.  Cannot be very
difficult to implement that feature in the firmware.  It's not like you
need to write a dhcp server.  You know you have only a single client on
the other end of a point-to-point link, and the address configuration is
given.  And all broadcast/multicast requires special treatment anyway.
I actually thought about implementing the DHCP functionality in the
driver before I knew that the firmware already provided this.

FWIW, the Windows driver implementation also depends on DHCP for address
configuration .

> If you take a look at the Android rmnet code (which is similar to your
> driver) you'll see they extract the IP address and DNS details from the
> QMI response.  Do we need to do that here too?

Based on the above, I don't think so.  

And if you still want to extract address details without using DHCP,
then that information is available via the AT^DHCP? command anyway.  You
don't need QMI for that part.



Bjørn
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

  parent reply	other threads:[~2011-12-15 10:02 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-12-13  4:33 [PATCH 0/3] Adding a new driver for Huawei E392 WWAN modem Bjorn Mork
     [not found] ` <1323750784-32608-1-git-send-email-bjorn-yOkvZcmFvRU@public.gmane.org>
2011-12-13  4:33   ` [PATCH 1/3] option: Removing one bogus and adding some new Huawei combinations Bjorn Mork
2011-12-13 17:16     ` Greg KH
2011-12-13  4:33   ` [PATCH 2/3] cdc_ether: allow vendor specific data interface if control interface is vendor specific Bjorn Mork
     [not found]     ` <1323750784-32608-3-git-send-email-bjorn-yOkvZcmFvRU@public.gmane.org>
2011-12-13  4:54       ` Joe Perches
2011-12-13  4:59         ` Bjørn Mork
     [not found]           ` <87vcplcbj3.fsf-lbf33ChDnrE/G1V5fR+Y7Q@public.gmane.org>
2011-12-13 10:39             ` Sergei Shtylyov
2011-12-13  4:33   ` [PATCH 3/3] qmi_wwan: Driver for WWAN devices requiring use of the QMI protocol Bjorn Mork
     [not found]     ` <1323750784-32608-4-git-send-email-bjorn-yOkvZcmFvRU@public.gmane.org>
2011-12-14 17:08       ` Dan Williams
     [not found]         ` <1323882501.2077.3.camel-wKZy7rqYPVb5EHUCmHmTqw@public.gmane.org>
2011-12-15 10:02           ` Bjørn Mork [this message]
2011-12-15 17:52             ` Dan Williams
     [not found]               ` <1323971530.23419.13.camel-wKZy7rqYPVb5EHUCmHmTqw@public.gmane.org>
2011-12-16 16:03                 ` Bjørn Mork
     [not found]                   ` <874nx0bj1d.fsf-lbf33ChDnrE/G1V5fR+Y7Q@public.gmane.org>
2011-12-16 17:17                     ` Dan Williams
     [not found]                       ` <1324055842.17587.18.camel-wKZy7rqYPVb5EHUCmHmTqw@public.gmane.org>
2012-01-04 20:57                         ` Dan Williams
2012-01-05  8:58                           ` Bjørn Mork
2011-12-13  9:02 ` [PATCH 0/3] Adding a new driver for Huawei E392 WWAN modem Bjørn Mork

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87r506b1ap.fsf@nemi.mork.no \
    --to=bjorn-yokvzcmfvru@public.gmane.org \
    --cc=dcbw-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org \
    --cc=linux-usb-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=netdev-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.