diff options
author | Marc Yang <yangyang@marvell.com> | 2013-07-10 12:02:37 -0700 |
---|---|---|
committer | Dan Willemsen <dwillemsen@nvidia.com> | 2013-09-14 13:32:47 -0700 |
commit | c3f5d3bc6a022ab864a777ae6615cda375023ada (patch) | |
tree | 0c0d3009eb51d187ddc44542f23f9e6f463c7654 /drivers/bluetooth | |
parent | 86d22782be29c8f33a2824259635e8f7ad9d1478 (diff) |
net: wireless: Update SD8797/SD8897 WLAN/BT driver to 413
Signed-off-by: Marc Yang <yangyang@marvell.com>
Bug 1318052
Change-Id: Ie6fbc284bf30ca9ae5f6930a270a1f82ed37b409
Signed-off-by: Nagarjuna Kristam <nkristam@nvidia.com>
Reviewed-on: http://git-master/r/251131
Reviewed-by: Mohan Thadikamalla <mohant@nvidia.com>
Reviewed-by: Venu Byravarasu <vbyravarasu@nvidia.com>
Diffstat (limited to 'drivers/bluetooth')
-rw-r--r-- | drivers/bluetooth/sd8797/bt/bt_drv.h | 36 | ||||
-rw-r--r-- | drivers/bluetooth/sd8797/bt/bt_main.c | 26 | ||||
-rw-r--r-- | drivers/bluetooth/sd8797/bt/bt_proc.c | 18 | ||||
-rw-r--r-- | drivers/bluetooth/sd8797/bt/bt_sdio.h | 3 | ||||
-rw-r--r-- | drivers/bluetooth/sd8797/bt/bt_sdiommc.c | 16 | ||||
-rw-r--r-- | drivers/bluetooth/sd8797/bt/hci_wrapper.h | 15 | ||||
-rw-r--r-- | drivers/bluetooth/sd8797/bt/mbt_char.c | 4 | ||||
-rw-r--r-- | drivers/bluetooth/sd8797/bt/mbt_char.h | 3 | ||||
-rw-r--r-- | drivers/bluetooth/sd8897/bt/bt_drv.h | 36 | ||||
-rw-r--r-- | drivers/bluetooth/sd8897/bt/bt_main.c | 26 | ||||
-rw-r--r-- | drivers/bluetooth/sd8897/bt/bt_proc.c | 18 | ||||
-rw-r--r-- | drivers/bluetooth/sd8897/bt/bt_sdio.h | 3 | ||||
-rw-r--r-- | drivers/bluetooth/sd8897/bt/bt_sdiommc.c | 16 | ||||
-rw-r--r-- | drivers/bluetooth/sd8897/bt/hci_wrapper.h | 15 | ||||
-rw-r--r-- | drivers/bluetooth/sd8897/bt/mbt_char.c | 4 | ||||
-rw-r--r-- | drivers/bluetooth/sd8897/bt/mbt_char.h | 3 |
16 files changed, 110 insertions, 132 deletions
diff --git a/drivers/bluetooth/sd8797/bt/bt_drv.h b/drivers/bluetooth/sd8797/bt/bt_drv.h index a0eec3f1e023..6773d34a944c 100644 --- a/drivers/bluetooth/sd8797/bt/bt_drv.h +++ b/drivers/bluetooth/sd8797/bt/bt_drv.h @@ -210,8 +210,7 @@ hexdump(char *prompt, u8 * buf, int len) wait_event_interruptible_timeout(waitq, cond, ((timeout) * HZ / 1000)) #endif -typedef struct -{ +typedef struct { /** Task */ struct task_struct *task; /** Queue */ @@ -273,8 +272,7 @@ os_sched_timeout(u32 millisec) #endif /** Data structure for the Marvell Bluetooth device */ -typedef struct _bt_dev -{ +typedef struct _bt_dev { /** device name */ char name[DEV_NAME_LEN]; /** card pointer */ @@ -324,8 +322,7 @@ typedef struct _bt_dev u32 sdio_pull_cfg; } bt_dev_t, *pbt_dev_t; -typedef struct _bt_adapter -{ +typedef struct _bt_adapter { /** Chip revision ID */ u8 chip_rev; /** Surprise removed flag */ @@ -377,8 +374,7 @@ typedef struct _bt_adapter /** Length of prov name */ #define PROC_NAME_LEN 32 -struct item_data -{ +struct item_data { /** Name */ char name[PROC_NAME_LEN]; /** Size */ @@ -391,8 +387,7 @@ struct item_data u32 flag; }; -struct proc_private_data -{ +struct proc_private_data { /** Name */ char name[PROC_NAME_LEN]; /** File flag */ @@ -409,8 +404,7 @@ struct proc_private_data const struct file_operations *fops; }; -struct device_proc -{ +struct device_proc { /** Proc directory entry */ struct proc_dir_entry *proc_entry; /** num of proc files */ @@ -420,8 +414,7 @@ struct device_proc }; /** Private structure for the MV device */ -typedef struct _bt_private -{ +typedef struct _bt_private { /** Bluetooth device */ bt_dev_t bt_dev; /** Adapter */ @@ -573,8 +566,7 @@ int fm_set_intr_mask(bt_private * priv, u32 mask); /** default idle time */ #define DEFAULT_IDLE_TIME 1000 -typedef struct _BT_CMD -{ +typedef struct _BT_CMD { /** OCF OGF */ u16 ocf_ogf; /** Length */ @@ -583,8 +575,7 @@ typedef struct _BT_CMD u8 data[32]; } __ATTRIB_PACK__ BT_CMD; -typedef struct _BT_EVENT -{ +typedef struct _BT_EVENT { /** Event Counter */ u8 EC; /** Length */ @@ -667,8 +658,7 @@ int sd_download_firmware_w_helper(bt_private * priv); /** Bluetooth command : BLE deepsleep */ #define BT_CMD_BLE_DEEP_SLEEP 0x8b -typedef struct _BT_BLE_CMD -{ +typedef struct _BT_BLE_CMD { /** OCF OGF */ u16 ocf_ogf; /** Length */ @@ -677,8 +667,7 @@ typedef struct _BT_BLE_CMD u8 deepsleep; } __ATTRIB_PACK__ BT_BLE_CMD; -typedef struct _BT_CSU_CMD -{ +typedef struct _BT_CSU_CMD { /** OCF OGF */ u16 ocf_ogf; /** Length */ @@ -702,8 +691,7 @@ int bt_load_cal_data(bt_private * priv, u8 * config_data, u8 * mac); /** BT set user defined calibration data */ int bt_cal_config(bt_private * priv, char *cfg_file, char *mac); -typedef struct _BT_HCI_CMD -{ +typedef struct _BT_HCI_CMD { /** OCF OGF */ u16 ocf_ogf; /** Length */ diff --git a/drivers/bluetooth/sd8797/bt/bt_main.c b/drivers/bluetooth/sd8797/bt/bt_main.c index 078f91ba8d52..6c5f26561381 100644 --- a/drivers/bluetooth/sd8797/bt/bt_main.c +++ b/drivers/bluetooth/sd8797/bt/bt_main.c @@ -209,6 +209,7 @@ free_m_dev(struct m_dev *m_dev) { ENTER(); kfree(m_dev->dev_pointer); + m_dev->dev_pointer = NULL; LEAVE(); } @@ -1745,6 +1746,7 @@ sbi_register_conf_dpc(bt_private * priv) "mbtchar%d", mbtchar_minor); snprintf(dev_file, sizeof(dev_file), "/dev/%s", mbt_dev->name); mbtchar_minor++; + PRINTM(MSG, "BT: Create %s\n", dev_file); /** create BT char device node */ register_char_dev(char_dev, chardev_class, MODULE_NAME, @@ -1802,6 +1804,7 @@ sbi_register_conf_dpc(bt_private * priv) snprintf(fm_dev->name, sizeof(fm_dev->name), "mfmchar%d", fmchar_minor); snprintf(dev_file, sizeof(dev_file), "/dev/%s", fm_dev->name); + PRINTM(MSG, "BT: Create %s\n", dev_file); fmchar_minor++; /** register char dev */ @@ -1857,6 +1860,7 @@ sbi_register_conf_dpc(bt_private * priv) snprintf(nfc_dev->name, sizeof(nfc_dev->name), "mnfcchar%d", nfcchar_minor); snprintf(dev_file, sizeof(dev_file), "/dev/%s", nfc_dev->name); + PRINTM(MSG, "BT: Create %s\n", dev_file); nfcchar_minor++; /** register char dev */ @@ -2050,6 +2054,7 @@ bt_add_card(void *card) return priv; err_init_fw: + bt_proc_remove(priv); PRINTM(INFO, "Unregister device\n"); sbi_unregister_dev(priv); err_registerdev: @@ -2110,6 +2115,7 @@ bt_remove_card(void *card) if (m_dev->spec_type == IANYWHERE_SPEC) { if ((drv_mode & DRV_MODE_BT) && (mbtchar_minor > 0)) mbtchar_minor--; + m_dev->close(m_dev); for (i = 0; i < 3; i++) kfree_skb(((struct mbt_dev *) (m_dev->dev_pointer))-> @@ -2124,7 +2130,8 @@ bt_remove_card(void *card) m_dev = &(priv->bt_dev.m_dev[FM_SEQ]); if ((drv_mode & DRV_MODE_FM) && (fmchar_minor > 0)) fmchar_minor--; - /** unregister m_dev to char_dev */ + m_dev->close(m_dev); + /** unregister m_dev to char_dev */ if (chardev_class) chardev_cleanup_one(m_dev, chardev_class); free_m_dev(m_dev); @@ -2133,6 +2140,7 @@ bt_remove_card(void *card) m_dev = &(priv->bt_dev.m_dev[NFC_SEQ]); if ((drv_mode & DRV_MODE_NFC) && (nfcchar_minor > 0)) nfcchar_minor--; + m_dev->close(m_dev); /** unregister m_dev to char_dev */ if (chardev_class) chardev_cleanup_one(m_dev, chardev_class); @@ -2286,11 +2294,11 @@ bt_init_module(void) { int ret = BT_STATUS_SUCCESS; ENTER(); + PRINTM(MSG, "BT: Loading driver\n"); + bt_root_proc_init(); - if (ret) - goto done; - /** create char device class */ + /** create char device class */ chardev_class = class_create(THIS_MODULE, MODULE_NAME); if (IS_ERR(chardev_class)) { PRINTM(ERROR, "Unable to allocate class\n"); @@ -2301,10 +2309,16 @@ bt_init_module(void) bt_add_dev(); if (sbi_register() == NULL) { + bt_root_proc_remove(); ret = BT_STATUS_FAILURE; goto done; } done: + if (ret) + PRINTM(MSG, "BT: Driver loading failed\n"); + else + PRINTM(MSG, "BT: Driver loaded successfully\n"); + LEAVE(); return ret; } @@ -2318,13 +2332,13 @@ static void bt_exit_module(void) { ENTER(); - printk(KERN_ERR "+++++ enter func bt_exit_module() +++++\n"); - + PRINTM(MSG, "BT: Unloading driver\n"); sbi_unregister(); bt_root_proc_remove(); bt_del_dev(); class_destroy(chardev_class); + PRINTM(MSG, "BT: Driver unloaded\n"); LEAVE(); } diff --git a/drivers/bluetooth/sd8797/bt/bt_proc.c b/drivers/bluetooth/sd8797/bt/bt_proc.c index 7922abe37d7b..08ebd6522397 100644 --- a/drivers/bluetooth/sd8797/bt/bt_proc.c +++ b/drivers/bluetooth/sd8797/bt/bt_proc.c @@ -40,8 +40,7 @@ static struct proc_dir_entry *proc_mbt = NULL; static bt_private *bpriv = NULL; static char cmd52_string[CMD52_STR_LEN]; -struct proc_data -{ +struct proc_data { /** Read length */ int rdlen; /** Read buffer */ @@ -618,14 +617,13 @@ bt_proc_remove(bt_private * priv) PRINTM(INFO, "BT: Remove Proc Interface\n"); if (proc_mbt) { for (i = 0; i < MAX_RADIO_FUNC; i++) { - if (priv->dev_proc[i].proc_entry) { - for (j = 0; - j < - sizeof(proc_files) / sizeof(proc_files[0]); - j++) - remove_proc_entry(proc_files[j].name, - priv->dev_proc[i]. - proc_entry); + if (!priv->dev_proc[i].proc_entry) + continue; + for (j = 0; + j < sizeof(proc_files) / sizeof(proc_files[0]); + j++) { + remove_proc_entry(proc_files[j].name, + priv->dev_proc[i].proc_entry); } if (priv->dev_proc[i].proc_entry) { remove_proc_entry(priv->bt_dev.m_dev[i].name, diff --git a/drivers/bluetooth/sd8797/bt/bt_sdio.h b/drivers/bluetooth/sd8797/bt/bt_sdio.h index c8ec246be10c..c8428ec56347 100644 --- a/drivers/bluetooth/sd8797/bt/bt_sdio.h +++ b/drivers/bluetooth/sd8797/bt/bt_sdio.h @@ -223,8 +223,7 @@ typedef IRQ_RET_TYPE(*isr_notifier_fn_t) (s32 irq, void *dev_id, /** Chip Id Register 1 */ #define CARD_CHIP_ID_1_REG 0x801d -struct sdio_mmc_card -{ +struct sdio_mmc_card { /** sdio_func structure pointer */ struct sdio_func *func; /** bt_private structure pointer */ diff --git a/drivers/bluetooth/sd8797/bt/bt_sdiommc.c b/drivers/bluetooth/sd8797/bt/bt_sdiommc.c index 5cad6bfb0669..293eacb92da8 100644 --- a/drivers/bluetooth/sd8797/bt/bt_sdiommc.c +++ b/drivers/bluetooth/sd8797/bt/bt_sdiommc.c @@ -383,7 +383,7 @@ done: int sd_verify_fw_download(bt_private * priv, int pollnum) { - int ret = BT_STATUS_SUCCESS; + int ret = BT_STATUS_FAILURE; u16 firmwarestat; int tries; @@ -397,16 +397,10 @@ sd_verify_fw_download(bt_private * priv, int pollnum) PRINTM(MSG, "BT FW is active(%d)\n", tries); ret = BT_STATUS_SUCCESS; break; - } else { - mdelay(100); - ret = BT_STATUS_FAILURE; } + mdelay(100); } - if (ret < 0) - goto done; - ret = BT_STATUS_SUCCESS; -done: LEAVE(); return ret; } @@ -640,6 +634,7 @@ sd_request_fw_dpc(const struct firmware *fw_firmware, void *context) PRINTM(ERROR, "BT: sd_init_fw_dpc failed (download fw with nowait: %d). Terminating download\n", req_fw_nowait); + sdio_release_host(card->func); ret = BT_STATUS_FAILURE; goto done; } @@ -648,6 +643,7 @@ sd_request_fw_dpc(const struct firmware *fw_firmware, void *context) if (sd_verify_fw_download(priv, MAX_FIRMWARE_POLL_TRIES)) { PRINTM(ERROR, "BT: FW failed to be active in time!\n"); ret = BT_STATUS_FAILURE; + sdio_release_host(card->func); goto done; } sdio_release_host(card->func); @@ -677,7 +673,6 @@ done: /* For synchronous download cleanup will be done in add_card */ if (!req_fw_nowait) return ret; - sdio_release_host(card->func); PRINTM(INFO, "unregister device\n"); sbi_unregister_dev(priv); ((struct sdio_mmc_card *)card)->priv = NULL; @@ -1678,7 +1673,6 @@ sbi_download_fw(bt_private * priv) if (sd_download_firmware_w_helper(priv)) { PRINTM(INFO, "BT: FW download failed!\n"); ret = BT_STATUS_FAILURE; - goto done; } goto exit; done: @@ -1695,8 +1689,6 @@ err_register: free_m_dev(m_dev_fm); if (m_dev_nfc->dev_pointer) free_m_dev(m_dev_nfc); - if (priv->adapter) - bt_free_adapter(priv); LEAVE(); return ret; } diff --git a/drivers/bluetooth/sd8797/bt/hci_wrapper.h b/drivers/bluetooth/sd8797/bt/hci_wrapper.h index 40545967b93f..849b96e294a7 100644 --- a/drivers/bluetooth/sd8797/bt/hci_wrapper.h +++ b/drivers/bluetooth/sd8797/bt/hci_wrapper.h @@ -51,8 +51,7 @@ #define DEV_NAME_LEN 32 /** Define struct m_dev */ -struct m_dev -{ +struct m_dev { char name[DEV_NAME_LEN]; int index; unsigned long flags; @@ -81,8 +80,7 @@ struct m_dev }; /** Define struct mbt_dev */ -struct mbt_dev -{ +struct mbt_dev { /** maybe could add some private member later */ char name[DEV_NAME_LEN]; unsigned long flags; @@ -103,23 +101,20 @@ struct mbt_dev }; /** Define 'fm' interface specific struct fm_dev */ -struct fm_dev -{ +struct fm_dev { /** maybe could add some private member later */ char name[DEV_NAME_LEN]; unsigned long flags; }; /** Define 'nfc' interface specific struct fm_dev */ -struct nfc_dev -{ +struct nfc_dev { /** maybe could add some private member later */ char name[DEV_NAME_LEN]; unsigned long flags; }; -struct debug_dev -{ +struct debug_dev { /** maybe could add some private member later */ char name[DEV_NAME_LEN]; unsigned long flags; diff --git a/drivers/bluetooth/sd8797/bt/mbt_char.c b/drivers/bluetooth/sd8797/bt/mbt_char.c index 4a17582a903d..293234abf603 100644 --- a/drivers/bluetooth/sd8797/bt/mbt_char.c +++ b/drivers/bluetooth/sd8797/bt/mbt_char.c @@ -178,6 +178,10 @@ chardev_write(struct file * filp, const char *buf, size_t count, loff_t * f_pos) LEAVE(); return -ENXIO; } + if (!test_bit(HCI_UP, &m_dev->flags)) { + LEAVE(); + return -EBUSY; + } nwrite = count; skb = bt_skb_alloc(count, GFP_ATOMIC); if (!skb) { diff --git a/drivers/bluetooth/sd8797/bt/mbt_char.h b/drivers/bluetooth/sd8797/bt/mbt_char.h index 07d617097b2d..3d67202a689f 100644 --- a/drivers/bluetooth/sd8797/bt/mbt_char.h +++ b/drivers/bluetooth/sd8797/bt/mbt_char.h @@ -37,8 +37,7 @@ #define DEBUGCHAR_MINOR_BASE (30) /** Declaration of char_dev struct */ -struct char_dev -{ +struct char_dev { struct list_head list; int minor; int dev_type; diff --git a/drivers/bluetooth/sd8897/bt/bt_drv.h b/drivers/bluetooth/sd8897/bt/bt_drv.h index a0eec3f1e023..6773d34a944c 100644 --- a/drivers/bluetooth/sd8897/bt/bt_drv.h +++ b/drivers/bluetooth/sd8897/bt/bt_drv.h @@ -210,8 +210,7 @@ hexdump(char *prompt, u8 * buf, int len) wait_event_interruptible_timeout(waitq, cond, ((timeout) * HZ / 1000)) #endif -typedef struct -{ +typedef struct { /** Task */ struct task_struct *task; /** Queue */ @@ -273,8 +272,7 @@ os_sched_timeout(u32 millisec) #endif /** Data structure for the Marvell Bluetooth device */ -typedef struct _bt_dev -{ +typedef struct _bt_dev { /** device name */ char name[DEV_NAME_LEN]; /** card pointer */ @@ -324,8 +322,7 @@ typedef struct _bt_dev u32 sdio_pull_cfg; } bt_dev_t, *pbt_dev_t; -typedef struct _bt_adapter -{ +typedef struct _bt_adapter { /** Chip revision ID */ u8 chip_rev; /** Surprise removed flag */ @@ -377,8 +374,7 @@ typedef struct _bt_adapter /** Length of prov name */ #define PROC_NAME_LEN 32 -struct item_data -{ +struct item_data { /** Name */ char name[PROC_NAME_LEN]; /** Size */ @@ -391,8 +387,7 @@ struct item_data u32 flag; }; -struct proc_private_data -{ +struct proc_private_data { /** Name */ char name[PROC_NAME_LEN]; /** File flag */ @@ -409,8 +404,7 @@ struct proc_private_data const struct file_operations *fops; }; -struct device_proc -{ +struct device_proc { /** Proc directory entry */ struct proc_dir_entry *proc_entry; /** num of proc files */ @@ -420,8 +414,7 @@ struct device_proc }; /** Private structure for the MV device */ -typedef struct _bt_private -{ +typedef struct _bt_private { /** Bluetooth device */ bt_dev_t bt_dev; /** Adapter */ @@ -573,8 +566,7 @@ int fm_set_intr_mask(bt_private * priv, u32 mask); /** default idle time */ #define DEFAULT_IDLE_TIME 1000 -typedef struct _BT_CMD -{ +typedef struct _BT_CMD { /** OCF OGF */ u16 ocf_ogf; /** Length */ @@ -583,8 +575,7 @@ typedef struct _BT_CMD u8 data[32]; } __ATTRIB_PACK__ BT_CMD; -typedef struct _BT_EVENT -{ +typedef struct _BT_EVENT { /** Event Counter */ u8 EC; /** Length */ @@ -667,8 +658,7 @@ int sd_download_firmware_w_helper(bt_private * priv); /** Bluetooth command : BLE deepsleep */ #define BT_CMD_BLE_DEEP_SLEEP 0x8b -typedef struct _BT_BLE_CMD -{ +typedef struct _BT_BLE_CMD { /** OCF OGF */ u16 ocf_ogf; /** Length */ @@ -677,8 +667,7 @@ typedef struct _BT_BLE_CMD u8 deepsleep; } __ATTRIB_PACK__ BT_BLE_CMD; -typedef struct _BT_CSU_CMD -{ +typedef struct _BT_CSU_CMD { /** OCF OGF */ u16 ocf_ogf; /** Length */ @@ -702,8 +691,7 @@ int bt_load_cal_data(bt_private * priv, u8 * config_data, u8 * mac); /** BT set user defined calibration data */ int bt_cal_config(bt_private * priv, char *cfg_file, char *mac); -typedef struct _BT_HCI_CMD -{ +typedef struct _BT_HCI_CMD { /** OCF OGF */ u16 ocf_ogf; /** Length */ diff --git a/drivers/bluetooth/sd8897/bt/bt_main.c b/drivers/bluetooth/sd8897/bt/bt_main.c index 566f89ccf3b5..96260f06bf48 100644 --- a/drivers/bluetooth/sd8897/bt/bt_main.c +++ b/drivers/bluetooth/sd8897/bt/bt_main.c @@ -209,6 +209,7 @@ free_m_dev(struct m_dev *m_dev) { ENTER(); kfree(m_dev->dev_pointer); + m_dev->dev_pointer = NULL; LEAVE(); } @@ -1745,6 +1746,7 @@ sbi_register_conf_dpc(bt_private * priv) "mbtchar%d", mbtchar_minor); snprintf(dev_file, sizeof(dev_file), "/dev/%s", mbt_dev->name); mbtchar_minor++; + PRINTM(MSG, "BT: Create %s\n", dev_file); /** create BT char device node */ register_char_dev(char_dev, chardev_class, MODULE_NAME, @@ -1802,6 +1804,7 @@ sbi_register_conf_dpc(bt_private * priv) snprintf(fm_dev->name, sizeof(fm_dev->name), "mfmchar%d", fmchar_minor); snprintf(dev_file, sizeof(dev_file), "/dev/%s", fm_dev->name); + PRINTM(MSG, "BT: Create %s\n", dev_file); fmchar_minor++; /** register char dev */ @@ -1857,6 +1860,7 @@ sbi_register_conf_dpc(bt_private * priv) snprintf(nfc_dev->name, sizeof(nfc_dev->name), "mnfcchar%d", nfcchar_minor); snprintf(dev_file, sizeof(dev_file), "/dev/%s", nfc_dev->name); + PRINTM(MSG, "BT: Create %s\n", dev_file); nfcchar_minor++; /** register char dev */ @@ -2050,6 +2054,7 @@ bt_add_card(void *card) return priv; err_init_fw: + bt_proc_remove(priv); PRINTM(INFO, "Unregister device\n"); sbi_unregister_dev(priv); err_registerdev: @@ -2110,6 +2115,7 @@ bt_remove_card(void *card) if (m_dev->spec_type == IANYWHERE_SPEC) { if ((drv_mode & DRV_MODE_BT) && (mbtchar_minor > 0)) mbtchar_minor--; + m_dev->close(m_dev); for (i = 0; i < 3; i++) kfree_skb(((struct mbt_dev *) (m_dev->dev_pointer))-> @@ -2124,7 +2130,8 @@ bt_remove_card(void *card) m_dev = &(priv->bt_dev.m_dev[FM_SEQ]); if ((drv_mode & DRV_MODE_FM) && (fmchar_minor > 0)) fmchar_minor--; - /** unregister m_dev to char_dev */ + m_dev->close(m_dev); + /** unregister m_dev to char_dev */ if (chardev_class) chardev_cleanup_one(m_dev, chardev_class); free_m_dev(m_dev); @@ -2133,6 +2140,7 @@ bt_remove_card(void *card) m_dev = &(priv->bt_dev.m_dev[NFC_SEQ]); if ((drv_mode & DRV_MODE_NFC) && (nfcchar_minor > 0)) nfcchar_minor--; + m_dev->close(m_dev); /** unregister m_dev to char_dev */ if (chardev_class) chardev_cleanup_one(m_dev, chardev_class); @@ -2286,11 +2294,11 @@ bt_init_module(void) { int ret = BT_STATUS_SUCCESS; ENTER(); + PRINTM(MSG, "BT: Loading driver\n"); + bt_root_proc_init(); - if (ret) - goto done; - /** create char device class */ + /** create char device class */ chardev_class = class_create(THIS_MODULE, MODULE_NAME); if (IS_ERR(chardev_class)) { PRINTM(ERROR, "Unable to allocate class\n"); @@ -2301,10 +2309,16 @@ bt_init_module(void) bt_add_dev(); if (sbi_register() == NULL) { + bt_root_proc_remove(); ret = BT_STATUS_FAILURE; goto done; } done: + if (ret) + PRINTM(MSG, "BT: Driver loading failed\n"); + else + PRINTM(MSG, "BT: Driver loaded successfully\n"); + LEAVE(); return ret; } @@ -2318,13 +2332,13 @@ static void bt_exit_module(void) { ENTER(); - printk(KERN_ERR "+++++ enter func bt_exit_module() +++++\n"); - + PRINTM(MSG, "BT: Unloading driver\n"); sbi_unregister(); bt_root_proc_remove(); bt_del_dev(); class_destroy(chardev_class); + PRINTM(MSG, "BT: Driver unloaded\n"); LEAVE(); } diff --git a/drivers/bluetooth/sd8897/bt/bt_proc.c b/drivers/bluetooth/sd8897/bt/bt_proc.c index 7922abe37d7b..08ebd6522397 100644 --- a/drivers/bluetooth/sd8897/bt/bt_proc.c +++ b/drivers/bluetooth/sd8897/bt/bt_proc.c @@ -40,8 +40,7 @@ static struct proc_dir_entry *proc_mbt = NULL; static bt_private *bpriv = NULL; static char cmd52_string[CMD52_STR_LEN]; -struct proc_data -{ +struct proc_data { /** Read length */ int rdlen; /** Read buffer */ @@ -618,14 +617,13 @@ bt_proc_remove(bt_private * priv) PRINTM(INFO, "BT: Remove Proc Interface\n"); if (proc_mbt) { for (i = 0; i < MAX_RADIO_FUNC; i++) { - if (priv->dev_proc[i].proc_entry) { - for (j = 0; - j < - sizeof(proc_files) / sizeof(proc_files[0]); - j++) - remove_proc_entry(proc_files[j].name, - priv->dev_proc[i]. - proc_entry); + if (!priv->dev_proc[i].proc_entry) + continue; + for (j = 0; + j < sizeof(proc_files) / sizeof(proc_files[0]); + j++) { + remove_proc_entry(proc_files[j].name, + priv->dev_proc[i].proc_entry); } if (priv->dev_proc[i].proc_entry) { remove_proc_entry(priv->bt_dev.m_dev[i].name, diff --git a/drivers/bluetooth/sd8897/bt/bt_sdio.h b/drivers/bluetooth/sd8897/bt/bt_sdio.h index 93809d863e1c..30424ab7b648 100644 --- a/drivers/bluetooth/sd8897/bt/bt_sdio.h +++ b/drivers/bluetooth/sd8897/bt/bt_sdio.h @@ -203,8 +203,7 @@ typedef IRQ_RET_TYPE(*isr_notifier_fn_t) (s32 irq, void *dev_id, /** Host Control Registers : I/O port 2 */ #define IO_PORT_2_REG 0xDA -struct sdio_mmc_card -{ +struct sdio_mmc_card { /** sdio_func structure pointer */ struct sdio_func *func; /** bt_private structure pointer */ diff --git a/drivers/bluetooth/sd8897/bt/bt_sdiommc.c b/drivers/bluetooth/sd8897/bt/bt_sdiommc.c index 766bc5b25b1e..b1c95b00ff11 100644 --- a/drivers/bluetooth/sd8897/bt/bt_sdiommc.c +++ b/drivers/bluetooth/sd8897/bt/bt_sdiommc.c @@ -382,7 +382,7 @@ done: int sd_verify_fw_download(bt_private * priv, int pollnum) { - int ret = BT_STATUS_SUCCESS; + int ret = BT_STATUS_FAILURE; u16 firmwarestat; int tries; @@ -396,16 +396,10 @@ sd_verify_fw_download(bt_private * priv, int pollnum) PRINTM(MSG, "BT FW is active(%d)\n", tries); ret = BT_STATUS_SUCCESS; break; - } else { - mdelay(100); - ret = BT_STATUS_FAILURE; } + mdelay(100); } - if (ret < 0) - goto done; - ret = BT_STATUS_SUCCESS; -done: LEAVE(); return ret; } @@ -639,6 +633,7 @@ sd_request_fw_dpc(const struct firmware *fw_firmware, void *context) PRINTM(ERROR, "BT: sd_init_fw_dpc failed (download fw with nowait: %d). Terminating download\n", req_fw_nowait); + sdio_release_host(card->func); ret = BT_STATUS_FAILURE; goto done; } @@ -647,6 +642,7 @@ sd_request_fw_dpc(const struct firmware *fw_firmware, void *context) if (sd_verify_fw_download(priv, MAX_FIRMWARE_POLL_TRIES)) { PRINTM(ERROR, "BT: FW failed to be active in time!\n"); ret = BT_STATUS_FAILURE; + sdio_release_host(card->func); goto done; } sdio_release_host(card->func); @@ -676,7 +672,6 @@ done: /* For synchronous download cleanup will be done in add_card */ if (!req_fw_nowait) return ret; - sdio_release_host(card->func); PRINTM(INFO, "unregister device\n"); sbi_unregister_dev(priv); ((struct sdio_mmc_card *)card)->priv = NULL; @@ -1671,7 +1666,6 @@ sbi_download_fw(bt_private * priv) if (sd_download_firmware_w_helper(priv)) { PRINTM(INFO, "BT: FW download failed!\n"); ret = BT_STATUS_FAILURE; - goto done; } goto exit; done: @@ -1688,8 +1682,6 @@ err_register: free_m_dev(m_dev_fm); if (m_dev_nfc->dev_pointer) free_m_dev(m_dev_nfc); - if (priv->adapter) - bt_free_adapter(priv); LEAVE(); return ret; } diff --git a/drivers/bluetooth/sd8897/bt/hci_wrapper.h b/drivers/bluetooth/sd8897/bt/hci_wrapper.h index 40545967b93f..849b96e294a7 100644 --- a/drivers/bluetooth/sd8897/bt/hci_wrapper.h +++ b/drivers/bluetooth/sd8897/bt/hci_wrapper.h @@ -51,8 +51,7 @@ #define DEV_NAME_LEN 32 /** Define struct m_dev */ -struct m_dev -{ +struct m_dev { char name[DEV_NAME_LEN]; int index; unsigned long flags; @@ -81,8 +80,7 @@ struct m_dev }; /** Define struct mbt_dev */ -struct mbt_dev -{ +struct mbt_dev { /** maybe could add some private member later */ char name[DEV_NAME_LEN]; unsigned long flags; @@ -103,23 +101,20 @@ struct mbt_dev }; /** Define 'fm' interface specific struct fm_dev */ -struct fm_dev -{ +struct fm_dev { /** maybe could add some private member later */ char name[DEV_NAME_LEN]; unsigned long flags; }; /** Define 'nfc' interface specific struct fm_dev */ -struct nfc_dev -{ +struct nfc_dev { /** maybe could add some private member later */ char name[DEV_NAME_LEN]; unsigned long flags; }; -struct debug_dev -{ +struct debug_dev { /** maybe could add some private member later */ char name[DEV_NAME_LEN]; unsigned long flags; diff --git a/drivers/bluetooth/sd8897/bt/mbt_char.c b/drivers/bluetooth/sd8897/bt/mbt_char.c index 4a17582a903d..293234abf603 100644 --- a/drivers/bluetooth/sd8897/bt/mbt_char.c +++ b/drivers/bluetooth/sd8897/bt/mbt_char.c @@ -178,6 +178,10 @@ chardev_write(struct file * filp, const char *buf, size_t count, loff_t * f_pos) LEAVE(); return -ENXIO; } + if (!test_bit(HCI_UP, &m_dev->flags)) { + LEAVE(); + return -EBUSY; + } nwrite = count; skb = bt_skb_alloc(count, GFP_ATOMIC); if (!skb) { diff --git a/drivers/bluetooth/sd8897/bt/mbt_char.h b/drivers/bluetooth/sd8897/bt/mbt_char.h index 07d617097b2d..3d67202a689f 100644 --- a/drivers/bluetooth/sd8897/bt/mbt_char.h +++ b/drivers/bluetooth/sd8897/bt/mbt_char.h @@ -37,8 +37,7 @@ #define DEBUGCHAR_MINOR_BASE (30) /** Declaration of char_dev struct */ -struct char_dev -{ +struct char_dev { struct list_head list; int minor; int dev_type; |