dib7000p.c: Fix for warning: the frame size of 1236 bytes is larger than 1024 bytes
PATCH 1/1 dib7000p.c: Fix for warning: the frame size of 1236 bytes is larger than 1024 bytes
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.
linux/drivers/media/dvb/frontends/dib7000p.c +25 -14
@@ -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);
Quoted 11 lines · Ricardo Maraschini
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 bytesI 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/
Signature · 1 line
~Randy