From 37f49e37ab4cb5d0bc4c60eb5c6d4dd57db767bb Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Fri, 10 May 2024 07:44:59 +0000
Subject: [PATCH] gmac get mac form eeprom
---
kernel/drivers/soc/rockchip/mtd_vendor_storage.c | 85 ++++++++++++++++++++----------------------
1 files changed, 40 insertions(+), 45 deletions(-)
diff --git a/kernel/drivers/soc/rockchip/mtd_vendor_storage.c b/kernel/drivers/soc/rockchip/mtd_vendor_storage.c
index c840ead..1f32930 100644
--- a/kernel/drivers/soc/rockchip/mtd_vendor_storage.c
+++ b/kernel/drivers/soc/rockchip/mtd_vendor_storage.c
@@ -16,38 +16,13 @@
#include <linux/soc/rockchip/rk_vendor_storage.h>
#include <linux/uaccess.h>
#include <linux/vmalloc.h>
+#include <misc/rkflash_vendor_storage.h>
#define MTD_VENDOR_PART_START 0
-#define MTD_VENDOR_PART_SIZE 8
+#define MTD_VENDOR_PART_SIZE FLASH_VENDOR_PART_SIZE
+#define MTD_VENDOR_NOR_BLOCK_SIZE 128
#define MTD_VENDOR_PART_NUM 1
-#define MTD_VENDOR_TAG 0x524B5644
-
-struct rk_vendor_req {
- u32 tag;
- u16 id;
- u16 len;
- u8 data[1024];
-};
-
-struct vendor_item {
- u16 id;
- u16 offset;
- u16 size;
- u16 flag;
-};
-
-struct vendor_info {
- u32 tag;
- u32 version;
- u16 next_index;
- u16 item_num;
- u16 free_offset;
- u16 free_size;
- struct vendor_item item[62];
- u8 data[MTD_VENDOR_PART_SIZE * 512 - 512 - 8];
- u32 hash;
- u32 version2;
-};
+#define MTD_VENDOR_TAG VENDOR_HEAD_TAG
struct mtd_nand_info {
u32 blk_offset;
@@ -65,16 +40,14 @@
#define GET_LOCK_FLAG_IO _IOW('r', 0x53, unsigned int)
#endif
-#define VENDOR_REQ_TAG 0x56524551
-#define VENDOR_READ_IO _IOW('v', 0x01, unsigned int)
-#define VENDOR_WRITE_IO _IOW('v', 0x02, unsigned int)
-
static u8 *g_idb_buffer;
-static struct vendor_info *g_vendor;
+static struct flash_vendor_info *g_vendor;
static DEFINE_MUTEX(vendor_ops_mutex);
static struct mtd_info *mtd;
+static u32 mtd_erase_size;
static const char *vendor_mtd_name = "vnvm";
static struct mtd_nand_info nand_info;
+static struct platform_device *g_pdev;
static int mtd_vendor_nand_write(void)
{
@@ -83,8 +56,8 @@
struct erase_info ei;
re_write:
- if (nand_info.page_offset >= mtd->erasesize) {
- nand_info.blk_offset += mtd->erasesize;
+ if (nand_info.page_offset >= mtd_erase_size) {
+ nand_info.blk_offset += mtd_erase_size;
if (nand_info.blk_offset >= mtd->size)
nand_info.blk_offset = 0;
if (mtd_block_isbad(mtd, nand_info.blk_offset))
@@ -92,7 +65,7 @@
memset(&ei, 0, sizeof(struct erase_info));
ei.addr = nand_info.blk_offset;
- ei.len = mtd->erasesize;
+ ei.len = mtd_erase_size;
if (mtd_erase(mtd, &ei))
goto re_write;
@@ -129,7 +102,15 @@
nand_info.ops_size = (sizeof(*g_vendor) + mtd->writesize - 1) / mtd->writesize;
nand_info.ops_size *= mtd->writesize;
- for (offset = 0; offset < mtd->size; offset += mtd->erasesize) {
+ /*
+ * The NOR FLASH erase size maybe config as 4KB, need to re-define
+ * and maintain consistency with uboot.
+ */
+ mtd_erase_size = mtd->erasesize;
+ if (mtd_erase_size <= MTD_VENDOR_NOR_BLOCK_SIZE * 512)
+ mtd_erase_size = MTD_VENDOR_NOR_BLOCK_SIZE * 512;
+
+ for (offset = 0; offset < mtd->size; offset += mtd_erase_size) {
if (!mtd_block_isbad(mtd, offset)) {
err = mtd_read(mtd, offset, sizeof(*g_vendor),
&bytes_read, (u8 *)g_vendor);
@@ -144,11 +125,11 @@
}
}
} else if (nand_info.blk_offset == offset)
- nand_info.blk_offset += mtd->erasesize;
+ nand_info.blk_offset += mtd_erase_size;
}
if (nand_info.version) {
- for (offset = mtd->erasesize - nand_info.ops_size;
+ for (offset = mtd_erase_size - nand_info.ops_size;
offset >= 0;
offset -= nand_info.ops_size) {
err = mtd_read(mtd, nand_info.blk_offset + offset,
@@ -174,7 +155,10 @@
if (bytes_read == sizeof(*g_vendor) &&
g_vendor->tag == MTD_VENDOR_TAG &&
g_vendor->version == g_vendor->version2) {
- nand_info.version = g_vendor->version;
+ if (nand_info.version > g_vendor->version)
+ g_vendor->version = nand_info.version;
+ else
+ nand_info.version = g_vendor->version;
break;
}
}
@@ -184,11 +168,11 @@
g_vendor->tag = MTD_VENDOR_TAG;
g_vendor->free_size = sizeof(g_vendor->data);
g_vendor->version2 = g_vendor->version;
- for (offset = 0; offset < mtd->size; offset += mtd->erasesize) {
+ for (offset = 0; offset < mtd->size; offset += mtd_erase_size) {
if (!mtd_block_isbad(mtd, offset)) {
memset(&ei, 0, sizeof(struct erase_info));
ei.addr = nand_info.blk_offset + offset;
- ei.len = mtd->erasesize;
+ ei.len = mtd_erase_size;
mtd_erase(mtd, &ei);
}
}
@@ -305,7 +289,7 @@
{
long ret = -1;
int size;
- struct rk_vendor_req *v_req;
+ struct RK_VENDOR_REQ *v_req;
u32 *page_buf;
page_buf = kmalloc(4096, GFP_KERNEL);
@@ -314,7 +298,7 @@
mutex_lock(&vendor_ops_mutex);
- v_req = (struct rk_vendor_req *)page_buf;
+ v_req = (struct RK_VENDOR_REQ *)page_buf;
switch (cmd) {
case VENDOR_READ_IO:
@@ -436,6 +420,8 @@
g_idb_buffer = NULL;
ret = platform_driver_register(&vendor_storage_driver);
+ if (ret)
+ return ret;
pdev = platform_device_register_simple("mtd_vendor_storage",
-1, NULL, 0);
@@ -443,8 +429,17 @@
platform_driver_unregister(&vendor_storage_driver);
return PTR_ERR(pdev);
}
+ g_pdev = pdev;
return ret;
}
+static __exit void vendor_storage_deinit(void)
+{
+ platform_device_unregister(g_pdev);
+ platform_driver_unregister(&vendor_storage_driver);
+}
+
device_initcall_sync(vendor_storage_init);
+module_exit(vendor_storage_deinit);
+MODULE_LICENSE("GPL");
--
Gitblit v1.6.2