summaryrefslogtreecommitdiff
path: root/drivers/bluetooth
diff options
context:
space:
mode:
authorMarc Yang <yangyang@marvell.com>2013-07-10 12:02:37 -0700
committerDan Willemsen <dwillemsen@nvidia.com>2013-09-14 13:32:47 -0700
commitc3f5d3bc6a022ab864a777ae6615cda375023ada (patch)
tree0c0d3009eb51d187ddc44542f23f9e6f463c7654 /drivers/bluetooth
parent86d22782be29c8f33a2824259635e8f7ad9d1478 (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.h36
-rw-r--r--drivers/bluetooth/sd8797/bt/bt_main.c26
-rw-r--r--drivers/bluetooth/sd8797/bt/bt_proc.c18
-rw-r--r--drivers/bluetooth/sd8797/bt/bt_sdio.h3
-rw-r--r--drivers/bluetooth/sd8797/bt/bt_sdiommc.c16
-rw-r--r--drivers/bluetooth/sd8797/bt/hci_wrapper.h15
-rw-r--r--drivers/bluetooth/sd8797/bt/mbt_char.c4
-rw-r--r--drivers/bluetooth/sd8797/bt/mbt_char.h3
-rw-r--r--drivers/bluetooth/sd8897/bt/bt_drv.h36
-rw-r--r--drivers/bluetooth/sd8897/bt/bt_main.c26
-rw-r--r--drivers/bluetooth/sd8897/bt/bt_proc.c18
-rw-r--r--drivers/bluetooth/sd8897/bt/bt_sdio.h3
-rw-r--r--drivers/bluetooth/sd8897/bt/bt_sdiommc.c16
-rw-r--r--drivers/bluetooth/sd8897/bt/hci_wrapper.h15
-rw-r--r--drivers/bluetooth/sd8897/bt/mbt_char.c4
-rw-r--r--drivers/bluetooth/sd8897/bt/mbt_char.h3
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;