Hi Henk, > From: Henk Medenblik <iio-developer@xxxxxxxxxx> > Sent: Wednesday, June 9, 2021 9:04 AM > To: Alexandru Ardelean <ardeleanalex@xxxxxxxxx>; Henk Medenblik > <iio-developer@xxxxxxxxxx> > Cc: linux-iio <linux-iio@xxxxxxxxxxxxxxx> > Subject: Re: active_scan_mask > > [External] > > Dear Alexandru, > > > Hmm, so the "zerocopy" branch isn't at v0.21. > > It's something much older [ ~6 years ? ]. > > Though the kernel active scan mask is unrelated to libiio, since > > iio_readdev is being used in different sessions. > > > > The 4.14 version of the kernel, isn't quite new. > > There was some recent fix with regards to active scan-mask > computation. > > But I am not sure if it's related to this. > > > > Will try to make some time to do some testing on this. > > > I believe it is a bug which still exists in the adi linux kernel sources. > In industrialio-buffer.c : > > static int iio_channel_mask_clear(struct iio_dev *indio_dev, > struct iio_buffer *buffer, int bit) > { > unsigned int ch; > > clear_bit(bit, buffer->channel_mask); > > memset(buffer->scan_mask, 0, > BITS_TO_LONGS(indio_dev->masklength)); <--------- > for_each_set_bit(ch, buffer->channel_mask, indio_dev- > >num_channels) > set_bit(indio_dev->channels[ch].scan_index, buffer- > >scan_mask); > return 0; > } > Take a look at [1] for more details. Long story short, I think this is here because we have some devices where we have bit granularity. Hence, we map all channels to the same scan_index and to distinguish which channels are enabled, we could not use the current upstream implementation. I remember some talks about this but not actual patches came from it (I will have to go over those emails to see if I can come up with some patches). Regarding the memset, that looks like a bug. I guess we want: memset(buffer->scan_mask, 0, BITS_TO_LONGS(indio_dev->masklength) * sizeof(*buffer->scan_mask)); Ccing Lars as he implemented this patches and might have something to add to your questions. ps: feel free to push a PR to ADI tree if you fix this :) - Nuno Sá [1]: https://github.com/analogdevicesinc/linux/commit/81d00795b1537a8cfd3eb5152b30ae407c0e16e7