/* * ITP code for ST-Ericsson CW1200 mac80211 driver * * Copyright (c) 2011, ST-Ericsson * Author: Dmitry Tarnyagin * * 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 */