Return-path: Received: from s15283307.onlinehome-server.info ([87.106.208.187]:53122 "EHLO mail.holtmann.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751225Ab3IURA7 convert rfc822-to-8bit (ORCPT ); Sat, 21 Sep 2013 13:00:59 -0400 Content-Type: text/plain; charset=us-ascii Mime-Version: 1.0 (Mac OS X Mail 6.6 \(1510\)) Subject: Re: [PATCH v5 1/2] Bluetooth: btmrvl: add setup handler From: Marcel Holtmann In-Reply-To: <1379715667-22424-1-git-send-email-bzhao@marvell.com> Date: Sat, 21 Sep 2013 12:00:38 -0500 Cc: , Gustavo Padovan , Johan Hedberg , , Mike Frysinger , Hyuckjoo Lee , Amitkumar Karwar Message-Id: <18678858-E711-43E5-AFE6-E637D1CECFFB@holtmann.org> (sfid-20130921_190119_650691_B488F797) References: <1379715667-22424-1-git-send-email-bzhao@marvell.com> To: Bing Zhao Sender: linux-wireless-owner@vger.kernel.org List-ID: Hi Bing, > Move initialization code to hdev's setup handler. New flag > setup_done is added to make sure that initialization is done only > during driver load time. Our firmware doesn't expect > re-initialization later when interface is re-enabled. > > Signed-off-by: Amitkumar Karwar > Signed-off-by: Bing Zhao > --- > v5: make use of hdev's setup handler (Marcel Holtmann) > > drivers/bluetooth/btmrvl_drv.h | 1 + > drivers/bluetooth/btmrvl_main.c | 23 +++++++++++++++++++++-- > drivers/bluetooth/btmrvl_sdio.c | 6 ------ > 3 files changed, 22 insertions(+), 8 deletions(-) > > diff --git a/drivers/bluetooth/btmrvl_drv.h b/drivers/bluetooth/btmrvl_drv.h > index 27068d1..e776b8b 100644 > --- a/drivers/bluetooth/btmrvl_drv.h > +++ b/drivers/bluetooth/btmrvl_drv.h > @@ -68,6 +68,7 @@ struct btmrvl_adapter { > wait_queue_head_t cmd_wait_q; > u8 cmd_complete; > bool is_suspended; > + bool setup_done; > }; > > struct btmrvl_private { > diff --git a/drivers/bluetooth/btmrvl_main.c b/drivers/bluetooth/btmrvl_main.c > index 9a9f518..e352f8e 100644 > --- a/drivers/bluetooth/btmrvl_main.c > +++ b/drivers/bluetooth/btmrvl_main.c > @@ -479,6 +479,27 @@ static int btmrvl_open(struct hci_dev *hdev) > return 0; > } > > +static int btmrvl_setup(struct hci_dev *hdev) > +{ > + struct btmrvl_private *priv = hci_get_drvdata(hdev); > + struct btmrvl_adapter *adapter = priv->adapter; > + > + if (adapter->setup_done) > + return 0; > + > + btmrvl_send_module_cfg_cmd(priv, MODULE_BRINGUP_REQ); > + > + priv->btmrvl_dev.psmode = 1; > + btmrvl_enable_ps(priv); > + > + priv->btmrvl_dev.gpio_gap = 0xffff; > + btmrvl_send_hscfg_cmd(priv); > + > + adapter->setup_done = true; > + > + return 0; > +} > + > /* > * This function handles the event generated by firmware, rx data > * received from firmware, and tx data sent from kernel. > @@ -572,8 +592,7 @@ int btmrvl_register_hdev(struct btmrvl_private *priv) > hdev->flush = btmrvl_flush; > hdev->send = btmrvl_send_frame; > hdev->ioctl = btmrvl_ioctl; > - > - btmrvl_send_module_cfg_cmd(priv, MODULE_BRINGUP_REQ); > + hdev->setup = btmrvl_setup; just to make sure you guys understand how ->setup() works. It is only called once. Bringing the adapter down and up again does not call ->setup() a second time. So do you guys need this setup_done variable and if so, then you need to be a bit more verbose and help me understand why. Regards Marcel