summaryrefslogtreecommitdiff
path: root/drivers/staging/cw1200/itp.h
blob: 635e7f85ff9bb6355b2c9b904c67c3ceb77db94b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
/*
 * ITP code for ST-Ericsson CW1200 mac80211 driver
 *
 * Copyright (c) 2011, ST-Ericsson
 * Author: Dmitry Tarnyagin <dmitry.tarnyagin@stericsson.com>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */

#ifndef CW1200_ITP_H_INCLUDED
#define CW1200_ITP_H_INCLUDED

struct cw200_common;
struct wsm_tx_confirm;
struct dentry;

#ifdef CONFIG_CW1200_ITP

/*extern*/ struct ieee80211_channel;

#define TEST_MODE_NO_TEST	(0)
#define TEST_MODE_RX_TEST	(1)
#define TEST_MODE_TX_TEST	(2)

#define itp_printk(...) printk(__VA_ARGS__)
#define ITP_DEFAULT_DA_ADDR {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}
#define ITP_MIN_DATA_SIZE 6
#define ITP_MAX_DATA_SIZE 1600
#define ITP_TIME_THRES_US 10000
#define ITP_US_TO_MS(x) ((x)/1000)
#define ITP_MS_TO_US(x) ((x)*1000)
#if ((ITP_US_TO_MS(ITP_TIME_THRES_US))*HZ/1000) < 1
#warning not able to achieve non-busywaiting ITP_TIME_THRES_US\
precision with current HZ value !
#endif
#define ITP_BUF_SIZE 255


enum cw1200_itp_data_modes {
	ITP_DATA_ZEROS,
	ITP_DATA_ONES,
	ITP_DATA_ZERONES,
	ITP_DATA_RANDOM,
	ITP_DATA_MAX_MODE,
};

enum cw1200_itp_version_type {
	ITP_CHIP_ID,
	ITP_FW_VER,
};

enum cw1200_itp_preamble_type {
	ITP_PREAMBLE_LONG,
	ITP_PREAMBLE_SHORT,
	ITP_PREAMBLE_OFDM,
	ITP_PREAMBLE_MIXED,
	ITP_PREAMBLE_GREENFIELD,
	ITP_PREAMBLE_MAX,
};


struct cw1200_itp {
	struct cw1200_common	*priv;
	atomic_t		open_count;
	atomic_t		awaiting_confirm;
	struct sk_buff_head	log_queue;
	wait_queue_head_t	read_wait;
	wait_queue_head_t	write_wait;
	wait_queue_head_t	close_wait;
	struct ieee80211_channel *saved_channel;
	atomic_t		stop_tx;
	struct delayed_work	tx_work;
	struct delayed_work	tx_finish;
	spinlock_t		tx_lock;
	struct timespec		last_sent;
	atomic_t		test_mode;
	int			rx_cnt;
	long			rx_rssi;
	int			rx_rssi_max;
	int			rx_rssi_min;
	unsigned		band;
	unsigned		ch;
	unsigned		rate;
	unsigned		preamble;
	unsigned int		number;
	unsigned		data_mode;
	int			interval_us;
	int			power;
	u8			*data;
	int			hdr_len;
	int			data_len;
};

int cw1200_itp_init(struct cw1200_common *priv);
void cw1200_itp_release(struct cw1200_common *priv);

bool cw1200_is_itp(struct cw1200_common *priv);
bool cw1200_itp_rxed(struct cw1200_common *priv, struct sk_buff *skb);
void cw1200_itp_wake_up_tx(struct cw1200_common *priv);
int cw1200_itp_get_tx(struct cw1200_common *priv, u8 **data,
		size_t *tx_len, int *burst);
bool cw1200_itp_tx_running(struct cw1200_common *priv);

#else /* CONFIG_CW1200_ITP */

static inline int
cw1200_itp_init(struct cw1200_common *priv)
{
	return 0;
}

static inline void cw1200_itp_release(struct cw1200_common *priv)
{
}

static inline bool cw1200_is_itp(struct cw1200_common *priv)
{
	return false;
}

static inline bool cw1200_itp_rxed(struct cw1200_common *priv,
		struct sk_buff *skb)
{
	return false;
}


static inline void cw1200_itp_consume_txed(struct cw1200_common *priv)
{
}

static inline void cw1200_itp_wake_up_tx(struct cw1200_common *priv)
{
}

static inline int cw1200_itp_get_tx(struct cw1200_common *priv, u8 **data,
		size_t *tx_len, int *burst)
{
	return 0;
}

static inline bool cw1200_itp_tx_running(struct cw1200_common *priv)
{
	return false;
}

#endif /* CONFIG_CW1200_ITP */

#endif /* CW1200_ITP_H_INCLUDED */