From b697b8ad545faae6442a3cf9d633bdac1cf963bb Mon Sep 17 00:00:00 2001 From: wangxuan Date: Tue, 23 Oct 2018 12:05:47 +0800 Subject: [PATCH] [RAMEN9610-11445][9610] wlbt : update MAC addr scheme to avoid merge conflict Read wifi/bt addr from utag Change-Id: I34ceefe178bdd0c3285f1f1cc0b504991ee65fbb --- drivers/misc/samsung/scsc/mx140_file.c | 83 +++++++++++++++++++ drivers/misc/samsung/scsc_bt/scsc_bt_module.c | 2 +- drivers/misc/samsung/scsc_bt/scsc_bt_priv.h | 2 +- drivers/net/wireless/scsc/mgt.c | 43 +++++----- drivers/net/wireless/scsc/mgt.h | 2 + include/scsc/scsc_mx.h | 8 ++ 6 files changed, 118 insertions(+), 22 deletions(-) mode change 100644 => 100755 drivers/misc/samsung/scsc/mx140_file.c diff --git a/drivers/misc/samsung/scsc/mx140_file.c b/drivers/misc/samsung/scsc/mx140_file.c old mode 100644 new mode 100755 index 40e918e6f88a..123cf4fcd074 --- a/drivers/misc/samsung/scsc/mx140_file.c +++ b/drivers/misc/samsung/scsc/mx140_file.c @@ -52,6 +52,8 @@ #define MX140_FW_VARIANT_DEFAULT "mx140" +#define MX140_FW_MAC_FILE_SIZE (24) + /* Table of suffixes to append to f/w name */ struct fw_suffix { char suffix[6]; @@ -466,6 +468,87 @@ int mx140_request_file(struct scsc_mx *mx, char *path, const struct firmware **f } EXPORT_SYMBOL(mx140_request_file); +int mx140_request_proc_file(struct scsc_mx *mx, char *path, const struct firmware **firmp) +{ + struct file *f; + mm_segment_t fs; + struct kstat stat; + int r; + struct firmware *firm; + char *buf; + + SCSC_TAG_DEBUG(MX_FILE, "request proc %s\n", path); + + *firmp = NULL; + + /* Current segment. */ + fs = get_fs(); + /* Set to kernel segment. */ + set_fs(get_ds()); + + /* Check f/w bin */ + r = vfs_stat(path, &stat); + if (r != 0) { + set_fs(fs); + SCSC_TAG_ERR(MX_FILE, "vfs_stat() failed for %s\n", path); + return -ENOENT; + } + /* Revert to original segment. */ + set_fs(fs); + + /* Get memory for file contents. */ + buf = vzalloc(MX140_FW_MAC_FILE_SIZE); + if (!buf) { + SCSC_TAG_ERR(MX_FILE, "kzalloc(%d) failed for %s\n", MX140_FW_MAC_FILE_SIZE, path); + return -ENOMEM; + } + + /* Get firmware structure. */ + firm = kzalloc(sizeof(*firm), GFP_KERNEL); + if (!firm) { + vfree(buf); + SCSC_TAG_ERR(MX_FILE, "kzalloc(%zu) failed for %s\n", sizeof(*firmp), path); + return -ENOMEM; + } + + /* Open the file for reading. */ + f = filp_open(path, O_RDONLY, 0); + if (IS_ERR(f)) { + vfree(buf); + kfree(firm); + SCSC_TAG_ERR(MX_FILE, "filp_open() failed for %s with %ld\n", path, PTR_ERR(f)); + return -ENOENT; + } + + fs = get_fs(); + set_fs(get_ds()); + + r = vfs_read(f, buf, MX140_FW_MAC_FILE_SIZE, &f->f_pos); + if (r < 0) { + SCSC_TAG_ERR(MX_FILE, "error reading %s\n", path); + return -ENOENT; + } + + set_fs(fs); + filp_close(f, NULL); + + if (r >= 0) { + r = 0; + /* Pass to caller. Caller will free allocated memory through + * mx140_release_file(). + */ + firm->size = MX140_FW_MAC_FILE_SIZE; + firm->data = buf; + *firmp = firm; + } else { + vfree(buf); + kfree(firm); + } + return r; +} +EXPORT_SYMBOL(mx140_request_proc_file); + + int mx140_release_file(struct scsc_mx *mx, const struct firmware *firmp) { if (!firmp || !firmp->data) { diff --git a/drivers/misc/samsung/scsc_bt/scsc_bt_module.c b/drivers/misc/samsung/scsc_bt/scsc_bt_module.c index 64954aa8926a..67f3dca83ad8 100755 --- a/drivers/misc/samsung/scsc_bt/scsc_bt_module.c +++ b/drivers/misc/samsung/scsc_bt/scsc_bt_module.c @@ -648,7 +648,7 @@ static int setup_bhcs(struct scsc_service *service, SCSC_TAG_DEBUG(BT_COMMON, "loading Bluetooth address configuration file: " SCSC_BT_ADDR "\n"); - err = mx140_request_file(common_service.maxwell_core, SCSC_BT_ADDR, &firm); + err = mx140_request_proc_file(common_service.maxwell_core, SCSC_BT_ADDR, &firm); if (err) { /* Not found - just silently ignore this */ SCSC_TAG_DEBUG(BT_COMMON, "Bluetooth address not found\n"); diff --git a/drivers/misc/samsung/scsc_bt/scsc_bt_priv.h b/drivers/misc/samsung/scsc_bt/scsc_bt_priv.h index 1415ea0b43ab..76634646c0fb 100755 --- a/drivers/misc/samsung/scsc_bt/scsc_bt_priv.h +++ b/drivers/misc/samsung/scsc_bt/scsc_bt_priv.h @@ -53,7 +53,7 @@ #define SCSC_BT_ADDR "/csa/bluetooth/.bd_addr" #define SCSC_BT_ADDR_LEN (3) #else -#define SCSC_BT_ADDR "/mnt/vendor/efs/bluetooth/bt_addr" +#define SCSC_BT_ADDR "/proc/config/bt_mac/ascii" #define SCSC_BT_ADDR_LEN (6) #endif diff --git a/drivers/net/wireless/scsc/mgt.c b/drivers/net/wireless/scsc/mgt.c index c6073eea9b0d..d5d444682f15 100755 --- a/drivers/net/wireless/scsc/mgt.c +++ b/drivers/net/wireless/scsc/mgt.c @@ -126,29 +126,26 @@ void slsi_get_hw_mac_address(struct slsi_dev *sdev, u8 *addr) int r; /* read maddr_file */ - if (sdev->maddr_file_name) { - scnprintf(path_name, MX_WLAN_FILE_PATH_LEN_MAX, "wlan/%s", sdev->maddr_file_name); - SLSI_DBG1(sdev, SLSI_INIT_DEINIT, "MAC address file : %s\n", path_name); + r = mx140_request_proc_file(sdev->maxwell_core, SLSI_WIFI_ADDR, &e); - r = mx140_file_request_device_conf(sdev->maxwell_core, &e, path_name); - if (r != 0) - goto mac_efs; + if (r != 0) + goto mac_efs; - if (!e) { - SLSI_ERR(sdev, "mx140_file_request_device_conf() returned succes, but firmware was null\n"); - goto mac_efs; - } - r = sscanf(e->data, "%02X:%02X:%02X:%02X:%02X:%02X", &u[0], &u[1], &u[2], &u[3], &u[4], &u[5]); - mx140_file_release_conf(sdev->maxwell_core, e); - if (r != ETH_ALEN) { - SLSI_ERR(sdev, "%s exists, but format is incorrect (should be e.g. xx:xx:xx:xx:xx:xx)\n", path_name); - goto mac_efs; - } - for (i = 0; i < ETH_ALEN; i++) - addr[i] = u[i] & 0xff; - SLSI_INFO(sdev, "MAC address loaded from %s: %02X:%02X:%02X:%02X:%02X:%02X\n", path_name, u[0], u[1], u[2], u[3], u[4], u[5]); - return; + if (!e) { + SLSI_ERR(sdev, "mx140_file_request_device_conf() returned succes, but firmware was null\n"); + goto mac_efs; + } + r = sscanf(e->data, "%02X:%02X:%02X:%02X:%02X:%02X", &u[0], &u[1], &u[2], &u[3], &u[4], &u[5]); + mx140_file_release_conf(sdev->maxwell_core, e); + if (r != ETH_ALEN) { + SLSI_ERR(sdev, "%s exists, but format is incorrect (should be e.g. xx:xx:xx:xx:xx:xx)\n", SLSI_WIFI_ADDR); + goto mac_efs; } + for (i = 0; i < ETH_ALEN; i++) + addr[i] = u[i] & 0xff; + SLSI_INFO(sdev, "MAC address loaded from %s: %02X:%02X:%02X:%02X:%02X:%02X\n", path_name, u[0], u[1], u[2], u[3], u[4], u[5]); + return; + mac_efs: #ifdef CONFIG_SCSC_WLAN_MAC_ADDRESS_FILENAME r = mx140_request_file(sdev->maxwell_core, CONFIG_SCSC_WLAN_MAC_ADDRESS_FILENAME, &e); @@ -166,6 +163,12 @@ mac_efs: for (i = 0; i < ETH_ALEN; i++) addr[i] = u[i] & 0xff; SLSI_INFO(sdev, "MAC address loaded from %s: %02X:%02X:%02X:%02X:%02X:%02X\n", CONFIG_SCSC_WLAN_MAC_ADDRESS_FILENAME, u[0], u[1], u[2], u[3], u[4], u[5]); + + /* MAC address in efs could be invalid, try to fix it to normal address */ + if (addr[0] & 0x01) { + addr[0] = addr[0] & 0xfe; + SLSI_INFO(sdev, "MAC address invalid, fixed address: %pM", addr); + } mx140_release_file(sdev->maxwell_core, e); return; #endif diff --git a/drivers/net/wireless/scsc/mgt.h b/drivers/net/wireless/scsc/mgt.h index c013e042fd3b..31c909a692c9 100755 --- a/drivers/net/wireless/scsc/mgt.h +++ b/drivers/net/wireless/scsc/mgt.h @@ -140,6 +140,8 @@ #define SLSI_RX_SEQ_NUM_MASK 0xFFF #define SLSI_RX_VIA_TDLS_LINK 0x8000 +#define SLSI_WIFI_ADDR "/proc/config/wifi_mac/ascii" + #define SET_ETHERTYPE_PATTERN_DESC(pd, ethertype) \ pd.offset = 0x0C; \ pd.mask_length = 2; \ diff --git a/include/scsc/scsc_mx.h b/include/scsc/scsc_mx.h index ff8965c877da..af99136a6d37 100755 --- a/include/scsc/scsc_mx.h +++ b/include/scsc/scsc_mx.h @@ -300,6 +300,14 @@ void mx140_file_release_conf(struct scsc_mx *mx, const struct firmware *conf); */ int mx140_request_file(struct scsc_mx *mx, char *path, const struct firmware **firmp); +/* Read device configuration proc file into memory. + * + * Path is absolute. + * Returns pointer to data or NULL if file not found. + * Call mx140_release_file() to release the memory. + */ +int mx140_request_proc_file(struct scsc_mx *mx, char *path, const struct firmware **firmp); + /* Release configuration file memory allocated with mx140_request_file() * * If firmp is NULL, has no effect. -- 2.20.1