RE: [PATCH] libertas sdio: remove CMD_FUNC_INIT call

2013-02-26 Thread Bing Zhao
Hi Daniel,

> > Do you have any concern for OLPC platforms with above change? If it doesn't 
> > seem to break OLPC I
> will send a patch to the list.
> 
> Looks fine to me. Thanks for investigating.

Thanks. I've just sent the patch.

Regards,
Bing
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH] libertas sdio: remove CMD_FUNC_INIT call

2013-02-26 Thread Daniel Drake
On Mon, Feb 25, 2013 at 5:21 PM, Bing Zhao  wrote:
> Do you have any concern for OLPC platforms with above change? If it doesn't 
> seem to break OLPC I will send a patch to the list.

Looks fine to me. Thanks for investigating.

Daniel
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH] libertas sdio: remove CMD_FUNC_INIT call

2013-02-26 Thread Daniel Drake
On Mon, Feb 25, 2013 at 5:21 PM, Bing Zhao bz...@marvell.com wrote:
 Do you have any concern for OLPC platforms with above change? If it doesn't 
 seem to break OLPC I will send a patch to the list.

Looks fine to me. Thanks for investigating.

Daniel
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


RE: [PATCH] libertas sdio: remove CMD_FUNC_INIT call

2013-02-26 Thread Bing Zhao
Hi Daniel,

  Do you have any concern for OLPC platforms with above change? If it doesn't 
  seem to break OLPC I
 will send a patch to the list.
 
 Looks fine to me. Thanks for investigating.

Thanks. I've just sent the patch.

Regards,
Bing
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


RE: [PATCH] libertas sdio: remove CMD_FUNC_INIT call

2013-02-25 Thread Bing Zhao
Hi Daniel,

