summaryrefslogtreecommitdiff
path: root/drivers/net/wireless/eagle/esp_sip.h
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/eagle/esp_sip.h')
-rwxr-xr-xdrivers/net/wireless/eagle/esp_sip.h173
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