/**
 * Mediatek BT-over-SDIO driver: SDIO interface related functions.
 * Copyright (C) 2009, Mediatek International Ltd.
 *
 * This software file (the "File") is distributed by Mediatek International
 * Ltd. under the terms of the GNU General Public License Version 2, June 1991
 * (the "License").  You may use, redistribute and/or modify this File in
 * accordance with the terms and conditions of the License, a copy of which
 * is available by writing to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA or on the
 * worldwide web at http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
 *
 *
 * THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE
 * ARE EXPRESSLY DISCLAIMED.  The License provides additional details about
 * this warranty disclaimer.
 **/
#include <linux/version.h>
#include <linux/firmware.h>
#include <linux/slab.h>

#include <linux/mmc/sdio_ids.h>
#include <linux/mmc/sdio_func.h>
#include <linux/module.h>

#include <net/bluetooth/bluetooth.h>
#include <net/bluetooth/hci_core.h>

#include <linux/mmc/host.h>
#include <linux/mmc/card.h>
#include <linux/mmc/sdio.h>
#include <linux/mmc/sdio_func.h>
#include <linux/cdev.h>
#include <linux/spinlock.h>
#include <linux/kallsyms.h>
#include <linux/device.h>


#include "btmtk_drv.h"
#include "btmtk_sdio.h"

u8 btmtk_log_lvl = BTMTK_LOG_LEVEL_DEFAULT;
static dev_t g_devIDfwlog;
static struct class *pBTClass;
static struct device *pBTDev;
struct device *pBTDevfwlog;
static wait_queue_head_t inq;
static wait_queue_head_t fw_log_inq;
static struct fasync_struct *fasync;

static int need_reset_stack;
/* The btmtk_sdio_remove() callback function is called
 * when user removes this module from kernel space or ejects
 * the card from the slot. The driver handles these 2 cases
 * differently.
 * If the user is removing the module, a MODULE_SHUTDOWN_REQ
 * command is sent to firmware and interrupt will be disabled.
 * If the card is removed, there is no need to send command
 * or disable interrupt.
 *
 * The variable 'user_rmmod' is used to distinguish these two
 * scenarios. This flag is initialized as FALSE in case the card
 * is removed, and will be set to TRUE for module removal when
 * module_exit function is called.
 */
typedef void (*register_sdio_early_suspend) (void (*f) (void));
typedef void (*register_sdio_late_resume) (void (*f) (void));
register_sdio_early_suspend register_sdio_early_suspend_func;
register_sdio_late_resume register_sdio_late_resume_func;

/*============================================================================*/
/* Callback Functions */
/*============================================================================*/

static u8 user_rmmod;

struct completion g_done;
unsigned char probe_counter;
unsigned char current_fwdump_file_number;
struct btmtk_private *g_priv;
#define STR_COREDUMP_END "coredump end\n\n"


static ring_buffer_struct metabuffer;
u8 probe_ready;

static char fw_dump_file_name[FW_DUMP_FILE_NAME_SIZE] = {0};
int fw_dump_buffer_full;
int fw_dump_total_read_size;
int fw_dump_total_write_size;
int fw_dump_buffer_used_size;
int fw_dump_task_should_stop;
u8 *fw_dump_ptr;
u8 *fw_dump_read_ptr;
u8 *fw_dump_write_ptr;
struct timeval fw_dump_last_write_time;
int fw_dump_end_checking_task_should_stop;
int fw_is_doing_coredump;
int fw_is_coredump_end_packet;

#if SAVE_FW_DUMP_IN_KERNEL
    static struct file *fw_dump_file;
#else
    static int    fw_dump_file;
#endif

static const struct btmtk_sdio_card_reg btmtk_reg_6630 = {
        .cfg = 0x03,
        .host_int_mask = 0x04,
        .host_intstatus = 0x05,
        .card_status = 0x20,
        .sq_read_base_addr_a0 = 0x10,
        .sq_read_base_addr_a1 = 0x11,
        .card_fw_status0 = 0x40,
        .card_fw_status1 = 0x41,
        .card_rx_len = 0x42,
        .card_rx_unit = 0x43,
        .io_port_0 = 0x00,
        .io_port_1 = 0x01,
        .io_port_2 = 0x02,
        .int_read_to_clear = false,
    .func_num = 2,
};

static const struct btmtk_sdio_card_reg btmtk_reg_6632 = {
        .cfg = 0x03,
        .host_int_mask = 0x04,
        .host_intstatus = 0x05,
        .card_status = 0x20,
        .sq_read_base_addr_a0 = 0x10,
        .sq_read_base_addr_a1 = 0x11,
        .card_fw_status0 = 0x40,
        .card_fw_status1 = 0x41,
        .card_rx_len = 0x42,
        .card_rx_unit = 0x43,
        .io_port_0 = 0x00,
        .io_port_1 = 0x01,
        .io_port_2 = 0x02,
        .int_read_to_clear = false,
    .func_num = 2,
};

static const struct btmtk_sdio_card_reg btmtk_reg_7668 = {
        .cfg = 0x03,
        .host_int_mask = 0x04,
        .host_intstatus = 0x05,
        .card_status = 0x20,
        .sq_read_base_addr_a0 = 0x10,
        .sq_read_base_addr_a1 = 0x11,
        .card_fw_status0 = 0x40,
        .card_fw_status1 = 0x41,
        .card_rx_len = 0x42,
        .card_rx_unit = 0x43,
        .io_port_0 = 0x00,
        .io_port_1 = 0x01,
        .io_port_2 = 0x02,
        .int_read_to_clear = false,
    .func_num = 2,
};

static const struct btmtk_sdio_card_reg btmtk_reg_7666 = {
        .cfg = 0x03,
        .host_int_mask = 0x04,
        .host_intstatus = 0x05,
        .card_status = 0x20,
        .sq_read_base_addr_a0 = 0x10,
        .sq_read_base_addr_a1 = 0x11,
        .card_fw_status0 = 0x40,
        .card_fw_status1 = 0x41,
        .card_rx_len = 0x42,
        .card_rx_unit = 0x43,
        .io_port_0 = 0x00,
        .io_port_1 = 0x01,
        .io_port_2 = 0x02,
        .int_read_to_clear = false,
    .func_num = 2,
};

static const struct btmtk_sdio_device btmtk_sdio_6630 = {
        .helper         = "mtmk/sd8688_helper.bin",
        .firmware       = "mt6632_patch_e1_hdr.bin",
        .reg            = &btmtk_reg_6630,
        .support_pscan_win_report = false,
        .sd_blksz_fw_dl = 64,
        .supports_fw_dump = false,
};

static const struct btmtk_sdio_device btmtk_sdio_6632 = {
        .helper         = "mtmk/sd8688_helper.bin",
        .firmware       = "mt6632_patch_e1_hdr.bin",
        .reg            = &btmtk_reg_6632,
        .support_pscan_win_report = false,
        .sd_blksz_fw_dl = 64,
        .supports_fw_dump = false,
};

static const struct btmtk_sdio_device btmtk_sdio_7668 = {
        .helper         = "mtmk/sd8688_helper.bin",
#if CFG_THREE_IN_ONE_FIRMWARE
        .firmware       = "MT7668_FW",
#else
        .firmware        = "mt7668_patch_e1_hdr.bin",
        .firmware1       = "mt7668_patch_e2_hdr.bin",
#endif
        .reg            = &btmtk_reg_7668,
        .support_pscan_win_report = false,
        .sd_blksz_fw_dl = 64,
        .supports_fw_dump = false,
};

static const struct btmtk_sdio_device btmtk_sdio_7666 = {
        .helper         = "mtmk/sd8688_helper.bin",
        .firmware       = "mt7668_patch_e1_hdr.bin",
        .reg            = &btmtk_reg_7666,
        .support_pscan_win_report = false,
        .sd_blksz_fw_dl = 64,
        .supports_fw_dump = false,
};


unsigned char *txbuf;
static unsigned char *rxbuf;
static u32 rx_length;
static struct btmtk_sdio_card *g_card;

/*
*add in /include/linux/mmc/sdio_ids.h
*/
#define SDIO_VENDOR_ID_MEDIATEK 0x037A

static const struct sdio_device_id btmtk_sdio_ids[] = {
        /* Mediatek SD8688 Bluetooth device */
        { SDIO_DEVICE(SDIO_VENDOR_ID_MEDIATEK, 0x6630),
                        .driver_data = (unsigned long) &btmtk_sdio_6630 },

    { SDIO_DEVICE(SDIO_VENDOR_ID_MEDIATEK, 0x6632),
                        .driver_data = (unsigned long) &btmtk_sdio_6632 },

    { SDIO_DEVICE(SDIO_VENDOR_ID_MEDIATEK, 0x7668),
                        .driver_data = (unsigned long) &btmtk_sdio_7668 },

    { SDIO_DEVICE(SDIO_VENDOR_ID_MEDIATEK, 0x7666),
                        .driver_data = (unsigned long) &btmtk_sdio_7666 },

        { }     /* Terminating entry */
};

MODULE_DEVICE_TABLE(sdio, btmtk_sdio_ids);


u32 lock_unsleepable_lock(P_OSAL_UNSLEEPABLE_LOCK pUSL)
{
    spin_lock_irqsave(&(pUSL->lock), pUSL->flag);
    return 0;
}

u32 unlock_unsleepable_lock(P_OSAL_UNSLEEPABLE_LOCK pUSL)
{
    spin_unlock_irqrestore(&(pUSL->lock), pUSL->flag);
    return 0;
}

static int btmtk_sdio_readb(u32 offset, u32 *val)
{
    u32 ret = 0;

    if (g_card->func == NULL) {
        BTMTK_ERR("%s g_card->func is NULL", __func__);
        return -EIO;
    }
    sdio_claim_host(g_card->func);
    *val = sdio_readb(g_card->func, offset, &ret);
    sdio_release_host(g_card->func);
    return ret;
}

static int btmtk_sdio_writel(u32 offset, u32 val)
{
    u32 ret = 0;

    if (g_card->func == NULL) {
        BTMTK_ERR("%s g_card->func is NULL", __func__);
        return -EIO;
    }
    sdio_claim_host(g_card->func);
    sdio_writel(g_card->func, val, offset, &ret);
    sdio_release_host(g_card->func);
    return ret;
}

static int btmtk_sdio_readl(u32 offset,  u32 *val)
{
    u32 ret = 0;

    if (g_card->func == NULL) {
        BTMTK_ERR("g_card->func is NULL");
        return -EIO;
    }
    sdio_claim_host(g_card->func);
    *val = sdio_readl(g_card->func, offset, &ret);
    sdio_release_host(g_card->func);
    return ret;
}
struct sk_buff *btmtk_create_send_data(struct sk_buff *skb)
{
    struct sk_buff *queue_skb = NULL;
    u32 sdio_header_len = skb->len + BTM_HEADER_LEN;

    if (skb_headroom(skb) < (BTM_HEADER_LEN)) {
        queue_skb = bt_skb_alloc(sdio_header_len, GFP_ATOMIC);
        if (queue_skb == NULL) {
                BTMTK_ERR("bt_skb_alloc fail return");
                return 0;
        }

        queue_skb->data[0] = (sdio_header_len & 0x0000ff);
        queue_skb->data[1] = (sdio_header_len & 0x00ff00) >> 8;
        queue_skb->data[2] = 0;
        queue_skb->data[3] = 0;
        queue_skb->data[4] = bt_cb(skb)->pkt_type;
        queue_skb->len = sdio_header_len;
        memcpy(&queue_skb->data[5], &skb->data[0], skb->len);
        kfree_skb(skb);
    } else {
        queue_skb = skb;
        skb_push(queue_skb, BTM_HEADER_LEN);
        queue_skb->data[0] = (sdio_header_len & 0x0000ff);
        queue_skb->data[1] = (sdio_header_len & 0x00ff00) >> 8;
        queue_skb->data[2] = 0;
        queue_skb->data[3] = 0;
        queue_skb->data[4] = bt_cb(skb)->pkt_type;
    }

