* [PATCH] dib7000p.c: Fix for warning: the frame size of 1236 bytes is larger than 1024 bytes
@ 2010-03-30 18:02 Ricardo Maraschini
2010-03-30 18:16 ` Randy Dunlap
0 siblings, 1 reply; 2+ messages in thread
From: Ricardo Maraschini @ 2010-03-30 18:02 UTC (permalink / raw)
To: linux-media; +Cc: dougsland, mchehab
When compiling the last version of v4l-dvb tree I got the following message:
/data/Projects/kernel/v4l-dvb/v4l/dib7000p.c: In function 'dib7000p_i2c_enumeration':
/data/Projects/kernel/v4l-dvb/v4l/dib7000p.c:1393: warning: the frame size of 1236 bytes is larger than 1024 bytes
I believe that this problem is related to stack size, because we are allocating memory for a big structure.
I changed the approach to dinamic allocated memory and the warning disappears.
The same problem appears on dib3000 as well, and I can fix that too if this patch get in.
Any comment on that?
I'll appreciate to read any comment from more experienced code makers.
Signed-off-by: Ricardo Maraschini <xrmarsx@gmail.com>
--- a/linux/drivers/media/dvb/frontends/dib7000p.c Sat Mar 27 23:09:47 2010 -0300
+++ b/linux/drivers/media/dvb/frontends/dib7000p.c Tue Mar 30 13:03:59 2010 -0300
@@ -1349,46 +1349,57 @@
int dib7000p_i2c_enumeration(struct i2c_adapter *i2c, int no_of_demods, u8 default_addr, struct dib7000p_config cfg[])
{
- struct dib7000p_state st = { .i2c_adap = i2c };
+ struct dib7000p_state *st = NULL;
int k = 0;
u8 new_addr = 0;
+ st = kmalloc(sizeof(struct dib7000p_state), GFP_KERNEL);
+ if (!st) {
+ dprintk("DiB7000P: Unable to allocate memory\n");
+ return -ENOMEM;
+ }
+
+ st->i2c_adap = i2c;
+
+
for (k = no_of_demods-1; k >= 0; k--) {
- st.cfg = cfg[k];
+ st->cfg = cfg[k];
/* designated i2c address */
new_addr = (0x40 + k) << 1;
- st.i2c_addr = new_addr;
- dib7000p_write_word(&st, 1287, 0x0003); /* sram lead in, rdy */
- if (dib7000p_identify(&st) != 0) {
- st.i2c_addr = default_addr;
- dib7000p_write_word(&st, 1287, 0x0003); /* sram lead in, rdy */
- if (dib7000p_identify(&st) != 0) {
+ st->i2c_addr = new_addr;
+ dib7000p_write_word(st, 1287, 0x0003); /* sram lead in, rdy */
+ if (dib7000p_identify(st) != 0) {
+ st->i2c_addr = default_addr;
+ dib7000p_write_word(st, 1287, 0x0003); /* sram lead in, rdy */
+ if (dib7000p_identify(st) != 0) {
dprintk("DiB7000P #%d: not identified\n", k);
+ kfree(st);
return -EIO;
}
}
/* start diversity to pull_down div_str - just for i2c-enumeration */
- dib7000p_set_output_mode(&st, OUTMODE_DIVERSITY);
+ dib7000p_set_output_mode(st, OUTMODE_DIVERSITY);
/* set new i2c address and force divstart */
- dib7000p_write_word(&st, 1285, (new_addr << 2) | 0x2);
+ dib7000p_write_word(st, 1285, (new_addr << 2) | 0x2);
dprintk("IC %d initialized (to i2c_address 0x%x)", k, new_addr);
}
for (k = 0; k < no_of_demods; k++) {
- st.cfg = cfg[k];
- st.i2c_addr = (0x40 + k) << 1;
+ st->cfg = cfg[k];
+ st->i2c_addr = (0x40 + k) << 1;
// unforce divstr
- dib7000p_write_word(&st, 1285, st.i2c_addr << 2);
+ dib7000p_write_word(st, 1285, st->i2c_addr << 2);
/* deactivate div - it was just for i2c-enumeration */
- dib7000p_set_output_mode(&st, OUTMODE_HIGH_Z);
+ dib7000p_set_output_mode(st, OUTMODE_HIGH_Z);
}
+ kfree(st);
return 0;
}
EXPORT_SYMBOL(dib7000p_i2c_enumeration);
^ permalink raw reply [flat|nested] 2+ messages in thread* Re: [PATCH] dib7000p.c: Fix for warning: the frame size of 1236 bytes is larger than 1024 bytes
2010-03-30 18:02 [PATCH] dib7000p.c: Fix for warning: the frame size of 1236 bytes is larger than 1024 bytes Ricardo Maraschini
@ 2010-03-30 18:16 ` Randy Dunlap
0 siblings, 0 replies; 2+ messages in thread
From: Randy Dunlap @ 2010-03-30 18:16 UTC (permalink / raw)
To: Ricardo Maraschini; +Cc: linux-media, dougsland, mchehab
On 03/30/10 11:02, Ricardo Maraschini wrote:
> When compiling the last version of v4l-dvb tree I got the following message:
>
> /data/Projects/kernel/v4l-dvb/v4l/dib7000p.c: In function 'dib7000p_i2c_enumeration':
> /data/Projects/kernel/v4l-dvb/v4l/dib7000p.c:1393: warning: the frame size of 1236 bytes is larger than 1024 bytes
>
> I believe that this problem is related to stack size, because we are allocating memory for a big structure.
> I changed the approach to dinamic allocated memory and the warning disappears.
> The same problem appears on dib3000 as well, and I can fix that too if this patch get in.
>
> Any comment on that?
> I'll appreciate to read any comment from more experienced code makers.
Hi,
There is one caller of dib7000p_i2c_enumeration() that does not check its
return value/error code. See
drivers/media/dvb/dvb-usb/cxusb.c::cxusb_dualdig4_rev2_frontend_attach():
dib7000p_i2c_enumeration(&adap->dev->i2c_adap, 1, 18,
&cxusb_dualdig4_rev2_config);
That is in my (similar) patch and I also posted a dib3000 patch.
Yes, it would be good if someone could review & merge them.
https://patchwork.kernel.org/patch/77891/
https://patchwork.kernel.org/patch/77892/
--
~Randy
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2010-03-30 18:16 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-03-30 18:02 [PATCH] dib7000p.c: Fix for warning: the frame size of 1236 bytes is larger than 1024 bytes Ricardo Maraschini
2010-03-30 18:16 ` Randy Dunlap
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox