Dan
> -Jason
>
>
>
>
> diff --git a/src/mm-serial-port.c b/src/mm-serial-port.c
>
>
> index 07010e1..0ed57f9 100644
>
>
> --- a/src/mm-serial-port.c
>
>
> +++ b/src/mm-serial-port.c
>
>
> @@ -358,7 +358,7 @@ config_fd (MMSerialPort *self, GError **error)
>
>
> stbuf.c_cc[VEOF] = 1;
>
>
>
>
>
> stbuf.c_cflag &= ~(CBAUD | CSIZE | CSTOPB | CLOCAL | PARENB);
>
>
> - stbuf.c_cflag |= (speed | bits | CREAD | 0 | parity | stopbits);
>
>
> + stbuf.c_cflag |= (speed | bits | CREAD | 0 | parity | stopbits |
> CLOCAL);
>
>
>
>
> if (ioctl (priv->fd, TCSETA, &stbuf) < 0) {
>
>
> g_set_error (error,
>
>
>
>
> jglasgow visitor-1950-269a-x600:modemmanager$
>
>
>
> On Mon, Mar 15, 2010 at 8:22 PM, Jason Glasgow <
jglasgow google com>
> wrote:
> Sure, I'll give that a try and let you know what happens.
> Thanks, -Jason
>
>
>
> On Mon, Mar 15, 2010 at 7:13 PM, Dan Williams
> <
dcbw redhat com> wrote:
> On Fri, 2010-03-12 at 12:50 -0500, Jason Glasgow
> wrote:
> > Dan,
> >
> >
> > Novatel U760. The modem appears to be fine (not
> sure what you mean
> > drop off the bus. If I reopen the device all is
> fine). I hacked up
> > my version of the code (mm-generic-cdma.c) to always
> call
> > mm_serial_port_open() before using the file
> descriptor, and it works
> > great. But I don't think this is a good solution.
>
>
> It looks like this device actually cares about DCD
> state, or at least
> it's sending messages that make 'option' think it
> does. Can you try
> adding CLOCAL to the c_cflags in mm-serial-port.c's
> config_fd()
> function? Just logical OR it together with the rest
> of the flags there
> and let us know if that helps things.
>
> I've been meaning to add CLOCAL for a while, since for
> most 3G modems
> the control lines are completely ignored by either the
> driver or the
> device anyway, but I've shied away from it because
> it's a change that
> could potentially break stuff that I have no way to
> test. There's a lot
> of odd hardware out there. Now that we're on the
> track to MM 0.4
> though, we may want to revisit that.
>
> Dan
>
>
> >
> > -Jason
> >
> >
> > diff --git a/src/mm-generic-cdma.c
> b/src/mm-generic-cdma.c
> > index 50cd86c..7f44775 100644
> > --- a/src/mm-generic-cdma.c
> > +++ b/src/mm-generic-cdma.c
> > @@ -598,6 +598,10 @@ connect (MMModem *modem,
> >
> > info = mm_callback_info_new (modem, callback,
> user_data);
> > command = g_strconcat ("DT", number, NULL);
> > + if (!mm_serial_port_open (priv->primary,
> &info->error)) {
> > + g_assert (info->error);
> > + /* TODO(jglasgow): what should we do? */
> > + }
> > mm_serial_port_queue_command (priv->primary,
> command, 90,
> > dial_done, info);
> > g_free (command);
> > }
> > @@ -620,7 +624,9 @@ disconnect_flash_done
> (MMSerialPort *port,
> >
> MM_MODEM_STATE_REASON_NONE);
> > }
> > } else {
> > - mm_port_set_connected
> (MM_GENERIC_CDMA_GET_PRIVATE
> > (info->modem)->data, FALSE);
> > + MMGenericCdmaPrivate *priv =
> MM_GENERIC_CDMA_GET_PRIVATE
> > (info->modem);
> > +
> > + mm_port_set_connected (priv->data, FALSE);
> > update_enabled_state (MM_GENERIC_CDMA
> (info->modem), FALSE,
> > MM_MODEM_STATE_REASON_NONE);
> > }
> >
> > @@ -753,6 +759,10 @@ get_card_info (MMModem *modem,
> > port = priv->secondary;
> > }
> >
> > + if (!mm_serial_port_open (port, &info->error))
> {
> > + g_assert (info->error);
> > + /* TODO(jglasgow): what should we do? */
> > + }
> > mm_serial_port_queue_command_cached (port,
> "+GMI", 3,
> > get_manufacturer_done, info);
> > mm_serial_port_queue_command_cached (port,
> "+GMM", 3,
> > get_model_done, info);
> > mm_serial_port_queue_command_cached (port,
> "+GMR", 3,
> > get_version_done, info);
> > @@ -867,6 +877,10 @@ get_signal_quality (MMModemCdma
> *modem,
> > }
> >
> > info = mm_callback_info_uint_new (MM_MODEM
> (modem), callback,
> > user_data);
> > + if (!mm_serial_port_open (port, &info->error))
> {
> > + g_assert (info->error);
> > + /* TODO(jglasgow): what should we do? */
> > + }
> > mm_serial_port_queue_command (port, "+CSQ", 3,
> > get_signal_quality_done, info);
> > }
> >
> > @@ -913,6 +927,10 @@ get_esn (MMModemCdma *modem,
> > }
> >
> > info = mm_callback_info_string_new (MM_MODEM
> (modem), callback,
> > user_data);
> > + if (!mm_serial_port_open (port, &info->error))
> {
> > + g_assert (info->error);
> > + /* TODO(jglasgow): what should we do? */
> > + }
> > mm_serial_port_queue_command_cached (port,
> "+GSN", 3,
> > get_string_done, info);
> > }
> >
> > @@ -1136,6 +1154,11 @@ get_serving_system
> (MMModemCdma *modem,
> > G_CALLBACK
> (callback),
> > user_data);
> >
> > + if (!mm_serial_port_open (port, &info->error))
> {
> > + g_assert (info->error);
> > + /* TODO(jglasgow): what should we do? */
> > + }
> > +
> > mm_serial_port_queue_command (port, "+CSS?", 3,
> > serving_system_done, info);
> > }
> >
> > @@ -1380,6 +1403,12 @@ get_registration_state
> (MMModemCdma *modem,
> > }
> >
> > info =
> mm_generic_cdma_query_reg_state_callback_info_new
> > (MM_GENERIC_CDMA (modem), callback, user_data);
> > +
> > + if (!mm_serial_port_open (port, &info->error))
> {
> > + g_assert (info->error);
> > + /* TODO(jglasgow): what should we do? */
> > + }
> > +
> > mm_serial_port_queue_command (port, "+CAD?", 3,
> > get_analog_digital_done, info);
> > }
> >
> > On Thu, Mar 11, 2010 at 6:46 PM, Dan Williams
> <
dcbw redhat com> wrote:
> > On Wed, 2010-03-10 at 18:03 -0500, Jason
> Glasgow wrote:
> > > I've been working with a Novatel Modem on
> a 2.6.31 kernel
> > using the
> > > generic CDMA driver. If I enable the
> modem via
> > ModemManager and then
> > > connect, everything works fine. But if I
> disconnect the
> > modem using
> > > the DBUS API, and shut down ppp,
> ModemManager gets
> > confused. The
> > > internal modem state indicates that the
> modem is now
> > REGISTERED, but
> > > the kernel appears to have sent a hangup
> (G_IO_HUP) to the
> > usb port,
> > > so mm-serial-port.c has closed the port
> (->fd == -1).
> >
> >
> > Does the modem crash at that point, or drop
> off the bus? This
> > may
> > indicate a USB driver problem or just a bug
> in ModemManager.
> > But
> > normally with serial ports, when you get a
> hangup, you're
> > done.
> >
> > Also, what specific novatel device?
> >
> > Dan
> >
> > >
> > > Other than Disable(), no command works
> because the ->fd is
> > now -1.
> > >
> > >
> > > Do you have any thoughts on the best way
> to fix this? And
> > what the
> > > semantics of receiving a HUP on the modem
> port should be.
> > My thought
> > > is that disconnect() should leave the
> modem in a registered
> > (or
> > > enabled) state, and that fp should still
> be valid.
> > > * Might it be reasonable to ignore
> the G_IO_HUP?
> > > * Should we automatically reopen
> then port for all
> > commands that
> > > are issued? Seems like a bad
> idea.
> > > * Should we automatically reopen the
> port if
> > > mm_modem_get_state() >
> MM_MODEM_STATE_ENABLED?
> > > * Maybe the most logical is to have
> G_IO_HUP invoke a
> > callback
> > > to notify the code that originally
> opened the serial
> > port that
> > > it has been closed. It then can
> update the state of
> > the modem
> > > appropriately.
> > > Thanks for your thoughts,
> > > Jason
> >