Hi Sean, I found the problem. The read buffer needs to be allocated with kmalloc too. int dibusb_read_eeprom_byte(struct dvb_usb_device *d, u8 offs, u8 *val) { u8 *wbuf; u8 *rbuf; int rc; rbuf = kmalloc(1, GFP_KERNEL); if (!rbuf) return -ENOMEM; wbuf = kmalloc(1, GFP_KERNEL); if (!wbuf) return -ENOMEM; *wbuf = offs; rc = dibusb_i2c_msg(d, 0x50, wbuf, 1, rbuf, 1); kfree(wbuf); *val = *rbuf; kfree(rbuf); return rc; } It works now. Please update the code in the main branch for futur versions. Thanks. Regards, Laurent 2017-10-29 20:31 GMT+01:00 Sean Young <sean@xxxxxxxx>: > On Sun, Oct 29, 2017 at 06:54:28PM +0100, Laurent Caumont wrote: >> Hi Sean, >> >> I recompiled the modules by following the >> https://www.linuxtv.org/wiki/index.php/How_to_Obtain,_Build_and_Install_V4L-DVB_Device_Drivers >> page and applied the patch. >> But I still have problems (see below). It doesn't seem to be the same callstack. >> Is it the right way to get the fix ? > > Yes, it's the right way to get the fix. However, you've hit a new problem > of a similar making. Please can you try with this patch as well: > > Thanks > Sean > --- > From 84efb0bf72ae5d9183f25d69d95fb9ad9b9bc644 Mon Sep 17 00:00:00 2001 > From: Sean Young <sean@xxxxxxxx> > Date: Sun, 29 Oct 2017 19:28:32 +0000 > Subject: [PATCH] media: dibusb: don't do DMA on stack > > The USB control messages require DMA to work. We cannot pass > a stack-allocated buffer, as it is not warranted that the > stack would be into a DMA enabled area. > > Signed-off-by: Sean Young <sean@xxxxxxxx> > --- > drivers/media/usb/dvb-usb/dibusb-common.c | 14 ++++++++++++-- > 1 file changed, 12 insertions(+), 2 deletions(-) > > diff --git a/drivers/media/usb/dvb-usb/dibusb-common.c b/drivers/media/usb/dvb-usb/dibusb-common.c > index 8207e6900656..18c6e454b1b7 100644 > --- a/drivers/media/usb/dvb-usb/dibusb-common.c > +++ b/drivers/media/usb/dvb-usb/dibusb-common.c > @@ -223,8 +223,18 @@ EXPORT_SYMBOL(dibusb_i2c_algo); > > int dibusb_read_eeprom_byte(struct dvb_usb_device *d, u8 offs, u8 *val) > { > - u8 wbuf[1] = { offs }; > - return dibusb_i2c_msg(d, 0x50, wbuf, 1, val, 1); > + u8 *wbuf; > + int rc; > + > + wbuf = kmalloc(1, GFP_KERNEL); > + if (!wbuf) > + return -ENOMEM; > + > + *wbuf = offs; > + rc = dibusb_i2c_msg(d, 0x50, wbuf, 1, val, 1); > + kfree(wbuf); > + > + return rc; > } > EXPORT_SYMBOL(dibusb_read_eeprom_byte); > > -- > 2.13.6 >