/* * seekwave - Platform data for sv6160 platform. * * This software is distributed under the terms of the GNU General Public * License ("GPL") version 2, as published by the Free Software Foundation. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef __SKW_PLATFORM_DATA_H__ #define __SKW_PLATFORM_DATA_H__ #define MAX_PORT_COUNT 8 #define WIFIDATA_PORTNO 0 #define WIFICMD_PORTNO 1 #define BRDATA_PORTNO 2 #define BTCMD_PORTNO 3 #define SKW_LOG 4 #define SKW_AT 5 #define SKW_LOOPCHECK 6 #define SKW_ASSERT 7 #define DEVICE_ASSERT_EVENT 0 #define DEVICE_BSPREADY_EVENT 1 #define DEVICE_DUMPDONE_EVENT 2 #define DEVICE_BLOCKED_EVENT 3 #define DEVICE_DISCONNECT_EVENT 4 #define DEVICE_DUMPMEM_EVENT 5 #define DEVICE_SUSPEND_EVENT 6 #define DEVICE_RESUME_EVENT 7 #define DEVICE_BOOTUP_EVENT 8 #define SV6160_WIRELESS "sv6160_wireless" #define SV6621S_WIRELESS "sv6621s_wireless" #define SV6160_BTDRIVER "sv6160_btdriver" #define SV6316_WIRELESS "sv6316_wireless" #define RX_CALLBACK 0 #define ADMA_TX_CALLBACK 1 #define SDMA_TX_CALLBACK 2 #define SKW_ADMA_BUFF_LEN PAGE_SIZE struct skw_packet_header { u32 pad:7; u32 len:16; u32 eof:1; u32 channel:8; }; struct skw_packet2_header { u32 len:16; u32 pad:7; u32 eof:1; u32 channel:8; }; struct EDMA_Node{ u64 data_addr:40; u64 user_len:16; u64 tx_int:1; u64 rsv1:6; u64 done:1; u64 next_hdr:40; u64 edma_no:8; u64 length:16;//cur_trans_length,except header } __attribute__((packed)); struct skw_operation { u8 port; int (*open) (int id, void *callback, void *data); int (*close) (int id); int (*read) (int id, char *buff, int len); int (*write) (int id, char *buff, int len); /* * actual : buffer to save actual read /write data size; * timeout : timeout unit ms. * return value * ret=0: transfer successfully, actual save the data size * ret=-ETIMEDOUT, timer out * otherwise error happened. */ int (*read_tm) (int id, char *buff, int len, int *actual, int timeout); int (*write_tm) (int id, char *buff, int len, int *actual, int timeout); }; /***************************************************************** * add EDMA parameters, usage: * direction: CP is source: 1; AP is source: 0, * priority: EDMA channel priority: 4 level: 0(highest)~3(lowest) * split: 0: not split; * 1: split. * AP driver: not successive * ring: 1:ring node; 0: list mode; AP driver:ring buffer. * endian: 0; * irq_threshold: processed node count that raise complete IRQ. * req_mode: 1:linklist mode * 0:std mode * fix_linklist_len(linklist mode): * 1: current node transfer length is trsc_len * 0: current node transfer length in head * trsc_len: ditto * opposite_node_done: * 1: report local complete int to opposite end * 0: no * node_count: node count in list ready for EDMA to process. * header: this is the free node EDMA is going to process. * timeout: timeout value for Complete IRQ, timeout unit is uS. * maximum timeout value is 4ms. * list header is set to CHNn_SRC_DSCR_PTR_HIGH(direction=1)/ * or to CHNn_DST_DSCR_PTR_HIGH(direction=0)/ * context: save service context to be referred in callbck function. * header: ring buffer header, it's better to be aligned to 8 bytes. * header = &edma_node.next_addr_l32 ******************************************************************/ struct skw_channel_cfg { u8 direction; u8 priority; u8 split; u8 ring; u8 endian; u8 irq_threshold; u8 req_mode; u8 fix_linklist_len; u16 trsc_len; u8 opposite_node_done; u16 timeout; dma_addr_t header; //PCIe Address u16 node_count; u32 buf_cnt; u32 buf_level; void *context; int (*complete_callback) (void *context, void *header, void *tailed, int node_count); int (*empty_callback) (void *context); void (*rx_callback) (void *context, void *data_addr, u16 data_len); }; typedef int (*rx_submit_fn) (int id, struct scatterlist *sg, int nets, void *data); typedef int (*adma_callback) (int id, struct scatterlist *sg, int nets, void *data, int status); typedef int (*sdma_callback) (int id, void *buffer, int size, void *data, int status); typedef int (*status_notify) (u8 event); struct sv6160_platform_data { u8 data_port; u8 cmd_port; u8 audio_port; u8 bus_type; #define SDIO_LINK (0<<0) #define USB_LINK (1<<0) #define PCIE_LINK (2<<0) #define SDIO2_LINK (3<<0) #define USB2_LINK (4<<0) #define TYPE_MASK 0x07 #define TX_ADMA (0<<3) #define TX_SDMA (1<<3) #define TX_ASYN (1<<4) #define RX_ADMA (0<<5) #define RX_SDMA (1<<5) #define CP_DBG (0<<6) #define CP_RLS (1<<6) #define REINIT_USB_STR (1<<7) u32 max_buffer_size; u16 align_value; char chipid[16]; char *port_name; int (*hw_channel_init) (int id, void *channl_cfg, void *data); int (*hw_channel_deinit) (int id); int (*open_port) (int id, void *callback, void *data); int (*hw_adma_tx)(int id, struct scatterlist *sg, int nets, int size); int (*hw_sdma_tx)(int id, char *buff, int len); int (*hw_adma_tx_async)(int id, struct scatterlist *sg, int nets, int size); int (*hw_sdma_tx_async)(int id, char *buff, int len); int (*hw_sdma_rx)(int id, char *buff, int len); int (*read_timeout)(int id, char *buffer, int len, int timeout); int (*write_timeout)(int id, char *buffer, int len, int timeout); int (*callback_register)(int id, void *function, void *para); int (*close_port) (int id); int (*modem_assert) (void); dma_addr_t (*phyaddr_to_pcieaddr)(dma_addr_t phy_addr); dma_addr_t (*pcieaddr_to_phyaddr)(dma_addr_t pcie_addr); dma_addr_t (*virtaddr_to_pcieaddr)(void *virt_addr); u64 (*pcieaddr_to_virtaddr)(dma_addr_t phy_addr); struct skw_operation at_ops; void (*modem_register_notify)(struct notifier_block *nb); void (*modem_unregister_notify)(struct notifier_block *nb); int (*wifi_get_credit)(void); int (*service_start)(void); int (*service_stop)(void); int (*skw_dloader)(int index); int (*wifi_store_credit)(unsigned char val); int (*skw_dump_mem)(unsigned int system_addr, void *buf,unsigned int len); int (*tx_callback_register)(int id, void *function, void *para); int (*submit_list_to_edma_channel)(int ch_id, void *header, int count); void (*edma_mask_irq)(int channel); void (*edma_unmask_irq)(int channel); int (*wifi_power_on)(int is_on); void (*usb_speed_switch)(char *mode); int (*edma_get_node_tot_cnt)(int channel); u32 (*edma_clear_src_node_count)(int channel); void (*rx_thread_wakeup)(void); int (*suspend_adma_cmd)(int id, struct scatterlist *sg, int nets, int size); int (*suspend_sdma_cmd)(int id, char *buff, int len); void (*dump_modem_memory)(char *buffer, int size, int *log_size); int (*bluetooth_log_disable)(int disable); /* * add edma channel mask for WIFI platform device. * value=0x7ff, means first 11 channels owned by WIFI. */ u64 wifi_channel_map;//0x7ff; char *debug_info; }; #endif