    BTMTK_INFO("%s end", __func__);
    return queue_skb;
}
static int btmtk_sdio_set_own_back(int owntype)
{
    /*Set driver own*/
    int ret = 0;
    u32 u32LoopCount = 0;
    u32 u32ReadCRValue = 0;
    u32 ownValue = 0;
    u32 set_checkretry = 30;

    BTMTK_DBG("%s owntype %d", __func__, owntype);

    if(user_rmmod)
        set_checkretry = 1;

    ret = btmtk_sdio_readl(CHLPCR, &u32ReadCRValue);

    BTMTK_DBG("%s btmtk_sdio_readl  CHLPCR done", __func__);
    if (owntype == DRIVER_OWN) {
        if ((u32ReadCRValue&0x100) == 0x100) {
            BTMTK_DBG("%s already driver own 0x%0x, return\n", __func__, u32ReadCRValue);
            return ret;
        }

    } else if (owntype == FW_OWN) {
        if ((u32ReadCRValue&0x100) == 0) {
            BTMTK_DBG("%s already FW own 0x%0x, return\n", __func__, u32ReadCRValue);
            return ret;
        }

    }


setretry:

    if (owntype == DRIVER_OWN)
        ownValue = 0x00000200;
    else
        ownValue = 0x00000100;

    BTMTK_DBG("%s write CHLPCR 0x%x", __func__, ownValue);
    ret = btmtk_sdio_writel(CHLPCR, ownValue);
    if (ret) {
        ret = -EINVAL;
        goto done;
    }
    BTMTK_DBG("%s write CHLPCR 0x%x done", __func__, ownValue);

    u32LoopCount = 200;

    if (owntype == DRIVER_OWN) {
        do {
            udelay(1);
            ret = btmtk_sdio_readl(CHLPCR, &u32ReadCRValue);
            u32LoopCount--;
            BTMTK_DBG("%s DRIVER_OWN btmtk_sdio_readl CHLPCR 0x%x ", __func__, u32ReadCRValue);
        } while ((u32LoopCount > 0) && ((u32ReadCRValue&0x100) != 0x100));

        if ((u32LoopCount == 0) && (0x100 != (u32ReadCRValue&0x100)) && (set_checkretry > 0)) {
            BTMTK_WARN("%s retry set_check driver own, CHLPCR 0x%x", __func__,u32ReadCRValue);
            set_checkretry--;
            mdelay(20);
            goto setretry;
        }
    } else {
        do {
        udelay(1);
        ret = btmtk_sdio_readl(CHLPCR, &u32ReadCRValue);
        u32LoopCount--;
        BTMTK_DBG("%s FW_OWN btmtk_sdio_readl CHLPCR 0x%x ", __func__, u32ReadCRValue);
        } while ((u32LoopCount > 0) &&  ((u32ReadCRValue&0x100) != 0));

        if ((u32LoopCount == 0) && ((u32ReadCRValue&0x100) != 0) && (set_checkretry > 0)) {
            BTMTK_WARN("%s retry set_check FW own, CHLPCR 0x%x", __func__,u32ReadCRValue);
            set_checkretry--;
            goto setretry;
        }
    }

    BTMTK_DBG("%s CHLPCR(0x%x), is 0x%x\n", __func__, CHLPCR, u32ReadCRValue);

    if (owntype == DRIVER_OWN) {
        if ((u32ReadCRValue&0x100) == 0x100)
            BTMTK_DBG("%s check %04x, is 0x100 driver own success\n", __func__, CHLPCR);
        else {
                BTMTK_DBG("%s check %04x, is %x shuld be 0x100\n", __func__, CHLPCR, u32ReadCRValue);
                ret = EINVAL;
                goto done;
        }
    } else {
        if (0x0 == (u32ReadCRValue&0x100))
            BTMTK_DBG("%s check %04x, bit 8 is 0 FW own success\n", __func__, CHLPCR);
        else{
            BTMTK_DBG("%s bit 8 should be 0, %04x bit 8 is %04x\n", __func__, u32ReadCRValue, (u32ReadCRValue&0x100));
            ret = EINVAL;
            goto done;
        }
    }



done:

    if (owntype == DRIVER_OWN) {
        if (ret)
            BTMTK_ERR("%s set driver own fail\n", __func__);
        else
            BTMTK_DBG("%s set driver own success\n", __func__);
    } else if (owntype == FW_OWN) {
        if (ret)
            BTMTK_ERR("%s set FW own fail\n", __func__);
        else
            BTMTK_DBG("%s set FW own success\n", __func__);

    } else
        BTMTK_ERR("%s unknow type %d\n", __func__, owntype);


    return ret;
}
static int btmtk_sdio_enable_interrupt(int enable)
{
    u32 ret = 0;
    u32 cr_value = 0;

    if (enable)
        cr_value |= C_FW_INT_EN_SET;
    else
        cr_value |= C_FW_INT_EN_CLEAR;

    ret = btmtk_sdio_writel(CHLPCR, cr_value);
    BTMTK_DBG("%s enable %d write CHLPCR 0x%08x\n", __func__, enable, cr_value);

    return ret;
}

static int btmtk_sdio_get_rx_unit(struct btmtk_sdio_card *card)
{
        u8 reg;
        int ret;

        reg = sdio_readb(card->func, card->reg->card_rx_unit, &ret);
        if (!ret)
                card->rx_unit = reg;

        return ret;
}

static int btmtk_sdio_enable_host_int_mask(struct btmtk_sdio_card *card,
                                                                u8 mask)
{
        int ret;

        sdio_writeb(card->func, mask, card->reg->host_int_mask, &ret);
        if (ret) {
                BTMTK_ERR("Unable to enable the host interrupt!");
                ret = -EIO;
        }

        return ret;
}

static int btmtk_sdio_disable_host_int_mask(struct btmtk_sdio_card *card,
                                                                u8 mask)
{
        u8 host_int_mask;
        int ret;

        host_int_mask = sdio_readb(card->func, card->reg->host_int_mask, &ret);
        if (ret)
                return -EIO;

        host_int_mask &= ~mask;

        sdio_writeb(card->func, host_int_mask, card->reg->host_int_mask, &ret);
        if (ret < 0) {
                BTMTK_ERR("Unable to disable the host interrupt!");
                return -EIO;
        }

        return 0;
}

/*for debug*/
int btmtk_print_buffer_conent(u8 *buf, u32 Datalen)
{
    int i = 0;
    int print_finish = 0;
    /*Print out txbuf data for debug*/
    for (i = 0; i <= (Datalen-1); i += 16) {
        if ((i+16) <= Datalen) {
            BTMTK_DBG("%s: %02X%02X%02X%02X%02X %02X%02X%02X%02X%02X %02X%02X%02X%02X%02X %02X\n", __func__,
            buf[i], buf[i+1], buf[i+2], buf[i+3], buf[i+4],
            buf[i+5], buf[i+6], buf[i+7], buf[i+8], buf[i+9],
            buf[i+10], buf[i+11], buf[i+12], buf[i+13], buf[i+14],
            buf[i+15]);
        } else {
            for (; i < (Datalen); i++)
                BTMTK_DBG("%s: %02X\n", __func__, buf[i]);

            print_finish = 1;
        }

        if (print_finish)
            break;

    }
    return 0;
}

static int btmtk_sdio_send_tx_data(u8 *buffer, int tx_data_len)
{
    int ret = 0;
    u8 MultiBluckCount = 0;
    u8 redundant = 0;

    MultiBluckCount = tx_data_len/SDIO_BLOCK_SIZE;
    redundant = tx_data_len % SDIO_BLOCK_SIZE;

    if (redundant)
        tx_data_len = (MultiBluckCount+1)*SDIO_BLOCK_SIZE;

    sdio_claim_host(g_card->func);
    ret = sdio_writesb(g_card->func, CTDR, buffer, tx_data_len);
    sdio_release_host(g_card->func);

    return ret;
}

static int btmtk_sdio_recv_rx_data(void)
{
    int ret = 0;
    u32 u32ReadCRValue = 0;
    int retry_count = 5;
    u32 sdio_header_length = 0;
    memset(rxbuf, 0, MTK_RXDATA_SIZE);

    do {
        ret = btmtk_sdio_readl(CHISR, &u32ReadCRValue);
        BTMTK_DBG("%s: loop Get CHISR 0x%08X\n", __func__, u32ReadCRValue);
        rx_length = (u32ReadCRValue & RX_PKT_LEN) >> 16;
        if (rx_length == 0xFFFF) {
            BTMTK_WARN("%s: 0xFFFF==rx_length, error return -EIO\n", __func__);
            ret = -EIO;
            break;
        }

        if ((RX_DONE&u32ReadCRValue) && rx_length) {
            BTMTK_DBG("%s: u32ReadCRValue = %08X\n", __func__, u32ReadCRValue);
            u32ReadCRValue &= 0xFFFB;
            ret = btmtk_sdio_writel(CHISR, u32ReadCRValue);
            BTMTK_DBG("%s: write = %08X\n", __func__, u32ReadCRValue);


            sdio_claim_host(g_card->func);
            ret = sdio_readsb(g_card->func, rxbuf, CRDR, rx_length);
            sdio_release_host(g_card->func);
            sdio_header_length = (rxbuf[1] << 8);
            sdio_header_length |= rxbuf[0];

            if(sdio_header_length != rx_length){
                BTMTK_ERR("%s sdio header length %d, rx_length %d mismatch",__func__,sdio_header_length,rx_length);
                break;
            }

            if (sdio_header_length == 0) {
                BTMTK_WARN("%s: get sdio_header_length = %d\n", __func__, sdio_header_length);
                continue;
            }


            break;
        }


        retry_count--;
        if (retry_count <= 0) {
            BTMTK_WARN("%s: retry_count = %d,timeout\n", __func__, retry_count);
            ret = -EIO;
            break;
        }

/*
* msleep(1);
*/
        mdelay(3);
        BTMTK_DBG("%s: retry_count = %d,wait\n", __func__, retry_count);

        if (ret)
            break;

    } while (1);



    if (ret)
        return -EIO;





    return ret;
}

static int btmtk_sdio_send_wmt_reset(void)
{
    int ret = 0;
    u8 wmt_event[8] = {4, 0xE4, 5, 2, 7, 1, 0, 0};
    u8 mtksdio_packet_header[MTK_SDIO_PACKET_HEADER_SIZE] = {0};
    u8 mtksdio_wmt_reset[9] = {1, 0x6F, 0xFC, 5, 1, 7, 1, 0, 4};

    BTMTK_INFO("%s:\n", __func__);
    mtksdio_packet_header[0] = sizeof(mtksdio_packet_header) + sizeof(mtksdio_wmt_reset);

    memcpy(txbuf, mtksdio_packet_header, MTK_SDIO_PACKET_HEADER_SIZE);
    memcpy(txbuf+MTK_SDIO_PACKET_HEADER_SIZE, mtksdio_wmt_reset, sizeof(mtksdio_wmt_reset));

    btmtk_sdio_send_tx_data(txbuf, MTK_SDIO_PACKET_HEADER_SIZE+sizeof(mtksdio_wmt_reset));
    btmtk_sdio_recv_rx_data();

    /*compare rx data is wmt reset correct response or not*/
    if (memcmp(wmt_event, rxbuf+MTK_SDIO_PACKET_HEADER_SIZE, sizeof(wmt_event)) != 0) {
        ret = -EIO;
        BTMTK_WARN("%s: fail\n", __func__);
    }

    return ret;
}

