static int fifo_check_recv(struct ilo_hwinfo *hw, char *fifobar) { struct fifo *fifo_q = FIFOBARTOHANDLE(fifobar); unsigned long flags; int ret = 0; u64 c; spin_lock_irqsave(&hw->fifo_lock, flags); c = fifo_q->fifobar[fifo_q->head & fifo_q->imask]; if (c & ENTRY_MASK_C) ret = 1; spin_unlock_irqrestore(&hw->fifo_lock, flags); return ret; }
/* * FIFO queues, shared with hardware. * * If a queue has empty slots, an entry is added to the queue tail, * and that entry is marked as occupied. * Entries can be dequeued from the head of the list, when the device * has marked the entry as consumed. * * Returns true on successful queue/dequeue, false on failure. */ static int fifo_enqueue(struct ilo_hwinfo *hw, char *fifobar, int entry) { struct fifo *fifo_q = FIFOBARTOHANDLE(fifobar); unsigned long flags; int ret = 0; spin_lock_irqsave(&hw->fifo_lock, flags); if (!(fifo_q->fifobar[(fifo_q->tail + 1) & fifo_q->imask] & ENTRY_MASK_O)) { fifo_q->fifobar[fifo_q->tail & fifo_q->imask] |= (entry & ENTRY_MASK_NOSTATE) | fifo_q->merge; fifo_q->tail += 1; ret = 1; } spin_unlock_irqrestore(&hw->fifo_lock, flags); return ret; }
static int fifo_dequeue(struct ilo_hwinfo *hw, char *fifobar, int *entry) { struct fifo *fifo_q = FIFOBARTOHANDLE(fifobar); unsigned long flags; int ret = 0; u64 c; spin_lock_irqsave(&hw->fifo_lock, flags); c = fifo_q->fifobar[fifo_q->head & fifo_q->imask]; if (c & ENTRY_MASK_C) { if (entry) *entry = c & ENTRY_MASK_NOSTATE; fifo_q->fifobar[fifo_q->head & fifo_q->imask] = (c | ENTRY_MASK) + 1; fifo_q->head += 1; ret = 1; } spin_unlock_irqrestore(&hw->fifo_lock, flags); return ret; }
static inline void set_channel_reset(struct ccb *ccb) { /* set a flag indicating this channel needs a reset */ FIFOBARTOHANDLE(ccb->ccb_u1.send_fifobar)->reset = 1; }
static inline int is_channel_reset(struct ccb *ccb) { /* check for this particular channel needing a reset */ return FIFOBARTOHANDLE(ccb->ccb_u1.send_fifobar)->reset; }
static inline void set_channel_reset(struct ccb *ccb) { /* */ FIFOBARTOHANDLE(ccb->ccb_u1.send_fifobar)->reset = 1; }
static inline int is_channel_reset(struct ccb *ccb) { /* */ return FIFOBARTOHANDLE(ccb->ccb_u1.send_fifobar)->reset; }