diag: Add missing fixes for diag sdio bridge
Due to separate branches for Fusion targets, some fixes
for SDIO layer were missing on mainline. This will add the
missing fixes on the mainline.
Change-Id: I56cd617a744ca9d280bac50370dc9aba11958fdf
Signed-off-by: Shalabh Jain <shalabhj@codeaurora.org>
diff --git a/drivers/char/diag/diagfwd_sdio.c b/drivers/char/diag/diagfwd_sdio.c
index f3873aa..a145c06 100644
--- a/drivers/char/diag/diagfwd_sdio.c
+++ b/drivers/char/diag/diagfwd_sdio.c
@@ -54,6 +54,13 @@
else {
APPEND_DEBUG('i');
sdio_read(driver->sdio_ch, buf, r);
+ if (((!driver->usb_connected) && (driver->
+ logging_mode == USB_MODE)) || (driver->
+ logging_mode == NO_LOGGING_MODE)) {
+ /* Drop the diag payload */
+ driver->in_busy_sdio = 0;
+ return;
+ }
APPEND_DEBUG('j');
driver->write_ptr_mdm->length = r;
driver->in_busy_sdio = 1;
@@ -149,8 +156,13 @@
void diag_read_mdm_work_fn(struct work_struct *work)
{
if (driver->sdio_ch) {
- wait_event_interruptible(driver->wait_q, (sdio_write_avail
- (driver->sdio_ch) >= driver->read_len_mdm));
+ wait_event_interruptible(driver->wait_q, ((sdio_write_avail
+ (driver->sdio_ch) >= driver->read_len_mdm) ||
+ !(driver->sdio_ch)));
+ if (!(driver->sdio_ch)) {
+ pr_alert("diag: sdio channel not valid");
+ return;
+ }
if (driver->sdio_ch && driver->usb_buf_mdm_out &&
(driver->read_len_mdm > 0))
sdio_write(driver->sdio_ch, driver->usb_buf_mdm_out,
@@ -181,15 +193,10 @@
static int diag_sdio_remove(struct platform_device *pdev)
{
- queue_work(driver->diag_sdio_wq, &(driver->diag_remove_sdio_work));
- return 0;
-}
-
-static void diag_remove_sdio_work_fn(struct work_struct *work)
-{
- pr_debug("diag: sdio remove called\n");
- /*Disable SDIO channel to prevent further read/write */
+ pr_debug("\n diag: sdio remove called");
+ /* Disable SDIO channel to prevent further read/write */
driver->sdio_ch = NULL;
+ return 0;
}
static int diagfwd_sdio_runtime_suspend(struct device *dev)
@@ -253,7 +260,6 @@
INIT_WORK(&(driver->diag_read_mdm_work), diag_read_mdm_work_fn);
#endif
INIT_WORK(&(driver->diag_read_sdio_work), diag_read_sdio_work_fn);
- INIT_WORK(&(driver->diag_remove_sdio_work), diag_remove_sdio_work_fn);
INIT_WORK(&(driver->diag_close_sdio_work), diag_close_sdio_work_fn);
ret = platform_driver_register(&msm_sdio_ch_driver);
if (ret)