X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;ds=sidebyside;f=net%2Frfkill%2Frfkill-wlan.c;h=070ef05ca15cba7fa8f93f1608c0eb6f7e7713c0;hb=b58f60a9e8ef17896d56078b43911564f1afcc35;hp=ce9e3cf7f0ef94e0f6f35d26137245a3904a50b8;hpb=a26084749b4fa2ea42705e5c3ed398b445e9c3ce;p=firefly-linux-kernel-4.4.55.git diff --git a/net/rfkill/rfkill-wlan.c b/net/rfkill/rfkill-wlan.c old mode 100755 new mode 100644 index ce9e3cf7f0ef..070ef05ca15c --- a/net/rfkill/rfkill-wlan.c +++ b/net/rfkill/rfkill-wlan.c @@ -34,17 +34,18 @@ #include #include #include -#include #include #include #include #include #include +#include #ifdef CONFIG_OF #include #include #include #endif +#include #if 0 #define DBG(x...) printk(KERN_INFO "[WLAN_RFKILL]: "x) @@ -54,6 +55,9 @@ #define LOG(x...) printk(KERN_INFO "[WLAN_RFKILL]: "x) +extern struct mmc_host *primary_sdio_host; +extern void mmc_pwrseq_power_off(struct mmc_host *host); + struct rfkill_wlan_data { struct rksdmmc_gpio_wifi_moudle *pdata; struct wake_lock wlan_irq_wl; @@ -269,107 +273,11 @@ int rfkill_get_wifi_power_state(int *power, int *vref_ctrl_enable) return -1; } - if (mrfkill->pdata->vref_ctrl_enble) - *vref_ctrl_enable = 1; *power = wifi_power_state; return 0; } -/************************************************************************** - * - * wifi reference voltage control Func - * - *************************************************************************/ -int rockchip_wifi_ref_voltage(int on) -{ - struct rfkill_wlan_data *mrfkill = g_rfkill; - struct rksdmmc_gpio *vddio; - struct regulator *ldo = NULL; - int power = 0; - bool toggle = false; - - LOG("%s: %d\n", __func__, on); - - if (mrfkill == NULL) { - LOG("%s: rfkill-wlan driver has not Successful initialized\n", __func__); - return -1; - } - - if (!mrfkill->pdata->vref_ctrl_enble) { - LOG("%s: wifi io reference voltage control is disabled.\n", __func__); - return 0; - } - - if (!rfkill_get_bt_power_state(&power, &toggle)) { - if (power == 1) { - LOG("%s: wifi shouldn't control io reference voltage, BT is running!\n", __func__); - return 0; - } - } - - if (mrfkill->pdata->ioregulator.power_ctrl_by_pmu) { - int ret = -1; - char *ldostr; - int level = mrfkill->pdata->ioregulator.enable; - int voltage = 1000 * mrfkill->pdata->sdio_vol; - - ldostr = mrfkill->pdata->ioregulator.pmu_regulator; - if (ldostr == NULL) { - LOG("%s: wifi io reference voltage set to be controled by pmic, but which one?\n", __func__); - return -1; - } - ldo = regulator_get(NULL, ldostr); - if (ldo == NULL || IS_ERR(ldo)) { - LOG("\n\n\n%s get ldo error,please mod this\n\n\n", __func__); - return -1; - } else { - if (on == level) { - if(cpu_is_rk3036() || cpu_is_rk312x()) - { - /*regulator_set_voltage(ldo, voltage, voltage); - LOG("%s: %s enabled, level = %d\n", __func__, ldostr, voltage); - ret = regulator_enable(ldo); - LOG("wifi turn on io reference voltage.\n");*/ - }else{ - regulator_set_voltage(ldo, voltage, voltage); - LOG("%s: %s enabled, level = %d\n", __func__, ldostr, voltage); - ret = regulator_enable(ldo); - LOG("wifi turn on io reference voltage.\n"); - } - } else { - LOG("%s: %s disabled\n", __func__, ldostr); - while (regulator_is_enabled(ldo) > 0) { - ret = regulator_disable(ldo); - } - LOG("wifi shut off io reference voltage.\n"); - } - regulator_put(ldo); - msleep(100); - } - } else { - vddio = &mrfkill->pdata->power_n; - - if (on){ - if (gpio_is_valid(vddio->io)) { - gpio_set_value(vddio->io, vddio->enable); - msleep(100); - } - - LOG("wifi turn on io reference voltage.\n"); - }else{ - if (gpio_is_valid(vddio->io)) { - gpio_set_value(vddio->io, !(vddio->enable)); - msleep(100); - } - - LOG("wifi shut off io reference voltage.\n"); - } - } - - return 0; -} - /************************************************************************** * * Wifi Power Control Func @@ -387,6 +295,9 @@ int rockchip_wifi_power(int on) LOG("%s: %d\n", __func__, on); + if (!on && primary_sdio_host) + mmc_pwrseq_power_off(primary_sdio_host); + if (mrfkill == NULL) { LOG("%s: rfkill-wlan driver has not Successful initialized\n", __func__); return -1; @@ -403,9 +314,6 @@ int rockchip_wifi_power(int on) return 0; } } - - if (on) - rockchip_wifi_ref_voltage(1); if (mrfkill->pdata->mregulator.power_ctrl_by_pmu) { int ret = -1; @@ -471,9 +379,6 @@ int rockchip_wifi_power(int on) } } - if (!on) - rockchip_wifi_ref_voltage(0); - return 0; } EXPORT_SYMBOL(rockchip_wifi_power); @@ -483,21 +388,10 @@ EXPORT_SYMBOL(rockchip_wifi_power); * Wifi Sdio Detect Func * *************************************************************************/ -#include extern int mmc_host_rescan(struct mmc_host *host, int val, int irq_type); int rockchip_wifi_set_carddetect(int val) { - int chip, irq_type; - chip = get_wifi_chip_type(); - - /* irq_type : 0, oob; 1, cap-sdio-irq */ - if (!strncmp(wifi_chip_type_string, "ap", 2) || - !strncmp(wifi_chip_type_string, "rk", 2)) - irq_type = 0; - else - irq_type = 1; - - return mmc_host_rescan(NULL, val, irq_type);//NULL => SDIO host + return mmc_host_rescan(NULL, val, 1); } EXPORT_SYMBOL(rockchip_wifi_set_carddetect); @@ -547,44 +441,73 @@ EXPORT_SYMBOL(rockchip_wifi_reset); * *************************************************************************/ #include +#include u8 wifi_custom_mac_addr[6] = {0,0,0,0,0,0}; -extern char GetSNSectorInfo(char * pbuf); + +//#define RANDOM_ADDRESS_SAVE +static int get_wifi_addr_vendor(unsigned char *addr) +{ + int ret; + + ret = rk_vendor_read(WIFI_MAC_ID, addr, 6); + if (ret != 6 || is_zero_ether_addr(addr)) { + LOG("%s: rk_vendor_read wifi mac address failed (%d)\n", + __func__, ret); +#ifdef RANDOM_ADDRESS_SAVE + random_ether_addr(addr); + LOG("%s: generate random wifi mac address: " + "%02x:%02x:%02x:%02x:%02x:%02x\n", + __func__, addr[0], addr[1], addr[2], + addr[3], addr[4], addr[5]); + ret = rk_vendor_write(WIFI_MAC_ID, addr, 6); + if (ret != 0) { + LOG("%s: rk_vendor_write" + " wifi mac address failed (%d)\n", + __func__, ret); + memset(addr, 0, 6); + return -1; + } +#else + return -1; +#endif + } else { + LOG("%s: rk_vendor_read wifi mac address: " + "%02x:%02x:%02x:%02x:%02x:%02x\n", + __func__, addr[0], addr[1], addr[2], + addr[3], addr[4], addr[5]); + } + return 0; +} + int rockchip_wifi_mac_addr(unsigned char *buf) { - char mac_buf[20] = {0}; - LOG("%s: enter.\n", __func__); - - // from vflash - if(is_zero_ether_addr(wifi_custom_mac_addr)) { - int i; - char *tempBuf = kmalloc(512, GFP_KERNEL); - if(tempBuf) { - GetSNSectorInfo(tempBuf); - for (i = 445; i <= 450; i++) - wifi_custom_mac_addr[i-445] = tempBuf[i]; - kfree(tempBuf); - } else { - return -1; - } - } + char mac_buf[20] = {0}; - sprintf(mac_buf,"%02x:%02x:%02x:%02x:%02x:%02x",wifi_custom_mac_addr[0],wifi_custom_mac_addr[1], - wifi_custom_mac_addr[2],wifi_custom_mac_addr[3],wifi_custom_mac_addr[4],wifi_custom_mac_addr[5]); - LOG("falsh wifi_custom_mac_addr=[%s]\n", mac_buf); + LOG("%s: enter.\n", __func__); - if (is_valid_ether_addr(wifi_custom_mac_addr)) { - if (2 == (wifi_custom_mac_addr[0] & 0x0F)) { - LOG("This mac address come into conflict with the address of direct, ignored...\n"); - return -1; - } - } else { - LOG("This mac address is not valid, ignored...\n"); - return -1; - } + // from vendor storage + if (is_zero_ether_addr(wifi_custom_mac_addr)) { + if (get_wifi_addr_vendor(wifi_custom_mac_addr) != 0) + return -1; + } - memcpy(buf, wifi_custom_mac_addr, 6); + sprintf(mac_buf, "%02x:%02x:%02x:%02x:%02x:%02x", + wifi_custom_mac_addr[0], wifi_custom_mac_addr[1], + wifi_custom_mac_addr[2], wifi_custom_mac_addr[3], + wifi_custom_mac_addr[4], wifi_custom_mac_addr[5]); + LOG("falsh wifi_custom_mac_addr=[%s]\n", mac_buf); - return 0; + if (is_valid_ether_addr(wifi_custom_mac_addr)) { + if (!strncmp(wifi_chip_type_string, "rtl", 3)) + wifi_custom_mac_addr[0] &= ~0x2; // for p2p + } else { + LOG("This mac address is not valid, ignored...\n"); + return -1; + } + + memcpy(buf, wifi_custom_mac_addr, 6); + + return 0; } EXPORT_SYMBOL(rockchip_wifi_mac_addr); @@ -615,49 +538,6 @@ void *rockchip_wifi_country_code(char *ccode) EXPORT_SYMBOL(rockchip_wifi_country_code); /**************************************************************************/ -#define RK3368_GRF_IO_VSEL 0x900 -static int rockchip_wifi_voltage_select(void) -{ - struct rfkill_wlan_data *mrfkill = g_rfkill; - int voltage = 0; - - if (mrfkill == NULL) { - LOG("%s: rfkill-wlan driver has not Successful initialized\n", __func__); - return -1; - } - - voltage = mrfkill->pdata->sdio_vol; - if (cpu_is_rk3288()) { - if (voltage > 2700 && voltage < 3500) { - writel_relaxed(0x00100000, RK_GRF_VIRT+0x380); //3.3 - LOG("%s: wifi & sdio reference voltage: 3.3V\n", __func__); - } else if (voltage > 1500 && voltage < 1950) { - writel_relaxed(0x00100010, RK_GRF_VIRT+0x380); //1.8 - LOG("%s: wifi & sdio reference voltage: 1.8V\n", __func__); - } else { - LOG("%s: unsupport wifi & sdio reference voltage!\n", __func__); - return -1; - } - } else if(cpu_is_rk3036() || cpu_is_rk312x()) { - } else { // rk3368 -#ifdef CONFIG_MFD_SYSCON - if (voltage > 2700 && voltage < 3500) { - regmap_write(mrfkill->pdata->grf, RK3368_GRF_IO_VSEL, ((1<<3)<<16)|(0<<3)); //3.3 - LOG("%s: wifi & sdio reference voltage: 3.3V\n", __func__); - } else if (voltage > 1500 && voltage < 1950) { - regmap_write(mrfkill->pdata->grf, RK3368_GRF_IO_VSEL, ((1<<3)<<16)|(1<<3)); //1.8 - LOG("%s: wifi & sdio reference voltage: 1.8V\n", __func__); - } else -#endif - { - LOG("%s: unsupport wifi & sdio reference voltage!\n", __func__); - return -1; - } - } - - return 0; -} - static int rfkill_rk_setup_gpio(struct rksdmmc_gpio *gpio, const char* prefix, const char* name) { if (gpio_is_valid(gpio->io)) { @@ -692,7 +572,7 @@ static int wlan_platdata_parse_dt(struct device *dev, data->grf = syscon_regmap_lookup_by_phandle(node, "rockchip,grf"); if (IS_ERR(data->grf)) { LOG("can't find rockchip,grf property\n"); - return -1; + //return -1; } #endif @@ -705,22 +585,6 @@ static int wlan_platdata_parse_dt(struct device *dev, } LOG("%s: wifi_chip_type = %s\n", __func__, wifi_chip_type_string); - if(cpu_is_rk3036() || cpu_is_rk312x()){ - /* ret = of_property_read_u32(node, "sdio_vref", &value); - if (ret < 0) { - LOG("%s: Can't get sdio vref.", __func__); - return -1; - } - data->sdio_vol = value;*/ - }else { - ret = of_property_read_u32(node, "sdio_vref", &value); - if (ret < 0) { - LOG("%s: Can't get sdio vref.", __func__); - return -1; - } - data->sdio_vol = value; - } - if (of_find_property(node, "keep_wifi_power_on", NULL)) { data->wifi_power_remain = true; LOG("%s: wifi power will enabled while kernel starting and keep on.\n", __func__); @@ -728,47 +592,6 @@ static int wlan_platdata_parse_dt(struct device *dev, data->wifi_power_remain = false; LOG("%s: enable wifi power control.\n", __func__); } - - if (of_find_property(node, "vref_ctrl_enable", NULL)) { - LOG("%s: enable wifi io reference voltage control.\n", __func__); - data->vref_ctrl_enble = true; - if (of_find_property(node, "vref_ctrl_gpio", NULL)) { - gpio = of_get_named_gpio_flags(node, "vref_ctrl_gpio", 0, &flags); - if (gpio_is_valid(gpio)){ - data->vddio.io = gpio; - data->vddio.enable = (flags == GPIO_ACTIVE_HIGH)? 1:0; - data->ioregulator.power_ctrl_by_pmu = false; - LOG("%s: get property: vref_ctrl_gpio = %d, flags = %d.\n", __func__, gpio, flags); - } else { - data->vddio.io = -1; - data->vref_ctrl_enble = false; - LOG("%s: vref_ctrl_gpio defined invalid, disable wifi io reference voltage control.\n", __func__); - } - } else { - data->ioregulator.power_ctrl_by_pmu = true; - ret = of_property_read_string(node, "vref_pmu_regulator", &strings); - if (ret) { - LOG("%s: Can not read property: vref_pmu_regulator.\n", __func__); - data->vref_ctrl_enble = false; - data->ioregulator.power_ctrl_by_pmu = false; - } else { - LOG("%s: wifi io reference voltage controled by pmu(%s).\n", __func__, strings); - sprintf(data->ioregulator.pmu_regulator, "%s", strings); - } - ret = of_property_read_u32(node, "vref_pmu_enable_level", &value); - if (ret) { - LOG("%s: Can not read property: vref_pmu_enable_level.\n", __func__); - data->vref_ctrl_enble = false; - data->ioregulator.power_ctrl_by_pmu = false; - } else { - LOG("%s: wifi io reference voltage controled by pmu(level = %s).\n", __func__, (value == 1)?"HIGH":"LOW"); - data->ioregulator.enable = value; - } - } - } else { - data->vref_ctrl_enble = false; - LOG("%s: disable wifi io reference voltage control.\n", __func__); - } if (of_find_property(node, "power_ctrl_by_pmu", NULL)) { data->mregulator.power_ctrl_by_pmu = true; @@ -934,8 +757,6 @@ static int rfkill_wlan_probe(struct platform_device *pdev) rockchip_wifi_power(1); } - rockchip_wifi_voltage_select(); - #if BCM_STATIC_MEMORY_SUPPORT rockchip_init_wifi_mem(); #endif