On Mon, Jun 08, 2015 at 01:32:13PM -0500, Peter Berger wrote:
> On Fri, 2015-05-22 at 17:21 +0200, Johan Hovold wrote:
> > On Fri, May 15, 2015 at 12:09:53AM -0500, Peter E. Berger wrote:
> > > From: "Peter E. Berger" <[email protected]>
> > >
> > > When using newer Edgeport devices such as the EP/416, idle ports are
> > > automatically bounced (disconnected and then reconnected) approximately
> > > every 60 seconds. This breaks programs (e.g: minicom) where idle periods
> > > are common, normal and expected.
> > >
> > > I confirmed with the manufacturer (Digi International) that Edgeports now
> > > ship from the factory with firmware that expects periodic "heartbeat"
> > > queries from the driver to keep ports alive. This patch implements
> > > heartbeat support using the mechanism Digi suggested (requesting an
> > > I2C descriptor address every 15 seconds) that appears effective on
> > > Edgeports running the newer firmware (that require it) and benign on
> > > Edgeport devices running older firmware.
> > >
> > > Signed-off-by: Peter E. Berger <[email protected]>
> > You say you've tested this with older firmware, but I'd still prefer if
> > we only enable this when actually needed. Just set a flag during probe
> > if the firmware requires this heartbeat and only start it if needed.
>
> Good suggestion. I've reorganized the code to schedule heartbeats only
> if the firmware version is newer than 4.80. We know that the heartbeat
> requirement was added after version 4.80 (which is the version
> distributed in /lib/firmware/edgeport/down3.bin), but not precisely
> when. The two other versions I have seen (5.32 and 5.38) both require
> heartbeats. I asked Digi which version first introduced this
> requirement but have not yet heard back. Meanwhile, since the heartbeat
> code uses Digi's suggested mechanism that is both innocuous on older
> firmware that do not require it (I tested this on 4.80), and effective
> on newer ones like 5.38 that do, I think using 4.80 as the cutoff
> version is the best we can do. Sound OK?
That sounds good.
> > Just to clarify, is this hearbeat needed also when no port is open?
>
> Yes, the heartbeat code is required to keep idle Edgeport devices from
> bouncing (disconnecting/reconnecting) even when no ports are open.
Ok. Perhaps this should be documented in the code unless it already is
in v4.
> > > ---
> > > drivers/usb/serial/io_ti.c | 68
> > > ++++++++++++++++++++++++++++++++++++++++++++++
> > > 1 file changed, 68 insertions(+)
> > >
> > > diff --git a/drivers/usb/serial/io_ti.c b/drivers/usb/serial/io_ti.c
> > > index ddbb8fe..1db929b 100644
> > > --- a/drivers/usb/serial/io_ti.c
> > > +++ b/drivers/usb/serial/io_ti.c
> > > +#define EP_HEARTBEAT_SECS 15
> >
> > Could this interval be increased from somewhat (you mention 60 seconds
> > above)?
>
> Digi originally suggested 15 seconds, but in practice 40 seconds seems
> to work on the devices I have tested here. I have asked Digi if 40
> seconds will be safe on all Edgeport devices, but have not yet heard
> back. Meanwhile, I have set this to 40 seconds for the v4 patch. Sound
> OK?
Yes, we can always decrease it if anyone experiences disconnect issues,
or if Digi recommends a lower interval.
> > > @@ -2373,11 +2376,33 @@ static void edge_break(struct tty_struct *tty,
> > > int break_state)
> > > __func__, status);
> > > }
> > >
> > > +static void heartbeat(struct work_struct *taskp)
> >
> > Rename edge_heartbeat_work.
>
> Done.
>
> >
> > > +{
> > > + struct edgeport_serial *serial;
> > > + struct ti_i2c_desc rom_desc;
> >
> > This one cannot be allocated om the stack as it is eventually used for
> > DMA. Use kmalloc.
>
> Done.
>
> >
> > > +
> > > + serial = container_of(taskp, struct edgeport_serial,
> > > + heartbeat_task.work);
> > > +
> > > + dev_dbg(&serial->serial->dev->dev, "%s - serial:%s",
> > > + __func__, serial->serial->dev->serial);
> >
> > Just remove this one.
>
> Done. (Though, since devices like the 16-port EP/416 present as eight
> separate 2-port devices, and do not always probe in the same order, it
> is very useful during debugging to have the individual device serial
> numbers available via dev_dbg() to see, for example: if the heartbeats
> are being scheduled for the correct devices. But I can easily add this
> back in my development/testing copies as needed.)
You should still be able to rely on the USB interface name, which all
debug statement should include (e.g. "usb 1-1.3.1").
> > > +
> > > + /* Descriptor address request is enough to reset the firmware timer */
> > > + if (!get_descriptor_addr(serial, I2C_DESC_TYPE_ION, &rom_desc))
> > > + dev_warn(&serial->serial->dev->dev,
> > > + "%s - Incomplete heartbeat.", __func__);
> >
> > Use serial->serial->interface->dev for all messages throughout (won't
> > mention again).
>
> Done. (In all the patched code.)
Thanks,
Johan
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html