[WCNCR00152648] [SDIO][ZTE N]Add woble cmd
CR-Id: WCNCR00152648
diff --git a/btmtk_drv.h b/btmtk_drv.h
index d130c1a..59a9866 100644
--- a/btmtk_drv.h
+++ b/btmtk_drv.h
@@ -64,7 +64,7 @@
struct btmtk_device {
void *card;
- struct hci_dev *hcidev;
+ //struct hci_dev *hcidev;
u8 dev_type;
@@ -182,7 +182,6 @@
/* Prototype of global function */
- int btmtk_register_hdev(struct btmtk_private *priv);
struct btmtk_private *btmtk_add_card(void *card);
int btmtk_remove_card(struct btmtk_private *priv);
@@ -215,8 +214,6 @@
} ring_buffer_struct;
#ifdef CONFIG_DEBUG_FS
- void btmtk_debugfs_init(struct hci_dev *hdev);
- void btmtk_debugfs_remove(struct hci_dev *hdev);
#define FIXED_STPBT_MAJOR_DEV_ID 111
diff --git a/btmtk_main.c b/btmtk_main.c
index 771c4d8..4d5c398 100644
--- a/btmtk_main.c
+++ b/btmtk_main.c
@@ -306,30 +306,7 @@
return 0;
}
-int btmtk_register_hdev(struct btmtk_private *priv)
-{
- struct hci_dev *hdev = NULL;
- BTMTK_INFO("%s\n", __func__);
- hdev = hci_alloc_dev();
- if (!hdev) {
- BTMTK_ERR("Can not allocate HCI device");
- goto err_hdev;
- }
-
- hci_set_drvdata(hdev, priv);
- return 0;
-
-err_hdev:
- /* Stop the thread servicing the interrupts */
- kthread_stop(priv->main_thread.task);
-
- btmtk_free_adapter(priv);
- kfree(priv);
-
- return -ENOMEM;
-}
-EXPORT_SYMBOL_GPL(btmtk_register_hdev);
struct btmtk_private *btmtk_add_card(void *card)
{
diff --git a/btmtk_sdio.c b/btmtk_sdio.c
index d7dbb61..7552fc8 100644
--- a/btmtk_sdio.c
+++ b/btmtk_sdio.c
@@ -45,7 +45,9 @@
static struct class *pBTClass;
static struct device *pBTDev;
static wait_queue_head_t 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
@@ -1474,14 +1476,6 @@
return 0;
}
-int hci_recv_fragment(struct hci_dev *hdev, int type, void *data, int count)
-{
- int rem = 0;
-
-
-
- return rem;
-}
static void btmtk_sdio_interrupt(struct sdio_func *func)
{
@@ -1878,11 +1872,7 @@
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;
- /*if (btmtk_register_hdev(priv)) {
- BTMTK_ERR("Register hdev failed!");
- ret = -ENODEV;
- goto unreg_dev;
- }*/
+
g_priv = priv;
if (fw_dump_ptr == NULL)
fw_dump_ptr = kmalloc(FW_DUMP_BUF_SIZE, GFP_ATOMIC);
@@ -2004,108 +1994,19 @@
static int btmtk_sdio_suspend(struct device *dev)
{
struct sdio_func *func = dev_to_sdio_func(dev);
- struct btmtk_sdio_card *card;
- struct btmtk_private *priv;
- mmc_pm_flag_t pm_flags;
- struct hci_dev *hcidev;
u8 ret = 0;
ret = btmtk_sdio_set_own_back(DRIVER_OWN);
ret = btmtk_sdio_send_woble_cmd();
-
+ need_reset_stack = 1;
+ BTMTK_ERR("%s set reset_stack 1\n", __func__);
return sdio_set_host_pm_flags(func, MMC_PM_KEEP_POWER);
-
- btmtk_sdio_bt_set_power(0);
- ret = btmtk_sdio_set_own_back(FW_OWN);
- if (ret) {
- BTMTK_ERR("%s set DRIVER_FW fail", __func__);
- return -EBUSY;
- }
-
- 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;
- }
- card = sdio_get_drvdata(func);
- if (!card || !card->priv) {
- BTMTK_ERR("card or priv structure is not valid");
- return 0;
- }
- } else {
- BTMTK_ERR("sdio_func is not specified");
- return 0;
- }
-
- priv = card->priv;
- hcidev = priv->btmtk_dev.hcidev;
- BTMTK_DBG("%s: SDIO suspend", hcidev->name);
- skb_queue_purge(&priv->adapter->tx_queue);
-
-
-
-
- if (priv->adapter->hs_state != HS_ACTIVATED) {
- if (btmtk_enable_hs(priv)) {
- BTMTK_ERR("HS not actived, suspend failed!");
- return -EBUSY;
- }
- }
-
-
- priv->adapter->is_suspended = true;
-
-
- if (priv->adapter->hs_state == HS_ACTIVATED) {
- BTMTK_DBG("suspend with MMC_PM_KEEP_POWER");
- return sdio_set_host_pm_flags(func, MMC_PM_KEEP_POWER);
- } else {
- BTMTK_DBG("suspend without MMC_PM_KEEP_POWER");
- return 0;
- }
}
static int btmtk_sdio_resume(struct device *dev)
{
-
- struct sdio_func *func = dev_to_sdio_func(dev);
- struct btmtk_sdio_card *card;
- struct btmtk_private *priv;
- mmc_pm_flag_t pm_flags;
- struct hci_dev *hcidev;
-
BTMTK_INFO("%s begin return 0, do nothing", __func__);
return 0;
-
- if (func) {
- pm_flags = sdio_get_host_pm_caps(func);
- BTMTK_DBG("%s: resume: PM flags = 0x%x", sdio_func_id(func),
- pm_flags);
- card = sdio_get_drvdata(func);
- if (!card || !card->priv) {
- BTMTK_ERR("card or priv structure is not valid");
- return 0;
- }
- } else {
- BTMTK_ERR("sdio_func is not specified");
- return 0;
- }
- priv = card->priv;
-
- if (!priv->adapter->is_suspended)
- BTMTK_DBG("device already resumed");
-
- priv->adapter->hs_state = HS_DEACTIVATED;
- hcidev = priv->btmtk_dev.hcidev;
- BTMTK_DBG("%s: HS DEACTIVATED in resume!", hcidev->name);
- priv->adapter->is_suspended = false;
- BTMTK_DBG("%s: SDIO resume", hcidev->name);
-
- return 0;
}
static const struct dev_pm_ops btmtk_sdio_pm_ops = {
@@ -2317,6 +2218,13 @@
}
}
+ 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) {
@@ -2365,6 +2273,12 @@
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;
@@ -2476,7 +2390,8 @@
.read = btmtk_fops_read,
.write = btmtk_fops_write,
.poll = btmtk_fops_poll,
- .unlocked_ioctl = btmtk_fops_unlocked_ioctl
+ .unlocked_ioctl = btmtk_fops_unlocked_ioctl,
+ .fasync = btmtk_fops_fasync
};
diff --git a/btmtk_sdio.h b/btmtk_sdio.h
index 4722813..6f0ec30 100644
--- a/btmtk_sdio.h
+++ b/btmtk_sdio.h
@@ -19,7 +19,7 @@
*
**/
-#define VERSION "v0.0.0.21"
+#define VERSION "v0.0.0.22"
#define SDIO_HEADER_LEN 4