[device]: add the new platform ag9064 (#23)
Signed-off-by: hans <hans.tseng@deltaww.com>
This commit is contained in:
parent
764a7edd83
commit
cbf204ba01
@ -51,7 +51,7 @@ class SfpUtil(SfpUtilBase):
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
try:
|
try:
|
||||||
reg_file = open("/sys/devices/platform/delta-ag9032v1-cpld.0/sfp_present")
|
reg_file = open("/sys/devices/platform/delta-ag9032v1-swpld.0/sfp_present")
|
||||||
except IOError as e:
|
except IOError as e:
|
||||||
print "Error: unable to open file: %s" % str(e)
|
print "Error: unable to open file: %s" % str(e)
|
||||||
return False
|
return False
|
||||||
@ -76,7 +76,7 @@ class SfpUtil(SfpUtilBase):
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
try:
|
try:
|
||||||
reg_file = open("/sys/devices/platform/delta-ag9032v1-cpld.0/sfp_lpmode")
|
reg_file = open("/sys/devices/platform/delta-ag9032v1-swpld.0/sfp_lpmode")
|
||||||
except IOError as e:
|
except IOError as e:
|
||||||
print "Error: unable to open file: %s" % str(e)
|
print "Error: unable to open file: %s" % str(e)
|
||||||
|
|
||||||
@ -100,7 +100,7 @@ class SfpUtil(SfpUtilBase):
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
try:
|
try:
|
||||||
reg_file = open("/sys/devices/platform/delta-ag9032v1-cpld.0/sfp_lpmode", "r+")
|
reg_file = open("/sys/devices/platform/delta-ag9032v1-swpld.0/sfp_lpmode", "r+")
|
||||||
except IOError as e:
|
except IOError as e:
|
||||||
print "Error: unable to open file: %s" % str(e)
|
print "Error: unable to open file: %s" % str(e)
|
||||||
return False
|
return False
|
||||||
@ -129,7 +129,7 @@ class SfpUtil(SfpUtilBase):
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
def reset(self, port_num):
|
def reset(self, port_num):
|
||||||
QSFP_RESET_REGISTER_DEVICE_FILE = "/sys/devices/platform/delta-ag9032v1-cpld.0/sfp_reset"
|
QSFP_RESET_REGISTER_DEVICE_FILE = "/sys/devices/platform/delta-ag9032v1-swpld.0/sfp_reset"
|
||||||
|
|
||||||
# Check for invalid port_num
|
# Check for invalid port_num
|
||||||
if port_num < self.port_start or port_num > self.port_end:
|
if port_num < self.port_start or port_num > self.port_end:
|
||||||
@ -172,4 +172,4 @@ class SfpUtil(SfpUtilBase):
|
|||||||
reg_file.write(hex(reg_value))
|
reg_file.write(hex(reg_value))
|
||||||
reg_file.close()
|
reg_file.close()
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
@ -1,67 +1,65 @@
|
|||||||
# name lanes alias index
|
# name lanes alias
|
||||||
Ethernet0 49,50,51,52 Ethernet1/1 1
|
Ethernet0 49,50,51,52 Ethernet1/1
|
||||||
Ethernet4 53,54,55,56 Ethernet2/1 2
|
Ethernet4 53,54,55,56 Ethernet2/1
|
||||||
Ethernet8 65,66,67,68 Ethernet3/1 3
|
Ethernet8 65,66,67,68 Ethernet3/1
|
||||||
Ethernet12 69,70,71,72 Ethernet4/1 4
|
Ethernet12 69,70,71,72 Ethernet4/1
|
||||||
Ethernet16 81,82,83,84 Ethernet5/1 5
|
Ethernet16 81,82,83,84 Ethernet5/1
|
||||||
Ethernet20 85,86,87,88 Ethernet6/1 6
|
Ethernet20 85,86,87,88 Ethernet6/1
|
||||||
Ethernet24 1,2,3,4 Ethernet7/1 7
|
Ethernet24 1,2,3,4 Ethernet7/1
|
||||||
Ethernet28 101,102,103,104 Ethernet8/1 8
|
Ethernet28 101,102,103,104 Ethernet8/1
|
||||||
Ethernet32 5,6,7,8 Ethernet9/1 9
|
Ethernet32 5,6,7,8 Ethernet9/1
|
||||||
Ethernet36 17,18,19,20 Ethernet10/1 10
|
Ethernet36 17,18,19,20 Ethernet10/1
|
||||||
Ethernet40 21,22,23,24 Ethernet11/1 11
|
Ethernet40 21,22,23,24 Ethernet11/1
|
||||||
Ethernet44 33,34,35,36 Ethernet12/1 12
|
Ethernet44 33,34,35,36 Ethernet12/1
|
||||||
Ethernet48 37,38,39,40 Ethernet13/1 13
|
Ethernet48 37,38,39,40 Ethernet13/1
|
||||||
Ethernet52 97,98,99,100 Ethernet14/1 14
|
Ethernet52 97,98,99,100 Ethernet14/1
|
||||||
Ethernet56 113,114,115,116 Ethernet15/1 15
|
Ethernet56 113,114,115,116 Ethernet15/1
|
||||||
Ethernet60 117,118,119,120 Ethernet16/1 16
|
Ethernet60 117,118,119,120 Ethernet16/1
|
||||||
Ethernet64 129,130,131,132 Ethernet17/1 17
|
Ethernet64 129,130,131,132 Ethernet17/1
|
||||||
Ethernet68 133,134,135,136 Ethernet18/1 18
|
Ethernet68 133,134,135,136 Ethernet18/1
|
||||||
Ethernet72 145,146,147,148 Ethernet19/1 19
|
Ethernet72 145,146,147,148 Ethernet19/1
|
||||||
Ethernet76 209,210,211,212 Ethernet20/1 20
|
Ethernet76 209,210,211,212 Ethernet20/1
|
||||||
Ethernet80 213,214,215,216 Ethernet21/1 21
|
Ethernet80 213,214,215,216 Ethernet21/1
|
||||||
Ethernet84 225,226,227,228 Ethernet22/1 22
|
Ethernet84 225,226,227,228 Ethernet22/1
|
||||||
Ethernet88 229,230,231,232 Ethernet23/1 23
|
Ethernet88 229,230,231,232 Ethernet23/1
|
||||||
Ethernet92 241,242,243,244 Ethernet24/1 24
|
Ethernet92 241,242,243,244 Ethernet24/1
|
||||||
Ethernet96 245,246,247,248 Ethernet25/1 25
|
Ethernet96 245,246,247,248 Ethernet25/1
|
||||||
Ethernet100 157,158,159,160 Ethernet26/1 26
|
Ethernet100 157,158,159,160 Ethernet26/1
|
||||||
Ethernet104 161,162,163,164 Ethernet27/1 27
|
Ethernet104 161,162,163,164 Ethernet27/1
|
||||||
Ethernet108 165,166,167,168 Ethernet28/1 28
|
Ethernet108 165,166,167,168 Ethernet28/1
|
||||||
Ethernet112 177,178,179,180 Ethernet29/1 29
|
Ethernet112 177,178,179,180 Ethernet29/1
|
||||||
Ethernet116 181,182,183,184 Ethernet30/1 30
|
Ethernet116 181,182,183,184 Ethernet30/1
|
||||||
Ethernet120 193,194,195,196 Ethernet31/1 31
|
Ethernet120 193,194,195,196 Ethernet31/1
|
||||||
Ethernet124 197,198,199,200 Ethernet32/1 32
|
Ethernet124 197,198,199,200 Ethernet32/1
|
||||||
Ethernet128 61,62,63,64 Ethernet33/1 33
|
Ethernet128 61,62,63,64 Ethernet33/1
|
||||||
Ethernet132 57,58,59,60 Ethernet34/1 34
|
Ethernet132 57,58,59,60 Ethernet34/1
|
||||||
Ethernet136 77,78,79,80 Ethernet35/1 35
|
Ethernet136 77,78,79,80 Ethernet35/1
|
||||||
Ethernet140 73,74,75,76 Ethernet36/1 36
|
Ethernet140 73,74,75,76 Ethernet36/1
|
||||||
Ethernet144 93,94,95,96 Ethernet37/1 37
|
Ethernet144 93,94,95,96 Ethernet37/1
|
||||||
Ethernet148 89,90,91,92 Ethernet38/1 38
|
Ethernet148 89,90,91,92 Ethernet38/1
|
||||||
Ethernet152 105,106,107,108 Ethernet39/1 39
|
Ethernet152 105,106,107,108 Ethernet39/1
|
||||||
Ethernet156 9,10,11,12 Ethernet40/1 40
|
Ethernet156 9,10,11,12 Ethernet40/1
|
||||||
Ethernet160 25,26,27,28 Ethernet41/1 41
|
Ethernet160 25,26,27,28 Ethernet41/1
|
||||||
Ethernet164 13,14,15,16 Ethernet42/1 42
|
Ethernet164 13,14,15,16 Ethernet42/1
|
||||||
Ethernet168 41,42,43,44 Ethernet43/1 43
|
Ethernet168 41,42,43,44 Ethernet43/1
|
||||||
Ethernet172 29,30,31,32 Ethernet44/1 44
|
Ethernet172 29,30,31,32 Ethernet44/1
|
||||||
Ethernet176 45,46,47,48 Ethernet45/1 45
|
Ethernet176 45,46,47,48 Ethernet45/1
|
||||||
Ethernet180 109,110,111,112 Ethernet46/1 46
|
Ethernet180 109,110,111,112 Ethernet46/1
|
||||||
Ethernet184 125,126,127,128 Ethernet47/1 47
|
Ethernet184 125,126,127,128 Ethernet47/1
|
||||||
Ethernet188 121,122,123,124 Ethernet48/1 48
|
Ethernet188 121,122,123,124 Ethernet48/1
|
||||||
Ethernet192 141,142,143,144 Ethernet49/1 49
|
Ethernet192 141,142,143,144 Ethernet49/1
|
||||||
Ethernet196 137,138,139,140 Ethernet50/1 50
|
Ethernet196 137,138,139,140 Ethernet50/1
|
||||||
Ethernet200 217,218,219,220 Ethernet51/1 51
|
Ethernet200 217,218,219,220 Ethernet51/1
|
||||||
Ethernet204 149,150,151,152 Ethernet52/1 52
|
Ethernet204 149,150,151,152 Ethernet52/1
|
||||||
Ethernet208 233,234,235,236 Ethernet53/1 53
|
Ethernet208 233,234,235,236 Ethernet53/1
|
||||||
Ethernet212 221,222,223,224 Ethernet54/1 54
|
Ethernet212 221,222,223,224 Ethernet54/1
|
||||||
Ethernet216 249,250,251,252 Ethernet55/1 55
|
Ethernet216 249,250,251,252 Ethernet55/1
|
||||||
Ethernet220 237,238,239,240 Ethernet56/1 56
|
Ethernet220 237,238,239,240 Ethernet56/1
|
||||||
Ethernet224 153,154,155,156 Ethernet57/1 57
|
Ethernet224 153,154,155,156 Ethernet57/1
|
||||||
Ethernet228 253,254,255,256 Ethernet58/1 58
|
Ethernet228 253,254,255,256 Ethernet58/1
|
||||||
Ethernet232 173,174,175,176 Ethernet59/1 59
|
Ethernet232 173,174,175,176 Ethernet59/1
|
||||||
Ethernet236 169,170,171,172 Ethernet60/1 60
|
Ethernet236 169,170,171,172 Ethernet60/1
|
||||||
Ethernet240 189,190,191,192 Ethernet61/1 61
|
Ethernet240 189,190,191,192 Ethernet61/1
|
||||||
Ethernet244 185,186,187,188 Ethernet62/1 62
|
Ethernet244 185,186,187,188 Ethernet62/1
|
||||||
Ethernet248 205,206,207,208 Ethernet63/1 63
|
Ethernet248 205,206,207,208 Ethernet63/1
|
||||||
Ethernet252 201,202,203,204 Ethernet64/1 64
|
Ethernet252 201,202,203,204 Ethernet64/1
|
||||||
Ethernet256 257 Ethernet65 65
|
|
||||||
Ethernet260 259 Ethernet66 66
|
|
||||||
|
@ -554,7 +554,7 @@ static int __exit i2c_deivce_remove(struct platform_device *pdev)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (pdata->client) {
|
if (pdata->client) {
|
||||||
parent = i2c_get_adapter(pdata->parent);
|
parent = (pdata->client)->adapter;
|
||||||
i2c_unregister_device(pdata->client);
|
i2c_unregister_device(pdata->client);
|
||||||
i2c_put_adapter(parent);
|
i2c_put_adapter(parent);
|
||||||
}
|
}
|
||||||
|
@ -776,7 +776,7 @@ static int __exit i2c_deivce_remove(struct platform_device *pdev)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (pdata->client) {
|
if (pdata->client) {
|
||||||
parent = i2c_get_adapter(pdata->parent);
|
parent = (pdata->client)->adapter;
|
||||||
i2c_unregister_device(pdata->client);
|
i2c_unregister_device(pdata->client);
|
||||||
i2c_put_adapter(parent);
|
i2c_put_adapter(parent);
|
||||||
}
|
}
|
||||||
@ -799,7 +799,7 @@ static struct platform_driver i2c_device_driver = {
|
|||||||
struct swpld_mux_platform_data {
|
struct swpld_mux_platform_data {
|
||||||
int parent;
|
int parent;
|
||||||
int base_nr;
|
int base_nr;
|
||||||
struct i2c_client *cpld;
|
// struct i2c_client *cpld;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct swpld_mux {
|
struct swpld_mux {
|
||||||
@ -812,7 +812,7 @@ static struct swpld_mux_platform_data ag9064_swpld_mux_platform_data[] = {
|
|||||||
{
|
{
|
||||||
.parent = BUS9,
|
.parent = BUS9,
|
||||||
.base_nr = BUS9_BASE_NUM,
|
.base_nr = BUS9_BASE_NUM,
|
||||||
.cpld = NULL,
|
// .cpld = NULL,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -827,11 +827,36 @@ static struct platform_device ag9064_swpld_mux[] =
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
#if LINUX_VERSION_CODE < KERNEL_VERSION(4,7,0)
|
||||||
static int swpld_mux_select(struct i2c_adapter *adap, void *data, u8 chan)
|
static int swpld_mux_select(struct i2c_adapter *adap, void *data, u8 chan)
|
||||||
{
|
{
|
||||||
struct swpld_mux *mux = data;
|
|
||||||
uint8_t cmd_data[4]={0};
|
uint8_t cmd_data[4]={0};
|
||||||
|
struct swpld_mux *mux = data;
|
||||||
|
uint8_t set_cmd;
|
||||||
|
int cmd_data_len;
|
||||||
|
|
||||||
|
if ( mux->data.base_nr == BUS9_BASE_NUM )
|
||||||
|
{
|
||||||
|
set_cmd = CMD_SETDATA;
|
||||||
|
cmd_data[0] = BMC_BUS_5;
|
||||||
|
cmd_data[1] = SWPLD2_ADDR;
|
||||||
|
cmd_data[2] = QSFP_PORT_MUX_REG;
|
||||||
|
cmd_data[3] = chan + 1;
|
||||||
|
cmd_data_len = sizeof(cmd_data);
|
||||||
|
// return 0;
|
||||||
|
return dni_bmc_cmd(set_cmd, cmd_data, cmd_data_len);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printk(KERN_ERR "Swpld mux QSFP select port error\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
static int swpld_mux_select(struct i2c_mux_core *muxc, u32 chan)
|
||||||
|
{
|
||||||
|
uint8_t cmd_data[4]={0};
|
||||||
|
struct swpld_mux *mux = i2c_mux_priv(muxc);
|
||||||
uint8_t set_cmd;
|
uint8_t set_cmd;
|
||||||
int cmd_data_len;
|
int cmd_data_len;
|
||||||
|
|
||||||
@ -844,14 +869,18 @@ static int swpld_mux_select(struct i2c_adapter *adap, void *data, u8 chan)
|
|||||||
cmd_data[3] = chan + 1;
|
cmd_data[3] = chan + 1;
|
||||||
cmd_data_len = sizeof(cmd_data);
|
cmd_data_len = sizeof(cmd_data);
|
||||||
return dni_bmc_cmd(set_cmd, cmd_data, cmd_data_len);
|
return dni_bmc_cmd(set_cmd, cmd_data, cmd_data_len);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
printk(KERN_ERR "Swpld mux QSFP select port error\n");
|
printk(KERN_ERR "Swpld mux QSFP select port error\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if LINUX_VERSION_CODE < KERNEL_VERSION(4,7,0)
|
||||||
static int __init swpld_mux_probe(struct platform_device *pdev)
|
static int __init swpld_mux_probe(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
struct swpld_mux *mux;
|
struct swpld_mux *mux;
|
||||||
@ -926,7 +955,76 @@ alloc_failed:
|
|||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
#else // #if LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0)
|
||||||
|
static int __init swpld_mux_probe(struct platform_device *pdev)
|
||||||
|
{
|
||||||
|
struct i2c_mux_core *muxc;
|
||||||
|
struct swpld_mux *mux;
|
||||||
|
struct swpld_mux_platform_data *pdata;
|
||||||
|
struct i2c_adapter *parent;
|
||||||
|
int i, ret, dev_num;
|
||||||
|
|
||||||
|
pdata = pdev->dev.platform_data;
|
||||||
|
if (!pdata) {
|
||||||
|
dev_err(&pdev->dev, "SWPLD platform data not found\n");
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
mux = kzalloc(sizeof(*mux), GFP_KERNEL);
|
||||||
|
if (!mux) {
|
||||||
|
printk(KERN_ERR "Failed to allocate memory for mux\n");
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
mux->data = *pdata;
|
||||||
|
|
||||||
|
parent = i2c_get_adapter(pdata->parent);
|
||||||
|
if (!parent) {
|
||||||
|
kfree(mux);
|
||||||
|
dev_err(&pdev->dev, "Parent adapter (%d) not found\n", pdata->parent);
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
/* Judge bus number to decide how many devices*/
|
||||||
|
switch (pdata->parent) {
|
||||||
|
case BUS9:
|
||||||
|
dev_num = BUS9_DEV_NUM;
|
||||||
|
break;
|
||||||
|
default :
|
||||||
|
dev_num = DEFAULT_NUM;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
muxc = i2c_mux_alloc(parent, &pdev->dev, dev_num, 0, 0,swpld_mux_select, NULL);
|
||||||
|
if (!muxc) {
|
||||||
|
ret = -ENOMEM;
|
||||||
|
goto alloc_failed;
|
||||||
|
}
|
||||||
|
muxc->priv = mux;
|
||||||
|
platform_set_drvdata(pdev, muxc);
|
||||||
|
|
||||||
|
for (i = 0; i < dev_num; i++)
|
||||||
|
{
|
||||||
|
int nr = pdata->base_nr + i;
|
||||||
|
unsigned int class = 0;
|
||||||
|
ret = i2c_mux_add_adapter(muxc, nr, i, class);
|
||||||
|
if (ret) {
|
||||||
|
dev_err(&pdev->dev, "Failed to add adapter %d\n", i);
|
||||||
|
goto add_adapter_failed;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dev_info(&pdev->dev, "%d port mux on %s adapter\n", dev_num, parent->name);
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
add_adapter_failed:
|
||||||
|
i2c_mux_del_adapters(muxc);
|
||||||
|
alloc_failed2:
|
||||||
|
kfree(mux);
|
||||||
|
alloc_failed:
|
||||||
|
i2c_put_adapter(parent);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if LINUX_VERSION_CODE < KERNEL_VERSION(4,7,0)
|
||||||
static int __exit swpld_mux_remove(struct platform_device *pdev)
|
static int __exit swpld_mux_remove(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
@ -966,6 +1064,18 @@ static int __exit swpld_mux_remove(struct platform_device *pdev)
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
#else // #if LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0)
|
||||||
|
static int __exit swpld_mux_remove(struct platform_device *pdev)
|
||||||
|
{
|
||||||
|
struct i2c_mux_core *muxc = platform_get_drvdata(pdev);
|
||||||
|
struct i2c_adapter *parent=muxc->parent;
|
||||||
|
|
||||||
|
i2c_mux_del_adapters(muxc);
|
||||||
|
i2c_put_adapter(parent);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static struct platform_driver swpld_mux_driver = {
|
static struct platform_driver swpld_mux_driver = {
|
||||||
.probe = swpld_mux_probe,
|
.probe = swpld_mux_probe,
|
||||||
@ -977,13 +1087,627 @@ static struct platform_driver swpld_mux_driver = {
|
|||||||
};
|
};
|
||||||
/*---------------- MUX - end ------------- */
|
/*---------------- MUX - end ------------- */
|
||||||
|
|
||||||
|
/*---------------- CPLD - start ------------- */
|
||||||
|
|
||||||
|
/* CPLD -- device */
|
||||||
|
|
||||||
|
static ssize_t get_present(struct device *dev, struct device_attribute \
|
||||||
|
*dev_attr, char *buf)
|
||||||
|
{
|
||||||
|
uint8_t cmd_data[4]={0};
|
||||||
|
int ret;
|
||||||
|
u64 data = 0;
|
||||||
|
uint8_t set_cmd;
|
||||||
|
int cmd_data_len;
|
||||||
|
|
||||||
|
set_cmd = CMD_GETDATA;
|
||||||
|
|
||||||
|
/*QSFP1~8*/
|
||||||
|
cmd_data[0] = BMC_BUS_5;
|
||||||
|
cmd_data[1] = SWPLD1_ADDR;
|
||||||
|
cmd_data[2] = QSFP_PRESENCE_1;
|
||||||
|
cmd_data[3] = 1;
|
||||||
|
cmd_data_len = sizeof(cmd_data);
|
||||||
|
ret = dni_bmc_cmd(set_cmd, cmd_data, cmd_data_len);
|
||||||
|
ret=0;
|
||||||
|
data = (u64)(ret & 0xff);
|
||||||
|
|
||||||
|
/*QSFP9~16*/
|
||||||
|
cmd_data[1] = SWPLD2_ADDR;
|
||||||
|
cmd_data[2] = QSFP_PRESENCE_2;
|
||||||
|
ret = dni_bmc_cmd(set_cmd, cmd_data, cmd_data_len);
|
||||||
|
// ret=0;
|
||||||
|
data |= (u64)(ret & 0xff) << 8;
|
||||||
|
|
||||||
|
/*QSFP17~24*/
|
||||||
|
cmd_data[1] = SWPLD4_ADDR;
|
||||||
|
cmd_data[2] = QSFP_PRESENCE_3;
|
||||||
|
ret = dni_bmc_cmd(set_cmd, cmd_data, cmd_data_len);
|
||||||
|
data |= (u64)(ret & 0xff) << 16;
|
||||||
|
|
||||||
|
/*QSFP25~32*/
|
||||||
|
cmd_data[1] = SWPLD3_ADDR;
|
||||||
|
cmd_data[2] = QSFP_PRESENCE_4;
|
||||||
|
ret = dni_bmc_cmd(set_cmd, cmd_data, cmd_data_len);
|
||||||
|
data |= (u64)(ret & 0xff) << 24;
|
||||||
|
|
||||||
|
/*QSFP33~40*/
|
||||||
|
cmd_data[1] = SWPLD1_ADDR;
|
||||||
|
cmd_data[2] = QSFP_PRESENCE_5;
|
||||||
|
ret = dni_bmc_cmd(set_cmd, cmd_data, cmd_data_len);
|
||||||
|
data |= (u64)(ret & 0xff) << 32;
|
||||||
|
|
||||||
|
/*QSFP41~48*/
|
||||||
|
cmd_data[1] = SWPLD2_ADDR;
|
||||||
|
cmd_data[2] = QSFP_PRESENCE_6;
|
||||||
|
ret = dni_bmc_cmd(set_cmd, cmd_data, cmd_data_len);
|
||||||
|
data |= (u64)(ret & 0xff) << 40;
|
||||||
|
|
||||||
|
/*QSFP49~56*/
|
||||||
|
cmd_data[1] = SWPLD4_ADDR;
|
||||||
|
cmd_data[2] = QSFP_PRESENCE_7;
|
||||||
|
ret = dni_bmc_cmd(set_cmd, cmd_data, cmd_data_len);
|
||||||
|
data |= (u64)(ret & 0xff) << 48;
|
||||||
|
|
||||||
|
/*QSFP57~64*/
|
||||||
|
cmd_data[1] = SWPLD3_ADDR;
|
||||||
|
cmd_data[2] = QSFP_PRESENCE_8;
|
||||||
|
ret = dni_bmc_cmd(set_cmd, cmd_data, cmd_data_len);
|
||||||
|
data |= (u64)(ret & 0xff) << 56;
|
||||||
|
|
||||||
|
return sprintf(buf, "0x%016llx\n", data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static ssize_t get_lpmode(struct device *dev, struct device_attribute \
|
||||||
|
*dev_attr, char *buf)
|
||||||
|
{
|
||||||
|
uint8_t cmd_data[4]={0};
|
||||||
|
int ret;
|
||||||
|
u64 data = 0;
|
||||||
|
uint8_t set_cmd;
|
||||||
|
int cmd_data_len;
|
||||||
|
|
||||||
|
set_cmd = CMD_GETDATA;
|
||||||
|
ret=0;
|
||||||
|
/*QSFP1~8*/
|
||||||
|
cmd_data[0] = BMC_BUS_5;
|
||||||
|
cmd_data[1] = SWPLD1_ADDR;
|
||||||
|
cmd_data[2] = QSFP_LP_MODE_1;
|
||||||
|
cmd_data[3] = 1;
|
||||||
|
cmd_data_len = sizeof(cmd_data);
|
||||||
|
ret = dni_bmc_cmd(set_cmd, cmd_data, cmd_data_len);
|
||||||
|
data = (u64)(ret & 0xff);
|
||||||
|
|
||||||
|
/*QSFP9~16*/
|
||||||
|
cmd_data[1] = SWPLD2_ADDR;
|
||||||
|
cmd_data[2] = QSFP_LP_MODE_2;
|
||||||
|
ret = dni_bmc_cmd(set_cmd, cmd_data, cmd_data_len);
|
||||||
|
data |= (u64)(ret & 0xff) << 8;
|
||||||
|
|
||||||
|
/*QSFP17~24*/
|
||||||
|
cmd_data[1] = SWPLD4_ADDR;
|
||||||
|
cmd_data[2] = QSFP_LP_MODE_3;
|
||||||
|
ret = dni_bmc_cmd(set_cmd, cmd_data, cmd_data_len);
|
||||||
|
data |= (u64)(ret & 0xff) << 16;
|
||||||
|
|
||||||
|
/*QSFP25~32*/
|
||||||
|
cmd_data[1] = SWPLD3_ADDR;
|
||||||
|
cmd_data[2] = QSFP_LP_MODE_4;
|
||||||
|
ret = dni_bmc_cmd(set_cmd, cmd_data, cmd_data_len);
|
||||||
|
data |= (u64)(ret & 0xff) << 24;
|
||||||
|
|
||||||
|
/*QSFP33~40*/
|
||||||
|
cmd_data[1] = SWPLD1_ADDR;
|
||||||
|
cmd_data[2] = QSFP_LP_MODE_5;
|
||||||
|
ret = dni_bmc_cmd(set_cmd, cmd_data, cmd_data_len);
|
||||||
|
data |= (u64)(ret & 0xff) << 32;
|
||||||
|
|
||||||
|
/*QSFP41~48*/
|
||||||
|
cmd_data[1] = SWPLD2_ADDR;
|
||||||
|
cmd_data[2] = QSFP_LP_MODE_6;
|
||||||
|
ret = dni_bmc_cmd(set_cmd, cmd_data, cmd_data_len);
|
||||||
|
data |= (u64)(ret & 0xff) << 40;
|
||||||
|
|
||||||
|
/*QSFP49~56*/
|
||||||
|
cmd_data[1] = SWPLD4_ADDR;
|
||||||
|
cmd_data[2] = QSFP_LP_MODE_7;
|
||||||
|
ret = dni_bmc_cmd(set_cmd, cmd_data, cmd_data_len);
|
||||||
|
data |= (u64)(ret & 0xff) << 48;
|
||||||
|
|
||||||
|
/*QSFP57~64*/
|
||||||
|
cmd_data[1] = SWPLD3_ADDR;
|
||||||
|
cmd_data[2] = QSFP_LP_MODE_8;
|
||||||
|
ret = dni_bmc_cmd(set_cmd, cmd_data, cmd_data_len);
|
||||||
|
data |= (u64)(ret & 0xff) << 56;
|
||||||
|
|
||||||
|
return sprintf(buf, "0x%016llx\n", data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static ssize_t get_reset(struct device *dev, struct device_attribute \
|
||||||
|
*dev_attr, char *buf)
|
||||||
|
{
|
||||||
|
uint8_t cmd_data[4]={0};
|
||||||
|
int ret;
|
||||||
|
u64 data = 0;
|
||||||
|
uint8_t set_cmd;
|
||||||
|
int cmd_data_len;
|
||||||
|
|
||||||
|
set_cmd = CMD_GETDATA;
|
||||||
|
|
||||||
|
/*QSFP1~8*/
|
||||||
|
cmd_data[0] = BMC_BUS_5;
|
||||||
|
cmd_data[1] = SWPLD1_ADDR;
|
||||||
|
cmd_data[2] = QSFP_RESET_1;
|
||||||
|
cmd_data[3] = 1;
|
||||||
|
cmd_data_len = sizeof(cmd_data);
|
||||||
|
ret=0;
|
||||||
|
ret = dni_bmc_cmd(set_cmd, cmd_data, cmd_data_len);
|
||||||
|
data = (u64)(ret & 0xff);
|
||||||
|
|
||||||
|
/*QSFP9~16*/
|
||||||
|
cmd_data[1] = SWPLD2_ADDR;
|
||||||
|
cmd_data[2] = QSFP_RESET_2;
|
||||||
|
ret = dni_bmc_cmd(set_cmd, cmd_data, cmd_data_len);
|
||||||
|
data |= (u64)(ret & 0xff) << 8;
|
||||||
|
|
||||||
|
/*QSFP17~24*/
|
||||||
|
cmd_data[1] = SWPLD4_ADDR;
|
||||||
|
cmd_data[2] = QSFP_RESET_3;
|
||||||
|
ret = dni_bmc_cmd(set_cmd, cmd_data, cmd_data_len);
|
||||||
|
data |= (u64)(ret & 0xff) << 16;
|
||||||
|
|
||||||
|
/*QSFP25~32*/
|
||||||
|
cmd_data[1] = SWPLD3_ADDR;
|
||||||
|
cmd_data[2] = QSFP_RESET_4;
|
||||||
|
ret = dni_bmc_cmd(set_cmd, cmd_data, cmd_data_len);
|
||||||
|
data |= (u64)(ret & 0xff) << 24;
|
||||||
|
|
||||||
|
/*QSFP33~40*/
|
||||||
|
cmd_data[1] = SWPLD1_ADDR;
|
||||||
|
cmd_data[2] = QSFP_RESET_5;
|
||||||
|
ret = dni_bmc_cmd(set_cmd, cmd_data, cmd_data_len);
|
||||||
|
data |= (u64)(ret & 0xff) << 32;
|
||||||
|
|
||||||
|
/*QSFP41~48*/
|
||||||
|
cmd_data[1] = SWPLD2_ADDR;
|
||||||
|
cmd_data[2] = QSFP_RESET_6;
|
||||||
|
ret = dni_bmc_cmd(set_cmd, cmd_data, cmd_data_len);
|
||||||
|
data |= (u64)(ret & 0xff) << 40;
|
||||||
|
|
||||||
|
/*QSFP49~56*/
|
||||||
|
cmd_data[1] = SWPLD4_ADDR;
|
||||||
|
cmd_data[2] = QSFP_RESET_7;
|
||||||
|
ret = dni_bmc_cmd(set_cmd, cmd_data, cmd_data_len);
|
||||||
|
data |= (u64)(ret & 0xff) << 48;
|
||||||
|
|
||||||
|
/*QSFP57~64*/
|
||||||
|
cmd_data[1] = SWPLD3_ADDR;
|
||||||
|
cmd_data[2] = QSFP_RESET_8;
|
||||||
|
ret = dni_bmc_cmd(set_cmd, cmd_data, cmd_data_len);
|
||||||
|
data |= (u64)(ret & 0xff) << 56;
|
||||||
|
|
||||||
|
return sprintf(buf, "0x%016llx\n", data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static ssize_t get_response(struct device *dev, struct device_attribute \
|
||||||
|
*dev_attr, char *buf)
|
||||||
|
{
|
||||||
|
uint8_t cmd_data[4]={0};
|
||||||
|
int ret;
|
||||||
|
u64 data = 0;
|
||||||
|
uint8_t set_cmd;
|
||||||
|
int cmd_data_len;
|
||||||
|
|
||||||
|
set_cmd = CMD_GETDATA;
|
||||||
|
|
||||||
|
/*QSFP1~8*/
|
||||||
|
cmd_data[0] = BMC_BUS_5;
|
||||||
|
cmd_data[1] = SWPLD1_ADDR;
|
||||||
|
cmd_data[2] = QSFP_RESPONSE_1;
|
||||||
|
cmd_data[3] = 1;
|
||||||
|
cmd_data_len = sizeof(cmd_data);
|
||||||
|
ret = 0;
|
||||||
|
data = (u64)(ret & 0xff);
|
||||||
|
|
||||||
|
/*QSFP9~16*/
|
||||||
|
cmd_data[1] = SWPLD2_ADDR;
|
||||||
|
cmd_data[2] = QSFP_RESPONSE_2;
|
||||||
|
data |= (u64)(ret & 0xff) << 8;
|
||||||
|
|
||||||
|
/*QSFP17~24*/
|
||||||
|
cmd_data[1] = SWPLD4_ADDR;
|
||||||
|
cmd_data[2] = QSFP_RESPONSE_3;
|
||||||
|
data |= (u64)(ret & 0xff) << 16;
|
||||||
|
|
||||||
|
/*QSFP25~32*/
|
||||||
|
cmd_data[1] = SWPLD3_ADDR;
|
||||||
|
cmd_data[2] = QSFP_RESPONSE_4;
|
||||||
|
data |= (u64)(ret & 0xff) << 24;
|
||||||
|
|
||||||
|
/*QSFP33~40*/
|
||||||
|
cmd_data[1] = SWPLD1_ADDR;
|
||||||
|
cmd_data[2] = QSFP_RESPONSE_5;
|
||||||
|
data |= (u64)(ret & 0xff) << 32;
|
||||||
|
|
||||||
|
/*QSFP41~48*/
|
||||||
|
cmd_data[1] = SWPLD2_ADDR;
|
||||||
|
cmd_data[2] = QSFP_RESPONSE_6;
|
||||||
|
data |= (u64)(ret & 0xff) << 40;
|
||||||
|
|
||||||
|
/*QSFP49~56*/
|
||||||
|
cmd_data[1] = SWPLD4_ADDR;
|
||||||
|
cmd_data[2] = QSFP_RESPONSE_7;
|
||||||
|
data |= (u64)(ret & 0xff) << 48;
|
||||||
|
|
||||||
|
/*QSFP57~64*/
|
||||||
|
cmd_data[1] = SWPLD3_ADDR;
|
||||||
|
cmd_data[2] = QSFP_RESPONSE_8;
|
||||||
|
data |= (u64)(ret & 0xff) << 56;
|
||||||
|
|
||||||
|
return sprintf(buf, "0x%016llx\n", data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static ssize_t get_interrupt(struct device *dev, struct device_attribute \
|
||||||
|
*dev_attr, char *buf)
|
||||||
|
{
|
||||||
|
uint8_t cmd_data[4]={0};
|
||||||
|
int ret;
|
||||||
|
u64 data = 0;
|
||||||
|
uint8_t set_cmd;
|
||||||
|
int cmd_data_len;
|
||||||
|
|
||||||
|
set_cmd = CMD_GETDATA;
|
||||||
|
|
||||||
|
/*QSFP1~8*/
|
||||||
|
cmd_data[0] = BMC_BUS_5;
|
||||||
|
cmd_data[1] = SWPLD1_ADDR;
|
||||||
|
cmd_data[2] = QSFP_INTERRUPT_1;
|
||||||
|
cmd_data[3] = 1;
|
||||||
|
cmd_data_len = sizeof(cmd_data);
|
||||||
|
ret=0;
|
||||||
|
data = (u64)(ret & 0xff);
|
||||||
|
|
||||||
|
/*QSFP9~16*/
|
||||||
|
cmd_data[1] = SWPLD2_ADDR;
|
||||||
|
cmd_data[2] = QSFP_INTERRUPT_2;
|
||||||
|
data |= (u64)(ret & 0xff) << 8;
|
||||||
|
|
||||||
|
/*QSFP17~24*/
|
||||||
|
cmd_data[1] = SWPLD4_ADDR;
|
||||||
|
cmd_data[2] = QSFP_INTERRUPT_3;
|
||||||
|
data |= (u64)(ret & 0xff) << 16;
|
||||||
|
|
||||||
|
/*QSFP25~32*/
|
||||||
|
cmd_data[1] = SWPLD3_ADDR;
|
||||||
|
cmd_data[2] = QSFP_INTERRUPT_4;
|
||||||
|
data |= (u64)(ret & 0xff) << 24;
|
||||||
|
|
||||||
|
/*QSFP33~40*/
|
||||||
|
cmd_data[1] = SWPLD1_ADDR;
|
||||||
|
cmd_data[2] = QSFP_INTERRUPT_5;
|
||||||
|
data |= (u64)(ret & 0xff) << 32;
|
||||||
|
|
||||||
|
/*QSFP41~48*/
|
||||||
|
cmd_data[1] = SWPLD2_ADDR;
|
||||||
|
cmd_data[2] = QSFP_INTERRUPT_6;
|
||||||
|
data |= (u64)(ret & 0xff) << 40;
|
||||||
|
|
||||||
|
/*QSFP49~56*/
|
||||||
|
cmd_data[1] = SWPLD4_ADDR;
|
||||||
|
cmd_data[2] = QSFP_INTERRUPT_7;
|
||||||
|
data |= (u64)(ret & 0xff) << 48;
|
||||||
|
|
||||||
|
/*QSFP57~64*/
|
||||||
|
cmd_data[1] = SWPLD3_ADDR;
|
||||||
|
cmd_data[2] = QSFP_INTERRUPT_8;
|
||||||
|
data |= (u64)(ret & 0xff) << 56;
|
||||||
|
|
||||||
|
return sprintf(buf, "0x%016llx\n", data);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static ssize_t set_lpmode(struct device *dev, struct device_attribute *devattr, const char *buf, size_t count)
|
||||||
|
{
|
||||||
|
uint8_t cmd_data[4]={0};
|
||||||
|
unsigned long long set_data;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
err = kstrtoull(buf, 16, &set_data);
|
||||||
|
if (err){
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
uint8_t set_cmd;
|
||||||
|
int cmd_data_len;
|
||||||
|
|
||||||
|
set_cmd = CMD_SETDATA;
|
||||||
|
/*QSFP1~8*/
|
||||||
|
cmd_data[0] = BMC_BUS_5;
|
||||||
|
cmd_data[1] = SWPLD1_ADDR;
|
||||||
|
cmd_data[2] = QSFP_LP_MODE_1;
|
||||||
|
cmd_data[3] = (set_data & 0xff);
|
||||||
|
cmd_data_len = sizeof(cmd_data);
|
||||||
|
|
||||||
|
/*QSFP9~16*/
|
||||||
|
cmd_data[1] = SWPLD2_ADDR;
|
||||||
|
cmd_data[2] = QSFP_LP_MODE_2;
|
||||||
|
cmd_data[3] = ((set_data >> 8 ) & 0xff);
|
||||||
|
|
||||||
|
/*QSFP17~24*/
|
||||||
|
cmd_data[1] = SWPLD4_ADDR;
|
||||||
|
cmd_data[2] = QSFP_LP_MODE_3;
|
||||||
|
cmd_data[3] = ((set_data >> 16 ) & 0xff);
|
||||||
|
|
||||||
|
/*QSFP25~32*/
|
||||||
|
cmd_data[1] = SWPLD3_ADDR;
|
||||||
|
cmd_data[2] = QSFP_LP_MODE_4;
|
||||||
|
cmd_data[3] = ((set_data >> 24 ) & 0xff);
|
||||||
|
|
||||||
|
/*QSFP33~40*/
|
||||||
|
cmd_data[1] = SWPLD1_ADDR;
|
||||||
|
cmd_data[2] = QSFP_LP_MODE_5;
|
||||||
|
cmd_data[3] = ((set_data >> 32 ) & 0xff);
|
||||||
|
|
||||||
|
/*QSFP41~48*/
|
||||||
|
cmd_data[1] = SWPLD2_ADDR;
|
||||||
|
cmd_data[2] = QSFP_LP_MODE_6;
|
||||||
|
cmd_data[3] = ((set_data >> 40 ) & 0xff);
|
||||||
|
|
||||||
|
/*QSFP49~56*/
|
||||||
|
cmd_data[1] = SWPLD4_ADDR;
|
||||||
|
cmd_data[2] = QSFP_LP_MODE_7;
|
||||||
|
cmd_data[3] = ((set_data >> 48 ) & 0xff);
|
||||||
|
|
||||||
|
/*QSFP57~64*/
|
||||||
|
cmd_data[1] = SWPLD3_ADDR;
|
||||||
|
cmd_data[2] = QSFP_LP_MODE_8;
|
||||||
|
cmd_data[3] = ((set_data >> 56 ) & 0xff);
|
||||||
|
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ssize_t set_reset(struct device *dev, struct device_attribute *devattr, const char *buf, size_t count)
|
||||||
|
{
|
||||||
|
uint8_t cmd_data[4]={0};
|
||||||
|
unsigned long long set_data;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
err = kstrtoull(buf, 16, &set_data);
|
||||||
|
if (err){
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
uint8_t set_cmd;
|
||||||
|
int cmd_data_len;
|
||||||
|
|
||||||
|
set_cmd = CMD_SETDATA;
|
||||||
|
|
||||||
|
/*QSFP1~8*/
|
||||||
|
cmd_data[0] = BMC_BUS_5;
|
||||||
|
cmd_data[1] = SWPLD1_ADDR;
|
||||||
|
cmd_data[2] = QSFP_RESET_1;
|
||||||
|
cmd_data[3] = (set_data & 0xff);
|
||||||
|
cmd_data_len = sizeof(cmd_data);
|
||||||
|
|
||||||
|
/*QSFP9~16*/
|
||||||
|
cmd_data[1] = SWPLD2_ADDR;
|
||||||
|
cmd_data[2] = QSFP_RESET_2;
|
||||||
|
cmd_data[3] = ((set_data >> 8 ) & 0xff);
|
||||||
|
|
||||||
|
/*QSFP17~24*/
|
||||||
|
cmd_data[1] = SWPLD4_ADDR;
|
||||||
|
cmd_data[2] = QSFP_RESET_3;
|
||||||
|
cmd_data[3] = ((set_data >> 16 ) & 0xff);
|
||||||
|
|
||||||
|
/*QSFP25~32*/
|
||||||
|
cmd_data[1] = SWPLD3_ADDR;
|
||||||
|
cmd_data[2] = QSFP_RESET_4;
|
||||||
|
cmd_data[3] = ((set_data >> 24 ) & 0xff);
|
||||||
|
|
||||||
|
/*QSFP33~40*/
|
||||||
|
cmd_data[1] = SWPLD1_ADDR;
|
||||||
|
cmd_data[2] = QSFP_RESET_5;
|
||||||
|
cmd_data[3] = ((set_data >> 32 ) & 0xff);
|
||||||
|
|
||||||
|
/*QSFP41~48*/
|
||||||
|
cmd_data[1] = SWPLD2_ADDR;
|
||||||
|
cmd_data[2] = QSFP_RESET_6;
|
||||||
|
cmd_data[3] = ((set_data >> 40 ) & 0xff);
|
||||||
|
|
||||||
|
/*QSFP49~56*/
|
||||||
|
cmd_data[1] = SWPLD4_ADDR;
|
||||||
|
cmd_data[2] = QSFP_RESET_7;
|
||||||
|
cmd_data[3] = ((set_data >> 48 ) & 0xff);
|
||||||
|
|
||||||
|
/*QSFP57~64*/
|
||||||
|
cmd_data[1] = SWPLD3_ADDR;
|
||||||
|
cmd_data[2] = QSFP_RESET_8;
|
||||||
|
cmd_data[3] = ((set_data >> 56 ) & 0xff);
|
||||||
|
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ssize_t set_response(struct device *dev, struct device_attribute *devattr, const char *buf, size_t count)
|
||||||
|
{
|
||||||
|
uint8_t cmd_data[4]={0};
|
||||||
|
unsigned long long set_data;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
err = kstrtoull(buf, 16, &set_data);
|
||||||
|
if (err){
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
uint8_t set_cmd;
|
||||||
|
int cmd_data_len;
|
||||||
|
|
||||||
|
set_cmd = CMD_SETDATA;
|
||||||
|
|
||||||
|
/*QSFP1~8*/
|
||||||
|
cmd_data[0] = BMC_BUS_5;
|
||||||
|
cmd_data[1] = SWPLD1_ADDR;
|
||||||
|
cmd_data[2] = QSFP_RESPONSE_1;
|
||||||
|
cmd_data[3] = (set_data & 0xff);
|
||||||
|
cmd_data_len = sizeof(cmd_data);
|
||||||
|
|
||||||
|
/*QSFP9~16*/
|
||||||
|
cmd_data[1] = SWPLD2_ADDR;
|
||||||
|
cmd_data[2] = QSFP_RESPONSE_2;
|
||||||
|
cmd_data[3] = ((set_data >> 8 ) & 0xff);
|
||||||
|
|
||||||
|
/*QSFP17~24*/
|
||||||
|
cmd_data[1] = SWPLD4_ADDR;
|
||||||
|
cmd_data[2] = QSFP_RESPONSE_3;
|
||||||
|
cmd_data[3] = ((set_data >> 16 ) & 0xff);
|
||||||
|
|
||||||
|
/*QSFP25~32*/
|
||||||
|
cmd_data[1] = SWPLD3_ADDR;
|
||||||
|
cmd_data[2] = QSFP_RESPONSE_4;
|
||||||
|
cmd_data[3] = ((set_data >> 24 ) & 0xff);
|
||||||
|
|
||||||
|
/*QSFP33~40*/
|
||||||
|
cmd_data[1] = SWPLD1_ADDR;
|
||||||
|
cmd_data[2] = QSFP_RESPONSE_5;
|
||||||
|
cmd_data[3] = ((set_data >> 32 ) & 0xff);
|
||||||
|
|
||||||
|
/*QSFP41~48*/
|
||||||
|
cmd_data[1] = SWPLD2_ADDR;
|
||||||
|
cmd_data[2] = QSFP_RESPONSE_6;
|
||||||
|
cmd_data[3] = ((set_data >> 40 ) & 0xff);
|
||||||
|
|
||||||
|
/*QSFP49~56*/
|
||||||
|
cmd_data[1] = SWPLD4_ADDR;
|
||||||
|
cmd_data[2] = QSFP_RESPONSE_7;
|
||||||
|
cmd_data[3] = ((set_data >> 48 ) & 0xff);
|
||||||
|
|
||||||
|
/*QSFP57~64*/
|
||||||
|
cmd_data[1] = SWPLD3_ADDR;
|
||||||
|
cmd_data[2] = QSFP_RESPONSE_8;
|
||||||
|
cmd_data[3] = ((set_data >> 56 ) & 0xff);
|
||||||
|
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
static DEVICE_ATTR(qsfp_present, S_IRUGO, get_present, NULL);
|
||||||
|
static DEVICE_ATTR(qsfp_lpmode, S_IWUSR | S_IRUGO, get_lpmode, set_lpmode);
|
||||||
|
static DEVICE_ATTR(qsfp_reset, S_IWUSR | S_IRUGO, get_reset, set_reset);
|
||||||
|
static DEVICE_ATTR(qsfp_modsel, S_IWUSR | S_IRUGO, get_response, set_response);
|
||||||
|
static DEVICE_ATTR(qsfp_interrupt, S_IRUGO, get_interrupt, NULL);
|
||||||
|
|
||||||
|
static struct attribute *ag9064_cpld_attrs[] = {
|
||||||
|
&dev_attr_qsfp_present.attr,
|
||||||
|
&dev_attr_qsfp_lpmode.attr,
|
||||||
|
&dev_attr_qsfp_reset.attr,
|
||||||
|
&dev_attr_qsfp_modsel.attr,
|
||||||
|
&dev_attr_qsfp_interrupt.attr,
|
||||||
|
NULL,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct attribute_group ag9064_cpld_attr_grp = {
|
||||||
|
.attrs = ag9064_cpld_attrs,
|
||||||
|
};
|
||||||
|
|
||||||
|
enum cpld_type {
|
||||||
|
system_cpld,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct cpld_platform_data {
|
||||||
|
int reg_addr;
|
||||||
|
struct i2c_client *client;
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct cpld_platform_data ag9064_cpld_platform_data[] = {
|
||||||
|
[system_cpld] = {
|
||||||
|
.reg_addr = CPLD_REG,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device ag9064_cpld = {
|
||||||
|
.name = "delta-ag9064-cpld",
|
||||||
|
.id = 0,
|
||||||
|
.dev = {
|
||||||
|
.platform_data = ag9064_cpld_platform_data,
|
||||||
|
.release = device_release
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static int __init cpld_probe(struct platform_device *pdev)
|
||||||
|
{
|
||||||
|
struct cpld_platform_data *pdata;
|
||||||
|
struct i2c_adapter *parent;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
pdata = pdev->dev.platform_data;
|
||||||
|
if (!pdata) {
|
||||||
|
dev_err(&pdev->dev, "CPLD platform data not found\n");
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
|
||||||
|
parent = i2c_get_adapter(BUS7);
|
||||||
|
if (!parent) {
|
||||||
|
printk(KERN_WARNING "Parent adapter (%d) not found\n",BUS7);
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
|
||||||
|
pdata[system_cpld].client = i2c_new_dummy(parent, pdata[system_cpld].reg_addr);
|
||||||
|
if (!pdata[system_cpld].client) {
|
||||||
|
printk(KERN_WARNING "Fail to create dummy i2c client for addr %d\n", pdata[system_cpld].reg_addr);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = sysfs_create_group(&pdev->dev.kobj, &ag9064_cpld_attr_grp);
|
||||||
|
if (ret) {
|
||||||
|
printk(KERN_WARNING "Fail to create cpld attribute group");
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
error:
|
||||||
|
i2c_unregister_device(pdata[system_cpld].client);
|
||||||
|
i2c_put_adapter(parent);
|
||||||
|
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int __exit cpld_remove(struct platform_device *pdev)
|
||||||
|
{
|
||||||
|
struct i2c_adapter *parent = NULL;
|
||||||
|
struct cpld_platform_data *pdata = pdev->dev.platform_data;
|
||||||
|
sysfs_remove_group(&pdev->dev.kobj, &ag9064_cpld_attr_grp);
|
||||||
|
|
||||||
|
if (!pdata) {
|
||||||
|
dev_err(&pdev->dev, "Missing platform data\n");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (pdata[system_cpld].client) {
|
||||||
|
if (!parent) {
|
||||||
|
parent = (pdata[system_cpld].client)->adapter;
|
||||||
|
}
|
||||||
|
i2c_unregister_device(pdata[system_cpld].client);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
i2c_put_adapter(parent);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct platform_driver cpld_driver = {
|
||||||
|
.probe = cpld_probe,
|
||||||
|
.remove = __exit_p(cpld_remove),
|
||||||
|
.driver = {
|
||||||
|
.owner = THIS_MODULE,
|
||||||
|
.name = "delta-ag9064-cpld",
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
/*---------------- CPLD - end ------------- */
|
||||||
|
|
||||||
/*---------------- module initialization ------------- */
|
/*---------------- module initialization ------------- */
|
||||||
|
|
||||||
static void __init delta_ag9064_platform_init(void)
|
static int __init delta_ag9064_platform_init(void)
|
||||||
{
|
{
|
||||||
struct i2c_client *client;
|
struct i2c_client *client;
|
||||||
struct i2c_adapter *adapter;
|
struct i2c_adapter *adapter;
|
||||||
struct swpld_mux_platform_data *swpld_pdata;
|
struct swpld_mux_platform_data *swpld_pdata;
|
||||||
|
struct cpld_platform_data * cpld_pdata;
|
||||||
int ret,i = 0;
|
int ret,i = 0;
|
||||||
|
|
||||||
printk("ag9064_platform module initialization\n");
|
printk("ag9064_platform module initialization\n");
|
||||||
@ -997,6 +1721,12 @@ static void __init delta_ag9064_platform_init(void)
|
|||||||
printk(KERN_WARNING "Fail to create IPMI user\n");
|
printk(KERN_WARNING "Fail to create IPMI user\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ret = platform_driver_register(&cpld_driver);
|
||||||
|
if (ret) {
|
||||||
|
printk(KERN_WARNING "Fail to register cpld driver\n");
|
||||||
|
goto error_cpld_driver;
|
||||||
|
}
|
||||||
|
|
||||||
// register the mux prob which call the SWPLD
|
// register the mux prob which call the SWPLD
|
||||||
ret = platform_driver_register(&swpld_mux_driver);
|
ret = platform_driver_register(&swpld_mux_driver);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
@ -1011,9 +1741,15 @@ static void __init delta_ag9064_platform_init(void)
|
|||||||
goto error_i2c_device_driver;
|
goto error_i2c_device_driver;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// register the CPLD
|
||||||
|
ret = platform_device_register(&ag9064_cpld);
|
||||||
|
if (ret) {
|
||||||
|
printk(KERN_WARNING "Fail to create cpld device\n");
|
||||||
|
goto error_ag9064_cpld;
|
||||||
|
}
|
||||||
|
|
||||||
swpld_pdata = ag9064_swpld_mux[0].dev.platform_data;
|
swpld_pdata = ag9064_swpld_mux[0].dev.platform_data;
|
||||||
//swpld_pdata->cpld = cpld_pdata[system_cpld].client;
|
ret = platform_device_register(&ag9064_swpld_mux[0]);
|
||||||
ret = platform_device_register(&ag9064_swpld_mux);
|
|
||||||
if (ret) {
|
if (ret) {
|
||||||
printk(KERN_WARNING "Fail to create swpld mux\n");
|
printk(KERN_WARNING "Fail to create swpld mux\n");
|
||||||
goto error_ag9064_swpld_mux;
|
goto error_ag9064_swpld_mux;
|
||||||
@ -1044,10 +1780,14 @@ error_ag9064_swpld_mux:
|
|||||||
for (; i >= 0; i--) {
|
for (; i >= 0; i--) {
|
||||||
platform_device_unregister(&ag9064_swpld_mux);
|
platform_device_unregister(&ag9064_swpld_mux);
|
||||||
}
|
}
|
||||||
|
platform_driver_unregister(&ag9064_cpld);
|
||||||
|
error_ag9064_cpld:
|
||||||
platform_driver_unregister(&i2c_device_driver);
|
platform_driver_unregister(&i2c_device_driver);
|
||||||
error_i2c_device_driver:
|
error_i2c_device_driver:
|
||||||
platform_driver_unregister(&swpld_mux_driver);
|
platform_driver_unregister(&swpld_mux_driver);
|
||||||
error_swpld_mux_driver:
|
error_swpld_mux_driver:
|
||||||
|
platform_driver_unregister(&cpld_driver);
|
||||||
|
error_cpld_driver:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1060,8 +1800,10 @@ static void __exit delta_ag9064_platform_exit(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
platform_device_unregister(&ag9064_swpld_mux);
|
platform_device_unregister(&ag9064_swpld_mux);
|
||||||
|
platform_device_unregister(&ag9064_cpld);
|
||||||
platform_driver_unregister(&i2c_device_driver);
|
platform_driver_unregister(&i2c_device_driver);
|
||||||
platform_driver_unregister(&swpld_mux_driver);
|
platform_driver_unregister(&swpld_mux_driver);
|
||||||
|
platform_driver_unregister(&cpld_driver);
|
||||||
i2c_unregister_device(i2c_client_9548);
|
i2c_unregister_device(i2c_client_9548);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1070,4 +1812,4 @@ module_exit(delta_ag9064_platform_exit);
|
|||||||
|
|
||||||
MODULE_DESCRIPTION("DELTA ag9064 Platform Support");
|
MODULE_DESCRIPTION("DELTA ag9064 Platform Support");
|
||||||
MODULE_AUTHOR("Johnson Lu <johnson.lu@deltaww.com>");
|
MODULE_AUTHOR("Johnson Lu <johnson.lu@deltaww.com>");
|
||||||
MODULE_LICENSE("GPL");
|
MODULE_LICENSE("GPL");
|
||||||
|
@ -147,9 +147,10 @@ static int mei_TxRx(u8 sensor_bus, u16 addr, u8 command, char read_write, int
|
|||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
||||||
struct mei_msg * msg;
|
struct mei_msg * msg;
|
||||||
unsigned char blen;
|
// unsigned char blen;
|
||||||
|
|
||||||
UINT32 timeout, dwTimeout;
|
UINT32 timeout, dwTimeout;
|
||||||
|
UINT32 blen;
|
||||||
HECI_DEVICE sHeciDev;
|
HECI_DEVICE sHeciDev;
|
||||||
|
|
||||||
recv_buf = kmalloc(sizeof(unsigned char) * (32), GFP_KERNEL);
|
recv_buf = kmalloc(sizeof(unsigned char) * (32), GFP_KERNEL);
|
||||||
|
@ -12,7 +12,7 @@ Description: kernel modules for platform devices such as fan, led, sfp
|
|||||||
|
|
||||||
Package: platform-modules-ag9064
|
Package: platform-modules-ag9064
|
||||||
Architecture: amd64
|
Architecture: amd64
|
||||||
Depends: linux-image-3.16.0-5-amd64
|
Depends: linux-image-4.9.0-5-amd64
|
||||||
Description: kernel modules for platform devices such as fan, led, sfp
|
Description: kernel modules for platform devices such as fan, led, sfp
|
||||||
|
|
||||||
Package: platform-modules-ag5648
|
Package: platform-modules-ag5648
|
||||||
|
@ -20,11 +20,11 @@ start)
|
|||||||
modprobe i2c-dev
|
modprobe i2c-dev
|
||||||
modprobe i2c-i801
|
modprobe i2c-i801
|
||||||
modprobe i2c-ismt
|
modprobe i2c-ismt
|
||||||
|
modprobe ipmi_devintf
|
||||||
|
modprobe ipmi_si ports=0xca2
|
||||||
modprobe i2c-mei
|
modprobe i2c-mei
|
||||||
modprobe i2c-mux-pca954x
|
modprobe i2c-mux-pca954x
|
||||||
modprobe at24
|
modprobe at24
|
||||||
modprobe ipmi_devintf
|
|
||||||
modprobe ipmi_si trydefaults=1
|
|
||||||
modprobe delta_ag9064_platform
|
modprobe delta_ag9064_platform
|
||||||
modprobe delta_ag9064_cpld
|
modprobe delta_ag9064_cpld
|
||||||
modprobe delta_ag9064_swpld
|
modprobe delta_ag9064_swpld
|
||||||
|
@ -1 +1,2 @@
|
|||||||
ag9064/cfg/ag9064-modules.conf etc/modules-load.d
|
ag9064/cfg/ag9064-modules.conf etc/modules-load.d
|
||||||
|
systemd/platform-modules-ag9064.service lib/systemd/system
|
||||||
|
@ -0,0 +1,13 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=Delta ag9064 Platform modules
|
||||||
|
After=local-fs.target
|
||||||
|
Before=pmon.service
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=oneshot
|
||||||
|
ExecStart=-/etc/init.d/platform-modules-ag9064 start
|
||||||
|
ExecStop=-/etc/init.d/platform-modules-ag9064 stop
|
||||||
|
RemainAfterExit=yes
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
Reference in New Issue
Block a user