static u32 btmtk_sdio_bt_memRegister_read(u32 cr)
{
	int retrytime = 300;
	u32 result = 0;
	u8 wmt_event[15] = {0x04,0xE4,0x10,0x02,0x08,0x0C/*0x1C*/,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80 };
	//msleep(1000);
	u8 mtksdio_packet_header[MTK_SDIO_PACKET_HEADER_SIZE] = {0};
	u8 mtksdio_wmt_cmd[16] = {0x1,0x6F,0xFC,0x0C,0x01,0x08,0x08,0x00,0x02,0x01,0x00,0x01,0x00,0x00,0x00,0x00};
	mtksdio_packet_header[0] = sizeof(mtksdio_packet_header) + sizeof(mtksdio_wmt_cmd);
        BTMTK_INFO("%s: read cr %x\n",__func__,cr);

        memcpy(&mtksdio_wmt_cmd[12],&cr,sizeof(cr));

	memcpy(txbuf,mtksdio_packet_header,MTK_SDIO_PACKET_HEADER_SIZE);
	memcpy(txbuf+MTK_SDIO_PACKET_HEADER_SIZE,mtksdio_wmt_cmd,sizeof(mtksdio_wmt_cmd));

	btmtk_sdio_send_tx_data(txbuf,MTK_SDIO_PACKET_HEADER_SIZE+sizeof(mtksdio_wmt_cmd));
	btmtk_print_buffer_conent(txbuf,MTK_SDIO_PACKET_HEADER_SIZE+sizeof(mtksdio_wmt_cmd));

        do{
            msleep(10);
	    btmtk_sdio_recv_rx_data();
            retrytime--;
		if(retrytime<=0)
			break;

		BTMTK_INFO("%s: retrytime %d\n",__func__,retrytime);
	}while(!rxbuf[0]);

	btmtk_print_buffer_conent(rxbuf,rx_length);
	/*compare rx data is wmt reset correct response or not*/
	/*if(0!=memcmp(wmt_event,rxbuf+MTK_SDIO_PACKET_HEADER_SIZE,sizeof(wmt_event))){
		ret = -EIO;
		BTMTK_INFO("%s: fail\n",__func__);
	}*/

	memcpy(&result,rxbuf+MTK_SDIO_PACKET_HEADER_SIZE+sizeof(wmt_event),sizeof(result));
        BTMTK_INFO("%s: ger cr 0x%x value 0x%x\n",__func__,cr,result);
	return result;
}

/*
*1:on ,  0:off
*/
static int btmtk_sdio_bt_set_power(u8 onoff)
{
    int ret = 0;
    int retrytime = 60;
    u8 wmt_event[8] = {4, 0xE4, 5, 2, 6, 1, 0, 0};
    u8 mtksdio_packet_header[MTK_SDIO_PACKET_HEADER_SIZE] = {0};
    u8 mtksdio_wmt_cmd[10] = {1, 0x6F, 0xFC, 6, 1, 6, 2, 0, 0, 1};
    if (onoff==0)
        retrytime = 3;

    mtksdio_packet_header[0] = sizeof(mtksdio_packet_header) + sizeof(mtksdio_wmt_cmd);
    BTMTK_INFO("%s: onoff %d\n", __func__, onoff);

    mtksdio_wmt_cmd[9] = onoff;

    memcpy(txbuf, mtksdio_packet_header, MTK_SDIO_PACKET_HEADER_SIZE);
    memcpy(txbuf+MTK_SDIO_PACKET_HEADER_SIZE, mtksdio_wmt_cmd, sizeof(mtksdio_wmt_cmd));

    btmtk_sdio_send_tx_data(txbuf, MTK_SDIO_PACKET_HEADER_SIZE+sizeof(mtksdio_wmt_cmd));


    do {
        msleep(100);
        btmtk_sdio_recv_rx_data();
        retrytime--;
        if (retrytime <= 0)
            break;

        if (retrytime < 40)
            BTMTK_WARN("%s: retry over 2s, retrytime %d\n", __func__, retrytime);

        BTMTK_INFO("%s: retrytime %d\n", __func__, retrytime);
    } while (!rxbuf[0]);


    /*compare rx data is wmt reset correct response or not*/
    if (memcmp(wmt_event, rxbuf+MTK_SDIO_PACKET_HEADER_SIZE, sizeof(wmt_event)) != 0) {
        ret = -EIO;
        BTMTK_INFO("%s: fail\n", __func__);
    }

    return ret;
}
/*
* 1:on ,  0:off
*/
static int btmtk_sdio_set_sleep(void)
{
    int ret = 0;
    u8 wmt_event[8] = {4, 0xE, 4, 1, 0x7A, 0xFC, 0};
    u8 mtksdio_packet_header[MTK_SDIO_PACKET_HEADER_SIZE] = {0};
    u8 mtksdio_wmt_cmd[11] = {1, 0x7A, 0xFC, 7, /*3:sdio, 5:usb*/03,
    /*host non sleep duration*/0x80, 0x02, /*host non sleep duration*/0x80, 0x02, 0x0, 0x00};

    mtksdio_packet_header[0] = sizeof(mtksdio_packet_header) + sizeof(mtksdio_wmt_cmd);
    BTMTK_INFO("%s begin\n", __func__);

    memcpy(txbuf, mtksdio_packet_header, MTK_SDIO_PACKET_HEADER_SIZE);
    memcpy(txbuf+MTK_SDIO_PACKET_HEADER_SIZE, mtksdio_wmt_cmd, sizeof(mtksdio_wmt_cmd));

    btmtk_sdio_send_tx_data(txbuf, MTK_SDIO_PACKET_HEADER_SIZE+sizeof(mtksdio_wmt_cmd));
    btmtk_sdio_recv_rx_data();
    btmtk_print_buffer_conent(rxbuf, rx_length);
    /*compare rx data is wmt reset correct response or not*/
    if (memcmp(wmt_event, rxbuf+MTK_SDIO_PACKET_HEADER_SIZE, sizeof(wmt_event)) != 0) {
        ret = -EIO;
        BTMTK_INFO("%s: fail\n", __func__);
    }

    return ret;
}

static int btmtk_send_rom_patch(u8 *fwbuf, u32 fwlen, int mode)
{
    int ret = 0;
    u8 mtksdio_packet_header[MTK_SDIO_PACKET_HEADER_SIZE] = {0};
    int stp_len = 0;
    u8 mtkdata_header[MTKDATA_HEADER_SIZE] = {0};

    int copy_len = 0;
    int Datalen = fwlen;
    u32 u32ReadCRValue = 0;


    BTMTK_DBG("%s fwlen %d, mode = %d", __func__, fwlen, mode);
    if (fwlen < Datalen) {
        BTMTK_ERR("%s file size = %d,is not corect", __func__, fwlen);
        return -ENOENT;
    }

    stp_len = Datalen + MTKDATA_HEADER_SIZE;


    mtkdata_header[0] = 0x2;/*ACL data*/
    mtkdata_header[1] = 0x6F;
    mtkdata_header[2] = 0xFC;

    mtkdata_header[3] = ((Datalen+4+1)&0x00FF);
    mtkdata_header[4] = ((Datalen+4+1)&0xFF00)>>8;

    mtkdata_header[5] = 0x1;
    mtkdata_header[6] = 0x1;

    mtkdata_header[7] = ((Datalen+1)&0x00FF);
    mtkdata_header[8] = ((Datalen+1)&0xFF00)>>8;

    mtkdata_header[9] = mode;

/*
* 0 and 1 is packet length, include MTKSTP_HEADER_SIZE
*/
    mtksdio_packet_header[0] = (Datalen+4+MTKSTP_HEADER_SIZE+6)&0xFF;
    mtksdio_packet_header[1] = ((Datalen+4+MTKSTP_HEADER_SIZE+6)&0xFF00)>>8;
    mtksdio_packet_header[2] = 0;
    mtksdio_packet_header[3] = 0;

/*
*mtksdio_packet_header[2] and mtksdio_packet_header[3] are reserved
*/
    BTMTK_DBG("%s result %02x  %02x\n", __func__
    , ((Datalen+4+MTKSTP_HEADER_SIZE+6)&0xFF00)>>8
    , (Datalen+4+MTKSTP_HEADER_SIZE+6));

    memcpy(txbuf+copy_len, mtksdio_packet_header, MTK_SDIO_PACKET_HEADER_SIZE);
    copy_len += MTK_SDIO_PACKET_HEADER_SIZE;

    memcpy(txbuf+copy_len, mtkdata_header, MTKDATA_HEADER_SIZE);
    copy_len += MTKDATA_HEADER_SIZE;



    memcpy(txbuf+copy_len, fwbuf, Datalen);
    copy_len += Datalen;

    BTMTK_DBG("%s txbuf %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\n", __func__,
    txbuf[0], txbuf[1], txbuf[2], txbuf[3], txbuf[4],
    txbuf[5], txbuf[6], txbuf[7], txbuf[8], txbuf[9]);


    ret = btmtk_sdio_readl(CHIER, &u32ReadCRValue);
    BTMTK_DBG("%s: CHIER u32ReadCRValue %x, ret %d\n", __func__, u32ReadCRValue, ret);

    ret = btmtk_sdio_readl(CHLPCR, &u32ReadCRValue);
    BTMTK_DBG("%s: CHLPCR u32ReadCRValue %x, ret %d\n", __func__, u32ReadCRValue, ret);

    ret = btmtk_sdio_readl(CHISR, &u32ReadCRValue);
    BTMTK_DBG("%s: 0CHISR u32ReadCRValue %x, ret %d\n", __func__, u32ReadCRValue, ret);
    ret = btmtk_sdio_readl(CHISR, &u32ReadCRValue);
    BTMTK_DBG("%s: 00CHISR u32ReadCRValue %x, ret %d\n", __func__, u32ReadCRValue, ret);

    btmtk_sdio_send_tx_data(txbuf, copy_len);


    ret = btmtk_sdio_recv_rx_data();

    return ret;
}



