163fa15dbSBob Pearson /* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */
28700e3e7SMoni Shoua /*
38700e3e7SMoni Shoua  * Copyright (c) 2016 Mellanox Technologies Ltd. All rights reserved.
48700e3e7SMoni Shoua  * Copyright (c) 2015 System Fabric Works, Inc. All rights reserved.
58700e3e7SMoni Shoua  */
68700e3e7SMoni Shoua 
78700e3e7SMoni Shoua #ifndef RXE_TASK_H
88700e3e7SMoni Shoua #define RXE_TASK_H
98700e3e7SMoni Shoua 
108700e3e7SMoni Shoua enum {
118700e3e7SMoni Shoua 	TASK_STATE_START	= 0,
128700e3e7SMoni Shoua 	TASK_STATE_BUSY		= 1,
138700e3e7SMoni Shoua 	TASK_STATE_ARMED	= 2,
148700e3e7SMoni Shoua };
158700e3e7SMoni Shoua 
168700e3e7SMoni Shoua /*
178700e3e7SMoni Shoua  * data structure to describe a 'task' which is a short
188700e3e7SMoni Shoua  * function that returns 0 as long as it needs to be
198700e3e7SMoni Shoua  * called again.
208700e3e7SMoni Shoua  */
218700e3e7SMoni Shoua struct rxe_task {
228700e3e7SMoni Shoua 	struct tasklet_struct	tasklet;
238700e3e7SMoni Shoua 	int			state;
248700e3e7SMoni Shoua 	spinlock_t		state_lock; /* spinlock for task state */
258700e3e7SMoni Shoua 	void			*arg;
268700e3e7SMoni Shoua 	int			(*func)(void *arg);
278700e3e7SMoni Shoua 	int			ret;
2807bf9627SAndrew Boyer 	bool			destroyed;
298700e3e7SMoni Shoua };
308700e3e7SMoni Shoua 
318700e3e7SMoni Shoua /*
328700e3e7SMoni Shoua  * init rxe_task structure
338700e3e7SMoni Shoua  *	arg  => parameter to pass to fcn
345f9e2822SBob Pearson  *	func => function to call until it returns != 0
358700e3e7SMoni Shoua  */
36de669ae8SBob Pearson int rxe_init_task(struct rxe_task *task, void *arg, int (*func)(void *));
378700e3e7SMoni Shoua 
388700e3e7SMoni Shoua /* cleanup task */
398700e3e7SMoni Shoua void rxe_cleanup_task(struct rxe_task *task);
408700e3e7SMoni Shoua 
418700e3e7SMoni Shoua /*
428700e3e7SMoni Shoua  * raw call to func in loop without any checking
438700e3e7SMoni Shoua  * can call when tasklets are disabled
448700e3e7SMoni Shoua  */
458700e3e7SMoni Shoua int __rxe_do_task(struct rxe_task *task);
468700e3e7SMoni Shoua 
478700e3e7SMoni Shoua /*
488700e3e7SMoni Shoua  * common function called by any of the main tasklets
498700e3e7SMoni Shoua  * If there is any chance that there is additional
508700e3e7SMoni Shoua  * work to do someone must reschedule the task before
518700e3e7SMoni Shoua  * leaving
528700e3e7SMoni Shoua  */
5300b3c118SAllen Pais void rxe_do_task(struct tasklet_struct *t);
548700e3e7SMoni Shoua 
55*dccb23f6SBob Pearson void rxe_run_task(struct rxe_task *task);
56*dccb23f6SBob Pearson 
57*dccb23f6SBob Pearson void rxe_sched_task(struct rxe_task *task);
588700e3e7SMoni Shoua 
598700e3e7SMoni Shoua /* keep a task from scheduling */
608700e3e7SMoni Shoua void rxe_disable_task(struct rxe_task *task);
618700e3e7SMoni Shoua 
628700e3e7SMoni Shoua /* allow task to run */
638700e3e7SMoni Shoua void rxe_enable_task(struct rxe_task *task);
648700e3e7SMoni Shoua 
658700e3e7SMoni Shoua #endif /* RXE_TASK_H */
66