Linux Media Controller development
 help / color / mirror / Atom feed
* [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