/*
* type: cmd:1, ACL:2
* -------------------------------------------------
* mtksdio hedaer 4 byte| wmt header  |
*
*
* data len should less than 512-4-4
*/
static int btmtk_sdio_send_wohci(u8 type, u32 len, u8 *data)
{
    u32 ret = 0;
    u32 push_in_data_len = 0;
    u8 mtk_wmt_header[MTKWMT_HEADER_SIZE] = {0};
    u8 mtksdio_packet_header[MTK_SDIO_PACKET_HEADER_SIZE] = {0};
    u8 mtk_tx_data[512] = {0};

    mtk_wmt_header[0] = type;
    mtk_wmt_header[1] = 0x6F;
    mtk_wmt_header[2] = 0xFC;
    mtk_wmt_header[3] = len;

    mtksdio_packet_header[0] = (len+MTKWMT_HEADER_SIZE+MTK_SDIO_PACKET_HEADER_SIZE)&0xFF;
    mtksdio_packet_header[1] = ((len+MTKWMT_HEADER_SIZE+MTK_SDIO_PACKET_HEADER_SIZE)&0xFF00)>>8;
    mtksdio_packet_header[2] = 0;
    mtksdio_packet_header[3] = 0;
/*
* mtksdio_packet_header[2] and mtksdio_packet_header[3] are reserved
*/

    memcpy(mtk_tx_data, mtksdio_packet_header, sizeof(mtksdio_packet_header));
    push_in_data_len += sizeof(mtksdio_packet_header);

    memcpy(mtk_tx_data+push_in_data_len, mtk_wmt_header, sizeof(mtk_wmt_header));
    push_in_data_len += sizeof(mtk_wmt_header);

    memcpy(mtk_tx_data+push_in_data_len, data, len);
    push_in_data_len += len;

    sdio_claim_host(g_card->func);
    ret = sdio_writesb(g_card->func, CTDR, mtk_tx_data, push_in_data_len);
    sdio_release_host(g_card->func);


    BTMTK_INFO("%s retrun  0x%0x\n", __func__, ret);
    return ret;
}
/*
* data event:
* return
* 0:
* patch download is not complete/get patch semaphore fail
* 1:
* patch download is complete by others
* 2
* patch download is not coplete
* 3:(for debug)
* release patch semaphore success
*/
static int btmtk_sdio_need_load_rom_patch(void)
{
    u32 ret = 0;
    u8 cmd[] = {0x1, 0x17, 0x1, 0x0, 0x1};
    u8 event[] = {0x2, 0x17, 0x1, 0x0};

    do {
        ret = btmtk_sdio_send_wohci(HCI_COMMAND_PKT, sizeof(cmd), cmd);

        if (ret) {
            BTMTK_ERR("%s btmtk_sdio_send_wohci return fail ret %d", __func__, ret);
            break;
        }

        ret = btmtk_sdio_recv_rx_data();
        if (ret)
            break;

        if (rx_length == 12) {
            if (memcmp(rxbuf+7, event, sizeof(event)) == 0)
                return rxbuf[11];
            else{
                BTMTK_ERR("%s receive event content is not correct, print receive data\n", __func__);
                btmtk_print_buffer_conent(rxbuf, rx_length);
            }
        }

    } while (0);

    return ret;
}
static int btmtk_sdio_set_write_clear(void)
{
    u32 u32ReadCRValue = 0;
    u32 ret = 0;

    ret = btmtk_sdio_readl(CHCR, &u32ReadCRValue);
    if (ret) {
       BTMTK_ERR("%s read CHCR error\n", __func__);
       ret = EINVAL;
       return ret;
    }

    u32ReadCRValue |= 0x00000002;
    btmtk_sdio_writel(CHCR, u32ReadCRValue);
    BTMTK_INFO("%s write CHCR 0x%08X\n", __func__, u32ReadCRValue);
    ret = btmtk_sdio_readl(CHCR, &u32ReadCRValue);
    BTMTK_INFO("%s read CHCR 0x%08X\n", __func__, u32ReadCRValue);
    if (u32ReadCRValue&0x00000002)
       BTMTK_INFO("%s write clear\n", __func__);
    else
       BTMTK_INFO("%s read clear\n", __func__);


    return ret;
}
static int btmtk_sdio_download_rom_patch(struct btmtk_sdio_card *card)
{
        const struct firmware *fw_firmware = NULL;
        const u8 *firmware = NULL;
        int firmwarelen, ret = 0;
        void *tmpfwbuf = NULL;
        u8 *fwbuf;
        P_PATCH_HEADER patchHdr;
        u8 *cDateTime = NULL;
        u16 u2HwVer = 0;
        u16 u2SwVer = 0;
        u32 u4PatchVer = 0;
        u32 uhwversion = 0;

        u32 u32ReadCRValue = 0;

        int RedundantSize = 0;
        u32 bufferOffset = 0;
        u8  patch_status = 0;

        ret = btmtk_sdio_set_own_back(DRIVER_OWN);

        if (ret)
            return ret;

        patch_status = btmtk_sdio_need_load_rom_patch();

        BTMTK_DBG("%s patch_status %d\n", __func__, patch_status);

        if (PATCH_IS_DOWNLOAD_BT_OTHER == patch_status || PATCH_READY == patch_status) {
            BTMTK_INFO("%s patch is ready no need load patch again\n", __func__);

            ret = btmtk_sdio_readl(0, &u32ReadCRValue);
            BTMTK_INFO("%s read chipid =  %x\n", __func__, u32ReadCRValue);

            /*Set interrupt output*/
            ret = btmtk_sdio_writel(CHIER, FIRMWARE_INT|TX_FIFO_OVERFLOW |
                FW_INT_IND_INDICATOR | TX_COMPLETE_COUNT |
                TX_UNDER_THOLD | TX_EMPTY | RX_DONE);

            if (ret) {
                BTMTK_ERR("Set interrupt output fail(%d)\n", ret);
                ret = -EIO;
            }


            /*enable interrupt output*/
            ret = btmtk_sdio_writel(CHLPCR, C_FW_INT_EN_SET);



            if (ret) {
                BTMTK_ERR("enable interrupt output fail(%d)\n", ret);
                ret = -EIO;
                        goto done;
            }

            ret = btmtk_sdio_bt_set_power(1);
            if (ret)
                return ret;

            ret = btmtk_sdio_set_sleep();
        btmtk_sdio_set_write_clear();
            return ret;
        }

        uhwversion = btmtk_sdio_bt_memRegister_read(HW_VERSION);
        BTMTK_INFO("%s uhwversion 0x%x\n",__func__,uhwversion);

        if (uhwversion == 0x8A00){
            BTMTK_INFO("%s request_firmware(firmware name %s)\n",__func__,card->firmware);
	    ret = request_firmware(&fw_firmware, card->firmware,
                                                        &card->func->dev);

            if ((ret < 0) || !fw_firmware) {
                BTMTK_ERR("request_firmware(firmware name %s) failed, error code = %d",
                                                                        card->firmware,
									ret);
                ret = -ENOENT;
                goto done;
            }
        }
        else {
            BTMTK_INFO("%s request_firmware(firmware name %s)\n",__func__,card->firmware1);
	    ret = request_firmware(&fw_firmware, card->firmware1,
                                                        &card->func->dev);

            if ((ret < 0) || !fw_firmware) {
                BTMTK_ERR("request_firmware(firmware name %s) failed, error code = %d",
                                                                        card->firmware1,
									ret);
                ret = -ENOENT;
                goto done;
            }
     	}


        firmware = fw_firmware->data;
        firmwarelen = fw_firmware->size;

        BTMTK_DBG("Downloading FW image (%d bytes)", firmwarelen);

        tmpfwbuf = kzalloc(firmwarelen, GFP_KERNEL);

        if (!tmpfwbuf) {
                    BTMTK_ERR("%s Unable to allocate buffer for firmware. Terminating download"
                    , __func__);
                    ret = -ENOMEM;
                    goto done;
        }

        /* Ensure aligned firmware buffer */
        memcpy(tmpfwbuf, firmware, firmwarelen);
        fwbuf = tmpfwbuf;

        /*Display rom patch info*/
        patchHdr =  (P_PATCH_HEADER)fwbuf;
        cDateTime = patchHdr->ucDateTime;
        u2HwVer = patchHdr->u2HwVer;
        u2SwVer = patchHdr->u2SwVer;
        u4PatchVer = patchHdr->u4PatchVer;

        BTMTK_DBG("=====================================\n");
        BTMTK_INFO("===============Patch Info============\n");
        BTMTK_INFO("Built Time = %s\n", cDateTime);
        BTMTK_INFO("Hw Ver = 0x%x\n",
                  ((u2HwVer & 0x00ff) << 8) | ((u2HwVer & 0xff00) >> 8));
        BTMTK_INFO("Sw Ver = 0x%x\n",
                  ((u2SwVer & 0x00ff) << 8) | ((u2SwVer & 0xff00) >> 8));
        BTMTK_INFO("Patch Ver = 0x%04x\n",
                  ((u4PatchVer & 0xff000000) >> 24) | ((u4PatchVer & 0x00ff0000) >>
                                   16));
        BTMTK_INFO("Platform = %c%c%c%c\n", patchHdr->ucPlatform[0],
                  patchHdr->ucPlatform[1], patchHdr->ucPlatform[2], patchHdr->ucPlatform[3]);
        BTMTK_INFO("Patch start addr = %02x\n", patchHdr->u2PatchStartAddr);
        BTMTK_INFO("=====================================\n");


        fwbuf += sizeof(PATCH_HEADER);
        BTMTK_DBG("%s PATCH_HEADER size %zd\n", __func__, sizeof(PATCH_HEADER));
        firmwarelen -= sizeof(PATCH_HEADER);



        ret = btmtk_sdio_readl(0, &u32ReadCRValue);
        BTMTK_INFO("%s read chipid =  %x\n", __func__, u32ReadCRValue);

        /*Set interrupt output*/
        ret = btmtk_sdio_writel(CHIER, FIRMWARE_INT|TX_FIFO_OVERFLOW |
            FW_INT_IND_INDICATOR | TX_COMPLETE_COUNT |
            TX_UNDER_THOLD | TX_EMPTY | RX_DONE);

        if (ret) {
            BTMTK_ERR("Set interrupt output fail(%d)\n", ret);
            ret = -EIO;
                    goto done;
        }

        /*enable interrupt output*/
        ret = btmtk_sdio_writel(CHLPCR, C_FW_INT_EN_SET);



        if (ret) {
            BTMTK_ERR("enable interrupt output fail(%d)\n", ret);
            ret = -EIO;
                    goto done;
        }

        RedundantSize = firmwarelen;
        BTMTK_DBG("%s firmwarelen %d\n", __func__, firmwarelen);


        do {
            bufferOffset = firmwarelen - RedundantSize;

            if (RedundantSize == firmwarelen && PATCH_DOWNLOAD_SIZE <= RedundantSize)
                ret = btmtk_send_rom_patch(fwbuf+bufferOffset, PATCH_DOWNLOAD_SIZE, SDIO_PATCH_DOWNLOAD_FIRST);
            else if (RedundantSize == firmwarelen)
                ret = btmtk_send_rom_patch(fwbuf+bufferOffset, RedundantSize, SDIO_PATCH_DOWNLOAD_FIRST);
            else if (RedundantSize < PATCH_DOWNLOAD_SIZE) {
                ret = btmtk_send_rom_patch(fwbuf+bufferOffset, RedundantSize, SDIO_PATCH_DOWNLOAD_END);
                BTMTK_DBG("%s patch downoad last patch part\n", __func__);
            } else
                ret = btmtk_send_rom_patch(fwbuf+bufferOffset, PATCH_DOWNLOAD_SIZE, SDIO_PATCH_DOWNLOAD_CON);

            RedundantSize -= PATCH_DOWNLOAD_SIZE;

            if (ret) {
                BTMTK_ERR("%s btmtk_send_rom_patch fail\n", __func__);
                goto done;
            }
            BTMTK_DBG("%s RedundantSize %d", __func__, RedundantSize);
            if (RedundantSize <= 0) {
                BTMTK_DBG("%s patch downoad finish\n", __func__);
                break;
            }

        } while (1);

        btmtk_sdio_set_write_clear();


        if (btmtk_sdio_need_load_rom_patch() == PATCH_READY)
            BTMTK_INFO("%s patch is ready\n", __func__);


        ret = btmtk_sdio_send_wmt_reset();

        if (ret)
            goto done;


        ret = btmtk_sdio_bt_set_power(1);

        if (ret){
            ret = EINVAL;
            goto done;
        }

        ret = btmtk_sdio_set_sleep();


done:

        kfree(tmpfwbuf);
            release_firmware(fw_firmware);




        if (!ret)
            BTMTK_INFO("%s success\n", __func__);
        else
            BTMTK_INFO("%s fail\n", __func__);


        return ret;
}


