/* * Copyright (c) 2015 South Silicon Valley Microelectronics Inc. * Copyright (c) 2015 iComm Corporation * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef _SSV_HCI_H_ #define _SSV_HCI_H_ #define SSV_HW_TXQ_NUM 5 #define SSV_HW_TXQ_MAX_SIZE 64 #define SSV_HW_TXQ_RESUME_THRES ((SSV_HW_TXQ_MAX_SIZE >> 2) *3) #define HCI_FLAGS_ENQUEUE_HEAD 0x00000001 #define HCI_FLAGS_NO_FLOWCTRL 0x00000002 struct ssv_hw_txq { u32 txq_no; struct sk_buff_head qhead; int max_qsize; int resum_thres; bool paused; u32 tx_pkt; u32 tx_flags; }; struct ssv6xxx_hci_ops { int (*hci_start)(void); int (*hci_stop)(void); int (*hci_read_word)(u32 addr, u32 *regval); int (*hci_write_word)(u32 addr, u32 regval); int (*hci_load_fw)(u8 *firmware_name, u8 openfile); int (*hci_tx)(struct sk_buff *, int, u32); #if 0 int (*hci_rx)(struct sk_buff *); #endif int (*hci_tx_pause)(u32 txq_mask); int (*hci_tx_resume)(u32 txq_mask); int (*hci_txq_flush)(u32 txq_mask); int (*hci_txq_flush_by_sta)(int aid); bool (*hci_txq_empty)(int txqid); int (*hci_pmu_wakeup)(void); int (*hci_send_cmd)(struct sk_buff *); #ifdef CONFIG_SSV6XXX_DEBUGFS bool (*hci_init_debugfs)(struct dentry *dev_deugfs_dir); void (*hci_deinit_debugfs)(void); #endif int (*hci_write_sram)(u32 addr, u8* data, u32 size); int (*hci_interface_reset)(void); }; struct ssv6xxx_hci_info { struct device *dev; struct ssv6xxx_hwif_ops *if_ops; struct ssv6xxx_hci_ops *hci_ops; #if !defined(USE_THREAD_RX) || defined(USE_BATCH_RX) int (*hci_rx_cb)(struct sk_buff_head *, void *); #else int (*hci_rx_cb)(struct sk_buff *, void *); #endif void *rx_cb_args; void (*hci_tx_cb)(struct sk_buff_head *, void *); void *tx_cb_args; int (*hci_tx_flow_ctrl_cb)(void *, int, bool, int debug); void *tx_fctrl_cb_args; void (*hci_tx_buf_free_cb)(struct sk_buff *, void *); void *tx_buf_free_args; void (*hci_skb_update_cb)(struct sk_buff *, void *); void *skb_update_args; void (*hci_tx_q_empty_cb)(u32 txq_no, void *); void *tx_q_empty_args; }; int ssv6xxx_hci_deregister(void); int ssv6xxx_hci_register(struct ssv6xxx_hci_info *); #endif