[RAMEN9610-20413][9610] wlbt: SCSC Driver version 10.6.1.0
[GitHub/MotorolaMobilityLLC/kernel-slsi.git] / drivers / net / wireless / scsc / test / unittest.h
1 /****************************************************************************
2 *
3 * Copyright (c) 2012 - 2016 Samsung Electronics Co., Ltd. All rights reserved
4 *
5 ****************************************************************************/
6
7 #ifndef __SLSI_UNITTEST_H__
8 #define __SLSI_UNITTEST_H__
9
10 #include "dev.h"
11
12 struct slsi_test_dev;
13 struct slsi_test_bh_work {
14 bool available;
15 struct slsi_test_dev *uftestdev;
16 struct workqueue_struct *workqueue;
17 struct work_struct work;
18 struct slsi_spinlock spinlock;
19 };
20
21 struct slsi_test_data_route {
22 bool configured;
23 u16 test_device_minor_number; /* index into slsi_test_devices[] */
24 u8 mac[ETH_ALEN];
25 u16 vif;
26 u8 ipsubnet;
27 u16 sequence_number;
28 };
29
30 struct slsi_test_dev {
31 /* This is used for:
32 * 1) The uf6kunittesthip<n> chardevice number
33 * 2) The uf6kunittest<n> chardevice number
34 * 3) The /procf/devices/unifi<n> number
35 */
36 int device_minor_number;
37
38 void *uf_cdev;
39 struct device *dev;
40 struct slsi_dev *sdev;
41
42 struct workqueue_struct *attach_detach_work_queue;
43 /* a std mutex */
44 struct mutex attach_detach_mutex;
45 struct work_struct attach_work;
46 struct work_struct detach_work;
47 bool attached;
48
49 u8 hw_addr[ETH_ALEN];
50 struct slsi_test_bh_work bh_work;
51
52 /* a std spinlock */
53 spinlock_t route_spinlock;
54 struct slsi_test_data_route route[SLSI_AP_PEER_CONNECTIONS_MAX];
55 };
56
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);
60
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);
64
65 int slsi_test_udi_init(void);
66 int slsi_test_udi_deinit(void);
67
68 void slsi_test_bh_work_f(struct work_struct *work);
69 static inline int slsi_test_bh_init(struct slsi_test_dev *uftestdev)
70 {
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)
77 return -ENOMEM;
78 uftestdev->bh_work.available = true;
79 return 0;
80 }
81
82 static inline void slsi_test_bh_start(struct slsi_test_dev *uftestdev)
83 {
84 slsi_spinlock_lock(&uftestdev->bh_work.spinlock);
85 uftestdev->bh_work.available = true;
86 slsi_spinlock_unlock(&uftestdev->bh_work.spinlock);
87 }
88
89 static inline void slsi_test_bh_run(struct slsi_test_dev *uftestdev)
90 {
91 slsi_spinlock_lock(&uftestdev->bh_work.spinlock);
92 if (!uftestdev->bh_work.available)
93 goto exit;
94 queue_work(uftestdev->bh_work.workqueue, &uftestdev->bh_work.work);
95 exit:
96 slsi_spinlock_unlock(&uftestdev->bh_work.spinlock);
97 }
98
99 static inline void slsi_test_bh_stop(struct slsi_test_dev *uftestdev)
100 {
101 struct workqueue_struct *workqueue = NULL;
102
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);
108
109 if (workqueue)
110 flush_workqueue(workqueue);
111 }
112
113 static inline void slsi_test_bh_deinit(struct slsi_test_dev *uftestdev)
114 {
115 struct workqueue_struct *workqueue = NULL;
116
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);
123 if (workqueue) {
124 flush_workqueue(workqueue);
125 destroy_workqueue(workqueue);
126 }
127 }
128
129 #endif