static int btmtk_sdio_card_to_host(struct btmtk_private *priv)
{
        u16 buf_len = 0;
        int ret = 0, num_blocks = 0, blksz = 0;
        struct sk_buff *skb = NULL;
        struct sk_buff *fops_skb = NULL;
        u32 type;
        u8 *payload = NULL;
        u32 fourbalignment_len = 0;
        struct btmtk_sdio_card *card = priv->btmtk_dev.card;
        u32 dump_len = 0;
        char *core_dump_end = NULL;

        if (!card || !card->func) {
                BTMTK_ERR("card or function or is NULL!");
                ret = -EINVAL;
                goto exit;
        }

#if SUPPORT_FW_DUMP
    fw_is_coredump_end_packet = false;
    if (rx_length > (SDIO_HEADER_LEN+8)) {
        if (rxbuf[SDIO_HEADER_LEN] == 0x80) {
            dump_len = (rxbuf[SDIO_HEADER_LEN+1]&0x0F)*256 + rxbuf[SDIO_HEADER_LEN+2];
            BTMTK_WARN("%s get dump length %d", __func__, dump_len);
            if (rxbuf[SDIO_HEADER_LEN+5] == 0x6F && rxbuf[SDIO_HEADER_LEN+6] == 0xFC) {

                fw_is_doing_coredump = true;

                #if SAVE_FW_DUMP_IN_KERNEL
                if ((fw_dump_total_read_size == 0) && (fw_dump_file == NULL)) {
                    if(current_fwdump_file_number == probe_counter)
                        goto FW_DONE;
                //#if SAVE_FW_DUMP_IN_KERNEL
                    memset(fw_dump_file_name, 0, sizeof(fw_dump_file_name));
                    snprintf(fw_dump_file_name, sizeof(fw_dump_file_name),
                            FW_DUMP_FILE_NAME"_%d", probe_counter);
                    BTMTK_WARN("%s : open file %s\n", __func__, fw_dump_file_name);
                    fw_dump_file = filp_open(fw_dump_file_name, O_RDWR | O_CREAT, 0644);
                    if (fw_dump_file){
                        current_fwdump_file_number =  probe_counter;
                        BTMTK_WARN("%s : open file %s success\n", __func__, fw_dump_file_name);
                    }
                    else
                        BTMTK_WARN("%s : open file %s fail\n", __func__, fw_dump_file_name);
                //#endif

                }
                #endif
                fw_dump_total_read_size += dump_len;

                #if SAVE_FW_DUMP_IN_KERNEL
                if (fw_dump_file->f_op == NULL)
                    BTMTK_WARN("%s : fw_dump_file->f_op is NULL\n", __func__);

                if (fw_dump_file->f_op->write == NULL)
                    BTMTK_WARN("%s : fw_dump_file->f_op->write is NULL\n", __func__);


                if ((dump_len > 0) && fw_dump_file)
                    fw_dump_file->f_op->write(fw_dump_file, &rxbuf[SDIO_HEADER_LEN+10], dump_len, &fw_dump_file->f_pos);

                #endif

                if (dump_len >= sizeof(FW_DUMP_END_EVENT)) {
                    core_dump_end = strstr(&rxbuf[SDIO_HEADER_LEN+10], FW_DUMP_END_EVENT);
                    BTMTK_WARN("%s : core_dump_end %d\n", __func__, SDIO_HEADER_LEN);
                    if (core_dump_end) {
                        BTMTK_INFO("%s  vfs_fsync ", __func__);

                        #if SAVE_FW_DUMP_IN_KERNEL
                        if(fw_dump_file)
                            vfs_fsync(fw_dump_file, 0);
                        #endif

                        if (fw_dump_file) {
                            BTMTK_INFO("%s : close file  %s\n", __func__, fw_dump_file_name);
                            #if SAVE_FW_DUMP_IN_KERNEL
                            filp_close(fw_dump_file, NULL);
                            //#endif
                            fw_dump_file = NULL;
                            #endif
                            fw_is_doing_coredump = false;
                            fw_is_coredump_end_packet = true;
                        } else{
                            fw_is_doing_coredump = false;
                            BTMTK_INFO("%s : fw_dump_file is NULL can't close file %s", __func__, fw_dump_file_name);
                        }
                    }

                }

            }

        }
    }
#endif

#if SAVE_FW_DUMP_IN_KERNEL
FW_DONE:
#endif

        type = rxbuf[MTK_SDIO_PACKET_HEADER_SIZE];


        btmtk_print_buffer_conent(rxbuf, rx_length);

        /* Read the length of data to be transferred , not include pkt type*/
        buf_len = rx_length-(MTK_SDIO_PACKET_HEADER_SIZE+1);


        BTMTK_DBG("buf_len : %d", buf_len);
        if (rx_length <= SDIO_HEADER_LEN) {
                BTMTK_WARN("invalid packet length: %d", buf_len);
                ret = -EINVAL;
                goto exit;
        }

        /* Allocate buffer */
        skb = bt_skb_alloc(rx_length/*num_blocks * blksz + BTSDIO_DMA_ALIGN*/, GFP_ATOMIC);
        if (skb == NULL) {
                BTMTK_WARN("No free skb");
                ret = -ENOMEM;
                goto exit;
        }

        payload = rxbuf;
        BTMTK_DBG("%s rx_length %d,buf_len %d", __func__, rx_length, buf_len);

        memcpy(skb->data, &rxbuf[MTK_SDIO_PACKET_HEADER_SIZE+1], buf_len);

        switch (type) {
        case HCI_ACLDATA_PKT:
                BTMTK_DBG("%s data[2] 0x%02x, data[3] 0x%02x\n", __func__, skb->data[2], skb->data[3]);
                buf_len = skb->data[2] + skb->data[3]*256 + 4;
                BTMTK_DBG("%s acl buf_len %d\n", __func__, buf_len);
                break;
        case HCI_SCODATA_PKT:
                buf_len = skb->data[3] + 3;
                break;
        case HCI_EVENT_PKT:
                buf_len = skb->data[1] + 2;
                break;
        }

        lock_unsleepable_lock(&(metabuffer.spin_lock));
        if (priv->adapter->fops_mode & (!fw_is_doing_coredump) & (!fw_is_coredump_end_packet)) {
            fops_skb = bt_skb_alloc(buf_len, GFP_ATOMIC);
            bt_cb(fops_skb)->pkt_type = type;
            memcpy(fops_skb->data, skb->data, buf_len);
            fops_skb->len = buf_len;
            skb_queue_tail(&g_priv->adapter->fops_queue, fops_skb);
            BTMTK_DBG("%s push fops_queue\n", __func__);
            if (skb_queue_empty(&g_priv->adapter->fops_queue))
                BTMTK_INFO("%s fops_queue is empty\n", __func__);

            kfree_skb(skb);
            unlock_unsleepable_lock(&(metabuffer.spin_lock));
            BTMTK_DBG("%s call inq wake up\n", __func__);
            wake_up_interruptible(&inq);
            goto exit;
        }
        unlock_unsleepable_lock(&(metabuffer.spin_lock));

        switch (type) {
        case HCI_ACLDATA_PKT:
        case HCI_SCODATA_PKT:
        case HCI_EVENT_PKT:
                bt_cb(skb)->pkt_type = type;

                skb_put(skb, buf_len);

                break;

        case MTK_VENDOR_PKT:
                BTMTK_WARN("%s, MTK_VENDOR_PKT no handle now, break\n", __func__);
                kfree_skb(skb);
                break;

                bt_cb(skb)->pkt_type = HCI_VENDOR_PKT;
                skb_put(skb, buf_len);
                skb_pull(skb, SDIO_HEADER_LEN);


/*
* if kernel < 3, 11, 0, should use hci_recv_frame(skb);
*/

                break;

        default:
                BTMTK_WARN("Unknown packet type:%d", type);
                BTMTK_WARN("hex: %*ph", blksz * num_blocks, payload);

                kfree_skb(skb);
                skb = NULL;
                break;
        }

exit:
        if (ret) {
                BTMTK_DBG("%s fail free skb\n", __func__);
                kfree_skb(skb);
        }


        buf_len += 1;
        if (buf_len%4)
            fourbalignment_len = buf_len + 4 - buf_len%4;
        else
            fourbalignment_len = buf_len;

        rx_length -= fourbalignment_len;

        if (rx_length > (MTK_SDIO_PACKET_HEADER_SIZE)) {
            memcpy(&rxbuf[MTK_SDIO_PACKET_HEADER_SIZE],
            &rxbuf[MTK_SDIO_PACKET_HEADER_SIZE+fourbalignment_len],
            rx_length-MTK_SDIO_PACKET_HEADER_SIZE);
        }

        BTMTK_DBG("%s ret %d, rx_length, %d,fourbalignment_len %d <--\n", __func__, ret, rx_length, fourbalignment_len);

        return ret;
}

static int btmtk_sdio_process_int_status(struct btmtk_private *priv)
{
        int ret = 0;
        u32 u32rxdatacount = 0;
        u32 u32ReadCRValue = 0;

        ret = btmtk_sdio_readl(CHISR, &u32ReadCRValue);
        BTMTK_DBG("%s check TX_EMPTY CHISR 0x%08x\n", __func__, u32ReadCRValue);
        if (TX_EMPTY&u32ReadCRValue) {
            ret = btmtk_sdio_writel(CHISR, (TX_EMPTY | TX_COMPLETE_COUNT));
            priv->btmtk_dev.tx_dnld_rdy = true;
            BTMTK_DBG("%s set tx_dnld_rdy 1\n", __func__);
        }

        if (RX_DONE&u32ReadCRValue)
            ret = btmtk_sdio_recv_rx_data();


        if (ret == 0)
            while (rx_length > (MTK_SDIO_PACKET_HEADER_SIZE)) {
                btmtk_sdio_card_to_host(priv);
                u32rxdatacount++;
                BTMTK_DBG("%s u32rxdatacount %d\n", __func__, u32rxdatacount);
            }

        btmtk_sdio_enable_interrupt(1);

        return 0;
}


static void btmtk_sdio_interrupt(struct sdio_func *func)
{
    struct btmtk_private *priv;
    struct btmtk_sdio_card *card;


    card = sdio_get_drvdata(func);

    if (!card)
            return;


    if (!card->priv)
            return;

    priv = card->priv;
    btmtk_sdio_enable_interrupt(0);


    btmtk_interrupt(priv);

    return;
}

static int btmtk_sdio_register_dev(struct btmtk_sdio_card *card)
{
        struct sdio_func *func;
        u32    u32ReadCRValue = 0;
        u8 reg;
        int ret = 0;

        if (!card || !card->func) {
                BTMTK_ERR("Error: card or function is NULL!");
                ret = -EINVAL;
                goto failed;
        }

        func = card->func;

        sdio_claim_host(func);

        ret = sdio_enable_func(func);
        if (ret) {
                BTMTK_ERR("sdio_enable_func() failed: ret=%d", ret);
                ret = -EIO;
                goto release_host;
        }


        btmtk_sdio_readb(SDIO_CCCR_IENx, &u32ReadCRValue);
        BTMTK_INFO("before claim irq read SDIO_CCCR_IENx %x, func num %d\n", u32ReadCRValue, func->num);


        ret = sdio_claim_irq(func, btmtk_sdio_interrupt);
        if (ret) {
                BTMTK_ERR("sdio_claim_irq failed: ret=%d", ret);
                ret = -EIO;
                goto disable_func;
        }
        BTMTK_INFO("sdio_claim_irq success: ret=%d", ret);

        btmtk_sdio_readb(SDIO_CCCR_IENx, &u32ReadCRValue);
        BTMTK_INFO("after claim irq read SDIO_CCCR_IENx %x\n", u32ReadCRValue);

        ret = sdio_set_block_size(card->func, SDIO_BLOCK_SIZE);
        if (ret) {
                BTMTK_ERR("cannot set SDIO block size");
                ret = -EIO;
                goto release_irq;
        }

        reg = sdio_readb(func, card->reg->io_port_0, &ret);
        if (ret < 0) {
                ret = -EIO;
                goto release_irq;
        }

        card->ioport = reg;

        reg = sdio_readb(func, card->reg->io_port_1, &ret);
        if (ret < 0) {
                ret = -EIO;
                goto release_irq;
        }

        card->ioport |= (reg << 8);

        reg = sdio_readb(func, card->reg->io_port_2, &ret);
        if (ret < 0) {
                ret = -EIO;
                goto release_irq;
        }

        card->ioport |= (reg << 16);

        BTMTK_INFO("SDIO FUNC%d IO port: 0x%x", func->num, card->ioport);

        if (card->reg->int_read_to_clear) {
                reg = sdio_readb(func, card->reg->host_int_rsr, &ret);
                if (ret < 0) {
                        ret = -EIO;
                        goto release_irq;
                }
                sdio_writeb(func, reg | 0x3f, card->reg->host_int_rsr, &ret);
                if (ret < 0) {
                        ret = -EIO;
                        goto release_irq;
                }

                reg = sdio_readb(func, card->reg->card_misc_cfg, &ret);
                if (ret < 0) {
                        ret = -EIO;
                        goto release_irq;
                }
                sdio_writeb(func, reg | 0x10, card->reg->card_misc_cfg, &ret);
                if (ret < 0) {
                        ret = -EIO;
                        goto release_irq;
                }
        }

        sdio_set_drvdata(func, card);

        sdio_release_host(func);

        return 0;

release_irq:
        sdio_release_irq(func);

disable_func:
        sdio_disable_func(func);

release_host:
        sdio_release_host(func);

failed:
        BTMTK_INFO("%s fail\n", __func__);
        return ret;
}

static int btmtk_sdio_unregister_dev(struct btmtk_sdio_card *card)
{
        if (card && card->func) {
                sdio_claim_host(card->func);
                sdio_release_irq(card->func);
                sdio_disable_func(card->func);
                sdio_release_host(card->func);
                sdio_set_drvdata(card->func, NULL);
        }

        return 0;
}

