static ssize_t stm32l4_rngread(struct file *filep, char *buffer, size_t buflen) { if (sem_wait(&g_rngdev.rd_devsem) != OK) { return -errno; } else { /* We've got the device semaphore, proceed with reading */ /* Initialize the operation semaphore with 0 for blocking until the * buffer is filled from interrupts. The waitsem semaphore is used * for signaling and, hence, should not have priority inheritance * enabled. */ sem_init(&g_rngdev.rd_readsem, 0, 0); sem_setprotocol(&g_rngdev.rd_readsem, SEM_PRIO_NONE); g_rngdev.rd_buflen = buflen; g_rngdev.rd_buf = buffer; /* Enable RNG with interrupts */ stm32l4_rngenable(); /* Wait until the buffer is filled */ sem_wait(&g_rngdev.rd_readsem); /* Done with the operation semaphore */ sem_destroy(&g_rngdev.rd_readsem); /* Free RNG via the device semaphore for next use */ sem_post(&g_rngdev.rd_devsem); return buflen; } }
static ssize_t stm32l4_rngread(struct file *filep, char *buffer, size_t buflen) { if (sem_wait(&g_rngdev.rd_devsem) != OK) { return -errno; } else { /* We've got the device semaphore, proceed with reading */ /* Initialize the operation semaphore with 0 for blocking until * the buffer is filled from interrupts. */ sem_init(&g_rngdev.rd_readsem, 0, 0); g_rngdev.rd_buflen = buflen; g_rngdev.rd_buf = buffer; /* Enable RNG with interrupts */ stm32l4_rngenable(); /* Wait until the buffer is filled */ sem_wait(&g_rngdev.rd_readsem); /* Done with the operation semaphore */ sem_destroy(&g_rngdev.rd_readsem); /* Free RNG via the device semaphore for next use */ sem_post(&g_rngdev.rd_devsem); return buflen; } }