> > There seems to be a race condition in lbs_thread().
> >
> > At line 582:
> >  582 if (!priv->fw_ready)
> >  583 continue;
> >
> > The fw_ready is 0, so you never get the chance to execute the FUNC_INIT 
> > command.
> >
> >  617 /* Execute the next command */
> >  618 if (!priv->dnld_sent && !priv->cur_cmd)
> >  619 lbs_execute_next_command(priv);
> >
> >
> > Could you try the following change?
> >
> > diff --git a/drivers/net/wireless/libertas/if_sdio.c 
> > b/drivers/net/wireless/libe
> > index 739309e..8f5d977 100644
> > --- a/drivers/net/wireless/libertas/if_sdio.c
> > +++ b/drivers/net/wireless/libertas/if_sdio.c
> > @@ -825,6 +825,8 @@ static void if_sdio_finish_power_on(struct if_sdio_card 
> > *car
> >
> > sdio_release_host(func);
> >
> > +   priv->fw_ready = 1;
> > +
> > /*
> >  * FUNC_INIT is required for SD8688 WLAN/BT multiple functions
> >  */
> > @@ -839,7 +841,6 @@ static void if_sdio_finish_power_on(struct if_sdio_card 
> > *car
> > netdev_alert(priv->dev, "CMD_FUNC_INIT cmd 
> > failed\n");
> > }
> >
> > -   priv->fw_ready = 1;
> > wake_up(>pwron_waitq);
> >
> > if (!card->started) {
> 
> Thank you.
> Everything seem to work fine for me with the patch applied.

Do you have any concern for OLPC platforms with above change? If it doesn't 
seem to break OLPC I will send a patch to the list.

Thanks,
Bing



RE: [PATCH] libertas sdio: remove CMD_FUNC_INIT call

2013-02-25 Thread Bing Zhao
Hi Daniel,

  There seems to be a race condition in lbs_thread().
 
  At line 582:
   582 if (!priv-fw_ready)
   583 continue;
 
  The fw_ready is 0, so you never get the chance to execute the FUNC_INIT 
  command.
 
   617 /* Execute the next command */
   618 if (!priv-dnld_sent  !priv-cur_cmd)
   619 lbs_execute_next_command(priv);
 
 
  Could you try the following change?
 
  diff --git a/drivers/net/wireless/libertas/if_sdio.c 
  b/drivers/net/wireless/libe
  index 739309e..8f5d977 100644
  --- a/drivers/net/wireless/libertas/if_sdio.c
  +++ b/drivers/net/wireless/libertas/if_sdio.c
  @@ -825,6 +825,8 @@ static void if_sdio_finish_power_on(struct if_sdio_card 
  *car
 
  sdio_release_host(func);
 
  +   priv-fw_ready = 1;
  +
  /*
   * FUNC_INIT is required for SD8688 WLAN/BT multiple functions
   */
  @@ -839,7 +841,6 @@ static void if_sdio_finish_power_on(struct if_sdio_card 
  *car
  netdev_alert(priv-dev, CMD_FUNC_INIT cmd 
  failed\n);
  }
 
  -   priv-fw_ready = 1;
  wake_up(card-pwron_waitq);
 
  if (!card-started) {
 
 Thank you.
 Everything seem to work fine for me with the patch applied.

Do you have any concern for OLPC platforms with above change? If it doesn't 
seem to break OLPC I will send a patch to the list.

Thanks,
Bing



RE: [PATCH] libertas sdio: remove CMD_FUNC_INIT call

2013-02-24 Thread Lubomir Rintel
On Wed, 2013-02-20 at 17:59 -0800, Bing Zhao wrote:
> Hi Lubomir,
> 
> > > > @@ -825,20 +825,6 @@ static void if_sdio_finish_power_on(struct 
> > > > if_sdio_card *card)
> > > >
> > > > sdio_release_host(func);
> > > >
> > > > -   /*
> > > > -* FUNC_INIT is required for SD8688 WLAN/BT multiple functions
> > > > -*/
> > > > -   if (card->model == MODEL_8688) {
> > > > -   struct cmd_header cmd;
> > > > -
> > > > -   memset(, 0, sizeof(cmd));
> > > > -
> > > > -   lbs_deb_sdio("send function INIT command\n");
> > > > -   if (__lbs_cmd(priv, CMD_FUNC_INIT, , sizeof(cmd),
> > > > -   lbs_cmd_copyback, (unsigned long) ))
> > > > -   netdev_alert(priv->dev, "CMD_FUNC_INIT cmd 
> > > > failed\n");
> > > > -   }
> > > > -
> > >
> > > Removing FUNC_INIT could break things in some scenarios.
> > > Could you please test the following case?
> > >
> > > 1. insmod liberates -> download firmware, send FUNC_INIT, ...
> > > 2. rmmod libertas -> send FUNC_SHUTDOWN command to firmware; BT is still 
> > > working.
> > > 3. insmod libertas -> skip firmware downloading, send FUNC_INIT, ...
> > >
> > > If FUNC_INIT is removed, I don't expect step 3 to work.
> > 
> > In case btmrvl_sdio is loaded, the driver always locks up in FUNC_INIT
> > upon probe time, thus I'm not able to proceed to further steps.
> > 
> > [  209.338953] [] (__schedule+0x610/0x764) from [] 
> > (__lbs_cmd+0xb8/0x130
> > [libertas])
> > [  209.348340] [] (__lbs_cmd+0xb8/0x130 [libertas]) from 
> > []
> > (if_sdio_finish_power_on+0xec/0x1b0 [libertas_sdio])
> > [  209.360136] [] (if_sdio_finish_power_on+0xec/0x1b0 
> > [libertas_sdio]) from []
> > (if_sdio_power_on+0x18c/0x20c [libertas_sdio])
> > [  209.373052] [] (if_sdio_power_on+0x18c/0x20c [libertas_sdio]) 
> > from []
> > (if_sdio_probe+0x200/0x31c [libertas_sdio])
> > [  209.385316] [] (if_sdio_probe+0x200/0x31c [libertas_sdio]) 
> > from []
> > (sdio_bus_probe+0x94/0xfc [mmc_core])
> > [  209.396748] [] (sdio_bus_probe+0x94/0xfc [mmc_core]) from 
> > []
> > (driver_probe_device+0x12c/0x348)
> > [  209.407214] [] (driver_probe_device+0x12c/0x348) from 
> > []
> > (__driver_attach+0x78/0x9c)
> > [  209.416798] [] (__driver_attach+0x78/0x9c) from [] 
> > (bus_for_each_dev+0x50/0x88)
> > [  209.425946] [] (bus_for_each_dev+0x50/0x88) from []
> > (bus_add_driver+0x108/0x268)
> > [  209.435180] [] (bus_add_driver+0x108/0x268) from []
> > (driver_register+0xa4/0x134)
> > [  209.26] [] (driver_register+0xa4/0x134) from []
> > (if_sdio_init_module+0x1c/0x3c [libertas_sdio])
> > [  209.455339] [] (if_sdio_init_module+0x1c/0x3c [libertas_sdio]) 
> > from []
> > (do_one_initcall+0x98/0x174)
> > [  209.466236] [] (do_one_initcall+0x98/0x174) from [] 
> > (load_module+0x1c5c/0x1f80)
> > [  209.475390] [] (load_module+0x1c5c/0x1f80) from []
> > (sys_init_module+0x104/0x128)
> > [  209.484632] [] (sys_init_module+0x104/0x128) from []
> > (ret_fast_syscall+0x0/0x38)
> > 
> > In case btmrvl_sdio is _not_ loaded, insmod returns, but driver locks up
> > waiting for FUNC_INIT to finish:
> > 
> > [  300.538859] [] (__schedule+0x610/0x764) from [] 
> > (__lbs_cmd+0xb8/0x130
> > [libertas])
> > [  300.548600] [] (__lbs_cmd+0xb8/0x130 [libertas]) from 
> > []
> > (if_sdio_finish_power_on+0xec/0x1b0 [libertas_sdio])
> > [  300.560398] [] (if_sdio_finish_power_on+0xec/0x1b0 
> > [libertas_sdio]) from []
> > (if_sdio_do_prog_firmware+0x414/0x454 [libertas_sdio])
> > [  300.574052] [] (if_sdio_do_prog_firmware+0x414/0x454 
> > [libertas_sdio]) from []
> > (lbs_fw_loaded+0x24/0x58 [libertas])
> > [  300.586907] [] (lbs_fw_loaded+0x24/0x58 [libertas]) from 
> > []
> > (request_firmware_work_func+0xb0/0xf4)
> > [  300.597746] [] (request_firmware_work_func+0xb0/0xf4) from 
> > []
> > (process_one_work+0x348/0x6a8)
> > [  300.608288] [] (process_one_work+0x348/0x6a8) from []
> > (worker_thread+0x268/0x390)
> > [  300.617630] [] (worker_thread+0x268/0x390) from [] 
> > (kthread+0xc0/0xd4)
> > [  300.625947] [] (kthread+0xc0/0xd4) from [] 
> > (ret_from_fork+0x14/0x20)
> > [  300.634135] 2 locks held by kworker/0:1/19:
> > [  300.638383]  #0:  (events){.+.+.+}, at: [] 
> > process_one_work+0x208/0x6a8
> > [  300.646512]  #1:  ((_work->work)){+.+.+.}, at: [] 
> > process_one_work+0x208/0x6a8
> 
> There seems to be a race condition in lbs_thread().
> 
> At line 582:
>  582 if (!priv->fw_ready)
>  583 continue;
> 
> The fw_ready is 0, so you never get the chance to execute the FUNC_INIT 
> command.
> 
>  617 /* Execute the next command */
>  618 if (!priv->dnld_sent && !priv->cur_cmd)
>  619 lbs_execute_next_command(priv);
> 
> 
> Could you try the following change?
> 
> diff --git a/drivers/net/wireless/libertas/if_sdio.c 
> b/drivers/net/wireless/libe
> index 739309e..8f5d977 100644
> --- 

RE: [PATCH] libertas sdio: remove CMD_FUNC_INIT call

2013-02-24 Thread Lubomir Rintel
On Wed, 2013-02-20 at 17:59 -0800, Bing Zhao wrote:
 Hi Lubomir,
 
@@ -825,20 +825,6 @@ static void if_sdio_finish_power_on(struct 
if_sdio_card *card)
   
sdio_release_host(func);
   
-   /*
-* FUNC_INIT is required for SD8688 WLAN/BT multiple functions
-*/
-   if (card-model == MODEL_8688) {
-   struct cmd_header cmd;
-
-   memset(cmd, 0, sizeof(cmd));
-
-   lbs_deb_sdio(send function INIT command\n);
-   if (__lbs_cmd(priv, CMD_FUNC_INIT, cmd, sizeof(cmd),
-   lbs_cmd_copyback, (unsigned long) cmd))
-   netdev_alert(priv-dev, CMD_FUNC_INIT cmd 
failed\n);
-   }
-
  
   Removing FUNC_INIT could break things in some scenarios.
   Could you please test the following case?
  
   1. insmod liberates - download firmware, send FUNC_INIT, ...
   2. rmmod libertas - send FUNC_SHUTDOWN command to firmware; BT is still 
   working.
   3. insmod libertas - skip firmware downloading, send FUNC_INIT, ...
  
   If FUNC_INIT is removed, I don't expect step 3 to work.
  
  In case btmrvl_sdio is loaded, the driver always locks up in FUNC_INIT
  upon probe time, thus I'm not able to proceed to further steps.
  
  [  209.338953] [c0502248] (__schedule+0x610/0x764) from [bf20ae24] 
  (__lbs_cmd+0xb8/0x130
  [libertas])
  [  209.348340] [bf20ae24] (__lbs_cmd+0xb8/0x130 [libertas]) from 
  [bf222474]
  (if_sdio_finish_power_on+0xec/0x1b0 [libertas_sdio])
  [  209.360136] [bf222474] (if_sdio_finish_power_on+0xec/0x1b0 
  [libertas_sdio]) from [bf2226c4]
  (if_sdio_power_on+0x18c/0x20c [libertas_sdio])
  [  209.373052] [bf2226c4] (if_sdio_power_on+0x18c/0x20c [libertas_sdio]) 
  from [bf222944]
  (if_sdio_probe+0x200/0x31c [libertas_sdio])
  [  209.385316] [bf222944] (if_sdio_probe+0x200/0x31c [libertas_sdio]) 
  from [bf01d820]
  (sdio_bus_probe+0x94/0xfc [mmc_core])
  [  209.396748] [bf01d820] (sdio_bus_probe+0x94/0xfc [mmc_core]) from 
  [c02e729c]
  (driver_probe_device+0x12c/0x348)
  [  209.407214] [c02e729c] (driver_probe_device+0x12c/0x348) from 
  [c02e7530]
  (__driver_attach+0x78/0x9c)
  [  209.416798] [c02e7530] (__driver_attach+0x78/0x9c) from [c02e5658] 
  (bus_for_each_dev+0x50/0x88)
  [  209.425946] [c02e5658] (bus_for_each_dev+0x50/0x88) from [c02e6810]
  (bus_add_driver+0x108/0x268)
  [  209.435180] [c02e6810] (bus_add_driver+0x108/0x268) from [c02e782c]
  (driver_register+0xa4/0x134)
  [  209.26] [c02e782c] (driver_register+0xa4/0x134) from [bf22601c]
  (if_sdio_init_module+0x1c/0x3c [libertas_sdio])
  [  209.455339] [bf22601c] (if_sdio_init_module+0x1c/0x3c [libertas_sdio]) 
  from [c00085b8]
  (do_one_initcall+0x98/0x174)
  [  209.466236] [c00085b8] (do_one_initcall+0x98/0x174) from [c0076504] 
  (load_module+0x1c5c/0x1f80)
  [  209.475390] [c0076504] (load_module+0x1c5c/0x1f80) from [c007692c]
  (sys_init_module+0x104/0x128)
  [  209.484632] [c007692c] (sys_init_module+0x104/0x128) from [c0008c40]
  (ret_fast_syscall+0x0/0x38)
  
  In case btmrvl_sdio is _not_ loaded, insmod returns, but driver locks up
  waiting for FUNC_INIT to finish:
  
  [  300.538859] [c0502248] (__schedule+0x610/0x764) from [bf1fae24] 
  (__lbs_cmd+0xb8/0x130
  [libertas])
  [  300.548600] [bf1fae24] (__lbs_cmd+0xb8/0x130 [libertas]) from 
  [bf212474]
  (if_sdio_finish_power_on+0xec/0x1b0 [libertas_sdio])
  [  300.560398] [bf212474] (if_sdio_finish_power_on+0xec/0x1b0 
  [libertas_sdio]) from [bf213230]
  (if_sdio_do_prog_firmware+0x414/0x454 [libertas_sdio])
  [  300.574052] [bf213230] (if_sdio_do_prog_firmware+0x414/0x454 
  [libertas_sdio]) from [bf1fffbc]
  (lbs_fw_loaded+0x24/0x58 [libertas])
  [  300.586907] [bf1fffbc] (lbs_fw_loaded+0x24/0x58 [libertas]) from 
  [c02f02c0]
  (request_firmware_work_func+0xb0/0xf4)
  [  300.597746] [c02f02c0] (request_firmware_work_func+0xb0/0xf4) from 
  [c003ae0c]
  (process_one_work+0x348/0x6a8)
  [  300.608288] [c003ae0c] (process_one_work+0x348/0x6a8) from [c003b408]
  (worker_thread+0x268/0x390)
  [  300.617630] [c003b408] (worker_thread+0x268/0x390) from [c00414b0] 
  (kthread+0xc0/0xd4)
  [  300.625947] [c00414b0] (kthread+0xc0/0xd4) from [c0008ce8] 
  (ret_from_fork+0x14/0x20)
  [  300.634135] 2 locks held by kworker/0:1/19:
  [  300.638383]  #0:  (events){.+.+.+}, at: [c003accc] 
  process_one_work+0x208/0x6a8
  [  300.646512]  #1:  ((fw_work-work)){+.+.+.}, at: [c003accc] 
  process_one_work+0x208/0x6a8
 
 There seems to be a race condition in lbs_thread().
 
 At line 582:
  582 if (!priv-fw_ready)
  583 continue;
 
 The fw_ready is 0, so you never get the chance to execute the FUNC_INIT 
 command.
 
  617 /* Execute the next command */
  618 if (!priv-dnld_sent  !priv-cur_cmd)
  619 lbs_execute_next_command(priv);
 
 
 Could you try the following change?
 
 diff --git 

RE: [PATCH] libertas sdio: remove CMD_FUNC_INIT call

2013-02-20 Thread Bing Zhao
Hi Lubomir,

> > > @@ -825,20 +825,6 @@ static void if_sdio_finish_power_on(struct 
> > > if_sdio_card *card)
> > >
> > >   sdio_release_host(func);
> > >
> > > - /*
> > > -  * FUNC_INIT is required for SD8688 WLAN/BT multiple functions
> > > -  */
> > > - if (card->model == MODEL_8688) {
> > > - struct cmd_header cmd;
> > > -
> > > - memset(, 0, sizeof(cmd));
> > > -
> > > - lbs_deb_sdio("send function INIT command\n");
> > > - if (__lbs_cmd(priv, CMD_FUNC_INIT, , sizeof(cmd),
> > > - lbs_cmd_copyback, (unsigned long) ))
> > > - netdev_alert(priv->dev, "CMD_FUNC_INIT cmd failed\n");
> > > - }
> > > -
> >
> > Removing FUNC_INIT could break things in some scenarios.
> > Could you please test the following case?
> >
> > 1. insmod liberates -> download firmware, send FUNC_INIT, ...
> > 2. rmmod libertas -> send FUNC_SHUTDOWN command to firmware; BT is still 
> > working.
> > 3. insmod libertas -> skip firmware downloading, send FUNC_INIT, ...
> >
> > If FUNC_INIT is removed, I don't expect step 3 to work.
> 
> In case btmrvl_sdio is loaded, the driver always locks up in FUNC_INIT
> upon probe time, thus I'm not able to proceed to further steps.
> 
> [  209.338953] [] (__schedule+0x610/0x764) from [] 
> (__lbs_cmd+0xb8/0x130
> [libertas])
> [  209.348340] [] (__lbs_cmd+0xb8/0x130 [libertas]) from 
> []
> (if_sdio_finish_power_on+0xec/0x1b0 [libertas_sdio])
> [  209.360136] [] (if_sdio_finish_power_on+0xec/0x1b0 
> [libertas_sdio]) from []
> (if_sdio_power_on+0x18c/0x20c [libertas_sdio])
> [  209.373052] [] (if_sdio_power_on+0x18c/0x20c [libertas_sdio]) 
> from []
> (if_sdio_probe+0x200/0x31c [libertas_sdio])
> [  209.385316] [] (if_sdio_probe+0x200/0x31c [libertas_sdio]) from 
> []
> (sdio_bus_probe+0x94/0xfc [mmc_core])
> [  209.396748] [] (sdio_bus_probe+0x94/0xfc [mmc_core]) from 
> []
> (driver_probe_device+0x12c/0x348)
> [  209.407214] [] (driver_probe_device+0x12c/0x348) from 
> []
> (__driver_attach+0x78/0x9c)
> [  209.416798] [] (__driver_attach+0x78/0x9c) from [] 
> (bus_for_each_dev+0x50/0x88)
> [  209.425946] [] (bus_for_each_dev+0x50/0x88) from []
> (bus_add_driver+0x108/0x268)
> [  209.435180] [] (bus_add_driver+0x108/0x268) from []
> (driver_register+0xa4/0x134)
> [  209.26] [] (driver_register+0xa4/0x134) from []
> (if_sdio_init_module+0x1c/0x3c [libertas_sdio])
> [  209.455339] [] (if_sdio_init_module+0x1c/0x3c [libertas_sdio]) 
> from []
> (do_one_initcall+0x98/0x174)
> [  209.466236] [] (do_one_initcall+0x98/0x174) from [] 
> (load_module+0x1c5c/0x1f80)
> [  209.475390] [] (load_module+0x1c5c/0x1f80) from []
> (sys_init_module+0x104/0x128)
> [  209.484632] [] (sys_init_module+0x104/0x128) from []
> (ret_fast_syscall+0x0/0x38)
> 
> In case btmrvl_sdio is _not_ loaded, insmod returns, but driver locks up
> waiting for FUNC_INIT to finish:
> 
> [  300.538859] [] (__schedule+0x610/0x764) from [] 
> (__lbs_cmd+0xb8/0x130
> [libertas])
> [  300.548600] [] (__lbs_cmd+0xb8/0x130 [libertas]) from 
> []
> (if_sdio_finish_power_on+0xec/0x1b0 [libertas_sdio])
> [  300.560398] [] (if_sdio_finish_power_on+0xec/0x1b0 
> [libertas_sdio]) from []
> (if_sdio_do_prog_firmware+0x414/0x454 [libertas_sdio])
> [  300.574052] [] (if_sdio_do_prog_firmware+0x414/0x454 
> [libertas_sdio]) from []
> (lbs_fw_loaded+0x24/0x58 [libertas])
> [  300.586907] [] (lbs_fw_loaded+0x24/0x58 [libertas]) from 
> []
> (request_firmware_work_func+0xb0/0xf4)
> [  300.597746] [] (request_firmware_work_func+0xb0/0xf4) from 
> []
> (process_one_work+0x348/0x6a8)
> [  300.608288] [] (process_one_work+0x348/0x6a8) from []
> (worker_thread+0x268/0x390)
> [  300.617630] [] (worker_thread+0x268/0x390) from [] 
> (kthread+0xc0/0xd4)
> [  300.625947] [] (kthread+0xc0/0xd4) from [] 
> (ret_from_fork+0x14/0x20)
> [  300.634135] 2 locks held by kworker/0:1/19:
> [  300.638383]  #0:  (events){.+.+.+}, at: [] 
> process_one_work+0x208/0x6a8
> [  300.646512]  #1:  ((_work->work)){+.+.+.}, at: [] 
> process_one_work+0x208/0x6a8

There seems to be a race condition in lbs_thread().

At line 582:
 582 if (!priv->fw_ready)
 583 continue;

The fw_ready is 0, so you never get the chance to execute the FUNC_INIT command.

 617 /* Execute the next command */
 618 if (!priv->dnld_sent && !priv->cur_cmd)
 619 lbs_execute_next_command(priv);


Could you try the following change?

diff --git a/drivers/net/wireless/libertas/if_sdio.c b/drivers/net/wireless/libe
index 739309e..8f5d977 100644
--- a/drivers/net/wireless/libertas/if_sdio.c
+++ b/drivers/net/wireless/libertas/if_sdio.c
@@ -825,6 +825,8 @@ static void if_sdio_finish_power_on(struct if_sdio_card *car

sdio_release_host(func);

+   priv->fw_ready = 1;
+
/*
 * FUNC_INIT is required for SD8688 WLAN/BT multiple functions
 */
@@ -839,7 +841,6 @@ static void if_sdio_finish_power_on(struct if_sdio_card *car

RE: [PATCH] libertas sdio: remove CMD_FUNC_INIT call

2013-02-20 Thread Bing Zhao
Hi Lubomir,

   @@ -825,20 +825,6 @@ static void if_sdio_finish_power_on(struct 
   if_sdio_card *card)
  
 sdio_release_host(func);
  
   - /*
   -  * FUNC_INIT is required for SD8688 WLAN/BT multiple functions
   -  */
   - if (card-model == MODEL_8688) {
   - struct cmd_header cmd;
   -
   - memset(cmd, 0, sizeof(cmd));
   -
   - lbs_deb_sdio(send function INIT command\n);
   - if (__lbs_cmd(priv, CMD_FUNC_INIT, cmd, sizeof(cmd),
   - lbs_cmd_copyback, (unsigned long) cmd))
   - netdev_alert(priv-dev, CMD_FUNC_INIT cmd failed\n);
   - }
   -
 
  Removing FUNC_INIT could break things in some scenarios.
  Could you please test the following case?
 
  1. insmod liberates - download firmware, send FUNC_INIT, ...
  2. rmmod libertas - send FUNC_SHUTDOWN command to firmware; BT is still 
  working.
  3. insmod libertas - skip firmware downloading, send FUNC_INIT, ...
 
  If FUNC_INIT is removed, I don't expect step 3 to work.
 
 In case btmrvl_sdio is loaded, the driver always locks up in FUNC_INIT
 upon probe time, thus I'm not able to proceed to further steps.
 
 [  209.338953] [c0502248] (__schedule+0x610/0x764) from [bf20ae24] 
 (__lbs_cmd+0xb8/0x130
 [libertas])
 [  209.348340] [bf20ae24] (__lbs_cmd+0xb8/0x130 [libertas]) from 
 [bf222474]
 (if_sdio_finish_power_on+0xec/0x1b0 [libertas_sdio])
 [  209.360136] [bf222474] (if_sdio_finish_power_on+0xec/0x1b0 
 [libertas_sdio]) from [bf2226c4]
 (if_sdio_power_on+0x18c/0x20c [libertas_sdio])
 [  209.373052] [bf2226c4] (if_sdio_power_on+0x18c/0x20c [libertas_sdio]) 
 from [bf222944]
 (if_sdio_probe+0x200/0x31c [libertas_sdio])
 [  209.385316] [bf222944] (if_sdio_probe+0x200/0x31c [libertas_sdio]) from 
 [bf01d820]
 (sdio_bus_probe+0x94/0xfc [mmc_core])
 [  209.396748] [bf01d820] (sdio_bus_probe+0x94/0xfc [mmc_core]) from 
 [c02e729c]
 (driver_probe_device+0x12c/0x348)
 [  209.407214] [c02e729c] (driver_probe_device+0x12c/0x348) from 
 [c02e7530]
 (__driver_attach+0x78/0x9c)
 [  209.416798] [c02e7530] (__driver_attach+0x78/0x9c) from [c02e5658] 
 (bus_for_each_dev+0x50/0x88)
 [  209.425946] [c02e5658] (bus_for_each_dev+0x50/0x88) from [c02e6810]
 (bus_add_driver+0x108/0x268)
 [  209.435180] [c02e6810] (bus_add_driver+0x108/0x268) from [c02e782c]
 (driver_register+0xa4/0x134)
 [  209.26] [c02e782c] (driver_register+0xa4/0x134) from [bf22601c]
 (if_sdio_init_module+0x1c/0x3c [libertas_sdio])
 [  209.455339] [bf22601c] (if_sdio_init_module+0x1c/0x3c [libertas_sdio]) 
 from [c00085b8]
 (do_one_initcall+0x98/0x174)
 [  209.466236] [c00085b8] (do_one_initcall+0x98/0x174) from [c0076504] 
 (load_module+0x1c5c/0x1f80)
 [  209.475390] [c0076504] (load_module+0x1c5c/0x1f80) from [c007692c]
 (sys_init_module+0x104/0x128)
 [  209.484632] [c007692c] (sys_init_module+0x104/0x128) from [c0008c40]
 (ret_fast_syscall+0x0/0x38)
 
 In case btmrvl_sdio is _not_ loaded, insmod returns, but driver locks up
 waiting for FUNC_INIT to finish:
 
 [  300.538859] [c0502248] (__schedule+0x610/0x764) from [bf1fae24] 
 (__lbs_cmd+0xb8/0x130
 [libertas])
 [  300.548600] [bf1fae24] (__lbs_cmd+0xb8/0x130 [libertas]) from 
 [bf212474]
 (if_sdio_finish_power_on+0xec/0x1b0 [libertas_sdio])
 [  300.560398] [bf212474] (if_sdio_finish_power_on+0xec/0x1b0 
 [libertas_sdio]) from [bf213230]
 (if_sdio_do_prog_firmware+0x414/0x454 [libertas_sdio])
 [  300.574052] [bf213230] (if_sdio_do_prog_firmware+0x414/0x454 
 [libertas_sdio]) from [bf1fffbc]
 (lbs_fw_loaded+0x24/0x58 [libertas])
 [  300.586907] [bf1fffbc] (lbs_fw_loaded+0x24/0x58 [libertas]) from 
 [c02f02c0]
 (request_firmware_work_func+0xb0/0xf4)
 [  300.597746] [c02f02c0] (request_firmware_work_func+0xb0/0xf4) from 
 [c003ae0c]
 (process_one_work+0x348/0x6a8)
 [  300.608288] [c003ae0c] (process_one_work+0x348/0x6a8) from [c003b408]
 (worker_thread+0x268/0x390)
 [  300.617630] [c003b408] (worker_thread+0x268/0x390) from [c00414b0] 
 (kthread+0xc0/0xd4)
 [  300.625947] [c00414b0] (kthread+0xc0/0xd4) from [c0008ce8] 
 (ret_from_fork+0x14/0x20)
 [  300.634135] 2 locks held by kworker/0:1/19:
 [  300.638383]  #0:  (events){.+.+.+}, at: [c003accc] 
 process_one_work+0x208/0x6a8
 [  300.646512]  #1:  ((fw_work-work)){+.+.+.}, at: [c003accc] 
 process_one_work+0x208/0x6a8

There seems to be a race condition in lbs_thread().

At line 582:
 582 if (!priv-fw_ready)
 583 continue;

The fw_ready is 0, so you never get the chance to execute the FUNC_INIT command.

 617 /* Execute the next command */
 618 if (!priv-dnld_sent  !priv-cur_cmd)
 619 lbs_execute_next_command(priv);


Could you try the following change?

diff --git a/drivers/net/wireless/libertas/if_sdio.c b/drivers/net/wireless/libe
index 739309e..8f5d977 100644
--- a/drivers/net/wireless/libertas/if_sdio.c
+++ b/drivers/net/wireless/libertas/if_sdio.c
@@ -825,6 +825,8 @@ static void if_sdio_finish_power_on(struct if_sdio_card 

RE: [PATCH] libertas sdio: remove CMD_FUNC_INIT call

2013-02-18 Thread Lubomir Rintel
On Fri, 2013-01-18 at 12:28 -0800, Bing Zhao wrote:
> Hi Lubomir,
> 
> > It actually times out on a 8688 present in GuruPlug with sd8688.bin
> > (md5=7233401e9687f8c880da547beed4324e) firmware (that's present in
> > linux-firmware tree), but the adapter works fine.
> > 
> > For that firmware times out with libertas_uap [1] as well, though it 
> > succeeds
> > with sd8688_ap.bin (md5=52cd8f8296b9a7e1d3835d57416256b2) that was 
> > originally
> > shipped with GuruPlug. That firmware is not in linux-firmware tree and 
> > btmrvl
> > driver might win the race programming the 8688 with sd8688.bin anyway.
> > 
> > [1] https://github.com/lkundrak/linux/tree/libertas_uap
> > ---
> >  drivers/net/wireless/libertas/if_sdio.c |   14 --
> >  1 files changed, 0 insertions(+), 14 deletions(-)
> > 
> > diff --git a/drivers/net/wireless/libertas/if_sdio.c 
> > b/drivers/net/wireless/libertas/if_sdio.c
> > index 2ecab49..3c4c555 100644
> > --- a/drivers/net/wireless/libertas/if_sdio.c
> > +++ b/drivers/net/wireless/libertas/if_sdio.c
> > @@ -825,20 +825,6 @@ static void if_sdio_finish_power_on(struct 
> > if_sdio_card *card)
> > 
> > sdio_release_host(func);
> > 
> > -   /*
> > -* FUNC_INIT is required for SD8688 WLAN/BT multiple functions
> > -*/
> > -   if (card->model == MODEL_8688) {
> > -   struct cmd_header cmd;
> > -
> > -   memset(, 0, sizeof(cmd));
> > -
> > -   lbs_deb_sdio("send function INIT command\n");
> > -   if (__lbs_cmd(priv, CMD_FUNC_INIT, , sizeof(cmd),
> > -   lbs_cmd_copyback, (unsigned long) ))
> > -   netdev_alert(priv->dev, "CMD_FUNC_INIT cmd failed\n");
> > -   }
> > -
> 
> Removing FUNC_INIT could break things in some scenarios.
> Could you please test the following case?
> 
> 1. insmod liberates -> download firmware, send FUNC_INIT, ...
> 2. rmmod libertas -> send FUNC_SHUTDOWN command to firmware; BT is still 
> working.
> 3. insmod libertas -> skip firmware downloading, send FUNC_INIT, ...
> 
> If FUNC_INIT is removed, I don't expect step 3 to work.

In case btmrvl_sdio is loaded, the driver always locks up in FUNC_INIT
upon probe time, thus I'm not able to proceed to further steps.

[  209.338953] [] (__schedule+0x610/0x764) from [] 
(__lbs_cmd+0xb8/0x130 [libertas])
[  209.348340] [] (__lbs_cmd+0xb8/0x130 [libertas]) from [] 
(if_sdio_finish_power_on+0xec/0x1b0 [libertas_sdio])
[  209.360136] [] (if_sdio_finish_power_on+0xec/0x1b0 
[libertas_sdio]) from [] (if_sdio_power_on+0x18c/0x20c 
[libertas_sdio])
[  209.373052] [] (if_sdio_power_on+0x18c/0x20c [libertas_sdio]) from 
[] (if_sdio_probe+0x200/0x31c [libertas_sdio])
[  209.385316] [] (if_sdio_probe+0x200/0x31c [libertas_sdio]) from 
[] (sdio_bus_probe+0x94/0xfc [mmc_core])
[  209.396748] [] (sdio_bus_probe+0x94/0xfc [mmc_core]) from 
[] (driver_probe_device+0x12c/0x348)
[  209.407214] [] (driver_probe_device+0x12c/0x348) from [] 
(__driver_attach+0x78/0x9c)
[  209.416798] [] (__driver_attach+0x78/0x9c) from [] 
(bus_for_each_dev+0x50/0x88)
[  209.425946] [] (bus_for_each_dev+0x50/0x88) from [] 
(bus_add_driver+0x108/0x268)
[  209.435180] [] (bus_add_driver+0x108/0x268) from [] 
(driver_register+0xa4/0x134)
[  209.26] [] (driver_register+0xa4/0x134) from [] 
(if_sdio_init_module+0x1c/0x3c [libertas_sdio])
[  209.455339] [] (if_sdio_init_module+0x1c/0x3c [libertas_sdio]) 
from [] (do_one_initcall+0x98/0x174)
[  209.466236] [] (do_one_initcall+0x98/0x174) from [] 
(load_module+0x1c5c/0x1f80)
[  209.475390] [] (load_module+0x1c5c/0x1f80) from [] 
(sys_init_module+0x104/0x128)
[  209.484632] [] (sys_init_module+0x104/0x128) from [] 
(ret_fast_syscall+0x0/0x38)

In case btmrvl_sdio is _not_ loaded, insmod returns, but driver locks up
waiting for FUNC_INIT to finish:

[  300.538859] [] (__schedule+0x610/0x764) from [] 
(__lbs_cmd+0xb8/0x130 [libertas])
[  300.548600] [] (__lbs_cmd+0xb8/0x130 [libertas]) from [] 
(if_sdio_finish_power_on+0xec/0x1b0 [libertas_sdio])
[  300.560398] [] (if_sdio_finish_power_on+0xec/0x1b0 
[libertas_sdio]) from [] (if_sdio_do_prog_firmware+0x414/0x454 
[libertas_sdio])
[  300.574052] [] (if_sdio_do_prog_firmware+0x414/0x454 
[libertas_sdio]) from [] (lbs_fw_loaded+0x24/0x58 [libertas])
[  300.586907] [] (lbs_fw_loaded+0x24/0x58 [libertas]) from 
[] (request_firmware_work_func+0xb0/0xf4)
[  300.597746] [] (request_firmware_work_func+0xb0/0xf4) from 
[] (process_one_work+0x348/0x6a8)
[  300.608288] [] (process_one_work+0x348/0x6a8) from [] 
(worker_thread+0x268/0x390)
[  300.617630] [] (worker_thread+0x268/0x390) from [] 
(kthread+0xc0/0xd4)
[  300.625947] [] (kthread+0xc0/0xd4) from [] 
(ret_from_fork+0x14/0x20)
[  300.634135] 2 locks held by kworker/0:1/19:
[  300.638383]  #0:  (events){.+.+.+}, at: [] 
process_one_work+0x208/0x6a8
[  300.646512]  #1:  ((_work->work)){+.+.+.}, at: [] 
process_one_work+0x208/0x6a8

If I remove the FUNC_INIT call, wifi works fine, but bluetooth stops
working after a network scan:


RE: [PATCH] libertas sdio: remove CMD_FUNC_INIT call

2013-02-18 Thread Lubomir Rintel
On Fri, 2013-01-18 at 12:28 -0800, Bing Zhao wrote:
 Hi Lubomir,
 
  It actually times out on a 8688 present in GuruPlug with sd8688.bin
  (md5=7233401e9687f8c880da547beed4324e) firmware (that's present in
  linux-firmware tree), but the adapter works fine.
  
  For that firmware times out with libertas_uap [1] as well, though it 
  succeeds
  with sd8688_ap.bin (md5=52cd8f8296b9a7e1d3835d57416256b2) that was 
  originally
  shipped with GuruPlug. That firmware is not in linux-firmware tree and 
  btmrvl
  driver might win the race programming the 8688 with sd8688.bin anyway.
  
  [1] https://github.com/lkundrak/linux/tree/libertas_uap
  ---
   drivers/net/wireless/libertas/if_sdio.c |   14 --
   1 files changed, 0 insertions(+), 14 deletions(-)
  
  diff --git a/drivers/net/wireless/libertas/if_sdio.c 
  b/drivers/net/wireless/libertas/if_sdio.c
  index 2ecab49..3c4c555 100644
  --- a/drivers/net/wireless/libertas/if_sdio.c
  +++ b/drivers/net/wireless/libertas/if_sdio.c
  @@ -825,20 +825,6 @@ static void if_sdio_finish_power_on(struct 
  if_sdio_card *card)
  
  sdio_release_host(func);
  
  -   /*
  -* FUNC_INIT is required for SD8688 WLAN/BT multiple functions
  -*/
  -   if (card-model == MODEL_8688) {
  -   struct cmd_header cmd;
  -
  -   memset(cmd, 0, sizeof(cmd));
  -
  -   lbs_deb_sdio(send function INIT command\n);
  -   if (__lbs_cmd(priv, CMD_FUNC_INIT, cmd, sizeof(cmd),
  -   lbs_cmd_copyback, (unsigned long) cmd))
  -   netdev_alert(priv-dev, CMD_FUNC_INIT cmd failed\n);
  -   }
  -
 
 Removing FUNC_INIT could break things in some scenarios.
 Could you please test the following case?
 
 1. insmod liberates - download firmware, send FUNC_INIT, ...
 2. rmmod libertas - send FUNC_SHUTDOWN command to firmware; BT is still 
 working.
 3. insmod libertas - skip firmware downloading, send FUNC_INIT, ...
 
 If FUNC_INIT is removed, I don't expect step 3 to work.

In case btmrvl_sdio is loaded, the driver always locks up in FUNC_INIT
upon probe time, thus I'm not able to proceed to further steps.

[  209.338953] [c0502248] (__schedule+0x610/0x764) from [bf20ae24] 
(__lbs_cmd+0xb8/0x130 [libertas])
[  209.348340] [bf20ae24] (__lbs_cmd+0xb8/0x130 [libertas]) from [bf222474] 
(if_sdio_finish_power_on+0xec/0x1b0 [libertas_sdio])
[  209.360136] [bf222474] (if_sdio_finish_power_on+0xec/0x1b0 
[libertas_sdio]) from [bf2226c4] (if_sdio_power_on+0x18c/0x20c 
[libertas_sdio])
[  209.373052] [bf2226c4] (if_sdio_power_on+0x18c/0x20c [libertas_sdio]) from 
[bf222944] (if_sdio_probe+0x200/0x31c [libertas_sdio])
[  209.385316] [bf222944] (if_sdio_probe+0x200/0x31c [libertas_sdio]) from 
[bf01d820] (sdio_bus_probe+0x94/0xfc [mmc_core])
[  209.396748] [bf01d820] (sdio_bus_probe+0x94/0xfc [mmc_core]) from 
[c02e729c] (driver_probe_device+0x12c/0x348)
[  209.407214] [c02e729c] (driver_probe_device+0x12c/0x348) from [c02e7530] 
(__driver_attach+0x78/0x9c)
[  209.416798] [c02e7530] (__driver_attach+0x78/0x9c) from [c02e5658] 
(bus_for_each_dev+0x50/0x88)
[  209.425946] [c02e5658] (bus_for_each_dev+0x50/0x88) from [c02e6810] 
(bus_add_driver+0x108/0x268)
[  209.435180] [c02e6810] (bus_add_driver+0x108/0x268) from [c02e782c] 
(driver_register+0xa4/0x134)
[  209.26] [c02e782c] (driver_register+0xa4/0x134) from [bf22601c] 
(if_sdio_init_module+0x1c/0x3c [libertas_sdio])
[  209.455339] [bf22601c] (if_sdio_init_module+0x1c/0x3c [libertas_sdio]) 
from [c00085b8] (do_one_initcall+0x98/0x174)
[  209.466236] [c00085b8] (do_one_initcall+0x98/0x174) from [c0076504] 
(load_module+0x1c5c/0x1f80)
[  209.475390] [c0076504] (load_module+0x1c5c/0x1f80) from [c007692c] 
(sys_init_module+0x104/0x128)
[  209.484632] [c007692c] (sys_init_module+0x104/0x128) from [c0008c40] 
(ret_fast_syscall+0x0/0x38)

In case btmrvl_sdio is _not_ loaded, insmod returns, but driver locks up
waiting for FUNC_INIT to finish:

[  300.538859] [c0502248] (__schedule+0x610/0x764) from [bf1fae24] 
(__lbs_cmd+0xb8/0x130 [libertas])
[  300.548600] [bf1fae24] (__lbs_cmd+0xb8/0x130 [libertas]) from [bf212474] 
(if_sdio_finish_power_on+0xec/0x1b0 [libertas_sdio])
[  300.560398] [bf212474] (if_sdio_finish_power_on+0xec/0x1b0 
[libertas_sdio]) from [bf213230] (if_sdio_do_prog_firmware+0x414/0x454 
[libertas_sdio])
[  300.574052] [bf213230] (if_sdio_do_prog_firmware+0x414/0x454 
[libertas_sdio]) from [bf1fffbc] (lbs_fw_loaded+0x24/0x58 [libertas])
[  300.586907] [bf1fffbc] (lbs_fw_loaded+0x24/0x58 [libertas]) from 
[c02f02c0] (request_firmware_work_func+0xb0/0xf4)
[  300.597746] [c02f02c0] (request_firmware_work_func+0xb0/0xf4) from 
[c003ae0c] (process_one_work+0x348/0x6a8)
[  300.608288] [c003ae0c] (process_one_work+0x348/0x6a8) from [c003b408] 
(worker_thread+0x268/0x390)
[  300.617630] [c003b408] (worker_thread+0x268/0x390) from [c00414b0] 
(kthread+0xc0/0xd4)
[  300.625947] [c00414b0] (kthread+0xc0/0xd4) from [c0008ce8] 
(ret_from_fork+0x14/0x20)
[  300.634135] 2 locks 

Re: [PATCH] libertas sdio: remove CMD_FUNC_INIT call

2013-01-30 Thread John W. Linville
On Fri, Jan 18, 2013 at 12:28:17PM -0800, Bing Zhao wrote:
> Hi Lubomir,
> 
> > It actually times out on a 8688 present in GuruPlug with sd8688.bin
> > (md5=7233401e9687f8c880da547beed4324e) firmware (that's present in
> > linux-firmware tree), but the adapter works fine.
> > 
> > For that firmware times out with libertas_uap [1] as well, though it 
> > succeeds
> > with sd8688_ap.bin (md5=52cd8f8296b9a7e1d3835d57416256b2) that was 
> > originally
> > shipped with GuruPlug. That firmware is not in linux-firmware tree and 
> > btmrvl
> > driver might win the race programming the 8688 with sd8688.bin anyway.
> > 
> > [1] https://github.com/lkundrak/linux/tree/libertas_uap
> > ---
> >  drivers/net/wireless/libertas/if_sdio.c |   14 --
> >  1 files changed, 0 insertions(+), 14 deletions(-)
> > 
> > diff --git a/drivers/net/wireless/libertas/if_sdio.c 
> > b/drivers/net/wireless/libertas/if_sdio.c
> > index 2ecab49..3c4c555 100644
> > --- a/drivers/net/wireless/libertas/if_sdio.c
> > +++ b/drivers/net/wireless/libertas/if_sdio.c
> > @@ -825,20 +825,6 @@ static void if_sdio_finish_power_on(struct 
> > if_sdio_card *card)
> > 
> > sdio_release_host(func);
> > 
> > -   /*
> > -* FUNC_INIT is required for SD8688 WLAN/BT multiple functions
> > -*/
> > -   if (card->model == MODEL_8688) {
> > -   struct cmd_header cmd;
> > -
> > -   memset(, 0, sizeof(cmd));
> > -
> > -   lbs_deb_sdio("send function INIT command\n");
> > -   if (__lbs_cmd(priv, CMD_FUNC_INIT, , sizeof(cmd),
> > -   lbs_cmd_copyback, (unsigned long) ))
> > -   netdev_alert(priv->dev, "CMD_FUNC_INIT cmd failed\n");
> > -   }
> > -
> 
> Removing FUNC_INIT could break things in some scenarios.
> Could you please test the following case?
> 
> 1. insmod liberates -> download firmware, send FUNC_INIT, ...
> 2. rmmod libertas -> send FUNC_SHUTDOWN command to firmware; BT is still 
> working.
> 3. insmod libertas -> skip firmware downloading, send FUNC_INIT, ...
> 
> If FUNC_INIT is removed, I don't expect step 3 to work.
> 
> Thanks,
> Bing
> 
> > priv->fw_ready = 1;
> > wake_up(>pwron_waitq);
> > 
> > --
> > 1.7.1
> 

Lubomir, any reply?  Should I drop this one?

-- 
John W. LinvilleSomeday the world will need a hero, and you
linvi...@tuxdriver.com  might be all we have.  Be ready.
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH] libertas sdio: remove CMD_FUNC_INIT call

2013-01-30 Thread John W. Linville
On Fri, Jan 18, 2013 at 12:28:17PM -0800, Bing Zhao wrote:
 Hi Lubomir,
 
  It actually times out on a 8688 present in GuruPlug with sd8688.bin
  (md5=7233401e9687f8c880da547beed4324e) firmware (that's present in
  linux-firmware tree), but the adapter works fine.
  
  For that firmware times out with libertas_uap [1] as well, though it 
  succeeds
  with sd8688_ap.bin (md5=52cd8f8296b9a7e1d3835d57416256b2) that was 
  originally
  shipped with GuruPlug. That firmware is not in linux-firmware tree and 
  btmrvl
  driver might win the race programming the 8688 with sd8688.bin anyway.
  
  [1] https://github.com/lkundrak/linux/tree/libertas_uap
  ---
   drivers/net/wireless/libertas/if_sdio.c |   14 --
   1 files changed, 0 insertions(+), 14 deletions(-)
  
  diff --git a/drivers/net/wireless/libertas/if_sdio.c 
  b/drivers/net/wireless/libertas/if_sdio.c
  index 2ecab49..3c4c555 100644
  --- a/drivers/net/wireless/libertas/if_sdio.c
  +++ b/drivers/net/wireless/libertas/if_sdio.c
  @@ -825,20 +825,6 @@ static void if_sdio_finish_power_on(struct 
  if_sdio_card *card)
  
  sdio_release_host(func);
  
  -   /*
  -* FUNC_INIT is required for SD8688 WLAN/BT multiple functions
  -*/
  -   if (card-model == MODEL_8688) {
  -   struct cmd_header cmd;
  -
  -   memset(cmd, 0, sizeof(cmd));
  -
  -   lbs_deb_sdio(send function INIT command\n);
  -   if (__lbs_cmd(priv, CMD_FUNC_INIT, cmd, sizeof(cmd),
  -   lbs_cmd_copyback, (unsigned long) cmd))
  -   netdev_alert(priv-dev, CMD_FUNC_INIT cmd failed\n);
  -   }
  -
 
 Removing FUNC_INIT could break things in some scenarios.
 Could you please test the following case?
 
 1. insmod liberates - download firmware, send FUNC_INIT, ...
 2. rmmod libertas - send FUNC_SHUTDOWN command to firmware; BT is still 
 working.
 3. insmod libertas - skip firmware downloading, send FUNC_INIT, ...
 
 If FUNC_INIT is removed, I don't expect step 3 to work.
 
 Thanks,
 Bing
 
  priv-fw_ready = 1;
  wake_up(card-pwron_waitq);
  
  --
  1.7.1
 

Lubomir, any reply?  Should I drop this one?

-- 
John W. LinvilleSomeday the world will need a hero, and you
linvi...@tuxdriver.com  might be all we have.  Be ready.
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


RE: [PATCH] libertas sdio: remove CMD_FUNC_INIT call

2013-01-18 Thread Bing Zhao
Hi Lubomir,

> It actually times out on a 8688 present in GuruPlug with sd8688.bin
> (md5=7233401e9687f8c880da547beed4324e) firmware (that's present in
> linux-firmware tree), but the adapter works fine.
> 
> For that firmware times out with libertas_uap [1] as well, though it succeeds
> with sd8688_ap.bin (md5=52cd8f8296b9a7e1d3835d57416256b2) that was originally
> shipped with GuruPlug. That firmware is not in linux-firmware tree and btmrvl
> driver might win the race programming the 8688 with sd8688.bin anyway.
> 
> [1] https://github.com/lkundrak/linux/tree/libertas_uap
> ---
>  drivers/net/wireless/libertas/if_sdio.c |   14 --
>  1 files changed, 0 insertions(+), 14 deletions(-)
> 
> diff --git a/drivers/net/wireless/libertas/if_sdio.c 
> b/drivers/net/wireless/libertas/if_sdio.c
> index 2ecab49..3c4c555 100644
> --- a/drivers/net/wireless/libertas/if_sdio.c
> +++ b/drivers/net/wireless/libertas/if_sdio.c
> @@ -825,20 +825,6 @@ static void if_sdio_finish_power_on(struct if_sdio_card 
> *card)
> 
>   sdio_release_host(func);
> 
> - /*
> -  * FUNC_INIT is required for SD8688 WLAN/BT multiple functions
> -  */
> - if (card->model == MODEL_8688) {
> - struct cmd_header cmd;
> -
> - memset(, 0, sizeof(cmd));
> -
> - lbs_deb_sdio("send function INIT command\n");
> - if (__lbs_cmd(priv, CMD_FUNC_INIT, , sizeof(cmd),
> - lbs_cmd_copyback, (unsigned long) ))
> - netdev_alert(priv->dev, "CMD_FUNC_INIT cmd failed\n");
> - }
> -

Removing FUNC_INIT could break things in some scenarios.
Could you please test the following case?

1. insmod liberates -> download firmware, send FUNC_INIT, ...
2. rmmod libertas -> send FUNC_SHUTDOWN command to firmware; BT is still 
working.
3. insmod libertas -> skip firmware downloading, send FUNC_INIT, ...

If FUNC_INIT is removed, I don't expect step 3 to work.

Thanks,
Bing

>   priv->fw_ready = 1;
>   wake_up(>pwron_waitq);
> 
> --
> 1.7.1
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


RE: [PATCH] libertas sdio: remove CMD_FUNC_INIT call

2013-01-18 Thread Bing Zhao
Hi Lubomir,

 It actually times out on a 8688 present in GuruPlug with sd8688.bin
 (md5=7233401e9687f8c880da547beed4324e) firmware (that's present in
 linux-firmware tree), but the adapter works fine.
 
 For that firmware times out with libertas_uap [1] as well, though it succeeds
 with sd8688_ap.bin (md5=52cd8f8296b9a7e1d3835d57416256b2) that was originally
 shipped with GuruPlug. That firmware is not in linux-firmware tree and btmrvl
 driver might win the race programming the 8688 with sd8688.bin anyway.
 
 [1] https://github.com/lkundrak/linux/tree/libertas_uap
 ---
  drivers/net/wireless/libertas/if_sdio.c |   14 --
  1 files changed, 0 insertions(+), 14 deletions(-)
 
 diff --git a/drivers/net/wireless/libertas/if_sdio.c 
 b/drivers/net/wireless/libertas/if_sdio.c
 index 2ecab49..3c4c555 100644
 --- a/drivers/net/wireless/libertas/if_sdio.c
 +++ b/drivers/net/wireless/libertas/if_sdio.c
 @@ -825,20 +825,6 @@ static void if_sdio_finish_power_on(struct if_sdio_card 
 *card)
 
   sdio_release_host(func);
 
 - /*
 -  * FUNC_INIT is required for SD8688 WLAN/BT multiple functions
 -  */
 - if (card-model == MODEL_8688) {
 - struct cmd_header cmd;
 -
 - memset(cmd, 0, sizeof(cmd));
 -
 - lbs_deb_sdio(send function INIT command\n);
 - if (__lbs_cmd(priv, CMD_FUNC_INIT, cmd, sizeof(cmd),
 - lbs_cmd_copyback, (unsigned long) cmd))
 - netdev_alert(priv-dev, CMD_FUNC_INIT cmd failed\n);
 - }
 -

Removing FUNC_INIT could break things in some scenarios.
Could you please test the following case?

1. insmod liberates - download firmware, send FUNC_INIT, ...
2. rmmod libertas - send FUNC_SHUTDOWN command to firmware; BT is still 
working.
3. insmod libertas - skip firmware downloading, send FUNC_INIT, ...

If FUNC_INIT is removed, I don't expect step 3 to work.

Thanks,
Bing

   priv-fw_ready = 1;
   wake_up(card-pwron_waitq);
 
 --
 1.7.1
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH] libertas sdio: remove CMD_FUNC_INIT call

2013-01-17 Thread Lubomir Rintel
It actually times out on a 8688 present in GuruPlug with sd8688.bin
(md5=7233401e9687f8c880da547beed4324e) firmware (that's present in
linux-firmware tree), but the adapter works fine.

For that firmware times out with libertas_uap [1] as well, though it succeeds
with sd8688_ap.bin (md5=52cd8f8296b9a7e1d3835d57416256b2) that was originally
shipped with GuruPlug. That firmware is not in linux-firmware tree and btmrvl
driver might win the race programming the 8688 with sd8688.bin anyway.

[1] https://github.com/lkundrak/linux/tree/libertas_uap
---
 drivers/net/wireless/libertas/if_sdio.c |   14 --
 1 files changed, 0 insertions(+), 14 deletions(-)

diff --git a/drivers/net/wireless/libertas/if_sdio.c 
b/drivers/net/wireless/libertas/if_sdio.c
index 2ecab49..3c4c555 100644
--- a/drivers/net/wireless/libertas/if_sdio.c
+++ b/drivers/net/wireless/libertas/if_sdio.c
@@ -825,20 +825,6 @@ static void if_sdio_finish_power_on(struct if_sdio_card 
*card)
 
sdio_release_host(func);
 
-   /*
-* FUNC_INIT is required for SD8688 WLAN/BT multiple functions
-*/
-   if (card->model == MODEL_8688) {
-   struct cmd_header cmd;
-
-   memset(, 0, sizeof(cmd));
-
-   lbs_deb_sdio("send function INIT command\n");
-   if (__lbs_cmd(priv, CMD_FUNC_INIT, , sizeof(cmd),
-   lbs_cmd_copyback, (unsigned long) ))
-   netdev_alert(priv->dev, "CMD_FUNC_INIT cmd failed\n");
-   }
-
priv->fw_ready = 1;
wake_up(>pwron_waitq);
 
-- 
1.7.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH] libertas sdio: remove CMD_FUNC_INIT call

2013-01-17 Thread Lubomir Rintel
It actually times out on a 8688 present in GuruPlug with sd8688.bin
(md5=7233401e9687f8c880da547beed4324e) firmware (that's present in
linux-firmware tree), but the adapter works fine.

For that firmware times out with libertas_uap [1] as well, though it succeeds
with sd8688_ap.bin (md5=52cd8f8296b9a7e1d3835d57416256b2) that was originally
shipped with GuruPlug. That firmware is not in linux-firmware tree and btmrvl
driver might win the race programming the 8688 with sd8688.bin anyway.

[1] https://github.com/lkundrak/linux/tree/libertas_uap
---
 drivers/net/wireless/libertas/if_sdio.c |   14 --
 1 files changed, 0 insertions(+), 14 deletions(-)

diff --git a/drivers/net/wireless/libertas/if_sdio.c 
b/drivers/net/wireless/libertas/if_sdio.c
index 2ecab49..3c4c555 100644
--- a/drivers/net/wireless/libertas/if_sdio.c
+++ b/drivers/net/wireless/libertas/if_sdio.c
@@ -825,20 +825,6 @@ static void if_sdio_finish_power_on(struct if_sdio_card 
*card)
 
sdio_release_host(func);
 
-   /*
-* FUNC_INIT is required for SD8688 WLAN/BT multiple functions
-*/
-   if (card-model == MODEL_8688) {
-   struct cmd_header cmd;
-
-   memset(cmd, 0, sizeof(cmd));
-
-   lbs_deb_sdio(send function INIT command\n);
-   if (__lbs_cmd(priv, CMD_FUNC_INIT, cmd, sizeof(cmd),
-   lbs_cmd_copyback, (unsigned long) cmd))
-   netdev_alert(priv-dev, CMD_FUNC_INIT cmd failed\n);
-   }
-
priv-fw_ready = 1;
wake_up(card-pwron_waitq);
 
-- 
1.7.1

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/