static int btmtk_sdio_enable_host_int(struct btmtk_sdio_card *card)
{
        int ret;
        u32 read_data = 0;

        if (!card || !card->func)
                return -EINVAL;

        sdio_claim_host(card->func);

        ret = btmtk_sdio_enable_host_int_mask(card, HIM_ENABLE);

        btmtk_sdio_get_rx_unit(card);

if (0) {
                typedef int (*fp_sdio_hook)(struct mmc_host *host, unsigned int width);
                fp_sdio_hook func_sdio_hook = (fp_sdio_hook) kallsyms_lookup_name("mmc_set_bus_width");
                unsigned char data = 0;

                data = sdio_f0_readb(card->func, SDIO_CCCR_IF, &ret);
                if (ret)
                    BTMTK_INFO("%s sdio_f0_readb ret %d\n", __func__, ret);

                BTMTK_INFO("%s sdio_f0_readb data 0x%X!\n", __func__, data);

                data  &= ~SDIO_BUS_WIDTH_MASK;
                data  |= SDIO_BUS_ASYNC_INT;
                card->func->card->quirks |= MMC_QUIRK_LENIENT_FN0;

                sdio_f0_writeb(card->func, data, SDIO_CCCR_IF, &ret);
                if (ret)
                    BTMTK_INFO("%s sdio_f0_writeb ret %d\n", __func__, ret);

                BTMTK_INFO("%s func_sdio_hook at 0x%p!\n", __func__, func_sdio_hook);
                if (func_sdio_hook)
                    func_sdio_hook(card->func->card->host, MMC_BUS_WIDTH_1);


                data = sdio_f0_readb(card->func, SDIO_CCCR_IF, &ret);
                if (ret)
                BTMTK_INFO("%s sdio_f0_readb 2 ret %d\n", __func__, ret);


                BTMTK_INFO("%s sdio_f0_readb2 data 0x%X\n", __func__, data);
}

        sdio_release_host(card->func);


/*
* workaround for some platfrom no host clock sometimes
*/

        btmtk_sdio_readl(CSDIOCSR, &read_data);
        BTMTK_INFO("%s read CSDIOCSR is 0x%X\n", __func__, read_data);
        read_data |= 0x4;
        btmtk_sdio_writel(CSDIOCSR, read_data);
        BTMTK_INFO("%s write CSDIOCSR is 0x%X\n", __func__, read_data);



        return ret;
}

static int btmtk_sdio_disable_host_int(struct btmtk_sdio_card *card)
{
        int ret;

        if (!card || !card->func)
                return -EINVAL;

        sdio_claim_host(card->func);

        ret = btmtk_sdio_disable_host_int_mask(card, HIM_DISABLE);

        sdio_release_host(card->func);

        return ret;
}

static int btmtk_sdio_host_to_card(struct btmtk_private *priv,
                                u8 *payload, u16 nb)
{
        struct btmtk_sdio_card *card = priv->btmtk_dev.card;
        int ret = 0;
        int i = 0;
        u8 MultiBluckCount = 0;
        u8 redundant = 0;
        if (payload != txbuf){
            memset(txbuf,0,MTK_TXDATA_SIZE);
            memcpy(txbuf,payload,nb);
        }

        if (!card || !card->func) {
                BTMTK_ERR("card or function is NULL!");
                return -EINVAL;
        }

        MultiBluckCount = nb/SDIO_BLOCK_SIZE;
        redundant = nb % SDIO_BLOCK_SIZE;

        if (redundant)
           nb = (MultiBluckCount+1)*SDIO_BLOCK_SIZE;


       

       if (nb < 16)
            btmtk_print_buffer_conent(txbuf, nb);
       else
            btmtk_print_buffer_conent(txbuf, 16);

       do {
                 /* Transfer data to card */
                 sdio_claim_host(card->func);
                 ret = sdio_writesb(card->func, CTDR, txbuf,
                                    nb);
                 sdio_release_host(card->func);
                 if (ret < 0) {
                         i++;
                         BTMTK_ERR("i=%d writesb failed: %d", i, ret);
                         BTMTK_ERR("hex: %*ph", nb, txbuf);
                         ret = -EIO;
                         if (i > MAX_WRITE_IOMEM_RETRY)
                                 goto exit;
                 }
         } while (ret);

         if (priv)
            priv->btmtk_dev.tx_dnld_rdy = false;

 exit:
         


         return ret;
 }

 static int btmtk_sdio_download_fw(struct btmtk_sdio_card *card)
 {
         int ret;

         BTMTK_INFO("%s begin", __func__);
         if (!card || !card->func) {
                 BTMTK_ERR("card or function is NULL!");
                 return -EINVAL;
         }



         sdio_claim_host(card->func);

         if (btmtk_sdio_download_rom_patch(card)) {
                         BTMTK_ERR("Failed to download firmware!");
                         ret = -EIO;
                         goto done;
         }

         /*
          * winner or not, with this test the FW synchronizes when the
          * module can continue its initialization
          */
         sdio_release_host(card->func);

         return 0;

 done:
         sdio_release_host(card->func);
         return ret;
 }

 static int btmtk_sdio_probe(struct sdio_func *func,
                                         const struct sdio_device_id *id)
 {
    int ret = 0;
    struct btmtk_private *priv = NULL;
    struct btmtk_sdio_card *card = NULL;
    struct btmtk_sdio_device *data = (void *) id->driver_data;
    u32 u32ReadCRValue = 0;

    probe_counter++;
    BTMTK_INFO("%s Mediatek Bluetooth driver Version=%s", __func__, VERSION);
    BTMTK_INFO("vendor=0x%x, device=0x%x, class=%d, fn=%d, support func_num %d",
                        id->vendor, id->device, id->class, func->num, data->reg->func_num);

    if (func->num != data->reg->func_num) {
        BTMTK_INFO("func num is not match");
        return -ENODEV;
    }


        card = devm_kzalloc(&func->dev, sizeof(*card), GFP_KERNEL);
        if (!card)
                return -ENOMEM;

        card->func = func;
        g_card = card;

        if (id->driver_data) {

                card->helper = data->helper;
                card->firmware = data->firmware;
                card->firmware1 = data->firmware1;
                card->reg = data->reg;
                card->sd_blksz_fw_dl = data->sd_blksz_fw_dl;
                card->support_pscan_win_report = data->support_pscan_win_report;
                card->supports_fw_dump = data->supports_fw_dump;
        }

        BTMTK_INFO("%s func device %X\n", __func__, card->func->device);
        BTMTK_INFO("%s Call btmtk_sdio_register_dev\n", __func__);
        if (btmtk_sdio_register_dev(card) < 0) {
                BTMTK_ERR("Failed to register BT device!");
                return -ENODEV;
        } else
            BTMTK_INFO("%s btmtk_sdio_register_dev success\n", __func__);


        /* Disable the interrupts on the card */
        btmtk_sdio_enable_host_int(card);
        BTMTK_INFO("call btmtk_sdio_enable_host_int done");
        if (btmtk_sdio_download_fw(card)) {
            BTMTK_ERR("Downloading firmware failed!");
            ret = -ENODEV;
            goto unreg_dev;
        }





         priv = btmtk_add_card(card);
         if (!priv) {
                 BTMTK_ERR("Initializing card failed!");
                 ret = -ENODEV;
                 goto unreg_dev;
         }
         BTMTK_INFO("btmtk_add_card success");
         card->priv = priv;
         BTMTK_INFO("assign priv done");
         /* Initialize the interface specific function pointers */
         priv->hw_host_to_card = btmtk_sdio_host_to_card;
         priv->hw_process_int_status = btmtk_sdio_process_int_status;
         priv->hw_set_own_back =  btmtk_sdio_set_own_back;

        g_priv = priv;
        if (fw_dump_ptr == NULL)
            fw_dump_ptr = kmalloc(FW_DUMP_BUF_SIZE, GFP_ATOMIC);


        if (fw_dump_ptr == NULL) {
            BTMTK_ERR("%s : alloc fw_dump_ptr fail\n", __func__);
            ret = -ENODEV;
            return ret;
        }

        memset(&metabuffer.buffer, 0, META_BUFFER_SIZE);
        memset(fw_dump_ptr, 0, FW_DUMP_BUF_SIZE);
        fw_dump_task_should_stop = 0;
#if SAVE_FW_DUMP_IN_KERNEL
        fw_dump_file = NULL;
#endif
        fw_dump_read_ptr = fw_dump_ptr;
        fw_dump_write_ptr = fw_dump_ptr;
        fw_dump_total_read_size = 0;
        fw_dump_total_write_size = 0;
        fw_dump_buffer_used_size = 0;
        fw_dump_buffer_full = 0;

        ret = btmtk_sdio_readl(CHLPCR, &u32ReadCRValue);
        BTMTK_INFO("%s read CHLPCR (0x%08X)\n", __func__, u32ReadCRValue);
        BTMTK_INFO("%s normal end\n", __func__);
        probe_ready = true;
        return 0;

 unreg_dev:
         btmtk_sdio_unregister_dev(card);

         BTMTK_ERR("%s fail end\n", __func__);
         return ret;
 }

 static void btmtk_sdio_remove(struct sdio_func *func)
 {
         struct btmtk_sdio_card *card;

         BTMTK_INFO("%s begin user_rmmod %d\n", __func__,user_rmmod);
         probe_ready = false;

         if (func) {
                 card = sdio_get_drvdata(func);
                 if (card) {
                         /* Send SHUTDOWN command & disable interrupt
                          * if user removes the module.
                          */
                         if (user_rmmod) {
                                 BTMTK_INFO("%s begin user_rmmod %d in user mode\n", __func__,user_rmmod);
                                 btmtk_sdio_set_own_back(DRIVER_OWN);
                                 btmtk_sdio_enable_interrupt(0);
                                 btmtk_sdio_bt_set_power(0);
                                 btmtk_sdio_set_own_back(FW_OWN);

                                 btmtk_sdio_disable_host_int(card);
                         }
                         BTMTK_DBG("unregester dev");
                         card->priv->surprise_removed = true;
                         btmtk_sdio_unregister_dev(card);
                         btmtk_remove_card(card->priv);



                 }
         }
         BTMTK_INFO("%s end\n", __func__);
 }


/*
cmd_type:
#define HCI_COMMAND_PKT         0x01
#define HCI_ACLDATA_PKT         0x02
#define HCI_SCODATA_PKT         0x03
#define HCI_EVENT_PKT           0x04
#define HCI_VENDOR_PKT          0xff


*/
  static int btmtk_sdio_send_cmd(u8 cmd_type,u8* cmd,int cmd_len)
 {
        u8 ret = 0;
        u32 sdio_header_len = 0;
        u8 *send_data = NULL;
        u32 send_data_len = cmd_len + BTM_HEADER_LEN;
        if(cmd_len==0){
                BTMTK_ERR("%s cmd_len (%d) error return\n", __func__,cmd_len);
                return -EINVAL;
        }

        send_data = kmalloc(send_data_len, GFP_KERNEL);
        sdio_header_len = send_data_len;
        memset(send_data, 0, send_data_len);
        send_data[0] = (sdio_header_len & 0x0000ff);
        send_data[1] = (sdio_header_len & 0x00ff00) >> 8;
        send_data[2] = 0;
        send_data[3] = 0;
        send_data[4] = cmd_type ;
        memcpy(&send_data[BTM_HEADER_LEN], &cmd[0], cmd_len);

        ret = btmtk_sdio_host_to_card(g_priv, send_data, send_data_len);
        kfree(send_data);
        return ret;
 }
 static int btmtk_sdio_send_woble_cmd(void)
 {
        u8 ret = 0;
        u8 cmd[] = { 0xC9, 0xFC, 0x0D, 0x01, 0x0E, 0x00, 0x05, 0x43,
                     0x52, 0x4B, 0x54, 0x4D, 0x20, 0x04, 0x32, 0x00 };

        ret = btmtk_sdio_send_cmd(HCI_COMMAND_PKT,cmd,sizeof(cmd));
        BTMTK_INFO("%s return %d\n", __func__,ret);
        return ret;
 }

 static int btmtk_sdio_suspend(struct device *dev)
 {
         struct sdio_func *func = dev_to_sdio_func(dev);
         u8 ret = 0;
         mmc_pm_flag_t pm_flags;
         ret = btmtk_sdio_set_own_back(DRIVER_OWN);
         if(ret)
             BTMTK_ERR("%s set driver own fail",__func__);

         ret = btmtk_sdio_send_woble_cmd();
         if(ret)
             BTMTK_ERR("%s set woble cmd fail",__func__);


         need_reset_stack = 1;
         BTMTK_ERR("%s set reset_stack 1\n", __func__);
         if (func) {
                 pm_flags = sdio_get_host_pm_caps(func);
                 BTMTK_DBG("%s: suspend: PM flags = 0x%x", sdio_func_id(func),
                        pm_flags);
                 if (!(pm_flags & MMC_PM_KEEP_POWER)) {
                         BTMTK_ERR("%s: cannot remain alive while suspended",
                                sdio_func_id(func));
                         return -EINVAL;
                 }
         } else {
                 BTMTK_ERR("sdio_func is not specified");
                 return 0;
         }
         ret = btmtk_sdio_set_own_back(FW_OWN);
         if(ret)
             BTMTK_ERR("%s set fw own fail",__func__);
         return sdio_set_host_pm_flags(func, MMC_PM_KEEP_POWER);
 }

 static int btmtk_sdio_resume(struct device *dev)
 {
         BTMTK_INFO("%s begin return 0, do nothing", __func__);
         return 0;
 }

 static const struct dev_pm_ops btmtk_sdio_pm_ops = {
         .suspend        = btmtk_sdio_suspend,
         .resume         = btmtk_sdio_resume,
 };

 static struct sdio_driver bt_mtk_sdio = {
         .name           = "btmtk_sdio",
         .id_table       = btmtk_sdio_ids,
         .probe          = btmtk_sdio_probe,
         .remove         = btmtk_sdio_remove,
         .drv = {
                 .owner = THIS_MODULE,
                 .pm = &btmtk_sdio_pm_ops,
         }
 };


