1 /****************************************************************************
3 * Copyright (c) 2012 - 2016 Samsung Electronics Co., Ltd. All rights reserved
5 ****************************************************************************/
7 #ifndef __SLSI_UNITTEST_H__
8 #define __SLSI_UNITTEST_H__
13 struct slsi_test_bh_work
{
15 struct slsi_test_dev
*uftestdev
;
16 struct workqueue_struct
*workqueue
;
17 struct work_struct work
;
18 struct slsi_spinlock spinlock
;
21 struct slsi_test_data_route
{
23 u16 test_device_minor_number
; /* index into slsi_test_devices[] */
30 struct slsi_test_dev
{
32 * 1) The uf6kunittesthip<n> chardevice number
33 * 2) The uf6kunittest<n> chardevice number
34 * 3) The /procf/devices/unifi<n> number
36 int device_minor_number
;
40 struct slsi_dev
*sdev
;
42 struct workqueue_struct
*attach_detach_work_queue
;
44 struct mutex attach_detach_mutex
;
45 struct work_struct attach_work
;
46 struct work_struct detach_work
;
50 struct slsi_test_bh_work bh_work
;
53 spinlock_t route_spinlock
;
54 struct slsi_test_data_route route
[SLSI_AP_PEER_CONNECTIONS_MAX
];
57 void slsi_test_dev_attach(struct slsi_test_dev
*uftestdev
);
58 void slsi_test_dev_detach(struct slsi_test_dev
*uftestdev
);
59 bool slsi_test_process_signal(struct slsi_test_dev
*uftestdev
, struct sk_buff
*skb
);
61 int slsi_test_udi_node_init(struct slsi_test_dev
*uftestdev
, struct device
*parent
);
62 int slsi_test_udi_node_reregister(struct slsi_test_dev
*uftestdev
);
63 int slsi_test_udi_node_deinit(struct slsi_test_dev
*uftestdev
);
65 int slsi_test_udi_init(void);
66 int slsi_test_udi_deinit(void);
68 void slsi_test_bh_work_f(struct work_struct
*work
);
69 static inline int slsi_test_bh_init(struct slsi_test_dev
*uftestdev
)
71 uftestdev
->bh_work
.available
= false;
72 uftestdev
->bh_work
.uftestdev
= uftestdev
;
73 slsi_spinlock_create(&uftestdev
->bh_work
.spinlock
);
74 INIT_WORK(&uftestdev
->bh_work
.work
, slsi_test_bh_work_f
);
75 uftestdev
->bh_work
.workqueue
= alloc_ordered_workqueue("slsi_wlan_unittest_bh", 0);
76 if (!uftestdev
->bh_work
.workqueue
)
78 uftestdev
->bh_work
.available
= true;
82 static inline void slsi_test_bh_start(struct slsi_test_dev
*uftestdev
)
84 slsi_spinlock_lock(&uftestdev
->bh_work
.spinlock
);
85 uftestdev
->bh_work
.available
= true;
86 slsi_spinlock_unlock(&uftestdev
->bh_work
.spinlock
);
89 static inline void slsi_test_bh_run(struct slsi_test_dev
*uftestdev
)
91 slsi_spinlock_lock(&uftestdev
->bh_work
.spinlock
);
92 if (!uftestdev
->bh_work
.available
)
94 queue_work(uftestdev
->bh_work
.workqueue
, &uftestdev
->bh_work
.work
);
96 slsi_spinlock_unlock(&uftestdev
->bh_work
.spinlock
);
99 static inline void slsi_test_bh_stop(struct slsi_test_dev
*uftestdev
)
101 struct workqueue_struct
*workqueue
= NULL
;
103 slsi_spinlock_lock(&uftestdev
->bh_work
.spinlock
);
104 uftestdev
->bh_work
.available
= false;
105 workqueue
= uftestdev
->bh_work
.workqueue
;
106 uftestdev
->bh_work
.workqueue
= NULL
;
107 slsi_spinlock_unlock(&uftestdev
->bh_work
.spinlock
);
110 flush_workqueue(workqueue
);
113 static inline void slsi_test_bh_deinit(struct slsi_test_dev
*uftestdev
)
115 struct workqueue_struct
*workqueue
= NULL
;
117 slsi_spinlock_lock(&uftestdev
->bh_work
.spinlock
);
118 WARN_ON(uftestdev
->bh_work
.available
);
119 uftestdev
->bh_work
.available
= false;
120 workqueue
= uftestdev
->bh_work
.workqueue
;
121 uftestdev
->bh_work
.workqueue
= NULL
;
122 slsi_spinlock_unlock(&uftestdev
->bh_work
.spinlock
);
124 flush_workqueue(workqueue
);
125 destroy_workqueue(workqueue
);