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 {
11d9467163SBob Pearson 	TASK_STATE_IDLE		= 0,
128700e3e7SMoni Shoua 	TASK_STATE_BUSY		= 1,
138700e3e7SMoni Shoua 	TASK_STATE_ARMED	= 2,
14d9467163SBob Pearson 	TASK_STATE_DRAINING	= 3,
15d9467163SBob Pearson 	TASK_STATE_DRAINED	= 4,
16d9467163SBob Pearson 	TASK_STATE_INVALID	= 5,
178700e3e7SMoni Shoua };
188700e3e7SMoni Shoua 
198700e3e7SMoni Shoua /*
208700e3e7SMoni Shoua  * data structure to describe a 'task' which is a short
218700e3e7SMoni Shoua  * function that returns 0 as long as it needs to be
228700e3e7SMoni Shoua  * called again.
238700e3e7SMoni Shoua  */
248700e3e7SMoni Shoua struct rxe_task {
25*9b4b7c1fSBob Pearson 	struct work_struct	work;
268700e3e7SMoni Shoua 	int			state;
2763a18baeSBob Pearson 	spinlock_t		lock;
283946fc2aSBob Pearson 	struct rxe_qp		*qp;
293946fc2aSBob Pearson 	int			(*func)(struct rxe_qp *qp);
308700e3e7SMoni Shoua 	int			ret;
31d9467163SBob Pearson 	long			num_sched;
32d9467163SBob Pearson 	long			num_done;
338700e3e7SMoni Shoua };
348700e3e7SMoni Shoua 
35*9b4b7c1fSBob Pearson int rxe_alloc_wq(void);
36*9b4b7c1fSBob Pearson 
37*9b4b7c1fSBob Pearson void rxe_destroy_wq(void);
38*9b4b7c1fSBob Pearson 
398700e3e7SMoni Shoua /*
408700e3e7SMoni Shoua  * init rxe_task structure
413946fc2aSBob Pearson  *	qp  => parameter to pass to func
425f9e2822SBob Pearson  *	func => function to call until it returns != 0
438700e3e7SMoni Shoua  */
443946fc2aSBob Pearson int rxe_init_task(struct rxe_task *task, struct rxe_qp *qp,
453946fc2aSBob Pearson 		  int (*func)(struct rxe_qp *));
468700e3e7SMoni Shoua 
478700e3e7SMoni Shoua /* cleanup task */
488700e3e7SMoni Shoua void rxe_cleanup_task(struct rxe_task *task);
498700e3e7SMoni Shoua 
50dccb23f6SBob Pearson void rxe_run_task(struct rxe_task *task);
51dccb23f6SBob Pearson 
52dccb23f6SBob Pearson void rxe_sched_task(struct rxe_task *task);
538700e3e7SMoni Shoua 
548700e3e7SMoni Shoua /* keep a task from scheduling */
558700e3e7SMoni Shoua void rxe_disable_task(struct rxe_task *task);
568700e3e7SMoni Shoua 
578700e3e7SMoni Shoua /* allow task to run */
588700e3e7SMoni Shoua void rxe_enable_task(struct rxe_task *task);
598700e3e7SMoni Shoua 
608700e3e7SMoni Shoua #endif /* RXE_TASK_H */
61