static int btmtk_fops_open(struct inode *inode, struct file *file)
{
    BTMTK_INFO("%s begin", __func__);

    if (!probe_ready) {
        BTMTK_ERR("%s probe_ready is %d return", __func__,probe_ready);
        return -EFAULT;
    }

    spin_lock_init(&(metabuffer.spin_lock.lock));
    BTMTK_INFO("%s spin_lock_init end", __func__);
    if (g_priv == NULL) {
        BTMTK_ERR("%s g_priv is NULL", __func__);
        return -ENOENT;
    }

    if (g_priv->adapter == NULL) {
        BTMTK_ERR("%s g_priv->adapter is NULL", __func__);
        return -ENOENT;
    }

    if (g_priv)
        g_priv->adapter->fops_mode = true;

    BTMTK_INFO("%s fops_mode=%d end", __func__, g_priv->adapter->fops_mode);
    return 0;
}

static int btmtk_fops_close(struct inode *inode, struct file *file)
{
    struct sk_buff *skb = NULL;

    BTMTK_INFO("%s begin", __func__);

    if (!probe_ready) {
        BTMTK_ERR("%s probe_ready is %d return", __func__,probe_ready);
        return -EFAULT;
    }

    spin_lock_init(&(metabuffer.spin_lock.lock));
    if (g_priv)
        g_priv->adapter->fops_mode = false;

    lock_unsleepable_lock(&(metabuffer.spin_lock));


    if (!skb_queue_empty(&g_priv->adapter->fops_queue)) {
       BTMTK_INFO("%s clean data in fops_queue", __func__);
       do {
            skb = skb_dequeue(&g_priv->adapter->fops_queue);
            if (skb == NULL) {
                BTMTK_INFO("%s skb=NULL error break", __func__);
                break;
            }

           kfree_skb(skb);
        } while (!skb_queue_empty(&g_priv->adapter->fops_queue));

    }


    unlock_unsleepable_lock(&(metabuffer.spin_lock));

    BTMTK_INFO("%s fops_mode=%d end", __func__, g_priv->adapter->fops_mode);
    return 0;
}

ssize_t btmtk_fops_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos)
{
    int retval = 0;
    struct sk_buff *skb = NULL;
    u32 crAddr = 0, crValue = 0, crMask = 0;
    /*int i = 0;*/

    if (!probe_ready) {
        BTMTK_ERR("%s probe_ready is %d return", __func__,probe_ready);
        return -EFAULT;
    }

    if (g_priv == NULL) {
        BTMTK_INFO("%s g_priv is NULL", __func__);
        return -EFAULT;
    }

    if (g_priv->adapter->fops_mode == 0) {
        BTMTK_INFO("%s fops_mode is 0", __func__);
        return -EFAULT;
    }


	/*BTMTK_INFO("%s : (%d) %02X %02X %02X %02X %02X %02X %02X %02X\n", __func__, (int)count,
			buf[0],
			buf[1],
			buf[2],
			buf[3],
			buf[4],
			buf[5],
			buf[6],
			buf[7]);*/

    /*
    BTMTK_INFO("%s print write data", __func__);
    if (count > 10)
        BTMTK_INFO("  %02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",buf[0],buf[1],buf[2],buf[3],buf[4],buf[5],buf[6],buf[7],buf[8],buf[9]);
    else {
        for(i=0;i<count;i++)
            BTMTK_INFO("%d %02X",i,buf[i]);
    }*/

    if (buf[0] == 0x7) {
/*
* write CR
*/
        if (count < 15) {
            BTMTK_INFO("%s count=%zd less than 15, error", __func__, count);
            return -EFAULT;
        }

        crAddr = (buf[3]&0xff) + ((buf[4]&0xff)<<8) + ((buf[5]&0xff)<<16) + ((buf[6]&0xff)<<24);
        crValue = (buf[7]&0xff) + ((buf[8]&0xff)<<8) + ((buf[9]&0xff)<<16) + ((buf[10]&0xff)<<24);
        crMask = (buf[11]&0xff) + ((buf[12]&0xff)<<8) + ((buf[13]&0xff)<<16) + ((buf[14]&0xff)<<24);

        BTMTK_INFO("%s crAddr=0x%08x crValue=0x%08x crMask=0x%08x", __func__, crAddr, crValue, crMask);
        crValue &= crMask;


        BTMTK_INFO("%s write crAddr=0x%08x crValue=0x%08x", __func__, crAddr, crValue);
        btmtk_sdio_writel(crAddr, crValue);
        retval = count;
    } else if (buf[0] == 0x8) {
/*
* read CR
*/
        if (count < 16) {
            BTMTK_INFO("%s count=%zd less than 15, error", __func__, count);
            return -EFAULT;
        }

        crAddr = (buf[3]&0xff) + ((buf[4]&0xff)<<8) + ((buf[5]&0xff)<<16) + ((buf[6]&0xff)<<24);
        crMask = (buf[11]&0xff) + ((buf[12]&0xff)<<8) + ((buf[13]&0xff)<<16) + ((buf[14]&0xff)<<24);

        btmtk_sdio_readl(crAddr, &crValue);
        BTMTK_INFO("%s read crAddr=0x%08x crValue=0x%08x crMask=0x%08x", __func__, crAddr, crValue, crMask);
        retval = count;
    } else {

        skb = bt_skb_alloc(count-1, GFP_ATOMIC);
        bt_cb(skb)->pkt_type = buf[0];
        memcpy(&skb->data[0], &buf[1], count-1);
        skb->len = count-1;
        skb_queue_tail(&g_priv->adapter->tx_queue, skb);
        wake_up_interruptible(&g_priv->main_thread.wait_q);

        retval = count;
    }
    BTMTK_DBG("%s end", __func__);
    return retval;
}

ssize_t btmtk_fops_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos)
{
    int copyLen = 0;
    struct sk_buff *skb = NULL;
    unsigned long ret = 0;

    if (!probe_ready) {
        BTMTK_ERR("%s probe_ready is %d return", __func__,probe_ready);
        return -EFAULT;
    }

    if (g_priv == NULL) {
        BTMTK_INFO("%s g_priv is NULL", __func__);
        return -EFAULT;
    }

    if (g_priv->adapter->fops_mode == 0) {
        BTMTK_INFO("%s fops_mode is 0", __func__);
        return -EFAULT;
    }

    lock_unsleepable_lock(&(metabuffer.spin_lock));


    if (skb_queue_empty(&g_priv->adapter->fops_queue)) {
        if (filp->f_flags & O_NONBLOCK) {
            unlock_unsleepable_lock(&(metabuffer.spin_lock));
            return 0;
        }
    }

    if (need_reset_stack == 1){
        kill_fasync(&fasync, SIGIO, POLL_IN);
        need_reset_stack = 0;
        BTMTK_INFO("%s Call  kill_fasync and set reset_stack 0", __func__);
        return -ENODEV;
    }

    do {
        skb = skb_dequeue(&g_priv->adapter->fops_queue);
        if (skb == NULL) {
            BTMTK_INFO("%s skb=NULL error break", __func__);
            break;
        }
        //BTMTK_DBG("%s pkt_type %d metabuffer.buffer %d", __func__, bt_cb(skb)->pkt_type, metabuffer.buffer[copyLen]);
        btmtk_print_buffer_conent(skb->data, skb->len);

        if (((copyLen + 1 + skb->len) > META_BUFFER_SIZE) || ((copyLen + 1 + skb->len) > count)) {
            BTMTK_ERR("%s copy copyLen %d > META_BUFFER_SIZE(%d), push back to queue", __func__,
            (copyLen + 1 + skb->len), META_BUFFER_SIZE);
            skb_queue_head(&g_priv->adapter->fops_queue, skb);
            break;
        }

        metabuffer.buffer[copyLen] = bt_cb(skb)->pkt_type;
        copyLen++;

        memcpy(&metabuffer.buffer[copyLen], skb->data, skb->len);
        copyLen += skb->len;

        kfree_skb(skb);

    } while (!skb_queue_empty(&g_priv->adapter->fops_queue));
    unlock_unsleepable_lock(&(metabuffer.spin_lock));


    ret = copy_to_user(buf, metabuffer.buffer, copyLen);
    if (ret) {
        BTMTK_ERR("%s copy to user fail, ret %d", __func__, (int)ret);
        copyLen = (copyLen - ret);
    }/* else {
    	BTMTK_INFO("%s : (%d) %02X %02X %02X %02X %02X %02X %02X %02X\n", __func__, copyLen, 
    			metabuffer.buffer[0],
    			metabuffer.buffer[1],
    			metabuffer.buffer[2],
    			metabuffer.buffer[3],
    			metabuffer.buffer[4],
    			metabuffer.buffer[5],
    			metabuffer.buffer[6],
    			metabuffer.buffer[7]);
    }*/

    //BTMTK_DBG("%s copyLen %d", __func__, copyLen);
    return copyLen;
}

static int btmtk_fops_fasync(int fd, struct file *file, int on)
{
	BTMTK_INFO("%s: fd = 0x%X, flag = 0x%X", __func__, fd, on);
	return fasync_helper(fd, file, on, &fasync);
}

unsigned int btmtk_fops_poll(struct file *filp, poll_table *wait)
{
    unsigned int mask = 0;

    if (!probe_ready) {
        BTMTK_ERR("%s probe_ready is %d return", __func__,probe_ready);
        return mask;
    }

    if (g_priv == NULL) {
        BTMTK_ERR("%s g_priv is NULL", __func__);
        return -ENODEV;
    }

    if (skb_queue_empty(&g_priv->adapter->fops_queue)) {
        poll_wait(filp, &inq, wait);

        if (!skb_queue_empty(&g_priv->adapter->fops_queue)) {
            mask |= (POLLIN | POLLRDNORM);
            //BTMTK_INFO("%s poll done\n", __func__);
	}
    } else
        mask |= (POLLIN | POLLRDNORM);

    mask |= (POLLOUT | POLLWRNORM);

    //BTMTK_INFO("%s poll mask 0x%x\n", __func__,mask);
    return mask;
}

long btmtk_fops_unlocked_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
{
    u32 retval = 0;

    return retval;
}

static int btmtk_fops_openfwlog(struct inode *inode, struct file *file)
{
	if (g_priv == NULL) {
		BTMTK_ERR("%s: ERROR, g_data is NULL!", __func__);
		return -ENODEV;
	}

	BTMTK_INFO("%s: OK", __func__);
	return 0;
}

static int btmtk_fops_closefwlog(struct inode *inode, struct file *file)
{
	if (g_priv == NULL) {
		BTMTK_ERR("%s: ERROR, g_data is NULL!", __func__);
		return -ENODEV;
	}

	BTMTK_INFO("%s: OK", __func__);
	return 0;
}

