Set Wifi b/g/n mode

Tip / Sign in to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
Anonymous
Not applicable

I'm using the BCM43340/1 chip. Is there a way to force the chip to only use 80211.b mode? I am seeing the wl command, but is there a programmatic way to set this?

0 Likes
4 Replies
Pang-ChuanL_91
Employee
Employee
5 sign-ins First like received Welcome!

nrcrast

There is not function to set 802.11 b mode directly.

And you can try the following programmatic way.

[Wiced\wwd\internal\wwd_management.c]
wwd_management_wifi_on(...)
{

//Modify this parameter from GMODE_AUTO to GMODE_LEGACY_B
/* Set the GMode */
    data = (uint32_t*) wwd_sdpcm_get_ioctl_buffer( &buffer, (uint16_t) 4 );
    if ( data == NULL )
    {
        wiced_assert( "Could not get buffer for IOCTL", 0 != 0 );
        return WWD_BUFFER_ALLOC_FAIL;
    }
    *data = (uint32_t) GMODE_AUTO;-->GMODE_LEGACY_B
    retval = wwd_sdpcm_send_ioctl( SDPCM_SET, WLC_SET_GMODE, buffer, 0, WWD_STA_INTERFACE );

     ...

}

BTW, because BCM43340 is dual band, you need to disable 11n by using this function before setting b mode.
wiced_wifi_disable_11n_support(…)

Anonymous
Not applicable

Thanks for the reply.

However, this doesn't seem to work. It just hangs my system immediately.

I am calling wiced_core_init(), disabling 11n, and then calling wiced_wlan_connectivity_init().

If I don't disable 11n, it hangs when setting GMODE_LEGACY_B. If I disable 11n, it hangs in the disable_11n function.

-Nick

0 Likes
Anonymous
Not applicable

It seems that LegacyB is unsupported, at least for the BCM43341. Using the WL tool to send the WLC_SET_GMODE command, I am getting "Unsupported" back.

0 Likes
Anonymous
Not applicable

Hello Nick Crast,

You have modified the GMODE but not disabled nmode.

You need to follow the below steps to make the device to use only B-mode:

1) First disable 11n mode.

2) Set the Gmode to legacy B mode.

modify the following functions in wwd_management_wifi_on()

    /* Disable PHY N-Mode */

    data = wwd_sdpcm_get_iovar_buffer( &buffer, sizeof(uint32_t), IOVAR_STR_NMODE );

    if ( data == NULL )

    {

        wiced_assert( "Could not get buffer for IOCTL", 0 != 0 );

        return WWD_BUFFER_ALLOC_FAIL;

    }

    *data = 0;

    wwd_sdpcm_send_iovar( SDPCM_SET, buffer, NULL, WWD_STA_INTERFACE );

   /* Set the GMode to legacy B*/

    data = (uint32_t*) wwd_sdpcm_get_ioctl_buffer( &buffer, (uint16_t) 4 );

    if ( data == NULL )

    {

        wiced_assert( "Could not get buffer for IOCTL", 0 != 0 );

        return WWD_BUFFER_ALLOC_FAIL;

    }

    *data = (uint32_t) GMODE_LEGACY_B;

    retval = wwd_sdpcm_send_ioctl( SDPCM_SET, WLC_SET_GMODE, buffer, 0, WWD_STA_INTERFACE );

    if ( retval != WWD_SUCCESS )

    {

        /* Note: System may time out here if bus interrupts are not working properly */

        WPRINT_WWD_ERROR(("Error setting gmode\n"));

        return retval;

    }

If you need more info please let me know.

Best Regards,

Ramesh Mylavarapu