+
+ _reg_read(si, SI24_REG_STATUS, &flags, 1);
+
+ if (!(flags & (1 << RX_DR))) {
+ ev.type = EV_RX_EMPTY;
+ si->eh(si, &ev);
+ return -1;
+ }
+
+ /* do not accept any new incoming data */
+ si->opts->ioctl->chip_enable(0);
+
+ _reg_read(si, SI24_REG_FIFO_SATUS, &fifo_flags, 1);
+ while(!(fifo_flags & (1 << RX_EMPTY)) &&
+ bytes_read < size) {
+
+ int m_size = (size - bytes_read) > p_size ? p_size : (size - bytes_read);
+ _reg_read(si, SI24_R_RX_PAYLOAD, tmpbuf, m_size);
+ memcpy(buf + bytes_read, tmpbuf, m_size);
+ bytes_read += m_size;
+
+ ev.type = EV_RX_COMPLETE;
+ si->eh(si, &ev);
+
+ _reg_read(si, SI24_REG_FIFO_SATUS, &fifo_flags, 1);
+ }
+
+ flags |= (1 << RX_DR);
+ _reg_write(si, SI24_REG_STATUS, &flags, 1);
+
+ si->opts->ioctl->chip_enable(1);