static ssize_t btmtk_fops_readfwlog(struct file *filp, char __user *buf, size_t count, loff_t *f_pos)
{
	int copyLen = 0;

	if (g_priv == NULL) {
		BTMTK_ERR("%s: ERROR, g_data is NULL!", __func__);
		return -ENODEV;
	}

	BTMTK_INFO("%s: OK", __func__);
	return copyLen;
}

static ssize_t btmtk_fops_writefwlog(struct file *filp, const char __user *buf,
					size_t count, loff_t *f_pos)
{
	struct sk_buff *skb = NULL;
	int length = 0, i, j = 0;
	u8 *i_fwlog_buf = kmalloc(HCI_MAX_COMMAND_BUF_SIZE, GFP_KERNEL);
	u8 *o_fwlog_buf = kmalloc(HCI_MAX_COMMAND_SIZE, GFP_KERNEL);
	const char *val_param = NULL;

	memset(i_fwlog_buf, 0, HCI_MAX_COMMAND_BUF_SIZE);
	memset(o_fwlog_buf, 0, HCI_MAX_COMMAND_SIZE);


	if (g_priv == NULL) {
		BTMTK_INFO("%s g_priv is NULL", __func__);
		goto exit;
	}
	if (count > HCI_MAX_COMMAND_BUF_SIZE) {
		BTMTK_ERR("%s: your command is larger than maximum length, count = %zd\n", __func__, count);
		goto exit;
	}

	for (i = 0; i < count; i++) {
		if (buf[i] != '=' ) {
			i_fwlog_buf[i] = buf[i];
			BTMTK_DBG("%s: tag_param %02x", __func__, i_fwlog_buf[i]);
		}
		else {
			val_param = &buf[i+1];
			if (strcmp(i_fwlog_buf, "log_lvl") == 0) {
				BTMTK_INFO("%s: btmtk_log_lvl = %d", __func__, val_param[0] - 48);
				btmtk_log_lvl = val_param[0] - 48;
			}
			goto exit;
		}
	}

	if (i == count) {
		/* hci input command format : echo 01 be fc 01 05 > /dev/stpbtfwlog */
		/* We take the data from index three to end. */
		val_param = &buf[0];
	}
	length = strlen(val_param);

	for (i = 0; i < length; i++) {
		u8 ret = 0;
		u8 temp_str[3] = { 0 };
		long res = 0;

		if (val_param[i] == ' ' || val_param[i] == '\t' || val_param[i] == '\r' || val_param[i] == '\n')
			continue;
		if ((val_param[i] == '0' && val_param[i + 1] == 'x')
				|| (val_param[0] == '0' && val_param[i + 1] == 'X')) {
			i++;
			continue;
		}
		if (!(val_param[i] >= '0' && val_param[i] <= '9')
				&& !(val_param[i] >= 'A' && val_param[i] <= 'F')
				&& !(val_param[i] >= 'a' && val_param[i] <= 'f')) {
			break;
		}
		temp_str[0] = *(val_param+i);
		temp_str[1] = *(val_param+i+1);
		ret = (u8) (kstrtol((char *)temp_str, 16, &res) & 0xff);
		o_fwlog_buf[j++] = res;
		i++;
	}
	length = j;



	/* Receive command from stpbtfwlog, then Sent hci command to controller */
	BTMTK_DBG("%s: hci buff is %02x%02x%02x%02x%02x ", __func__, o_fwlog_buf[0]
		, o_fwlog_buf[1], o_fwlog_buf[2], o_fwlog_buf[3], o_fwlog_buf[4]);
	/* check HCI command length */
	if (length > HCI_MAX_COMMAND_SIZE) {
		BTMTK_ERR("%s: your command is larger than maximum length, length = %d\n", __func__, length);
		goto exit;
	}

	BTMTK_DBG("%s: hci buff is %02x%02x%02x%02x%02x ", __func__, o_fwlog_buf[0]
		, o_fwlog_buf[1], o_fwlog_buf[2], o_fwlog_buf[3], o_fwlog_buf[4]);

	/* Receive command from stpbtfwlog, then Sent hci command to Stack */
	skb = bt_skb_alloc(length - 1, GFP_ATOMIC);
	bt_cb(skb)->pkt_type = o_fwlog_buf[0];
	memcpy(&skb->data[0],&o_fwlog_buf[1],length - 1);
	skb->len = length - 1;
	skb_queue_tail(&g_priv->adapter->tx_queue, skb);
	wake_up_interruptible(&g_priv->main_thread.wait_q);

	BTMTK_INFO("%s write end", __func__);
exit:
	BTMTK_INFO("%s exit, length = %d", __func__, length);
	kfree(i_fwlog_buf);
	kfree(o_fwlog_buf);
	return count;
}

static unsigned int btmtk_fops_pollfwlog(struct file *file, poll_table *wait)
{
	unsigned int mask = 0;

	if (g_priv== NULL) {
		BTMTK_ERR("%s: ERROR, g_data is NULL!", __func__);
		return -ENODEV;
	}

	return mask;
}

static long btmtk_fops_unlocked_ioctlfwlog(struct file *filp, unsigned int cmd,
					  unsigned long arg)
{
	int retval = 0;

	BTMTK_INFO("%s: ->", __func__);
	if (g_priv == NULL) {
		BTMTK_ERR("%s: ERROR, g_data is NULL!", __func__);
		return -ENODEV;
	}

	return retval;
}


static int BTMTK_major;
static int BT_majorfwlog;
static struct cdev BTMTK_cdev;
static struct cdev BT_cdevfwlog;
static int BTMTK_devs = 1;

static wait_queue_head_t inq;
const struct file_operations BTMTK_fops = {
    .open = btmtk_fops_open,
    .release = btmtk_fops_close,
    .read = btmtk_fops_read,
    .write = btmtk_fops_write,
    .poll = btmtk_fops_poll,
    .unlocked_ioctl = btmtk_fops_unlocked_ioctl,
    .fasync = btmtk_fops_fasync
};


const struct file_operations BT_fopsfwlog = {
    .open = btmtk_fops_openfwlog,
    .release = btmtk_fops_closefwlog,
    .read = btmtk_fops_readfwlog,
    .write = btmtk_fops_writefwlog,
    .poll = btmtk_fops_pollfwlog,
    .unlocked_ioctl = btmtk_fops_unlocked_ioctlfwlog

};

static int BTMTK_init(void)
{
	dev_t devID = MKDEV(BTMTK_major, 0);
	dev_t devIDfwlog = MKDEV(BT_majorfwlog, 1);
	int ret = 0;
	int cdevErr = 0;
	int major = 0;
	int majorfwlog = 0;

	BTMTK_INFO("BTMTK_init\n");

	g_card = NULL;
	txbuf = NULL;
	rxbuf = NULL;
	rx_length = 0;

#if SAVE_FW_DUMP_IN_KERNEL
	fw_dump_file = NULL;
#else
	fw_dump_file = 0;
#endif
	g_priv = NULL;


	fw_dump_buffer_full = 0;
	fw_dump_total_read_size = 0;
	fw_dump_total_write_size = 0;
	fw_dump_buffer_used_size = 0;
	fw_dump_task_should_stop = 0;
	fw_dump_ptr = NULL;
	fw_dump_read_ptr = NULL;
	fw_dump_write_ptr = NULL;
	probe_counter = 0;
	fw_dump_end_checking_task_should_stop = 0;
	fw_is_doing_coredump = 0;


	ret = alloc_chrdev_region(&devID, 0, 1, "BT_chrdev");
	if (ret) {
		BTMTK_ERR("fail to allocate chrdev\n");
		return ret;
	}

	ret = alloc_chrdev_region(&devIDfwlog, 0, 1, "BT_chrdevfwlog");
	if (ret) {
		BTMTK_ERR("fail to allocate chrdev");
		return ret;
	}

	BTMTK_major = major = MAJOR(devID);
	BTMTK_INFO("major number:%d", BTMTK_major);
	BT_majorfwlog = majorfwlog = MAJOR(devIDfwlog);
	BTMTK_INFO("BT_majorfwlog number: %d", BT_majorfwlog);

	cdev_init(&BTMTK_cdev, &BTMTK_fops);
	BTMTK_cdev.owner = THIS_MODULE;

	cdev_init(&BT_cdevfwlog, &BT_fopsfwlog);
	BT_cdevfwlog.owner = THIS_MODULE;

    cdevErr = cdev_add(&BTMTK_cdev, devID, BTMTK_devs);
    if (cdevErr)
        goto error;

	cdevErr = cdev_add(&BT_cdevfwlog, devIDfwlog, 1);
	if (cdevErr)
		goto error;

	BTMTK_INFO("%s driver(major %d) installed.\n", "BT_chrdev", BTMTK_major);
	BTMTK_INFO("%s driver(major %d) installed.\n", "BT_chrdevfwlog", BT_majorfwlog);

	pBTClass = class_create(THIS_MODULE, "BT_chrdev");
	if (IS_ERR(pBTClass)) {
		BTMTK_ERR("class create fail, error code(%ld)\n", PTR_ERR(pBTClass));
		goto err1;
	}

	pBTDev = device_create(pBTClass, NULL, devID, NULL, BT_NODE);
	if (IS_ERR(pBTDev)) {
		BTMTK_ERR("device create fail, error code(%ld)\n", PTR_ERR(pBTDev));
		goto err2;
	}

	pBTDevfwlog = device_create(pBTClass, NULL, devIDfwlog, NULL, "stpbtfwlog");
	if (IS_ERR(pBTDevfwlog)) {
		BTMTK_ERR("device(stpbtfwlog) create fail, error code(%ld)", PTR_ERR(pBTDevfwlog));
		goto err2;
	}

	BTMTK_INFO("%s: BT_major %d, BT_majorfwlog %d", __func__, BTMTK_major, BT_majorfwlog);
	BTMTK_INFO("%s: devID %d, devIDfwlog %d", __func__, devID, devIDfwlog);

	// init wait queue
	g_devIDfwlog = devIDfwlog;
	init_waitqueue_head(&(fw_log_inq));
	init_waitqueue_head(&(inq));

	return 0;

 err2:
	if (pBTClass) {
		class_destroy(pBTClass);
		pBTClass = NULL;
	}

 err1:

 error:
	if (cdevErr == 0)
		cdev_del(&BTMTK_cdev);

	if (ret == 0)
		unregister_chrdev_region(devID, BTMTK_devs);

	return -1;
}

static void BTMTK_exit(void)
{
	dev_t dev = MKDEV(BTMTK_major, 0);
	dev_t devIDfwlog = g_devIDfwlog;

	BTMTK_INFO("BTMTK_exit\n");

	if(pBTDevfwlog){
		device_destroy(pBTClass,devIDfwlog);
		pBTDevfwlog = NULL;
	}

	if (pBTDev) {
		device_destroy(pBTClass, dev);
		pBTDev = NULL;
	}

	if (pBTClass) {
		class_destroy(pBTClass);
		pBTClass = NULL;
	}

	cdev_del(&BTMTK_cdev);
	unregister_chrdev_region(dev, 1);
	BTMTK_INFO("%s driver removed.\n", BT_DRIVER_NAME);
}

 static int __init btmtk_sdio_init_module(void)
{
     BTMTK_init();

     if (txbuf == NULL) {
        txbuf = kmalloc(MTK_TXDATA_SIZE, GFP_ATOMIC);
        memset(txbuf, 0, MTK_TXDATA_SIZE);
     }

     if (rxbuf == NULL) {
        rxbuf = kmalloc(MTK_RXDATA_SIZE, GFP_ATOMIC);
        memset(rxbuf, 0, MTK_RXDATA_SIZE);
     }


     if (sdio_register_driver(&bt_mtk_sdio) != 0) {
                 BTMTK_ERR("SDIO Driver Registration Failed");
                 return -ENODEV;
     } else
         BTMTK_INFO("SDIO Driver Registration Success");

         /* Clear the flag in case user removes the card. */
         user_rmmod = 0;

         return 0;
 }

 static void __exit btmtk_sdio_exit_module(void)
 {
     /* Set the flag as user is removing this module. */
     user_rmmod = 1;

     BTMTK_exit();

     sdio_unregister_driver(&bt_mtk_sdio);

     kfree(txbuf);

     kfree(rxbuf);

 }

 module_init(btmtk_sdio_init_module);
 module_exit(btmtk_sdio_exit_module);
