Merge tag 'v4.4-rc3'
[firefly-linux-kernel-4.4.55.git] / net / rfkill / rfkill-wlan.c
index 87e12f2317bf33c91b3ee41703baef42cdfb6140..cabc3336bdccdb60ac6603bb1e7decca8225fdee 100755 (executable)
@@ -102,6 +102,8 @@ int get_wifi_chip_type(void)
     int type;
     if (strcmp(wifi_chip_type_string, "ap6210") == 0) {
         type = WIFI_AP6210;
+    } else if (strcmp(wifi_chip_type_string, "ap6212") == 0) {
+        type = WIFI_AP6212;
     } else if (strcmp(wifi_chip_type_string, "rk901") == 0) {
         type = WIFI_RK901;    
     } else if (strcmp(wifi_chip_type_string, "rk903") == 0) {
@@ -114,6 +116,8 @@ int get_wifi_chip_type(void)
         type = WIFI_AP6330;
     } else if (strcmp(wifi_chip_type_string, "ap6335") == 0) {
         type = WIFI_AP6335;
+    } else if (strcmp(wifi_chip_type_string, "ap6354") == 0) {
+        type = WIFI_AP6354;
     } else if (strcmp(wifi_chip_type_string, "ap6441") == 0) {
         type = WIFI_AP6441;
     } else if (strcmp(wifi_chip_type_string, "ap6476") == 0) {
@@ -543,8 +547,48 @@ EXPORT_SYMBOL(rockchip_wifi_reset);
  *
  *************************************************************************/
 #include <linux/etherdevice.h>
+#include <linux/errno.h>
 u8 wifi_custom_mac_addr[6] = {0,0,0,0,0,0};
 extern char GetSNSectorInfo(char * pbuf);
+
+//#define ENABLE_WIFI_RAND_MAC
+#ifdef ENABLE_WIFI_RAND_MAC
+#define WIFI_RAND_MAC_FILE "/data/misc/wifi_rand_mac"
+static int rockchip_wifi_rand_mac_addr(unsigned char *buf)
+{
+    struct file *fp; 
+    loff_t pos;
+    mm_segment_t fs;
+    char mac_buf[20] = {0};
+
+    LOG("%s\n", __func__);
+    fp = filp_open(WIFI_RAND_MAC_FILE, O_RDONLY, 0);
+    if (fp == NULL || IS_ERR(fp)) {
+        fp = filp_open(WIFI_RAND_MAC_FILE, O_RDWR | O_CREAT, 0644);
+        if (fp == NULL || IS_ERR(fp)) {
+            LOG("%s: create %s failed.\n", __func__, WIFI_RAND_MAC_FILE);
+            return -1;
+        }
+        fs = get_fs();
+        set_fs(KERNEL_DS);
+        random_ether_addr(wifi_custom_mac_addr);
+        pos = 0;
+        vfs_write(fp, wifi_custom_mac_addr, 6, &pos);
+        filp_close(fp, NULL);  
+    } else {
+        fs = get_fs();
+        set_fs(KERNEL_DS);
+        pos = 0;
+        vfs_read(fp, wifi_custom_mac_addr, 6, &pos);
+        filp_close(fp, NULL); 
+    }
+    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("random wifi_custom_mac_addr=[%s]\n", mac_buf);    
+    return 0;
+}
+#endif
+
 int rockchip_wifi_mac_addr(unsigned char *buf)
 {
     char mac_buf[20] = {0};
@@ -568,11 +612,13 @@ int rockchip_wifi_mac_addr(unsigned char *buf)
     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);
 
+#ifdef ENABLE_WIFI_RAND_MAC
+    rockchip_wifi_rand_mac_addr(buf);
+#endif
+
     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;
-        }
+        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;
@@ -688,7 +734,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