From: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
To: Johannes Stezenbach <js@linuxtv.org>
Cc: Shuah Khan <shuahkh@osg.samsung.com>,
Shuah Khan <shuah.kh@samsung.com>,
linux-media@vger.kernel.org
Subject: Re: em28xx breaks after hibernate
Date: Fri, 26 Sep 2014 08:42:15 -0300 [thread overview]
Message-ID: <20140926084215.772adce9@recife.lan> (raw)
In-Reply-To: <20140926110727.GA880@linuxtv.org>
Em Fri, 26 Sep 2014 13:07:27 +0200
Johannes Stezenbach <js@linuxtv.org> escreveu:
> Hi Mauro,
>
> On Fri, Sep 26, 2014 at 07:14:11AM -0300, Mauro Carvalho Chehab wrote:
> >
> > I just pushed the pending patched and added a reverted patch for
> > b89193e0b06f at the media_tree.git. Could you please use it to compile
> > or, if you prefer to keep using 3.16, you can use the media_build.git[1]
> > tree to just use the newest media stack on the top of 3.16.
> >
> > [1] http://linuxtv.org/wiki/index.php/How_to_Obtain,_Build_and_Install_V4L-DVB_Device_Drivers
> >
> > I updated the today's tarball for it to have all the patches there.
> >
> > > > I should mention I just test "boot -> hibernate -> resume",
> > > > the device is not opened before hibernate.
> > >
> > > If I run dvb-fe-tool to load the xc5000 firmware before
> > > hibernate then the xc5000 issue seems fixed, but the
> > > drxk firmware issue still happens.
> >
> > Please check if the xc5000 issue disappears with the current patches.
>
> I compiled media_tree.git v3.17-rc5-734-g214635f, the
> xc5000 issue is fixed. I tested both "boot -> hibernate ->resume"
> and "boot -> dvb-fe-tool -> hibernate ->resume" in qemu.
>
> > The drxk issue will likely need a similar fix to the one that Shuah
> > did to drxj.
>
> The drx-k issue is still present:
>
> [ 3.758318] WARNING: CPU: 0 PID: 59 at drivers/base/firmware_class.c:1124 _request_firmware+0x205/0x568()
> [ 3.760266] Modules linked in:
> [ 3.760828] CPU: 0 PID: 59 Comm: kworker/0:2 Not tainted 3.17.0-rc5+ #82
> [ 3.762002] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.7.5-20140531_083030-gandalf 04/01/2014
> [ 3.763890] Workqueue: events request_module_async
> [ 3.764890] 0000000000000000 ffff88003c90fb38 ffffffff814bcac8 0000000000000000
> [ 3.766267] ffff88003c90fb70 ffffffff81032d75 ffffffff81320b3c 00000000fffffff5
> [ 3.767596] ffff880039ea1b00 ffff88003ca2be80 ffff88000053c900 ffff88003c90fb80
> [ 3.768941] Call Trace:
> [ 3.769414] [<ffffffff814bcac8>] dump_stack+0x4e/0x7a
> [ 3.770285] [<ffffffff81032d75>] warn_slowpath_common+0x7a/0x93
> [ 3.771281] [<ffffffff81320b3c>] ? _request_firmware+0x205/0x568
> [ 3.772289] [<ffffffff81032e32>] warn_slowpath_null+0x15/0x17
> [ 3.773235] [<ffffffff81320b3c>] _request_firmware+0x205/0x568
> [ 3.774162] [<ffffffff81065585>] ? trace_hardirqs_on+0xd/0xf
> [ 3.775064] [<ffffffff81063c2c>] ? lockdep_init_map+0xc4/0x13f
> [ 3.775973] [<ffffffff81320ecf>] request_firmware+0x30/0x42
> [ 3.776854] [<ffffffff813f974f>] drxk_attach+0x546/0x656
> [ 3.777675] [<ffffffff814c22a3>] em28xx_dvb_init.part.3+0xa3e/0x1cdf
> [ 3.778652] [<ffffffff8106555c>] ? trace_hardirqs_on_caller+0x183/0x19f
> [ 3.779690] [<ffffffff81065585>] ? trace_hardirqs_on+0xd/0xf
> [ 3.780615] [<ffffffff814c5b45>] ? mutex_unlock+0x9/0xb
> [ 3.781428] [<ffffffff814c0f50>] ? em28xx_v4l2_init.part.11+0xcbd/0xd04
> [ 3.782487] [<ffffffff814230cf>] em28xx_dvb_init+0x1d/0x1f
> [ 3.783335] [<ffffffff8141cfcb>] em28xx_init_extension+0x51/0x67
> [ 3.784276] [<ffffffff8141e5c3>] request_module_async+0x19/0x1b
> [ 3.785207] [<ffffffff8104585c>] process_one_work+0x1d2/0x38a
> [ 3.786133] [<ffffffff810462f0>] worker_thread+0x1f6/0x2a3
> [ 3.786982] [<ffffffff810460fa>] ? rescuer_thread+0x214/0x214
> [ 3.787863] [<ffffffff81049c09>] kthread+0xc7/0xcf
> [ 3.788616] [<ffffffff8125d487>] ? debug_smp_processor_id+0x17/0x19
> [ 3.789594] [<ffffffff8106555c>] ? trace_hardirqs_on_caller+0x183/0x19f
> [ 3.790617] [<ffffffff81049b42>] ? __kthread_parkme+0x62/0x62
> [ 3.791559] [<ffffffff814c866c>] ret_from_fork+0x7c/0xb0
> [ 3.792399] [<ffffffff81049b42>] ? __kthread_parkme+0x62/0x62
> [ 3.793314] ---[ end trace 001212d1d98f03c2 ]---
> [ 3.794014] usb 1-1: firmware: dvb-usb-hauppauge-hvr930c-drxk.fw will not be loaded
> [ 3.795218] drxk: Could not load firmware file dvb-usb-hauppauge-hvr930c-drxk.fw.
Could you please try this patch (untested):
[media] drxk: load firmware again at resume
While here, do some code cleanups.
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
diff --git a/drivers/media/dvb-frontends/drxk_hard.c b/drivers/media/dvb-frontends/drxk_hard.c
index 672195147d01..cad179738ae6 100644
--- a/drivers/media/dvb-frontends/drxk_hard.c
+++ b/drivers/media/dvb-frontends/drxk_hard.c
@@ -6276,33 +6276,32 @@ error:
return status;
}
-static void load_firmware_cb(const struct firmware *fw,
- void *context)
+static void load_firmware_cb(struct drxk_state *state)
{
- struct drxk_state *state = context;
+ const struct firmware *fw = NULL;
+ int status;
+
+ status = request_firmware(&fw, state->microcode_name,
+ state->i2c->dev.parent);
+ if (status < 0)
+ fw = NULL;
- dprintk(1, ": %s\n", fw ? "firmware loaded" : "firmware not loaded");
+ dprintk(1, ": firmware %s %s\n", state->microcode_name,
+ fw ? "loaded" : "not loaded");
if (!fw) {
pr_err("Could not load firmware file %s.\n",
state->microcode_name);
pr_info("Copy %s to your hotplug directory!\n",
state->microcode_name);
- state->microcode_name = NULL;
+ pr_info("Trying to use the internal firmware, but this may not work well. Be warned.\n");
/*
- * As firmware is now load asynchronous, it is not possible
- * anymore to fail at frontend attach. We might silently
- * return here, and hope that the driver won't crash.
- * We might also change all DVB callbacks to return -ENODEV
- * if the device is not initialized.
* As the DRX-K devices have their own internal firmware,
* let's just hope that it will match a firmware revision
* compatible with this driver and proceed.
*/
}
state->fw = fw;
-
- init_drxk(state);
}
static void drxk_release(struct dvb_frontend *fe)
@@ -6737,6 +6736,19 @@ static int drxk_get_tune_settings(struct dvb_frontend *fe,
}
}
+static int drxk_init(struct dvb_frontend *fe)
+{
+ struct drxk_state *state = fe->demodulator_priv;
+
+ if (fe->exit == DVB_FE_DEVICE_RESUME) {
+ /* Force device powerup and firmware reload */
+ state->m_drxk_state = DRXK_UNINITIALIZED;
+ return init_drxk(state);
+ }
+
+ return 0;
+}
+
static struct dvb_frontend_ops drxk_ops = {
/* .delsys will be filled dynamically */
.info = {
@@ -6760,6 +6772,7 @@ static struct dvb_frontend_ops drxk_ops = {
.release = drxk_release,
.sleep = drxk_sleep,
.i2c_gate_ctrl = drxk_gate_ctrl,
+ .init = drxk_init,
.set_frontend = drxk_set_parameters,
.get_tune_settings = drxk_get_tune_settings,
@@ -6776,7 +6789,6 @@ struct dvb_frontend *drxk_attach(const struct drxk_config *config,
struct dtv_frontend_properties *p;
struct drxk_state *state = NULL;
u8 adr = config->adr;
- int status;
dprintk(1, "\n");
state = kzalloc(sizeof(struct drxk_state), GFP_KERNEL);
@@ -6830,18 +6842,12 @@ struct dvb_frontend *drxk_attach(const struct drxk_config *config,
init_state(state);
/* Load firmware and initialize DRX-K */
- if (state->microcode_name) {
- const struct firmware *fw = NULL;
+ if (state->microcode_name)
+ load_firmware_cb(state);
- status = request_firmware(&fw, state->microcode_name,
- state->i2c->dev.parent);
- if (status < 0)
- fw = NULL;
- load_firmware_cb(fw, state);
- } else if (init_drxk(state) < 0)
+ if (init_drxk(state) < 0)
goto error;
-
/* Initialize stats */
p = &state->frontend.dtv_property_cache;
p->strength.len = 1;
next prev parent reply other threads:[~2014-09-26 11:42 UTC|newest]
Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-09-25 12:53 em28xx breaks after hibernate Johannes Stezenbach
2014-09-25 13:45 ` Shuah Khan
2014-09-25 14:10 ` Mauro Carvalho Chehab
2014-09-25 15:07 ` Shuah Khan
2014-09-25 16:01 ` Johannes Stezenbach
2014-09-25 17:36 ` Johannes Stezenbach
2014-09-25 18:01 ` Shuah Khan
2014-09-25 17:40 ` Shuah Khan
2014-09-25 18:17 ` Johannes Stezenbach
2014-09-25 18:45 ` Shuah Khan
2014-09-25 19:03 ` Shuah Khan
2014-09-26 7:41 ` Johannes Stezenbach
2014-09-26 8:00 ` Johannes Stezenbach
2014-09-26 8:08 ` Johannes Stezenbach
2014-09-26 10:14 ` Mauro Carvalho Chehab
2014-09-26 11:07 ` Johannes Stezenbach
2014-09-26 11:42 ` Mauro Carvalho Chehab [this message]
2014-09-26 12:02 ` Johannes Stezenbach
2014-09-26 12:11 ` Mauro Carvalho Chehab
2014-09-26 12:03 ` Mauro Carvalho Chehab
2014-09-26 12:27 ` Johannes Stezenbach
2014-09-26 13:12 ` Mauro Carvalho Chehab
2014-09-26 13:25 ` Johannes Stezenbach
2014-09-26 14:25 ` Shuah Khan
2014-09-26 14:25 ` Johannes Stezenbach
2014-09-26 14:30 ` Shuah Khan
2014-09-26 15:06 ` Johannes Stezenbach
2014-09-26 15:22 ` Johannes Stezenbach
2014-09-26 15:43 ` Mauro Carvalho Chehab
2014-09-28 10:55 ` Johannes Stezenbach
2014-09-28 11:12 ` Mauro Carvalho Chehab
2014-09-28 11:54 ` Johannes Stezenbach
2014-09-28 12:35 ` Mauro Carvalho Chehab
2014-09-28 12:57 ` Mauro Carvalho Chehab
2014-09-29 2:38 ` Mauro Carvalho Chehab
2014-09-26 15:22 ` Shuah Khan
2014-09-26 15:35 ` Mauro Carvalho Chehab
2014-09-26 15:40 ` Mauro Carvalho Chehab
2014-09-26 15:42 ` Johannes Stezenbach
2014-09-26 15:48 ` Mauro Carvalho Chehab
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=20140926084215.772adce9@recife.lan \
--to=mchehab@osg.samsung.com \
--cc=js@linuxtv.org \
--cc=linux-media@vger.kernel.org \
--cc=shuah.kh@samsung.com \
--cc=shuahkh@osg.samsung.com \
/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.