google_battery: bring up battery pairing function

- hash data via MD5: DINF size reduce from 32 to 16 bytes
- get serialno via write file node in ag/17365287

Bug: 215592076
Bug: 161574834
Signed-off-by: Jenny Ho <[email protected]>
Change-Id: I127986597c06f4b66efbb6b1760245ae1caff9bd
diff --git a/google_battery.c b/google_battery.c
index 37a65b8..97b1a47 100644
--- a/google_battery.c
+++ b/google_battery.c
@@ -98,12 +98,6 @@
 	CHG_DEADLINE_CLEARED = 0,
 };
 
-#undef MODULE_PARAM_PREFIX
-#define MODULE_PARAM_PREFIX	"androidboot."
-#define DEV_SN_LENGTH		20
-static char dev_sn[DEV_SN_LENGTH];
-module_param_string(serialno, dev_sn, DEV_SN_LENGTH, 0000);
-
 #if (GBMS_CCBIN_BUCKET_COUNT < 1) || (GBMS_CCBIN_BUCKET_COUNT > 100)
 #error "GBMS_CCBIN_BUCKET_COUNT needs to be a value from 1-100"
 #endif
@@ -231,6 +225,7 @@
 	u8 bpst_count;
 };
 
+#define DEV_SN_LENGTH 20
 enum batt_paired_state {
 	BATT_PAIRING_WRITE_ERROR = -4,
 	BATT_PAIRING_READ_ERROR = -3,
@@ -456,6 +451,7 @@
 
 	/* used to detect battery replacements and reset statistics */
 	enum batt_paired_state pairing_state;
+	char dev_sn[DEV_SN_LENGTH];
 
 	/* collect battery history/lifetime data (history) */
 	enum batt_lfcollect_status blf_state;
@@ -6315,6 +6311,29 @@
 
 static const DEVICE_ATTR_RO(power_metrics_current);
 
+static ssize_t dev_sn_store(struct device *dev,
+			    struct device_attribute *attr,
+			    const char *buf, size_t count)
+{
+	struct power_supply *psy = container_of(dev, struct power_supply, dev);
+	struct batt_drv *batt_drv = power_supply_get_drvdata(psy);
+
+	memcpy(batt_drv->dev_sn, buf, strlen(buf));
+
+	return count;
+}
+
+static ssize_t dev_sn_show(struct device *dev,
+			   struct device_attribute *attr, char *buf)
+{
+	struct power_supply *psy = container_of(dev, struct power_supply, dev);
+	struct batt_drv *batt_drv = power_supply_get_drvdata(psy);
+
+	return scnprintf(buf, PAGE_SIZE, "%s\n", batt_drv->dev_sn);
+}
+
+static const DEVICE_ATTR_RW(dev_sn);
+
 /* ------------------------------------------------------------------------- */
 
 static int batt_init_fs(struct batt_drv *batt_drv)
@@ -6488,6 +6507,9 @@
 	ret = device_create_file(&batt_drv->psy->dev, &dev_attr_power_metrics_current);
 	if (ret)
 		dev_err(&batt_drv->psy->dev, "Failed to create power_metrics_current\n");
+	ret = device_create_file(&batt_drv->psy->dev, &dev_attr_dev_sn);
+	if (ret)
+		dev_err(&batt_drv->psy->dev, "Failed to create dev sn\n");
 
 	de = debugfs_create_dir("google_battery", 0);
 	if (IS_ERR_OR_NULL(de))
@@ -6661,15 +6683,15 @@
 		      res, err);
 }
 
-static int batt_do_sha256(const u8 *data, unsigned int len, u8 *result)
+static int batt_do_md5(const u8 *data, unsigned int len, u8 *result)
 {
 	struct crypto_shash *tfm;
 	struct shash_desc *shash;
 	int size, ret = 0;
 
-	tfm = crypto_alloc_shash("sha256", 0, 0);
+	tfm = crypto_alloc_shash("md5", 0, 0);
 	if (IS_ERR(tfm)) {
-		pr_err("Error SHA-256 transform: %ld\n", PTR_ERR(tfm));
+		pr_err("Error MD5 transform: %ld\n", PTR_ERR(tfm));
 		return PTR_ERR(tfm);
 	}
 
@@ -6690,11 +6712,16 @@
 /* called with a lock on ->chg_lock */
 static enum batt_paired_state batt_check_pairing_state(struct batt_drv *batt_drv)
 {
-	const int len = strlen(dev_sn);
 	char dev_info[GBMS_DINF_LEN];
 	char mfg_info[GBMS_MINF_LEN];
 	u8 *dev_info_check = batt_drv->dev_info_check;
-	int ret;
+	int ret, len;
+
+	len = strlen(batt_drv->dev_sn);
+
+	/* No dev_sn, return current state */
+	if (len == 0)
+		return batt_drv->pairing_state;
 
 	ret = gbms_storage_read(GBMS_TAG_DINF, dev_info, GBMS_DINF_LEN);
 	if (ret < 0) {
@@ -6711,23 +6738,20 @@
 			return BATT_PAIRING_READ_ERROR;
 		}
 
-		memcpy(data, dev_sn, len);
+		memcpy(data, batt_drv->dev_sn, len);
 		memcpy(&data[len], mfg_info, GBMS_MINF_LEN);
 
-		ret = batt_do_sha256(data, len + GBMS_MINF_LEN, dev_info_check);
+		ret = batt_do_md5(data, len + GBMS_MINF_LEN, dev_info_check);
 		if (ret < 0) {
-			pr_err("execute batt_do_sha256 fail, ret=%d\n", ret);
+			pr_err("execute batt_do_md5 fail, ret=%d\n", ret);
 			return BATT_PAIRING_MISMATCH;
 		}
-
-		pr_info("dev_info_check: %*ph\n", (int)sizeof(dev_info_check), dev_info_check);
 	}
 
 	/* new battery: pair the battery to this device */
 	if (dev_info[0] == 0xFF) {
 
-		ret = gbms_storage_write(GBMS_TAG_DINF, dev_info_check,
-					 strlen(dev_info_check));
+		ret = gbms_storage_write(GBMS_TAG_DINF, dev_info_check, GBMS_DINF_LEN);
 		if (ret < 0) {
 			pr_err("Pairing to this device failed, ret=%d\n", ret);
 			return BATT_PAIRING_WRITE_ERROR;
@@ -6735,8 +6759,6 @@
 
 	/* recycled battery */
 	} else if (strncmp(dev_info, dev_info_check, strlen(dev_info_check))) {
-		pr_warn("dev_sn=%*ph\n", (int)sizeof(dev_sn), dev_sn);
-		pr_warn("dev_info=%*ph\n", (int)sizeof(dev_info), dev_info);
 		pr_warn("Battery paired to a different device\n");
 
 		return BATT_PAIRING_MISMATCH;