-void canqueue_notify_kern(struct canque_ends_t *qends, struct canque_edge_t *qedge, int what)
-{
- DEBUGQUE("canqueue_notify_kern for edge %d and event %d\n",qedge->edge_num,what);
- switch(what){
- case CANQUEUE_NOTIFY_EMPTY:
- wake_up_interruptible(&qends->endinfo.fileinfo.emptyq);
- break;
- case CANQUEUE_NOTIFY_SPACE:
- wake_up_interruptible(&qends->endinfo.fileinfo.writeq);
- break;
- case CANQUEUE_NOTIFY_PROC:
- wake_up_interruptible(&qends->endinfo.fileinfo.readq);
- break;
- case CANQUEUE_NOTIFY_NOUSR:
- wake_up_interruptible(&qends->endinfo.fileinfo.readq);
- wake_up_interruptible(&qends->endinfo.fileinfo.writeq);
- wake_up_interruptible(&qends->endinfo.fileinfo.emptyq);
- break;
- case CANQUEUE_NOTIFY_DEAD:
- if(atomic_read(&qedge->edge_used)>0)
- atomic_dec(&qedge->edge_used);
- break;
- case CANQUEUE_NOTIFY_ATACH:
- atomic_inc(&qedge->edge_used);
- break;
- }
-}
-
-int canqueue_ends_init_kern(struct canque_ends_t *qends)
-{
- canqueue_ends_init_gen(qends);
- qends->context=NULL;
- init_waitqueue_head(&qends->endinfo.fileinfo.readq);
- init_waitqueue_head(&qends->endinfo.fileinfo.writeq);
- init_waitqueue_head(&qends->endinfo.fileinfo.emptyq);
- qends->notify=canqueue_notify_kern;
- DEBUGQUE("canqueue_ends_init_kern\n");
- return 0;
-}
-
-
-int canque_get_inslot4id_wait_kern(struct canque_ends_t *qends,
- struct canque_edge_t **qedgep, struct canque_slot_t **slotp,
- int cmd, unsigned long id, int prio)
-{
- int ret=-1;
- DEBUGQUE("canque_get_inslot4id_wait_kern for cmd %d, id %ld, prio %d\n",cmd,id,prio);
- wait_event_interruptible((qends->endinfo.fileinfo.writeq),
- (ret=canque_get_inslot4id(qends,qedgep,slotp,cmd,id,prio))!=-1);
- return ret;
-}
-
-int canque_get_outslot_wait_kern(struct canque_ends_t *qends,
- struct canque_edge_t **qedgep, struct canque_slot_t **slotp)
-{
- int ret=-1;
- DEBUGQUE("canque_get_outslot_wait_kern\n");
- wait_event_interruptible((qends->endinfo.fileinfo.readq),
- (ret=canque_test_outslot(qends,qedgep,slotp))!=-1);
- return ret;
-}
-
-int canque_sync_wait_kern(struct canque_ends_t *qends, struct canque_edge_t *qedge)
-{
- int ret=-1;
- DEBUGQUE("canque_sync_wait_kern\n");
- wait_event_interruptible((qends->endinfo.fileinfo.emptyq),
- (ret=canque_fifo_test_fl(&qedge->fifo,EMPTY)));
- return ret;
-}
-
-
-struct canque_edge_t *canque_new_edge_kern(int slotsnr)
-{
- struct canque_edge_t *qedge;
- qedge = (struct canque_edge_t *)kmalloc(sizeof(struct canque_edge_t), GFP_KERNEL);
- if(qedge == NULL) return NULL;
-
- memset(qedge,0,sizeof(struct canque_edge_t));
- spin_lock_init(&qedge->fifo.fifo_lock);
- if(canque_fifo_init_slots(&qedge->fifo, slotsnr)<0){
- kfree(qedge);
- DEBUGQUE("canque_new_edge_kern failed\n");
- return NULL;
- }
- atomic_set(&qedge->edge_used,0);
- qedge->filtid = 0;
- qedge->filtmask = 0;
- qedge->edge_prio = 0;
- #ifdef CAN_DEBUG
- /* not exactly clean, but enough for debugging */
- atomic_inc(&edge_num_cnt);
- qedge->edge_num=atomic_read(&edge_num_cnt);
- #endif /* CAN_DEBUG */
- DEBUGQUE("canque_new_edge_kern %d\n",qedge->edge_num);
- return qedge;
-}
-