Mike (mwester) wrote:
 Andy Green wrote:
Somebody in the thread at some point said:
| Somebody in the thread at some point said:
| | Andy,
| |
| | I've now confirmed it is from GSM wakeup. If I do not initialize the
GSM
| | then the phone never locks up.
|
| EXCELLENT, thanks a lot.
|
| Mike can this plug into the serial resume problems?

> I haven't taken a thorough look at the GTA02; with the console safely
> out of the way on port 2 on this device there should be absolutely no
> reason for any suspend/resume ordering issue to cause lockup/hang problems.

|
| How can one provoke GSM wakes then?  Although I am in runlevel 3 I do
| actually have a SIM card in and am running gsmd -- last night before I
| went to bed though I put it in suspend, and it woke 100% perfect
| thismorning after 7 - 8 hours suspended.  But it didn't wake before that
| from GSM.... you really have to ring the phone?

> Depends on your rootfs; the other emails on this thread outline the
> common things.  One can enable the "nspy" feature to find out.  Echo "1"
>  to the nspy_enable sysfs file to turn it on.  Then when the phone
> wakes, repeatedly "cat" the nspy_buffer sysfs file to dump out the event
> buffer.  You'll see the suspend/resume events from the point of view of
> the serial and neo1973_pm_gsm drivers, and you'll see the data stream
> from the UART identifying the reason for the wakeup.

> There is one other possibility -- when the GSM first powers up, it
> always issues a GSM wakeup interrupt, although it has no data to send.
> Is there a possibility that the GSM is being unpowered and powering back up?

Hm what's going on here... in the resume:

    /* We must defer the auto flowcontrol because we resume before
     * the serial driver */
    if (!schedule_work(&gsmwork))
        dev_err(&pdev->dev,
            "Unable to schedule GSM wakeup work\n");

but in the work function there

static void gsm_resume_work(struct work_struct *w)
{
    printk(KERN_INFO "%s: waiting...\n", __FUNCTION__);
    nspy_add(NSPY_TYPE_RESUME, 'W', jiffies);
    if (gsm_autounlock_delay)                    <=== zero on GTA02
        msleep(gsm_autounlock_delay);        <=== no delay

> User-space on the GTA02 is expected to explicitly manage the
> flow-control by means of the sysfs flag (preferred), or by means of
> changing the modem control lines on the serial port (deprecated, IMO),
> or as a last resort (and highly discouraged) to set the auto-unlock
> delay to some non-zero value.


This is a gross hack. The whole point of device drivers having suspend/resume callbacks is to put them in a proper state so that they are there when you come back up. I, for one, do not want to use sysfs flags at all. I already set the hardware flow control on opening the device. Are you saying that the user-space must now monitor that is has been resumed and then write to some sysfs file? I repeat: Gross Hack.

> The GTA01 had different defaults because I thought (at the time) that by
> using the auto-unlock technique and the horrible hack in the serial
> driver, we could avoid the overrun problem.  It turns out that just
> defers it, so there's no longer any point to having GTA01 handled any
> differently than GTA02.

> Which (as I mentioned in an earlier email) leaves us with three means to
> handle flowcontrol of the GSM, which is two too many.  This particular
> bit of code will be removed, along with the code in the serial driver
> that does this function from the modem-control code.

    if (gsm_auto_flowcontrolled) {
        nspy_add(NSPY_TYPE_SPECIAL, '+', jiffies);
        if (machine_is_neo1973_gta01())
            s3c24xx_fake_rx_interrupt(10000);
        s3c2410_gpio_cfgpin(S3C2410_GPH1, S3C2410_GPH1_nRTS0);
        gsm_auto_flowcontrolled = 0;
    }
    nspy_add(NSPY_TYPE_RESUME, 'Z', jiffies);
    printk(KERN_INFO "%s: done.\n", __FUNCTION__);
}

There's no schedule_delayed_work, no msleep, this could execute right
away, and yet it says in the comment we need to wait for serial driver
!?!?

> We need to wait for the serial driver in order to avoid data loss -- not
> because of any hangs or lockups that I've ever observed.  The issue is
> that depending on whether the low-level debug for suspend/resume is
> enabled in the defconfig, the UART registers may be restored on wake, or
> they may be reset to the default boot-time settings and then reset to
> the settings specified in the termio structures.  Because of the shared
> console on the GTA01, that device actually sets the port to function as
> a console, then immediately sets it to the desired settings -- it is
> this "diddling about" with the UART status that requires that we keep
> the GSM from sending anything until after things have stabilized.


OK, then it should be stabilized in the resume process.

 I check the resume ordering

[ 7187.755000] neo1973-pm-gsm neo1973-pm-gsm.0: resuming

[ 7187.755000] gsm_resume_work: waiting...

[ 7187.755000] gsm_resume_work: done.

...
[ 7187.755000] s3c2440-uart s3c2440-uart.0: resuming

[ 7187.755000] s3c24xx_serial_set_mctrl: GSM mctrl=0x00000000

[ 7187.755000] s3c24xx_serial_set_mctrl: GSM mctrl=0x00000006

[ 7187.755000] s3c2440-uart s3c2440-uart.1: resuming

[ 7187.755000] s3c2440-uart s3c2440-uart.2: resuming

Hum what happens when that completes and the uarts aren't up?

-Andy
>

 Mike (mwester)




Reply via email to