summaryrefslogtreecommitdiff
path: root/io-module/mtac.c
blob: 99e2ce75f4a6811f98f36013f0508d33f2d26b72 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
static struct kobj_attribute* create_attribute(const char* _name, umode_t _mode) {
	char* attr_name;
	struct kobj_attribute* _attr;
	
	_attr = kzalloc(sizeof(struct kobj_attribute), GFP_KERNEL);
	if (! _attr) {
		log_error("kzalloc of attribute %s failed", _name);
		return NULL;
	}

	sysfs_attr_init(_attr);
	attr_name = kstrdup(_name, GFP_KERNEL);
	if (! attr_name) {
		log_error("GFP_KERNEL dup failed for attribute [%s]", _name);
		return NULL;
	}

	_attr->attr.name = attr_name;
	_attr->attr.mode = _mode;

	return _attr;
}

static ssize_t ap_show_product_info(struct kobject *kobj, struct kobj_attribute *attr, char *buf) {
	ssize_t value;
	int port;

	if (sscanf(attr->attr.name, "vendor-id:%d", &port) > 0) {
		value = snprintf(buf, 32, "%s\n", ap_eeprom[port - 1].vendor_id);
	} else if (sscanf(attr->attr.name, "product-id:%d", &port) > 0) {
		value = snprintf(buf, 32, "%s\n", ap_eeprom[port - 1].product_id);
	} else if (sscanf(attr->attr.name, "device-id:%d", &port) > 0) {
		value = snprintf(buf, 32, "%s\n", ap_eeprom[port - 1].device_id);
	} else if (sscanf(attr->attr.name, "hw-version:%d", &port) > 0) {
		value = snprintf(buf, 32, "%s\n", ap_eeprom[port - 1].hw_version);
	} else if (sscanf(attr->attr.name, "mac-eth:%d", &port) > 0) {
		value = sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X\n",
			ap_eeprom[port - 1].mac_addr[0],
			ap_eeprom[port - 1].mac_addr[1],
			ap_eeprom[port - 1].mac_addr[2],
			ap_eeprom[port - 1].mac_addr[3],
			ap_eeprom[port - 1].mac_addr[4],
			ap_eeprom[port - 1].mac_addr[5]);
	} else {
		log_error("attribute '%s' not found", attr->attr.name);
		value = -1;
	}

	return value;
}

static bool ap_add_product_info_attributes(int port, int type) {
	struct kobj_attribute *attr;
	char buf[32];

	switch (type) {
		case MTAC_ETH_0_0:
			sprintf(buf, "mac-eth:%d", port);
			attr = create_attribute(buf, MTS_ATTR_MODE_RO);
			if (! attr) {
				log_error("failed to create attribute[%s]", buf);
				return false;
			}
			attr->show = ap_show_product_info;
			device_attrs[device_attrs_size++] = &attr->attr;
			break;

		case MTAC_GPIOB_0_0:
		case MTAC_MFSER_0_0:
			break;
		default:
			log_error("invalid accessory card type");
			return false;
	}

	sprintf(buf, "vendor-id:%d", port);
	attr = create_attribute(buf, MTS_ATTR_MODE_RO);
	if (! attr) {
		log_error("failed to create attribute[%s]", buf);
		return false;
	}
	attr->show = ap_show_product_info;
	device_attrs[device_attrs_size++] = &attr->attr;

	sprintf(buf, "product-id:%d", port);
	attr = create_attribute(buf, MTS_ATTR_MODE_RO);
	if (! attr) {
		log_error("failed to create attribute[%s]", buf);
		return false;
	}
	attr->show = ap_show_product_info;
	device_attrs[device_attrs_size++] = &attr->attr;

	sprintf(buf, "device-id:%d", port);
	attr = create_attribute(buf, MTS_ATTR_MODE_RO);
	if (! attr) {
		log_error("failed to create attribute[%s]", buf);
		return false;
	}
	attr->show = ap_show_product_info;
	device_attrs[device_attrs_size++] = &attr->attr;

	sprintf(buf, "hw-version:%d", port);
	attr = create_attribute(buf, MTS_ATTR_MODE_RO);
	if (! attr) {
		log_error("failed to create attribute[%s]", buf);
		return false;
	}
	attr->show = ap_show_product_info;
	device_attrs[device_attrs_size++] = &attr->attr;

	return true;
}