diff options
Diffstat (limited to 'drivers/net/wireless/eagle/esp_sip.h')
-rwxr-xr-x | drivers/net/wireless/eagle/esp_sip.h | 173 |
1 files changed, 173 insertions, 0 deletions
diff --git a/drivers/net/wireless/eagle/esp_sip.h b/drivers/net/wireless/eagle/esp_sip.h new file mode 100755 index 00000000..f8c38b8e --- /dev/null +++ b/drivers/net/wireless/eagle/esp_sip.h @@ -0,0 +1,173 @@ +/* + * Copyright (c) 2009- 2012 Espressif System. + * + * Serial Interconnctor Protocol + */ + +#ifndef _ESP_SIP_H +#define _ESP_SIP_H + +#include "sip2_common.h" + +#define SIP_PKT_MAX_LEN (1024*16) + +/* 16KB on normal X86 system, should check before porting to orhters */ + +#define SIP_TX_AGGR_BUF_SIZE (4 * PAGE_SIZE) +#define SIP_RX_AGGR_BUF_SIZE (4 * PAGE_SIZE) + +struct sk_buff; + +struct sip_pkt { + struct list_head list; + + u8 * buf_begin; + u32 buf_len; + u8 * buf; + u32 payload_len; +#if 0 + union { + struct sip_tx_pkt_info tx; + struct sip_rx_pkt_info rx; + } info; +#endif + void *context; + int status; + //void (* completion)(struct esp_sip *sip, struct sip_pkt *pkt); +}; + +typedef enum SIP_STATE { + SIP_INIT = 0, + SIP_PREPARE_BOOT, + SIP_BOOT, + SIP_SEND_INIT, + SIP_WAIT_BOOTUP, + SIP_RUN, + SIP_SUSPEND, + SIP_STOP +} SIP_STATE; + +enum sip_notifier { + SIP_TX_DONE = 1, + SIP_RX_DONE = 2, +}; + +#define SIP_CREDITS_LOW_THRESHOLD 64 //i.e. 4k + +struct esp_sip { + struct list_head free_ctrl_txbuf; + struct list_head free_ctrl_rxbuf; + + u32 rxseq; /* sip pkt seq, should match target side */ + u32 txseq; + u32 txdataseq; + + atomic_t state; + spinlock_t lock; + int boot_credits; + atomic_t tx_credits; + + atomic_t tx_ask_credit_update; + + u8 * rawbuf; /* used in boot stage, free once chip is fully up */ + u8 * tx_aggr_buf; + u8 * tx_aggr_write_ptr; /* update after insertion of each pkt */ + u8 * tx_aggr_lastpkt_ptr; +#if 0 + u8 * rx_aggr_buf; + u8 * rx_aggr_write_ptr; + u8 * rx_aggr_lastpkt_ptr; +#endif + + spinlock_t rx_lock; + struct sk_buff_head rxq; +#ifndef RX_SYNC + struct work_struct rx_process_work; +#endif/* RX_SYNC */ + + u16 tx_blksz; + u16 rx_blksz; + + bool dump_rpbm_err; + bool sendup_rpbm_pkt; + bool rxabort_fixed; + bool support_bgscan; + u8 credit_to_reserve; + + atomic_t noise_floor; + + u32 tx_tot_len; /* total len for one transaction */ + u32 rx_tot_len; + + atomic_t rx_handling; + atomic_t tx_data_pkt_queued; + +#ifndef FAST_TX_STATUS + atomic_t pending_tx_status; +#endif /* !FAST_TX_STATUS */ + + atomic_t data_tx_stopped; + atomic_t tx_stopped; + + struct esp_pub *epub; +}; + +int sip_rx(struct esp_pub * epub); +//int sip_download_fw(struct esp_sip *sip, u32 load_addr, u32 boot_addr); + +/* tx must pad as 4-byte aligned */ +int sip_tx(struct esp_pub * epub, struct sip_pkt *pkt); + +int sip_get_raw_credits(struct esp_sip *); + +int sip_write_memory(struct esp_sip *, u32 addr, u8* buf, u16 len); + +void sip_credit_process(struct esp_pub *, u8 credits); + +int sip_prepare_boot(struct esp_sip *sip); + +int sip_send_cmd(struct esp_sip *sip, int cid, u32 cmdlen, void * cmd); + +struct esp_sip * sip_attach(struct esp_pub *); + +int sip_post_init(struct esp_sip *sip, struct sip_evt_bootup2 *bevt); + +void sip_detach(struct esp_sip *sip); + +void sip_txq_process(struct esp_pub *epub); + +struct sk_buff * sip_alloc_ctrl_skbuf(struct esp_sip *sip, u16 len, u32 cid); + +void sip_free_ctrl_skbuff(struct esp_sip *sip, struct sk_buff* skb); + +bool sip_queue_need_stop(struct esp_sip *sip); +bool sip_queue_may_resume(struct esp_sip *sip); +bool sip_tx_data_need_stop(struct esp_sip *sip); +bool sip_tx_data_may_resume(struct esp_sip *sip); + +void sip_tx_data_pkt_enqueue(struct esp_pub *epub, struct sk_buff *skb); +void sip_rx_data_pkt_enqueue(struct esp_pub *epub, struct sk_buff *skb); + +int sip_cmd_enqueue(struct esp_sip *sip, struct sk_buff *skb); + +void sip_dump_pending_data(struct esp_pub *epub); + +int sip_poll_bootup_event(struct esp_sip *sip); + +int sip_poll_resetting_event(struct esp_sip *sip); + +void sip_trigger_txq_process(struct esp_sip *sip); + +void sip_send_chip_init(struct esp_sip *sip); + +bool mod_support_no_txampdu(void); + +bool mod_support_no_rxampdu(void); + +void mod_support_no_txampdu_set(bool value); + +#ifdef FPGA_DEBUG +int sip_send_bootup(struct esp_sip *sip); +#endif /* FPGA_DEBUG */ +void sip_debug_show(struct esp_sip *sip); +#endif |