int wldev_set_band( struct net_device *dev, uint band) { int error = -1; if ((band == WLC_BAND_AUTO) || (band == WLC_BAND_5G) || (band == WLC_BAND_2G)) { error = wldev_ioctl(dev, WLC_SET_BAND, &band, sizeof(band), 1); } wl_cfg80211_abort_connecting(); return error; }
int wldev_set_band( struct net_device *dev, uint band) { int error = -1; if ((band == WLC_BAND_AUTO) || (band == WLC_BAND_5G) || (band == WLC_BAND_2G)) { error = wldev_ioctl(dev, WLC_SET_BAND, &band, sizeof(band), true); if (!error) dhd_bus_band_set(dev, band); } #ifdef CUSTOMER_HW_ONE wl_cfg80211_abort_connecting(); #endif return error; }
int wldev_set_country( struct net_device *dev, char *country_code, bool notify, bool user_enforced) { int error = -1; wl_country_t cspec = {{0}, 0, {0}}; scb_val_t scbval; char smbuf[WLC_IOCTL_SMLEN]; #ifdef CUSTOMER_HW_ONE uint32 chan_buf[WL_NUMCHANNELS]; wl_uint32_list_t *list; channel_info_t ci; int retry = 0; int chan = 1; #endif if (!country_code) return error; bzero(&scbval, sizeof(scb_val_t)); error = wldev_iovar_getbuf(dev, "country", NULL, 0, &cspec, sizeof(cspec), NULL); if (error < 0) { WLDEV_ERROR(("%s: get country failed = %d\n", __FUNCTION__, error)); return error; } if ((error < 0) || (strncmp(country_code, cspec.country_abbrev, WLC_CNTRY_BUF_SZ) != 0)) { if (user_enforced) { bzero(&scbval, sizeof(scb_val_t)); error = wldev_ioctl(dev, WLC_DISASSOC, &scbval, sizeof(scb_val_t), true); if (error < 0) { WLDEV_ERROR(("%s: set country failed due to Disassoc error %d\n", __FUNCTION__, error)); return error; } } #ifdef CUSTOMER_HW_ONE error = wldev_ioctl(dev, WLC_SET_CHANNEL, &chan, sizeof(chan), 1); if (error < 0) { WLDEV_ERROR(("%s: set country failed due to channel 1 error %d\n", __FUNCTION__, error)); return error; } } get_channel_retry: if ((error = wldev_ioctl(dev, WLC_GET_CHANNEL, &ci, sizeof(ci), 0))) { WLDEV_ERROR(("%s: get channel fail!\n", __FUNCTION__)); return error; } ci.scan_channel = dtoh32(ci.scan_channel); if (ci.scan_channel) { retry++; printf("%s: scan in progress, retry %d!\n", __FUNCTION__, retry); if (retry > 3) return -EBUSY; bcm_mdelay(1000); goto get_channel_retry; } #endif cspec.rev = -1; memcpy(cspec.country_abbrev, country_code, WLC_CNTRY_BUF_SZ); memcpy(cspec.ccode, country_code, WLC_CNTRY_BUF_SZ); get_customized_country_code((char *)&cspec.country_abbrev, &cspec); error = wldev_iovar_setbuf(dev, "country", &cspec, sizeof(cspec), smbuf, sizeof(smbuf), NULL); if (error < 0) { #ifdef CUSTOMER_HW_ONE if (strcmp(cspec.country_abbrev, DEF_COUNTRY_CODE) != 0) { strcpy(country_code, DEF_COUNTRY_CODE); retry = 0; goto get_channel_retry; } else { #endif WLDEV_ERROR(("%s: set country for %s as %s rev %d failed\n", __FUNCTION__, country_code, cspec.ccode, cspec.rev)); return error; } #ifdef CUSTOMER_HW_ONE } /* check if there are available channels */ else { if (strcmp(country_code, DEF_COUNTRY_CODE) != 0) { list = (wl_uint32_list_t *)(void *)chan_buf; list->count = htod32(WL_NUMCHANNELS); if ((error = wldev_ioctl_no_memset(dev, WLC_GET_VALID_CHANNELS, &chan_buf, sizeof(chan_buf), 0))) { WLDEV_ERROR(("%s: get channel list fail! %d\n", __FUNCTION__, error)); return error; } /* if NULL, set default country code instead and set country code again */ printf("%s: channel_count = %d\n", __FUNCTION__, list->count); if (list->count == 0) { strcpy(country_code, DEF_COUNTRY_CODE); retry = 0; goto get_channel_retry; } } #endif dhd_bus_country_set(dev, &cspec, notify); WLDEV_ERROR(("%s: set country for %s as %s rev %d\n", __FUNCTION__, country_code, cspec.ccode, cspec.rev)); } #ifdef CUSTOMER_HW_ONE wl_cfg80211_abort_connecting(); #endif return 0; }
int wldev_set_country( struct net_device *dev, char *country_code) { int error = -1; wl_country_t cspec = {{0}, 0, {0}}; scb_val_t scbval; char smbuf[WLC_IOCTL_SMLEN]; uint32 chan_buf[WL_NUMCHANNELS]; wl_uint32_list_t *list; channel_info_t ci; int retry = 0; int chan = 1; if (!country_code) return error; error = wldev_iovar_getbuf(dev, "country", &cspec, sizeof(cspec), smbuf, sizeof(smbuf), NULL); if (error < 0) WLDEV_ERROR(("%s: get country failed = %d\n", __FUNCTION__, error)); if ((error < 0) || (strncmp(country_code, smbuf, WLC_CNTRY_BUF_SZ) != 0)) { bzero(&scbval, sizeof(scb_val_t)); error = wldev_ioctl(dev, WLC_DISASSOC, &scbval, sizeof(scb_val_t), 1); if (error < 0) { WLDEV_ERROR(("%s: set country failed due to Disassoc error %d\n", __FUNCTION__, error)); return error; } error = wldev_ioctl(dev, WLC_SET_CHANNEL, &chan, sizeof(chan), 1); if (error < 0) { WLDEV_ERROR(("%s: set country failed due to channel 1 error %d\n", __FUNCTION__, error)); return error; } } get_channel_retry: if ((error = wldev_ioctl(dev, WLC_GET_CHANNEL, &ci, sizeof(ci), 0))) { WLDEV_ERROR(("%s: get channel fail!\n", __FUNCTION__)); return error; } ci.scan_channel = dtoh32(ci.scan_channel); if (ci.scan_channel) { retry++; printf("%s: scan in progress, retry %d!\n", __FUNCTION__, retry); if (retry > 3) return -EBUSY; bcm_mdelay(1000); goto get_channel_retry; } cspec.rev = -1; memcpy(cspec.country_abbrev, country_code, WLC_CNTRY_BUF_SZ); memcpy(cspec.ccode, country_code, WLC_CNTRY_BUF_SZ); get_customized_country_code((char *)&cspec.country_abbrev, &cspec); error = wldev_iovar_setbuf(dev, "country", &cspec, sizeof(cspec), smbuf, sizeof(smbuf), NULL); if (error < 0) { if (strcmp(cspec.country_abbrev, DEF_COUNTRY_CODE) != 0) { strcpy(country_code, DEF_COUNTRY_CODE); retry = 0; goto get_channel_retry; } else { WLDEV_ERROR(("%s: set country for %s as %s rev %d failed\n", __FUNCTION__, country_code, cspec.ccode, cspec.rev)); return error; } } else { if (strcmp(country_code, DEF_COUNTRY_CODE) != 0) { list = (wl_uint32_list_t *)(void *)chan_buf; list->count = htod32(WL_NUMCHANNELS); if ((error = wldev_ioctl_no_memset(dev, WLC_GET_VALID_CHANNELS, &chan_buf, sizeof(chan_buf), 0))) { WLDEV_ERROR(("%s: get channel list fail! %d\n", __FUNCTION__, error)); return error; } printf("%s: channel_count = %d\n", __FUNCTION__, list->count); if (list->count == 0) { strcpy(country_code, DEF_COUNTRY_CODE); retry = 0; goto get_channel_retry; } } } dhd_bus_country_set(dev, &cspec); printk(KERN_INFO "[WLAN] %s: set country for %s as %s rev %d\n", __func__, country_code, cspec.ccode, cspec.rev); wl_cfg80211_abort_connecting(); return 0; }