[Quanta] Update files for Bullseye and kernel 5.10 with enhancements (#11755)

* [Quanta][device][platform] Update files for IX7

Signed-off-by: roberthong-qct <10606901@qcttw.com>

* [Quanta][device][platform] Update files for IX7_BDE

Signed-off-by: roberthong-qct <10606901@qcttw.com>

* [Quanta][device][platform] Update files for IX8

Signed-off-by: roberthong-qct <10606901@qcttw.com>

* [Quanta][device][platform] Update files for IX8A_BDE

Signed-off-by: roberthong-qct <10606901@qcttw.com>

* [Quanta][device][platform] Update files for IX8C

Signed-off-by: roberthong-qct <10606901@qcttw.com>

* [Quanta][device][platform] Update files for IX9

Signed-off-by: roberthong-qct <10606901@qcttw.com>

Signed-off-by: roberthong-qct <10606901@qcttw.com>
This commit is contained in:
roberthong-qct 2022-08-24 01:10:08 +08:00 committed by GitHub
parent 0f4bca426e
commit 234b4973cd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
87 changed files with 5856 additions and 2078 deletions

View File

@ -0,0 +1,254 @@
{
"GLOBAL_MEDIA_SETTINGS": {
"1-1": {
"Default": {
"preemphasis": {
"lane0": "0x114D06",
"lane1": "0x0F4F06",
"lane2": "0x0F4F06",
"lane3": "0x104E06"
}
}
},
"2,4": {
"Default": {
"preemphasis": {
"lane0": "0x104E06",
"lane1": "0x104E06",
"lane2": "0x114D06",
"lane3": "0x104E06"
}
}
},
"3-3": {
"Default": {
"preemphasis": {
"lane0": "0x104E06",
"lane1": "0x104E06",
"lane2": "0x104E06",
"lane3": "0x104E06"
}
}
},
"5-5": {
"Default": {
"preemphasis": {
"lane0": "0x104E06",
"lane1": "0x114D06",
"lane2": "0x0F4F06",
"lane3": "0x114D06"
}
}
},
"6-6": {
"Default": {
"preemphasis": {
"lane0": "0x0F4F06",
"lane1": "0x0F4F06",
"lane2": "0x104E06",
"lane3": "0x114D06"
}
}
},
"7-7": {
"Default": {
"preemphasis": {
"lane0": "0x0F4F06",
"lane1": "0x0F4F06",
"lane2": "0x0D5106",
"lane3": "0x0F4F06"
}
}
},
"8-8": {
"Default": {
"preemphasis": {
"lane0": "0x0D5106",
"lane1": "0x0D5106",
"lane2": "0x0D5106",
"lane3": "0x0E5006"
}
}
},
"9,23": {
"Default": {
"preemphasis": {
"lane0": "0x0C5206",
"lane1": "0x0C5206",
"lane2": "0x0C5206",
"lane3": "0x0C5206"
}
}
},
"10-10": {
"Default": {
"preemphasis": {
"lane0": "0x0A5406",
"lane1": "0x0C5206",
"lane2": "0x0A5406",
"lane3": "0x0C5206"
}
}
},
"11,13": {
"Default": {
"preemphasis": {
"lane0": "0x0A5406",
"lane1": "0x0B5306",
"lane2": "0x0A5406",
"lane3": "0x0B5306"
}
}
},
"12,14": {
"Default": {
"preemphasis": {
"lane0": "0x0A5406",
"lane1": "0x0B5306",
"lane2": "0x0A5406",
"lane3": "0x0A5406"
}
}
},
"15,17": {
"Default": {
"preemphasis": {
"lane0": "0x095506",
"lane1": "0x095506",
"lane2": "0x095506",
"lane3": "0x095506"
}
}
},
"16-16": {
"Default": {
"preemphasis": {
"lane0": "0x0A5406",
"lane1": "0x0A5406",
"lane2": "0x0A5406",
"lane3": "0x095506"
}
}
},
"18,19": {
"Default": {
"preemphasis": {
"lane0": "0x0A5406",
"lane1": "0x0A5406",
"lane2": "0x0A5406",
"lane3": "0x0A5406"
}
}
},
"20-20": {
"Default": {
"preemphasis": {
"lane0": "0x0B5306",
"lane1": "0x0C5206",
"lane2": "0x0A5406",
"lane3": "0x0C5206"
}
}
},
"21-21": {
"Default": {
"preemphasis": {
"lane0": "0x0B5306",
"lane1": "0x0B5306",
"lane2": "0x0B5306",
"lane3": "0x0B5306"
}
}
},
"22-22": {
"Default": {
"preemphasis": {
"lane0": "0x0B5306",
"lane1": "0x0C5206",
"lane2": "0x0A5406",
"lane3": "0x0A5406"
}
}
},
"24-24": {
"Default": {
"preemphasis": {
"lane0": "0x0C5206",
"lane1": "0x0C5206",
"lane2": "0x0B5306",
"lane3": "0x0C5206"
}
}
},
"25-25": {
"Default": {
"preemphasis": {
"lane0": "0x0E5006",
"lane1": "0x0D5106",
"lane2": "0x0D5106",
"lane3": "0x0D5106"
}
}
},
"26-26": {
"Default": {
"preemphasis": {
"lane0": "0x0E5006",
"lane1": "0x0E5006",
"lane2": "0x0D5106",
"lane3": "0x0E5006"
}
}
},
"27-27": {
"Default": {
"preemphasis": {
"lane0": "0x0F4F06",
"lane1": "0x114D06",
"lane2": "0x104E06",
"lane3": "0x114D06"
}
}
},
"28,31": {
"Default": {
"preemphasis": {
"lane0": "0x104E06",
"lane1": "0x114D06",
"lane2": "0x104E06",
"lane3": "0x114D06"
}
}
},
"29-29": {
"Default": {
"preemphasis": {
"lane0": "0x0F4F06",
"lane1": "0x104E06",
"lane2": "0x104E06",
"lane3": "0x104E06"
}
}
},
"30-30": {
"Default": {
"preemphasis": {
"lane0": "0x114D06",
"lane1": "0x114D06",
"lane2": "0x114D06",
"lane3": "0x114D06"
}
}
},
"32-32": {
"Default": {
"preemphasis": {
"lane0": "0x104E06",
"lane1": "0x104E06",
"lane2": "0x114D06",
"lane3": "0x114D06"
}
}
}
}
}

View File

@ -1,546 +1,545 @@
# Pre-emphasis
phy raw c45 0xa5 0x1 0xffde 0
phy raw c45 0xa5 0x1 0xd130 0x4d
phy raw c45 0xa5 0x1 0xd131 0x0611
phy raw c45 0xa5 0x1 0xd130 0x4D
phy raw c45 0xa5 0x1 0xd131 0x611
phy raw c45 0xa5 0x1 0xd134 1
phy raw c45 0xa5 0x1 0xffde 1
phy raw c45 0xa5 0x1 0xd130 0x4d
phy raw c45 0xa5 0x1 0xd131 0x0611
phy raw c45 0xa5 0x1 0xd130 0x4F
phy raw c45 0xa5 0x1 0xd131 0x60F
phy raw c45 0xa5 0x1 0xd134 1
phy raw c45 0xa5 0x1 0xffde 2
phy raw c45 0xa5 0x1 0xd130 0x4e
phy raw c45 0xa5 0x1 0xd131 0x0610
phy raw c45 0xa5 0x1 0xd130 0x4F
phy raw c45 0xa5 0x1 0xd131 0x60F
phy raw c45 0xa5 0x1 0xd134 1
phy raw c45 0xa5 0x1 0xffde 3
phy raw c45 0xa5 0x1 0xd130 0x4e
phy raw c45 0xa5 0x1 0xd131 0x0610
phy raw c45 0xa5 0x1 0xd130 0x4E
phy raw c45 0xa5 0x1 0xd131 0x610
phy raw c45 0xa5 0x1 0xd134 1
phy raw c45 0xa9 0x1 0xffde 0
phy raw c45 0xa9 0x1 0xd130 0x4e
phy raw c45 0xa9 0x1 0xd131 0x0610
phy raw c45 0xa9 0x1 0xd130 0x4E
phy raw c45 0xa9 0x1 0xd131 0x610
phy raw c45 0xa9 0x1 0xd134 1
phy raw c45 0xa9 0x1 0xffde 1
phy raw c45 0xa9 0x1 0xd130 0x4e
phy raw c45 0xa9 0x1 0xd131 0x0610
phy raw c45 0xa9 0x1 0xd130 0x4E
phy raw c45 0xa9 0x1 0xd131 0x610
phy raw c45 0xa9 0x1 0xd134 1
phy raw c45 0xa9 0x1 0xffde 2
phy raw c45 0xa9 0x1 0xd130 0x4e
phy raw c45 0xa9 0x1 0xd131 0x0610
phy raw c45 0xa9 0x1 0xd130 0x4D
phy raw c45 0xa9 0x1 0xd131 0x611
phy raw c45 0xa9 0x1 0xd134 1
phy raw c45 0xa9 0x1 0xffde 3
phy raw c45 0xa9 0x1 0xd130 0x4e
phy raw c45 0xa9 0x1 0xd131 0x0610
phy raw c45 0xa9 0x1 0xd130 0x4E
phy raw c45 0xa9 0x1 0xd131 0x610
phy raw c45 0xa9 0x1 0xd134 1
phy raw c45 0xc1 0x1 0xffde 0
phy raw c45 0xc1 0x1 0xd130 0x4e
phy raw c45 0xc1 0x1 0xd131 0x0610
phy raw c45 0xc1 0x1 0xd130 0x4E
phy raw c45 0xc1 0x1 0xd131 0x610
phy raw c45 0xc1 0x1 0xd134 1
phy raw c45 0xc1 0x1 0xffde 1
phy raw c45 0xc1 0x1 0xd130 0x4d
phy raw c45 0xc1 0x1 0xd131 0x0611
phy raw c45 0xc1 0x1 0xd130 0x4E
phy raw c45 0xc1 0x1 0xd131 0x610
phy raw c45 0xc1 0x1 0xd134 1
phy raw c45 0xc1 0x1 0xffde 2
phy raw c45 0xc1 0x1 0xd130 0x4e
phy raw c45 0xc1 0x1 0xd131 0x0610
phy raw c45 0xc1 0x1 0xd130 0x4E
phy raw c45 0xc1 0x1 0xd131 0x610
phy raw c45 0xc1 0x1 0xd134 1
phy raw c45 0xc1 0x1 0xffde 3
phy raw c45 0xc1 0x1 0xd130 0x4e
phy raw c45 0xc1 0x1 0xd131 0x0610
phy raw c45 0xc1 0x1 0xd130 0x4E
phy raw c45 0xc1 0x1 0xd131 0x610
phy raw c45 0xc1 0x1 0xd134 1
phy raw c45 0xc5 0x1 0xffde 0
phy raw c45 0xc5 0x1 0xd130 0x4e
phy raw c45 0xc5 0x1 0xd131 0x0610
phy raw c45 0xc5 0x1 0xd130 0x4E
phy raw c45 0xc5 0x1 0xd131 0x610
phy raw c45 0xc5 0x1 0xd134 1
phy raw c45 0xc5 0x1 0xffde 1
phy raw c45 0xc5 0x1 0xd130 0x4e
phy raw c45 0xc5 0x1 0xd131 0x0610
phy raw c45 0xc5 0x1 0xd130 0x4E
phy raw c45 0xc5 0x1 0xd131 0x610
phy raw c45 0xc5 0x1 0xd134 1
phy raw c45 0xc5 0x1 0xffde 2
phy raw c45 0xc5 0x1 0xd130 0x4d
phy raw c45 0xc5 0x1 0xd131 0x0611
phy raw c45 0xc5 0x1 0xd130 0x4D
phy raw c45 0xc5 0x1 0xd131 0x611
phy raw c45 0xc5 0x1 0xd134 1
phy raw c45 0xc5 0x1 0xffde 3
phy raw c45 0xc5 0x1 0xd130 0x4e
phy raw c45 0xc5 0x1 0xd131 0x0610
phy raw c45 0xc5 0x1 0xd130 0x4E
phy raw c45 0xc5 0x1 0xd131 0x610
phy raw c45 0xc5 0x1 0xd134 1
phy raw c45 0x81 0x1 0xffde 0
phy raw c45 0x81 0x1 0xd130 0x4e
phy raw c45 0x81 0x1 0xd131 0x0610
phy raw c45 0x81 0x1 0xd130 0x4E
phy raw c45 0x81 0x1 0xd131 0x610
phy raw c45 0x81 0x1 0xd134 1
phy raw c45 0x81 0x1 0xffde 1
phy raw c45 0x81 0x1 0xd130 0x4d
phy raw c45 0x81 0x1 0xd131 0x0611
phy raw c45 0x81 0x1 0xd130 0x4D
phy raw c45 0x81 0x1 0xd131 0x611
phy raw c45 0x81 0x1 0xd134 1
phy raw c45 0x81 0x1 0xffde 2
phy raw c45 0x81 0x1 0xd130 0x4e
phy raw c45 0x81 0x1 0xd131 0x0610
phy raw c45 0x81 0x1 0xd130 0x4F
phy raw c45 0x81 0x1 0xd131 0x60F
phy raw c45 0x81 0x1 0xd134 1
phy raw c45 0x81 0x1 0xffde 3
phy raw c45 0x81 0x1 0xd130 0x4e
phy raw c45 0x81 0x1 0xd131 0x0610
phy raw c45 0x81 0x1 0xd130 0x4D
phy raw c45 0x81 0x1 0xd131 0x611
phy raw c45 0x81 0x1 0xd134 1
phy raw c45 0x85 0x1 0xffde 0
phy raw c45 0x85 0x1 0xd130 0x4e
phy raw c45 0x85 0x1 0xd131 0x0610
phy raw c45 0x85 0x1 0xd130 0x4F
phy raw c45 0x85 0x1 0xd131 0x60F
phy raw c45 0x85 0x1 0xd134 1
phy raw c45 0x85 0x1 0xffde 1
phy raw c45 0x85 0x1 0xd130 0x4e
phy raw c45 0x85 0x1 0xd131 0x0610
phy raw c45 0x85 0x1 0xd130 0x4F
phy raw c45 0x85 0x1 0xd131 0x60F
phy raw c45 0x85 0x1 0xd134 1
phy raw c45 0x85 0x1 0xffde 2
phy raw c45 0x85 0x1 0xd130 0x4e
phy raw c45 0x85 0x1 0xd131 0x0610
phy raw c45 0x85 0x1 0xd130 0x4E
phy raw c45 0x85 0x1 0xd131 0x610
phy raw c45 0x85 0x1 0xd134 1
phy raw c45 0x85 0x1 0xffde 3
phy raw c45 0x85 0x1 0xd130 0x4d
phy raw c45 0x85 0x1 0xd131 0x0611
phy raw c45 0x85 0x1 0xd130 0x4D
phy raw c45 0x85 0x1 0xd131 0x611
phy raw c45 0x85 0x1 0xd134 1
phy raw c45 0x89 0x1 0xffde 0
phy raw c45 0x89 0x1 0xd130 0x50
phy raw c45 0x89 0x1 0xd131 0x060e
phy raw c45 0x89 0x1 0xd130 0x4F
phy raw c45 0x89 0x1 0xd131 0x60F
phy raw c45 0x89 0x1 0xd134 1
phy raw c45 0x89 0x1 0xffde 1
phy raw c45 0x89 0x1 0xd130 0x50
phy raw c45 0x89 0x1 0xd131 0x060e
phy raw c45 0x89 0x1 0xd130 0x4F
phy raw c45 0x89 0x1 0xd131 0x60F
phy raw c45 0x89 0x1 0xd134 1
phy raw c45 0x89 0x1 0xffde 2
phy raw c45 0x89 0x1 0xd130 0x50
phy raw c45 0x89 0x1 0xd131 0x060e
phy raw c45 0x89 0x1 0xd130 0x51
phy raw c45 0x89 0x1 0xd131 0x60D
phy raw c45 0x89 0x1 0xd134 1
phy raw c45 0x89 0x1 0xffde 3
phy raw c45 0x89 0x1 0xd130 0x50
phy raw c45 0x89 0x1 0xd131 0x060e
phy raw c45 0x89 0x1 0xd130 0x4F
phy raw c45 0x89 0x1 0xd131 0x60F
phy raw c45 0x89 0x1 0xd134 1
phy raw c45 0x8d 0x1 0xffde 0
phy raw c45 0x8d 0x1 0xd130 0x4f
phy raw c45 0x8d 0x1 0xd131 0x060f
phy raw c45 0x8d 0x1 0xd130 0x51
phy raw c45 0x8d 0x1 0xd131 0x60D
phy raw c45 0x8d 0x1 0xd134 1
phy raw c45 0x8d 0x1 0xffde 1
phy raw c45 0x8d 0x1 0xd130 0x4f
phy raw c45 0x8d 0x1 0xd131 0x060f
phy raw c45 0x8d 0x1 0xd130 0x51
phy raw c45 0x8d 0x1 0xd131 0x60D
phy raw c45 0x8d 0x1 0xd134 1
phy raw c45 0x8d 0x1 0xffde 2
phy raw c45 0x8d 0x1 0xd130 0x4f
phy raw c45 0x8d 0x1 0xd131 0x060f
phy raw c45 0x8d 0x1 0xd130 0x51
phy raw c45 0x8d 0x1 0xd131 0x60D
phy raw c45 0x8d 0x1 0xd134 1
phy raw c45 0x8d 0x1 0xffde 3
phy raw c45 0x8d 0x1 0xd130 0x4f
phy raw c45 0x8d 0x1 0xd131 0x060f
phy raw c45 0x8d 0x1 0xd130 0x50
phy raw c45 0x8d 0x1 0xd131 0x60E
phy raw c45 0x8d 0x1 0xd134 1
phy raw c45 0x91 0x1 0xffde 0
phy raw c45 0x91 0x1 0xd130 0x50
phy raw c45 0x91 0x1 0xd131 0x060e
phy raw c45 0x91 0x1 0xd130 0x52
phy raw c45 0x91 0x1 0xd131 0x60C
phy raw c45 0x91 0x1 0xd134 1
phy raw c45 0x91 0x1 0xffde 1
phy raw c45 0x91 0x1 0xd130 0x50
phy raw c45 0x91 0x1 0xd131 0x060e
phy raw c45 0x91 0x1 0xd130 0x52
phy raw c45 0x91 0x1 0xd131 0x60C
phy raw c45 0x91 0x1 0xd134 1
phy raw c45 0x91 0x1 0xffde 2
phy raw c45 0x91 0x1 0xd130 0x50
phy raw c45 0x91 0x1 0xd131 0x060e
phy raw c45 0x91 0x1 0xd130 0x52
phy raw c45 0x91 0x1 0xd131 0x60C
phy raw c45 0x91 0x1 0xd134 1
phy raw c45 0x91 0x1 0xffde 3
phy raw c45 0x91 0x1 0xd130 0x50
phy raw c45 0x91 0x1 0xd131 0x060e
phy raw c45 0x91 0x1 0xd130 0x52
phy raw c45 0x91 0x1 0xd131 0x60C
phy raw c45 0x91 0x1 0xd134 1
phy raw c45 0x95 0x1 0xffde 0
phy raw c45 0x95 0x1 0xd130 0x52
phy raw c45 0x95 0x1 0xd131 0x060c
phy raw c45 0x95 0x1 0xd130 0x54
phy raw c45 0x95 0x1 0xd131 0x60A
phy raw c45 0x95 0x1 0xd134 1
phy raw c45 0x95 0x1 0xffde 1
phy raw c45 0x95 0x1 0xd130 0x52
phy raw c45 0x95 0x1 0xd131 0x060c
phy raw c45 0x95 0x1 0xd131 0x60C
phy raw c45 0x95 0x1 0xd134 1
phy raw c45 0x95 0x1 0xffde 2
phy raw c45 0x95 0x1 0xd130 0x52
phy raw c45 0x95 0x1 0xd131 0x060c
phy raw c45 0x95 0x1 0xd130 0x54
phy raw c45 0x95 0x1 0xd131 0x60A
phy raw c45 0x95 0x1 0xd134 1
phy raw c45 0x95 0x1 0xffde 3
phy raw c45 0x95 0x1 0xd130 0x52
phy raw c45 0x95 0x1 0xd131 0x060c
phy raw c45 0x95 0x1 0xd131 0x60C
phy raw c45 0x95 0x1 0xd134 1
phy raw c45 0xa1 0x1 0xffde 0
phy raw c45 0xa1 0x1 0xd130 0x52
phy raw c45 0xa1 0x1 0xd131 0x060c
phy raw c45 0xa1 0x1 0xd130 0x54
phy raw c45 0xa1 0x1 0xd131 0x60A
phy raw c45 0xa1 0x1 0xd134 1
phy raw c45 0xa1 0x1 0xffde 1
phy raw c45 0xa1 0x1 0xd130 0x52
phy raw c45 0xa1 0x1 0xd131 0x060c
phy raw c45 0xa1 0x1 0xd130 0x53
phy raw c45 0xa1 0x1 0xd131 0x60B
phy raw c45 0xa1 0x1 0xd134 1
phy raw c45 0xa1 0x1 0xffde 2
phy raw c45 0xa1 0x1 0xd130 0x52
phy raw c45 0xa1 0x1 0xd131 0x060c
phy raw c45 0xa1 0x1 0xd130 0x54
phy raw c45 0xa1 0x1 0xd131 0x60A
phy raw c45 0xa1 0x1 0xd134 1
phy raw c45 0xa1 0x1 0xffde 3
phy raw c45 0xa1 0x1 0xd130 0x52
phy raw c45 0xa1 0x1 0xd131 0x060c
phy raw c45 0xa1 0x1 0xd130 0x53
phy raw c45 0xa1 0x1 0xd131 0x60B
phy raw c45 0xa1 0x1 0xd134 1
phy raw c45 0xad 0x1 0xffde 0
phy raw c45 0xad 0x1 0xd130 0x53
phy raw c45 0xad 0x1 0xd131 0x060b
phy raw c45 0xad 0x1 0xd130 0x54
phy raw c45 0xad 0x1 0xd131 0x60A
phy raw c45 0xad 0x1 0xd134 1
phy raw c45 0xad 0x1 0xffde 1
phy raw c45 0xad 0x1 0xd130 0x53
phy raw c45 0xad 0x1 0xd131 0x060b
phy raw c45 0xad 0x1 0xd131 0x60B
phy raw c45 0xad 0x1 0xd134 1
phy raw c45 0xad 0x1 0xffde 2
phy raw c45 0xad 0x1 0xd130 0x53
phy raw c45 0xad 0x1 0xd131 0x060b
phy raw c45 0xad 0x1 0xd130 0x54
phy raw c45 0xad 0x1 0xd131 0x60A
phy raw c45 0xad 0x1 0xd134 1
phy raw c45 0xad 0x1 0xffde 3
phy raw c45 0xad 0x1 0xd130 0x53
phy raw c45 0xad 0x1 0xd131 0x060b
phy raw c45 0xad 0x1 0xd130 0x54
phy raw c45 0xad 0x1 0xd131 0x60A
phy raw c45 0xad 0x1 0xd134 1
phy raw c45 0xc9 0x1 0xffde 0
phy raw c45 0xc9 0x1 0xd130 0x53
phy raw c45 0xc9 0x1 0xd131 0x060b
phy raw c45 0xc9 0x1 0xd130 0x54
phy raw c45 0xc9 0x1 0xd131 0x60A
phy raw c45 0xc9 0x1 0xd134 1
phy raw c45 0xc9 0x1 0xffde 1
phy raw c45 0xc9 0x1 0xd130 0x53
phy raw c45 0xc9 0x1 0xd131 0x060b
phy raw c45 0xc9 0x1 0xd131 0x60B
phy raw c45 0xc9 0x1 0xd134 1
phy raw c45 0xc9 0x1 0xffde 2
phy raw c45 0xc9 0x1 0xd130 0x53
phy raw c45 0xc9 0x1 0xd131 0x060b
phy raw c45 0xc9 0x1 0xd130 0x54
phy raw c45 0xc9 0x1 0xd131 0x60A
phy raw c45 0xc9 0x1 0xd134 1
phy raw c45 0xc9 0x1 0xffde 3
phy raw c45 0xc9 0x1 0xd130 0x53
phy raw c45 0xc9 0x1 0xd131 0x060b
phy raw c45 0xc9 0x1 0xd131 0x60B
phy raw c45 0xc9 0x1 0xd134 1
phy raw c45 0xcd 0x1 0xffde 0
phy raw c45 0xcd 0x1 0xd130 0x54
phy raw c45 0xcd 0x1 0xd131 0x060a
phy raw c45 0xcd 0x1 0xd131 0x60A
phy raw c45 0xcd 0x1 0xd134 1
phy raw c45 0xcd 0x1 0xffde 1
phy raw c45 0xcd 0x1 0xd130 0x54
phy raw c45 0xcd 0x1 0xd131 0x060a
phy raw c45 0xcd 0x1 0xd130 0x53
phy raw c45 0xcd 0x1 0xd131 0x60B
phy raw c45 0xcd 0x1 0xd134 1
phy raw c45 0xcd 0x1 0xffde 2
phy raw c45 0xcd 0x1 0xd130 0x54
phy raw c45 0xcd 0x1 0xd131 0x060a
phy raw c45 0xcd 0x1 0xd131 0x60A
phy raw c45 0xcd 0x1 0xd134 1
phy raw c45 0xcd 0x1 0xffde 3
phy raw c45 0xcd 0x1 0xd130 0x54
phy raw c45 0xcd 0x1 0xd131 0x060a
phy raw c45 0xcd 0x1 0xd131 0x60A
phy raw c45 0xcd 0x1 0xd134 1
phy raw c45 0xd1 0x1 0xffde 0
phy raw c45 0xd1 0x1 0xd130 0x56
phy raw c45 0xd1 0x1 0xd131 0x0608
phy raw c45 0xd1 0x1 0xd130 0x55
phy raw c45 0xd1 0x1 0xd131 0x609
phy raw c45 0xd1 0x1 0xd134 1
phy raw c45 0xd1 0x1 0xffde 1
phy raw c45 0xd1 0x1 0xd130 0x56
phy raw c45 0xd1 0x1 0xd131 0x0608
phy raw c45 0xd1 0x1 0xd130 0x55
phy raw c45 0xd1 0x1 0xd131 0x609
phy raw c45 0xd1 0x1 0xd134 1
phy raw c45 0xd1 0x1 0xffde 2
phy raw c45 0xd1 0x1 0xd130 0x56
phy raw c45 0xd1 0x1 0xd131 0x0608
phy raw c45 0xd1 0x1 0xd130 0x55
phy raw c45 0xd1 0x1 0xd131 0x609
phy raw c45 0xd1 0x1 0xd134 1
phy raw c45 0xd1 0x1 0xffde 3
phy raw c45 0xd1 0x1 0xd130 0x56
phy raw c45 0xd1 0x1 0xd131 0x0608
phy raw c45 0xd1 0x1 0xd130 0x55
phy raw c45 0xd1 0x1 0xd131 0x609
phy raw c45 0xd1 0x1 0xd134 1
phy raw c45 0xd5 0x1 0xffde 0
phy raw c45 0xd5 0x1 0xd130 0x55
phy raw c45 0xd5 0x1 0xd131 0x0609
phy raw c45 0xd5 0x1 0xd130 0x54
phy raw c45 0xd5 0x1 0xd131 0x60A
phy raw c45 0xd5 0x1 0xd134 1
phy raw c45 0xd5 0x1 0xffde 1
phy raw c45 0xd5 0x1 0xd130 0x55
phy raw c45 0xd5 0x1 0xd131 0x0609
phy raw c45 0xd5 0x1 0xd130 0x54
phy raw c45 0xd5 0x1 0xd131 0x60A
phy raw c45 0xd5 0x1 0xd134 1
phy raw c45 0xd5 0x1 0xffde 2
phy raw c45 0xd5 0x1 0xd130 0x55
phy raw c45 0xd5 0x1 0xd131 0x0609
phy raw c45 0xd5 0x1 0xd130 0x54
phy raw c45 0xd5 0x1 0xd131 0x60A
phy raw c45 0xd5 0x1 0xd134 1
phy raw c45 0xd5 0x1 0xffde 3
phy raw c45 0xd5 0x1 0xd130 0x55
phy raw c45 0xd5 0x1 0xd131 0x0609
phy raw c45 0xd5 0x1 0xd131 0x609
phy raw c45 0xd5 0x1 0xd134 1
phy raw c45 0xe1 0x1 0xffde 0
phy raw c45 0xe1 0x1 0xd130 0x56
phy raw c45 0xe1 0x1 0xd131 0x0608
phy raw c45 0xe1 0x1 0xd130 0x55
phy raw c45 0xe1 0x1 0xd131 0x609
phy raw c45 0xe1 0x1 0xd134 1
phy raw c45 0xe1 0x1 0xffde 1
phy raw c45 0xe1 0x1 0xd130 0x56
phy raw c45 0xe1 0x1 0xd131 0x0608
phy raw c45 0xe1 0x1 0xd130 0x55
phy raw c45 0xe1 0x1 0xd131 0x609
phy raw c45 0xe1 0x1 0xd134 1
phy raw c45 0xe1 0x1 0xffde 2
phy raw c45 0xe1 0x1 0xd130 0x56
phy raw c45 0xe1 0x1 0xd131 0x0608
phy raw c45 0xe1 0x1 0xd130 0x55
phy raw c45 0xe1 0x1 0xd131 0x609
phy raw c45 0xe1 0x1 0xd134 1
phy raw c45 0xe1 0x1 0xffde 3
phy raw c45 0xe1 0x1 0xd130 0x56
phy raw c45 0xe1 0x1 0xd131 0x0608
phy raw c45 0xe1 0x1 0xd130 0x55
phy raw c45 0xe1 0x1 0xd131 0x609
phy raw c45 0xe1 0x1 0xd134 1
phy raw c45 0xe5 0x1 0xffde 0
phy raw c45 0xe5 0x1 0xd130 0x55
phy raw c45 0xe5 0x1 0xd131 0x0609
phy raw c45 0xe5 0x1 0xd130 0x54
phy raw c45 0xe5 0x1 0xd131 0x60A
phy raw c45 0xe5 0x1 0xd134 1
phy raw c45 0xe5 0x1 0xffde 1
phy raw c45 0xe5 0x1 0xd130 0x55
phy raw c45 0xe5 0x1 0xd131 0x0609
phy raw c45 0xe5 0x1 0xd130 0x54
phy raw c45 0xe5 0x1 0xd131 0x60A
phy raw c45 0xe5 0x1 0xd134 1
phy raw c45 0xe5 0x1 0xffde 2
phy raw c45 0xe5 0x1 0xd130 0x55
phy raw c45 0xe5 0x1 0xd131 0x0609
phy raw c45 0xe5 0x1 0xd130 0x54
phy raw c45 0xe5 0x1 0xd131 0x60A
phy raw c45 0xe5 0x1 0xd134 1
phy raw c45 0xe5 0x1 0xffde 3
phy raw c45 0xe5 0x1 0xd130 0x55
phy raw c45 0xe5 0x1 0xd131 0x0609
phy raw c45 0xe5 0x1 0xd130 0x54
phy raw c45 0xe5 0x1 0xd131 0x60A
phy raw c45 0xe5 0x1 0xd134 1
phy raw c45 0xe9 0x1 0xffde 0
phy raw c45 0xe9 0x1 0xd130 0x56
phy raw c45 0xe9 0x1 0xd131 0x0608
phy raw c45 0xe9 0x1 0xd130 0x54
phy raw c45 0xe9 0x1 0xd131 0x60A
phy raw c45 0xe9 0x1 0xd134 1
phy raw c45 0xe9 0x1 0xffde 1
phy raw c45 0xe9 0x1 0xd130 0x56
phy raw c45 0xe9 0x1 0xd131 0x0608
phy raw c45 0xe9 0x1 0xd130 0x54
phy raw c45 0xe9 0x1 0xd131 0x60A
phy raw c45 0xe9 0x1 0xd134 1
phy raw c45 0xe9 0x1 0xffde 2
phy raw c45 0xe9 0x1 0xd130 0x56
phy raw c45 0xe9 0x1 0xd131 0x0608
phy raw c45 0xe9 0x1 0xd130 0x54
phy raw c45 0xe9 0x1 0xd131 0x60A
phy raw c45 0xe9 0x1 0xd134 1
phy raw c45 0xe9 0x1 0xffde 3
phy raw c45 0xe9 0x1 0xd130 0x56
phy raw c45 0xe9 0x1 0xd131 0x0608
phy raw c45 0xe9 0x1 0xd130 0x54
phy raw c45 0xe9 0x1 0xd131 0x60A
phy raw c45 0xe9 0x1 0xd134 1
phy raw c45 0xed 0x1 0xffde 0
phy raw c45 0xed 0x1 0xd130 0x55
phy raw c45 0xed 0x1 0xd131 0x0609
phy raw c45 0xed 0x1 0xd130 0x53
phy raw c45 0xed 0x1 0xd131 0x60B
phy raw c45 0xed 0x1 0xd134 1
phy raw c45 0xed 0x1 0xffde 1
phy raw c45 0xed 0x1 0xd130 0x53
phy raw c45 0xed 0x1 0xd131 0x060b
phy raw c45 0xed 0x1 0xd130 0x52
phy raw c45 0xed 0x1 0xd131 0x60C
phy raw c45 0xed 0x1 0xd134 1
phy raw c45 0xed 0x1 0xffde 2
phy raw c45 0xed 0x1 0xd130 0x54
phy raw c45 0xed 0x1 0xd131 0x060a
phy raw c45 0xed 0x1 0xd131 0x60A
phy raw c45 0xed 0x1 0xd134 1
phy raw c45 0xed 0x1 0xffde 3
phy raw c45 0xed 0x1 0xd130 0x54
phy raw c45 0xed 0x1 0xd131 0x060a
phy raw c45 0xed 0x1 0xd130 0x52
phy raw c45 0xed 0x1 0xd131 0x60C
phy raw c45 0xed 0x1 0xd134 1
phy raw c45 0x185 0x1 0xffde 0
phy raw c45 0x185 0x1 0xd130 0x55
phy raw c45 0x185 0x1 0xd131 0x0609
phy raw c45 0x185 0x1 0xd130 0x53
phy raw c45 0x185 0x1 0xd131 0x60B
phy raw c45 0x185 0x1 0xd134 1
phy raw c45 0x185 0x1 0xffde 1
phy raw c45 0x185 0x1 0xd130 0x55
phy raw c45 0x185 0x1 0xd131 0x0609
phy raw c45 0x185 0x1 0xd130 0x53
phy raw c45 0x185 0x1 0xd131 0x60B
phy raw c45 0x185 0x1 0xd134 1
phy raw c45 0x185 0x1 0xffde 2
phy raw c45 0x185 0x1 0xd130 0x55
phy raw c45 0x185 0x1 0xd131 0x0609
phy raw c45 0x185 0x1 0xd130 0x53
phy raw c45 0x185 0x1 0xd131 0x60B
phy raw c45 0x185 0x1 0xd134 1
phy raw c45 0x185 0x1 0xffde 3
phy raw c45 0x185 0x1 0xd130 0x55
phy raw c45 0x185 0x1 0xd131 0x0609
phy raw c45 0x185 0x1 0xd130 0x53
phy raw c45 0x185 0x1 0xd131 0x60B
phy raw c45 0x185 0x1 0xd134 1
phy raw c45 0x18d 0x1 0xffde 0
phy raw c45 0x18d 0x1 0xd130 0x54
phy raw c45 0x18d 0x1 0xd131 0x060a
phy raw c45 0x18d 0x1 0xd130 0x53
phy raw c45 0x18d 0x1 0xd131 0x60B
phy raw c45 0x18d 0x1 0xd134 1
phy raw c45 0x18d 0x1 0xffde 1
phy raw c45 0x18d 0x1 0xd130 0x53
phy raw c45 0x18d 0x1 0xd131 0x060b
phy raw c45 0x18d 0x1 0xd130 0x52
phy raw c45 0x18d 0x1 0xd131 0x60C
phy raw c45 0x18d 0x1 0xd134 1
phy raw c45 0x18d 0x1 0xffde 2
phy raw c45 0x18d 0x1 0xd130 0x53
phy raw c45 0x18d 0x1 0xd131 0x060b
phy raw c45 0x18d 0x1 0xd130 0x54
phy raw c45 0x18d 0x1 0xd131 0x60A
phy raw c45 0x18d 0x1 0xd134 1
phy raw c45 0x18d 0x1 0xffde 3
phy raw c45 0x18d 0x1 0xd130 0x53
phy raw c45 0x18d 0x1 0xd131 0x060b
phy raw c45 0x18d 0x1 0xd130 0x54
phy raw c45 0x18d 0x1 0xd131 0x60A
phy raw c45 0x18d 0x1 0xd134 1
phy raw c45 0x1a1 0x1 0xffde 0
phy raw c45 0x1a1 0x1 0xd130 0x55
phy raw c45 0x1a1 0x1 0xd131 0x0609
phy raw c45 0x1a1 0x1 0xd130 0x52
phy raw c45 0x1a1 0x1 0xd131 0x60C
phy raw c45 0x1a1 0x1 0xd134 1
phy raw c45 0x1a1 0x1 0xffde 1
phy raw c45 0x1a1 0x1 0xd130 0x54
phy raw c45 0x1a1 0x1 0xd131 0x060a
phy raw c45 0x1a1 0x1 0xd130 0x52
phy raw c45 0x1a1 0x1 0xd131 0x60C
phy raw c45 0x1a1 0x1 0xd134 1
phy raw c45 0x1a1 0x1 0xffde 2
phy raw c45 0x1a1 0x1 0xd130 0x55
phy raw c45 0x1a1 0x1 0xd131 0x0609
phy raw c45 0x1a1 0x1 0xd130 0x52
phy raw c45 0x1a1 0x1 0xd131 0x60C
phy raw c45 0x1a1 0x1 0xd134 1
phy raw c45 0x1a1 0x1 0xffde 3
phy raw c45 0x1a1 0x1 0xd130 0x53
phy raw c45 0x1a1 0x1 0xd131 0x060b
phy raw c45 0x1a1 0x1 0xd130 0x52
phy raw c45 0x1a1 0x1 0xd131 0x60C
phy raw c45 0x1a1 0x1 0xd134 1
phy raw c45 0x1a5 0x1 0xffde 0
phy raw c45 0x1a5 0x1 0xd130 0x54
phy raw c45 0x1a5 0x1 0xd131 0x060a
phy raw c45 0x1a5 0x1 0xd130 0x52
phy raw c45 0x1a5 0x1 0xd131 0x60C
phy raw c45 0x1a5 0x1 0xd134 1
phy raw c45 0x1a5 0x1 0xffde 1
phy raw c45 0x1a5 0x1 0xd130 0x53
phy raw c45 0x1a5 0x1 0xd131 0x060b
phy raw c45 0x1a5 0x1 0xd130 0x52
phy raw c45 0x1a5 0x1 0xd131 0x60C
phy raw c45 0x1a5 0x1 0xd134 1
phy raw c45 0x1a5 0x1 0xffde 2
phy raw c45 0x1a5 0x1 0xd130 0x53
phy raw c45 0x1a5 0x1 0xd131 0x060b
phy raw c45 0x1a5 0x1 0xd131 0x60B
phy raw c45 0x1a5 0x1 0xd134 1
phy raw c45 0x1a5 0x1 0xffde 3
phy raw c45 0x1a5 0x1 0xd130 0x53
phy raw c45 0x1a5 0x1 0xd131 0x060b
phy raw c45 0x1a5 0x1 0xd130 0x52
phy raw c45 0x1a5 0x1 0xd131 0x60C
phy raw c45 0x1a5 0x1 0xd134 1
phy raw c45 0x1a9 0x1 0xffde 0
phy raw c45 0x1a9 0x1 0xd130 0x54
phy raw c45 0x1a9 0x1 0xd131 0x060a
phy raw c45 0x1a9 0x1 0xd130 0x50
phy raw c45 0x1a9 0x1 0xd131 0x60E
phy raw c45 0x1a9 0x1 0xd134 1
phy raw c45 0x1a9 0x1 0xffde 1
phy raw c45 0x1a9 0x1 0xd130 0x51
phy raw c45 0x1a9 0x1 0xd131 0x060d
phy raw c45 0x1a9 0x1 0xd131 0x60D
phy raw c45 0x1a9 0x1 0xd134 1
phy raw c45 0x1a9 0x1 0xffde 2
phy raw c45 0x1a9 0x1 0xd130 0x52
phy raw c45 0x1a9 0x1 0xd131 0x060c
phy raw c45 0x1a9 0x1 0xd130 0x51
phy raw c45 0x1a9 0x1 0xd131 0x60D
phy raw c45 0x1a9 0x1 0xd134 1
phy raw c45 0x1a9 0x1 0xffde 3
phy raw c45 0x1a9 0x1 0xd130 0x52
phy raw c45 0x1a9 0x1 0xd131 0x060c
phy raw c45 0x1a9 0x1 0xd130 0x51
phy raw c45 0x1a9 0x1 0xd131 0x60D
phy raw c45 0x1a9 0x1 0xd134 1
phy raw c45 0x1ad 0x1 0xffde 0
phy raw c45 0x1ad 0x1 0xd130 0x51
phy raw c45 0x1ad 0x1 0xd131 0x060d
phy raw c45 0x1ad 0x1 0xd130 0x50
phy raw c45 0x1ad 0x1 0xd131 0x60E
phy raw c45 0x1ad 0x1 0xd134 1
phy raw c45 0x1ad 0x1 0xffde 1
phy raw c45 0x1ad 0x1 0xd130 0x4f
phy raw c45 0x1ad 0x1 0xd131 0x060f
phy raw c45 0x1ad 0x1 0xd130 0x50
phy raw c45 0x1ad 0x1 0xd131 0x60E
phy raw c45 0x1ad 0x1 0xd134 1
phy raw c45 0x1ad 0x1 0xffde 2
phy raw c45 0x1ad 0x1 0xd130 0x4f
phy raw c45 0x1ad 0x1 0xd131 0x060f
phy raw c45 0x1ad 0x1 0xd130 0x51
phy raw c45 0x1ad 0x1 0xd131 0x60D
phy raw c45 0x1ad 0x1 0xd134 1
phy raw c45 0x1ad 0x1 0xffde 3
phy raw c45 0x1ad 0x1 0xd130 0x4f
phy raw c45 0x1ad 0x1 0xd131 0x060f
phy raw c45 0x1ad 0x1 0xd130 0x50
phy raw c45 0x1ad 0x1 0xd131 0x60E
phy raw c45 0x1ad 0x1 0xd134 1
phy raw c45 0x1b1 0x1 0xffde 0
phy raw c45 0x1b1 0x1 0xd130 0x4f
phy raw c45 0x1b1 0x1 0xd131 0x060f
phy raw c45 0x1b1 0x1 0xd130 0x4F
phy raw c45 0x1b1 0x1 0xd131 0x60F
phy raw c45 0x1b1 0x1 0xd134 1
phy raw c45 0x1b1 0x1 0xffde 1
phy raw c45 0x1b1 0x1 0xd130 0x4f
phy raw c45 0x1b1 0x1 0xd131 0x060f
phy raw c45 0x1b1 0x1 0xd130 0x4D
phy raw c45 0x1b1 0x1 0xd131 0x611
phy raw c45 0x1b1 0x1 0xd134 1
phy raw c45 0x1b1 0x1 0xffde 2
phy raw c45 0x1b1 0x1 0xd130 0x4f
phy raw c45 0x1b1 0x1 0xd131 0x060f
phy raw c45 0x1b1 0x1 0xd130 0x4E
phy raw c45 0x1b1 0x1 0xd131 0x610
phy raw c45 0x1b1 0x1 0xd134 1
phy raw c45 0x1b1 0x1 0xffde 3
phy raw c45 0x1b1 0x1 0xd130 0x4f
phy raw c45 0x1b1 0x1 0xd131 0x060f
phy raw c45 0x1b1 0x1 0xd130 0x4D
phy raw c45 0x1b1 0x1 0xd131 0x611
phy raw c45 0x1b1 0x1 0xd134 1
phy raw c45 0x1b5 0x1 0xffde 0
phy raw c45 0x1b5 0x1 0xd130 0x4e
phy raw c45 0x1b5 0x1 0xd131 0x0610
phy raw c45 0x1b5 0x1 0xd130 0x4E
phy raw c45 0x1b5 0x1 0xd131 0x610
phy raw c45 0x1b5 0x1 0xd134 1
phy raw c45 0x1b5 0x1 0xffde 1
phy raw c45 0x1b5 0x1 0xd130 0x4d
phy raw c45 0x1b5 0x1 0xd131 0x0611
phy raw c45 0x1b5 0x1 0xd130 0x4D
phy raw c45 0x1b5 0x1 0xd131 0x611
phy raw c45 0x1b5 0x1 0xd134 1
phy raw c45 0x1b5 0x1 0xffde 2
phy raw c45 0x1b5 0x1 0xd130 0x4d
phy raw c45 0x1b5 0x1 0xd131 0x0611
phy raw c45 0x1b5 0x1 0xd130 0x4E
phy raw c45 0x1b5 0x1 0xd131 0x610
phy raw c45 0x1b5 0x1 0xd134 1
phy raw c45 0x1b5 0x1 0xffde 3
phy raw c45 0x1b5 0x1 0xd130 0x4d
phy raw c45 0x1b5 0x1 0xd131 0x0611
phy raw c45 0x1b5 0x1 0xd130 0x4D
phy raw c45 0x1b5 0x1 0xd131 0x611
phy raw c45 0x1b5 0x1 0xd134 1
phy raw c45 0xf1 0x1 0xffde 0
phy raw c45 0xf1 0x1 0xd130 0x4f
phy raw c45 0xf1 0x1 0xd131 0x060f
phy raw c45 0xf1 0x1 0xd130 0x4F
phy raw c45 0xf1 0x1 0xd131 0x60F
phy raw c45 0xf1 0x1 0xd134 1
phy raw c45 0xf1 0x1 0xffde 1
phy raw c45 0xf1 0x1 0xd130 0x4f
phy raw c45 0xf1 0x1 0xd131 0x060f
phy raw c45 0xf1 0x1 0xd130 0x4E
phy raw c45 0xf1 0x1 0xd131 0x610
phy raw c45 0xf1 0x1 0xd134 1
phy raw c45 0xf1 0x1 0xffde 2
phy raw c45 0xf1 0x1 0xd130 0x4f
phy raw c45 0xf1 0x1 0xd131 0x060f
phy raw c45 0xf1 0x1 0xd130 0x4E
phy raw c45 0xf1 0x1 0xd131 0x610
phy raw c45 0xf1 0x1 0xd134 1
phy raw c45 0xf1 0x1 0xffde 3
phy raw c45 0xf1 0x1 0xd130 0x4f
phy raw c45 0xf1 0x1 0xd131 0x060f
phy raw c45 0xf1 0x1 0xd130 0x4E
phy raw c45 0xf1 0x1 0xd131 0x610
phy raw c45 0xf1 0x1 0xd134 1
phy raw c45 0xf5 0x1 0xffde 0
phy raw c45 0xf5 0x1 0xd130 0x4d
phy raw c45 0xf5 0x1 0xd131 0x0611
phy raw c45 0xf5 0x1 0xd130 0x4D
phy raw c45 0xf5 0x1 0xd131 0x611
phy raw c45 0xf5 0x1 0xd134 1
phy raw c45 0xf5 0x1 0xffde 1
phy raw c45 0xf5 0x1 0xd130 0x4d
phy raw c45 0xf5 0x1 0xd131 0x0611
phy raw c45 0xf5 0x1 0xd130 0x4D
phy raw c45 0xf5 0x1 0xd131 0x611
phy raw c45 0xf5 0x1 0xd134 1
phy raw c45 0xf5 0x1 0xffde 2
phy raw c45 0xf5 0x1 0xd130 0x4d
phy raw c45 0xf5 0x1 0xd131 0x0611
phy raw c45 0xf5 0x1 0xd130 0x4D
phy raw c45 0xf5 0x1 0xd131 0x611
phy raw c45 0xf5 0x1 0xd134 1
phy raw c45 0xf5 0x1 0xffde 3
phy raw c45 0xf5 0x1 0xd130 0x4d
phy raw c45 0xf5 0x1 0xd131 0x0611
phy raw c45 0xf5 0x1 0xd130 0x4D
phy raw c45 0xf5 0x1 0xd131 0x611
phy raw c45 0xf5 0x1 0xd134 1
phy raw c45 0x181 0x1 0xffde 0
phy raw c45 0x181 0x1 0xd130 0x4e
phy raw c45 0x181 0x1 0xd131 0x0610
phy raw c45 0x181 0x1 0xd130 0x4E
phy raw c45 0x181 0x1 0xd131 0x610
phy raw c45 0x181 0x1 0xd134 1
phy raw c45 0x181 0x1 0xffde 1
phy raw c45 0x181 0x1 0xd130 0x4e
phy raw c45 0x181 0x1 0xd131 0x0610
phy raw c45 0x181 0x1 0xd130 0x4D
phy raw c45 0x181 0x1 0xd131 0x611
phy raw c45 0x181 0x1 0xd134 1
phy raw c45 0x181 0x1 0xffde 2
phy raw c45 0x181 0x1 0xd130 0x4e
phy raw c45 0x181 0x1 0xd131 0x0610
phy raw c45 0x181 0x1 0xd130 0x4E
phy raw c45 0x181 0x1 0xd131 0x610
phy raw c45 0x181 0x1 0xd134 1
phy raw c45 0x181 0x1 0xffde 3
phy raw c45 0x181 0x1 0xd130 0x4e
phy raw c45 0x181 0x1 0xd131 0x0610
phy raw c45 0x181 0x1 0xd130 0x4D
phy raw c45 0x181 0x1 0xd131 0x611
phy raw c45 0x181 0x1 0xd134 1
phy raw c45 0x189 0x1 0xffde 0
phy raw c45 0x189 0x1 0xd130 0x4d
phy raw c45 0x189 0x1 0xd131 0x0611
phy raw c45 0x189 0x1 0xd130 0x4E
phy raw c45 0x189 0x1 0xd131 0x610
phy raw c45 0x189 0x1 0xd134 1
phy raw c45 0x189 0x1 0xffde 1
phy raw c45 0x189 0x1 0xd130 0x4d
phy raw c45 0x189 0x1 0xd131 0x0611
phy raw c45 0x189 0x1 0xd130 0x4E
phy raw c45 0x189 0x1 0xd131 0x610
phy raw c45 0x189 0x1 0xd134 1
phy raw c45 0x189 0x1 0xffde 2
phy raw c45 0x189 0x1 0xd130 0x4d
phy raw c45 0x189 0x1 0xd131 0x0611
phy raw c45 0x189 0x1 0xd130 0x4D
phy raw c45 0x189 0x1 0xd131 0x611
phy raw c45 0x189 0x1 0xd134 1
phy raw c45 0x189 0x1 0xffde 3
phy raw c45 0x189 0x1 0xd130 0x4d
phy raw c45 0x189 0x1 0xd131 0x0611
phy raw c45 0x189 0x1 0xd130 0x4D
phy raw c45 0x189 0x1 0xd131 0x611
phy raw c45 0x189 0x1 0xd134 1

View File

@ -0,0 +1,254 @@
{
"GLOBAL_MEDIA_SETTINGS": {
"1-1": {
"Default": {
"preemphasis": {
"lane0": "0x114D06",
"lane1": "0x0F4F06",
"lane2": "0x0F4F06",
"lane3": "0x104E06"
}
}
},
"2,4": {
"Default": {
"preemphasis": {
"lane0": "0x104E06",
"lane1": "0x104E06",
"lane2": "0x114D06",
"lane3": "0x104E06"
}
}
},
"3-3": {
"Default": {
"preemphasis": {
"lane0": "0x104E06",
"lane1": "0x104E06",
"lane2": "0x104E06",
"lane3": "0x104E06"
}
}
},
"5-5": {
"Default": {
"preemphasis": {
"lane0": "0x104E06",
"lane1": "0x114D06",
"lane2": "0x0F4F06",
"lane3": "0x114D06"
}
}
},
"6-6": {
"Default": {
"preemphasis": {
"lane0": "0x0F4F06",
"lane1": "0x0F4F06",
"lane2": "0x104E06",
"lane3": "0x114D06"
}
}
},
"7-7": {
"Default": {
"preemphasis": {
"lane0": "0x0F4F06",
"lane1": "0x0F4F06",
"lane2": "0x0D5106",
"lane3": "0x0F4F06"
}
}
},
"8-8": {
"Default": {
"preemphasis": {
"lane0": "0x0D5106",
"lane1": "0x0D5106",
"lane2": "0x0D5106",
"lane3": "0x0E5006"
}
}
},
"9,23": {
"Default": {
"preemphasis": {
"lane0": "0x0C5206",
"lane1": "0x0C5206",
"lane2": "0x0C5206",
"lane3": "0x0C5206"
}
}
},
"10-10": {
"Default": {
"preemphasis": {
"lane0": "0x0A5406",
"lane1": "0x0C5206",
"lane2": "0x0A5406",
"lane3": "0x0C5206"
}
}
},
"11,13": {
"Default": {
"preemphasis": {
"lane0": "0x0A5406",
"lane1": "0x0B5306",
"lane2": "0x0A5406",
"lane3": "0x0B5306"
}
}
},
"12,14": {
"Default": {
"preemphasis": {
"lane0": "0x0A5406",
"lane1": "0x0B5306",
"lane2": "0x0A5406",
"lane3": "0x0A5406"
}
}
},
"15,17": {
"Default": {
"preemphasis": {
"lane0": "0x095506",
"lane1": "0x095506",
"lane2": "0x095506",
"lane3": "0x095506"
}
}
},
"16-16": {
"Default": {
"preemphasis": {
"lane0": "0x0A5406",
"lane1": "0x0A5406",
"lane2": "0x0A5406",
"lane3": "0x095506"
}
}
},
"18,19": {
"Default": {
"preemphasis": {
"lane0": "0x0A5406",
"lane1": "0x0A5406",
"lane2": "0x0A5406",
"lane3": "0x0A5406"
}
}
},
"20-20": {
"Default": {
"preemphasis": {
"lane0": "0x0B5306",
"lane1": "0x0C5206",
"lane2": "0x0A5406",
"lane3": "0x0C5206"
}
}
},
"21-21": {
"Default": {
"preemphasis": {
"lane0": "0x0B5306",
"lane1": "0x0B5306",
"lane2": "0x0B5306",
"lane3": "0x0B5306"
}
}
},
"22-22": {
"Default": {
"preemphasis": {
"lane0": "0x0B5306",
"lane1": "0x0C5206",
"lane2": "0x0A5406",
"lane3": "0x0A5406"
}
}
},
"24-24": {
"Default": {
"preemphasis": {
"lane0": "0x0C5206",
"lane1": "0x0C5206",
"lane2": "0x0B5306",
"lane3": "0x0C5206"
}
}
},
"25-25": {
"Default": {
"preemphasis": {
"lane0": "0x0E5006",
"lane1": "0x0D5106",
"lane2": "0x0D5106",
"lane3": "0x0D5106"
}
}
},
"26-26": {
"Default": {
"preemphasis": {
"lane0": "0x0E5006",
"lane1": "0x0E5006",
"lane2": "0x0D5106",
"lane3": "0x0E5006"
}
}
},
"27-27": {
"Default": {
"preemphasis": {
"lane0": "0x0F4F06",
"lane1": "0x114D06",
"lane2": "0x104E06",
"lane3": "0x114D06"
}
}
},
"28,31": {
"Default": {
"preemphasis": {
"lane0": "0x104E06",
"lane1": "0x114D06",
"lane2": "0x104E06",
"lane3": "0x114D06"
}
}
},
"29-29": {
"Default": {
"preemphasis": {
"lane0": "0x0F4F06",
"lane1": "0x104E06",
"lane2": "0x104E06",
"lane3": "0x104E06"
}
}
},
"30-30": {
"Default": {
"preemphasis": {
"lane0": "0x114D06",
"lane1": "0x114D06",
"lane2": "0x114D06",
"lane3": "0x114D06"
}
}
},
"32-32": {
"Default": {
"preemphasis": {
"lane0": "0x104E06",
"lane1": "0x104E06",
"lane2": "0x114D06",
"lane3": "0x114D06"
}
}
}
}
}

View File

@ -1,546 +1,545 @@
# Pre-emphasis
phy raw c45 0xa5 0x1 0xffde 0
phy raw c45 0xa5 0x1 0xd130 0x41
phy raw c45 0xa5 0x1 0xd131 0xd
phy raw c45 0xa5 0x1 0xd130 0x4D
phy raw c45 0xa5 0x1 0xd131 0x611
phy raw c45 0xa5 0x1 0xd134 1
phy raw c45 0xa5 0x1 0xffde 1
phy raw c45 0xa5 0x1 0xd130 0x41
phy raw c45 0xa5 0x1 0xd131 0xd
phy raw c45 0xa5 0x1 0xd130 0x4F
phy raw c45 0xa5 0x1 0xd131 0x60F
phy raw c45 0xa5 0x1 0xd134 1
phy raw c45 0xa5 0x1 0xffde 2
phy raw c45 0xa5 0x1 0xd130 0x41
phy raw c45 0xa5 0x1 0xd131 0xd
phy raw c45 0xa5 0x1 0xd130 0x4F
phy raw c45 0xa5 0x1 0xd131 0x60F
phy raw c45 0xa5 0x1 0xd134 1
phy raw c45 0xa5 0x1 0xffde 3
phy raw c45 0xa5 0x1 0xd130 0x41
phy raw c45 0xa5 0x1 0xd131 0xd
phy raw c45 0xa5 0x1 0xd130 0x4E
phy raw c45 0xa5 0x1 0xd131 0x610
phy raw c45 0xa5 0x1 0xd134 1
phy raw c45 0xa9 0x1 0xffde 0
phy raw c45 0xa9 0x1 0xd130 0x41
phy raw c45 0xa9 0x1 0xd131 0xd
phy raw c45 0xa9 0x1 0xd130 0x4E
phy raw c45 0xa9 0x1 0xd131 0x610
phy raw c45 0xa9 0x1 0xd134 1
phy raw c45 0xa9 0x1 0xffde 1
phy raw c45 0xa9 0x1 0xd130 0x41
phy raw c45 0xa9 0x1 0xd131 0xd
phy raw c45 0xa9 0x1 0xd130 0x4E
phy raw c45 0xa9 0x1 0xd131 0x610
phy raw c45 0xa9 0x1 0xd134 1
phy raw c45 0xa9 0x1 0xffde 2
phy raw c45 0xa9 0x1 0xd130 0x41
phy raw c45 0xa9 0x1 0xd131 0xd
phy raw c45 0xa9 0x1 0xd130 0x4D
phy raw c45 0xa9 0x1 0xd131 0x611
phy raw c45 0xa9 0x1 0xd134 1
phy raw c45 0xa9 0x1 0xffde 3
phy raw c45 0xa9 0x1 0xd130 0x41
phy raw c45 0xa9 0x1 0xd131 0xd
phy raw c45 0xa9 0x1 0xd130 0x4E
phy raw c45 0xa9 0x1 0xd131 0x610
phy raw c45 0xa9 0x1 0xd134 1
phy raw c45 0xc1 0x1 0xffde 0
phy raw c45 0xc1 0x1 0xd130 0x41
phy raw c45 0xc1 0x1 0xd131 0xd
phy raw c45 0xc1 0x1 0xd130 0x4E
phy raw c45 0xc1 0x1 0xd131 0x610
phy raw c45 0xc1 0x1 0xd134 1
phy raw c45 0xc1 0x1 0xffde 1
phy raw c45 0xc1 0x1 0xd130 0x41
phy raw c45 0xc1 0x1 0xd131 0xd
phy raw c45 0xc1 0x1 0xd130 0x4E
phy raw c45 0xc1 0x1 0xd131 0x610
phy raw c45 0xc1 0x1 0xd134 1
phy raw c45 0xc1 0x1 0xffde 2
phy raw c45 0xc1 0x1 0xd130 0x41
phy raw c45 0xc1 0x1 0xd131 0xd
phy raw c45 0xc1 0x1 0xd130 0x4E
phy raw c45 0xc1 0x1 0xd131 0x610
phy raw c45 0xc1 0x1 0xd134 1
phy raw c45 0xc1 0x1 0xffde 3
phy raw c45 0xc1 0x1 0xd130 0x41
phy raw c45 0xc1 0x1 0xd131 0xd
phy raw c45 0xc1 0x1 0xd130 0x4E
phy raw c45 0xc1 0x1 0xd131 0x610
phy raw c45 0xc1 0x1 0xd134 1
phy raw c45 0xc5 0x1 0xffde 0
phy raw c45 0xc5 0x1 0xd130 0x41
phy raw c45 0xc5 0x1 0xd131 0xd
phy raw c45 0xc5 0x1 0xd130 0x4E
phy raw c45 0xc5 0x1 0xd131 0x610
phy raw c45 0xc5 0x1 0xd134 1
phy raw c45 0xc5 0x1 0xffde 1
phy raw c45 0xc5 0x1 0xd130 0x41
phy raw c45 0xc5 0x1 0xd131 0xd
phy raw c45 0xc5 0x1 0xd130 0x4E
phy raw c45 0xc5 0x1 0xd131 0x610
phy raw c45 0xc5 0x1 0xd134 1
phy raw c45 0xc5 0x1 0xffde 2
phy raw c45 0xc5 0x1 0xd130 0x41
phy raw c45 0xc5 0x1 0xd131 0xd
phy raw c45 0xc5 0x1 0xd130 0x4D
phy raw c45 0xc5 0x1 0xd131 0x611
phy raw c45 0xc5 0x1 0xd134 1
phy raw c45 0xc5 0x1 0xffde 3
phy raw c45 0xc5 0x1 0xd130 0x41
phy raw c45 0xc5 0x1 0xd131 0xd
phy raw c45 0xc5 0x1 0xd130 0x4E
phy raw c45 0xc5 0x1 0xd131 0x610
phy raw c45 0xc5 0x1 0xd134 1
phy raw c45 0x81 0x1 0xffde 0
phy raw c45 0x81 0x1 0xd130 0x41
phy raw c45 0x81 0x1 0xd131 0xd
phy raw c45 0x81 0x1 0xd130 0x4E
phy raw c45 0x81 0x1 0xd131 0x610
phy raw c45 0x81 0x1 0xd134 1
phy raw c45 0x81 0x1 0xffde 1
phy raw c45 0x81 0x1 0xd130 0x41
phy raw c45 0x81 0x1 0xd131 0xd
phy raw c45 0x81 0x1 0xd130 0x4D
phy raw c45 0x81 0x1 0xd131 0x611
phy raw c45 0x81 0x1 0xd134 1
phy raw c45 0x81 0x1 0xffde 2
phy raw c45 0x81 0x1 0xd130 0x41
phy raw c45 0x81 0x1 0xd131 0xd
phy raw c45 0x81 0x1 0xd130 0x4F
phy raw c45 0x81 0x1 0xd131 0x60F
phy raw c45 0x81 0x1 0xd134 1
phy raw c45 0x81 0x1 0xffde 3
phy raw c45 0x81 0x1 0xd130 0x41
phy raw c45 0x81 0x1 0xd131 0xd
phy raw c45 0x81 0x1 0xd130 0x4D
phy raw c45 0x81 0x1 0xd131 0x611
phy raw c45 0x81 0x1 0xd134 1
phy raw c45 0x85 0x1 0xffde 0
phy raw c45 0x85 0x1 0xd130 0x41
phy raw c45 0x85 0x1 0xd131 0xd
phy raw c45 0x85 0x1 0xd130 0x4F
phy raw c45 0x85 0x1 0xd131 0x60F
phy raw c45 0x85 0x1 0xd134 1
phy raw c45 0x85 0x1 0xffde 1
phy raw c45 0x85 0x1 0xd130 0x41
phy raw c45 0x85 0x1 0xd131 0xd
phy raw c45 0x85 0x1 0xd130 0x4F
phy raw c45 0x85 0x1 0xd131 0x60F
phy raw c45 0x85 0x1 0xd134 1
phy raw c45 0x85 0x1 0xffde 2
phy raw c45 0x85 0x1 0xd130 0x41
phy raw c45 0x85 0x1 0xd131 0xd
phy raw c45 0x85 0x1 0xd130 0x4E
phy raw c45 0x85 0x1 0xd131 0x610
phy raw c45 0x85 0x1 0xd134 1
phy raw c45 0x85 0x1 0xffde 3
phy raw c45 0x85 0x1 0xd130 0x41
phy raw c45 0x85 0x1 0xd131 0xd
phy raw c45 0x85 0x1 0xd130 0x4D
phy raw c45 0x85 0x1 0xd131 0x611
phy raw c45 0x85 0x1 0xd134 1
phy raw c45 0x89 0x1 0xffde 0
phy raw c45 0x89 0x1 0xd130 0x41
phy raw c45 0x89 0x1 0xd131 0xd
phy raw c45 0x89 0x1 0xd130 0x4F
phy raw c45 0x89 0x1 0xd131 0x60F
phy raw c45 0x89 0x1 0xd134 1
phy raw c45 0x89 0x1 0xffde 1
phy raw c45 0x89 0x1 0xd130 0x41
phy raw c45 0x89 0x1 0xd131 0xd
phy raw c45 0x89 0x1 0xd130 0x4F
phy raw c45 0x89 0x1 0xd131 0x60F
phy raw c45 0x89 0x1 0xd134 1
phy raw c45 0x89 0x1 0xffde 2
phy raw c45 0x89 0x1 0xd130 0x41
phy raw c45 0x89 0x1 0xd131 0xd
phy raw c45 0x89 0x1 0xd130 0x51
phy raw c45 0x89 0x1 0xd131 0x60D
phy raw c45 0x89 0x1 0xd134 1
phy raw c45 0x89 0x1 0xffde 3
phy raw c45 0x89 0x1 0xd130 0x41
phy raw c45 0x89 0x1 0xd131 0xd
phy raw c45 0x89 0x1 0xd130 0x4F
phy raw c45 0x89 0x1 0xd131 0x60F
phy raw c45 0x89 0x1 0xd134 1
phy raw c45 0x8d 0x1 0xffde 0
phy raw c45 0x8d 0x1 0xd130 0x41
phy raw c45 0x8d 0x1 0xd131 0xd
phy raw c45 0x8d 0x1 0xd130 0x51
phy raw c45 0x8d 0x1 0xd131 0x60D
phy raw c45 0x8d 0x1 0xd134 1
phy raw c45 0x8d 0x1 0xffde 1
phy raw c45 0x8d 0x1 0xd130 0x41
phy raw c45 0x8d 0x1 0xd131 0xd
phy raw c45 0x8d 0x1 0xd130 0x51
phy raw c45 0x8d 0x1 0xd131 0x60D
phy raw c45 0x8d 0x1 0xd134 1
phy raw c45 0x8d 0x1 0xffde 2
phy raw c45 0x8d 0x1 0xd130 0x41
phy raw c45 0x8d 0x1 0xd131 0xd
phy raw c45 0x8d 0x1 0xd130 0x51
phy raw c45 0x8d 0x1 0xd131 0x60D
phy raw c45 0x8d 0x1 0xd134 1
phy raw c45 0x8d 0x1 0xffde 3
phy raw c45 0x8d 0x1 0xd130 0x41
phy raw c45 0x8d 0x1 0xd131 0xd
phy raw c45 0x8d 0x1 0xd130 0x50
phy raw c45 0x8d 0x1 0xd131 0x60E
phy raw c45 0x8d 0x1 0xd134 1
phy raw c45 0x91 0x1 0xffde 0
phy raw c45 0x91 0x1 0xd130 0x41
phy raw c45 0x91 0x1 0xd131 0x0408
phy raw c45 0x91 0x1 0xd130 0x52
phy raw c45 0x91 0x1 0xd131 0x60C
phy raw c45 0x91 0x1 0xd134 1
phy raw c45 0x91 0x1 0xffde 1
phy raw c45 0x91 0x1 0xd130 0x41
phy raw c45 0x91 0x1 0xd131 0x0408
phy raw c45 0x91 0x1 0xd130 0x52
phy raw c45 0x91 0x1 0xd131 0x60C
phy raw c45 0x91 0x1 0xd134 1
phy raw c45 0x91 0x1 0xffde 2
phy raw c45 0x91 0x1 0xd130 0x41
phy raw c45 0x91 0x1 0xd131 0x0408
phy raw c45 0x91 0x1 0xd130 0x52
phy raw c45 0x91 0x1 0xd131 0x60C
phy raw c45 0x91 0x1 0xd134 1
phy raw c45 0x91 0x1 0xffde 3
phy raw c45 0x91 0x1 0xd130 0x41
phy raw c45 0x91 0x1 0xd131 0x0408
phy raw c45 0x91 0x1 0xd130 0x52
phy raw c45 0x91 0x1 0xd131 0x60C
phy raw c45 0x91 0x1 0xd134 1
phy raw c45 0x95 0x1 0xffde 0
phy raw c45 0x95 0x1 0xd130 0x41
phy raw c45 0x95 0x1 0xd131 0x0307
phy raw c45 0x95 0x1 0xd130 0x54
phy raw c45 0x95 0x1 0xd131 0x60A
phy raw c45 0x95 0x1 0xd134 1
phy raw c45 0x95 0x1 0xffde 1
phy raw c45 0x95 0x1 0xd130 0x41
phy raw c45 0x95 0x1 0xd131 0x0307
phy raw c45 0x95 0x1 0xd130 0x52
phy raw c45 0x95 0x1 0xd131 0x60C
phy raw c45 0x95 0x1 0xd134 1
phy raw c45 0x95 0x1 0xffde 2
phy raw c45 0x95 0x1 0xd130 0x41
phy raw c45 0x95 0x1 0xd131 0x0307
phy raw c45 0x95 0x1 0xd130 0x54
phy raw c45 0x95 0x1 0xd131 0x60A
phy raw c45 0x95 0x1 0xd134 1
phy raw c45 0x95 0x1 0xffde 3
phy raw c45 0x95 0x1 0xd130 0x41
phy raw c45 0x95 0x1 0xd131 0x0307
phy raw c45 0x95 0x1 0xd130 0x52
phy raw c45 0x95 0x1 0xd131 0x60C
phy raw c45 0x95 0x1 0xd134 1
phy raw c45 0xa1 0x1 0xffde 0
phy raw c45 0xa1 0x1 0xd130 0x41
phy raw c45 0xa1 0x1 0xd131 0x0307
phy raw c45 0xa1 0x1 0xd130 0x54
phy raw c45 0xa1 0x1 0xd131 0x60A
phy raw c45 0xa1 0x1 0xd134 1
phy raw c45 0xa1 0x1 0xffde 1
phy raw c45 0xa1 0x1 0xd130 0x41
phy raw c45 0xa1 0x1 0xd131 0x0307
phy raw c45 0xa1 0x1 0xd130 0x53
phy raw c45 0xa1 0x1 0xd131 0x60B
phy raw c45 0xa1 0x1 0xd134 1
phy raw c45 0xa1 0x1 0xffde 2
phy raw c45 0xa1 0x1 0xd130 0x41
phy raw c45 0xa1 0x1 0xd131 0x0307
phy raw c45 0xa1 0x1 0xd130 0x54
phy raw c45 0xa1 0x1 0xd131 0x60A
phy raw c45 0xa1 0x1 0xd134 1
phy raw c45 0xa1 0x1 0xffde 3
phy raw c45 0xa1 0x1 0xd130 0x41
phy raw c45 0xa1 0x1 0xd131 0x0307
phy raw c45 0xa1 0x1 0xd130 0x53
phy raw c45 0xa1 0x1 0xd131 0x60B
phy raw c45 0xa1 0x1 0xd134 1
phy raw c45 0xad 0x1 0xffde 0
phy raw c45 0xad 0x1 0xd130 0x41
phy raw c45 0xad 0x1 0xd131 0x0307
phy raw c45 0xad 0x1 0xd130 0x54
phy raw c45 0xad 0x1 0xd131 0x60A
phy raw c45 0xad 0x1 0xd134 1
phy raw c45 0xad 0x1 0xffde 1
phy raw c45 0xad 0x1 0xd130 0x41
phy raw c45 0xad 0x1 0xd131 0x0307
phy raw c45 0xad 0x1 0xd130 0x53
phy raw c45 0xad 0x1 0xd131 0x60B
phy raw c45 0xad 0x1 0xd134 1
phy raw c45 0xad 0x1 0xffde 2
phy raw c45 0xad 0x1 0xd130 0x41
phy raw c45 0xad 0x1 0xd131 0x0307
phy raw c45 0xad 0x1 0xd130 0x54
phy raw c45 0xad 0x1 0xd131 0x60A
phy raw c45 0xad 0x1 0xd134 1
phy raw c45 0xad 0x1 0xffde 3
phy raw c45 0xad 0x1 0xd130 0x41
phy raw c45 0xad 0x1 0xd131 0x0307
phy raw c45 0xad 0x1 0xd130 0x54
phy raw c45 0xad 0x1 0xd131 0x60A
phy raw c45 0xad 0x1 0xd134 1
phy raw c45 0xc9 0x1 0xffde 0
phy raw c45 0xc9 0x1 0xd130 0x41
phy raw c45 0xc9 0x1 0xd131 0x0307
phy raw c45 0xc9 0x1 0xd130 0x54
phy raw c45 0xc9 0x1 0xd131 0x60A
phy raw c45 0xc9 0x1 0xd134 1
phy raw c45 0xc9 0x1 0xffde 1
phy raw c45 0xc9 0x1 0xd130 0x41
phy raw c45 0xc9 0x1 0xd131 0x0307
phy raw c45 0xc9 0x1 0xd130 0x53
phy raw c45 0xc9 0x1 0xd131 0x60B
phy raw c45 0xc9 0x1 0xd134 1
phy raw c45 0xc9 0x1 0xffde 2
phy raw c45 0xc9 0x1 0xd130 0x41
phy raw c45 0xc9 0x1 0xd131 0x0307
phy raw c45 0xc9 0x1 0xd130 0x54
phy raw c45 0xc9 0x1 0xd131 0x60A
phy raw c45 0xc9 0x1 0xd134 1
phy raw c45 0xc9 0x1 0xffde 3
phy raw c45 0xc9 0x1 0xd130 0x41
phy raw c45 0xc9 0x1 0xd131 0x0307
phy raw c45 0xc9 0x1 0xd130 0x53
phy raw c45 0xc9 0x1 0xd131 0x60B
phy raw c45 0xc9 0x1 0xd134 1
phy raw c45 0xcd 0x1 0xffde 0
phy raw c45 0xcd 0x1 0xd130 0x41
phy raw c45 0xcd 0x1 0xd131 0x0307
phy raw c45 0xcd 0x1 0xd130 0x54
phy raw c45 0xcd 0x1 0xd131 0x60A
phy raw c45 0xcd 0x1 0xd134 1
phy raw c45 0xcd 0x1 0xffde 1
phy raw c45 0xcd 0x1 0xd130 0x41
phy raw c45 0xcd 0x1 0xd131 0x0307
phy raw c45 0xcd 0x1 0xd130 0x53
phy raw c45 0xcd 0x1 0xd131 0x60B
phy raw c45 0xcd 0x1 0xd134 1
phy raw c45 0xcd 0x1 0xffde 2
phy raw c45 0xcd 0x1 0xd130 0x41
phy raw c45 0xcd 0x1 0xd131 0x0307
phy raw c45 0xcd 0x1 0xd130 0x54
phy raw c45 0xcd 0x1 0xd131 0x60A
phy raw c45 0xcd 0x1 0xd134 1
phy raw c45 0xcd 0x1 0xffde 3
phy raw c45 0xcd 0x1 0xd130 0x41
phy raw c45 0xcd 0x1 0xd131 0x0307
phy raw c45 0xcd 0x1 0xd130 0x54
phy raw c45 0xcd 0x1 0xd131 0x60A
phy raw c45 0xcd 0x1 0xd134 1
phy raw c45 0xd1 0x1 0xffde 0
phy raw c45 0xd1 0x1 0xd130 0x41
phy raw c45 0xd1 0x1 0xd131 0x0307
phy raw c45 0xd1 0x1 0xd130 0x55
phy raw c45 0xd1 0x1 0xd131 0x609
phy raw c45 0xd1 0x1 0xd134 1
phy raw c45 0xd1 0x1 0xffde 1
phy raw c45 0xd1 0x1 0xd130 0x41
phy raw c45 0xd1 0x1 0xd131 0x0307
phy raw c45 0xd1 0x1 0xd130 0x55
phy raw c45 0xd1 0x1 0xd131 0x609
phy raw c45 0xd1 0x1 0xd134 1
phy raw c45 0xd1 0x1 0xffde 2
phy raw c45 0xd1 0x1 0xd130 0x41
phy raw c45 0xd1 0x1 0xd131 0x0307
phy raw c45 0xd1 0x1 0xd130 0x55
phy raw c45 0xd1 0x1 0xd131 0x609
phy raw c45 0xd1 0x1 0xd134 1
phy raw c45 0xd1 0x1 0xffde 3
phy raw c45 0xd1 0x1 0xd130 0x41
phy raw c45 0xd1 0x1 0xd131 0x0307
phy raw c45 0xd1 0x1 0xd130 0x55
phy raw c45 0xd1 0x1 0xd131 0x609
phy raw c45 0xd1 0x1 0xd134 1
phy raw c45 0xd5 0x1 0xffde 0
phy raw c45 0xd5 0x1 0xd130 0x41
phy raw c45 0xd5 0x1 0xd131 0x0307
phy raw c45 0xd5 0x1 0xd130 0x54
phy raw c45 0xd5 0x1 0xd131 0x60A
phy raw c45 0xd5 0x1 0xd134 1
phy raw c45 0xd5 0x1 0xffde 1
phy raw c45 0xd5 0x1 0xd130 0x41
phy raw c45 0xd5 0x1 0xd131 0x0307
phy raw c45 0xd5 0x1 0xd130 0x54
phy raw c45 0xd5 0x1 0xd131 0x60A
phy raw c45 0xd5 0x1 0xd134 1
phy raw c45 0xd5 0x1 0xffde 2
phy raw c45 0xd5 0x1 0xd130 0x41
phy raw c45 0xd5 0x1 0xd131 0x0307
phy raw c45 0xd5 0x1 0xd130 0x54
phy raw c45 0xd5 0x1 0xd131 0x60A
phy raw c45 0xd5 0x1 0xd134 1
phy raw c45 0xd5 0x1 0xffde 3
phy raw c45 0xd5 0x1 0xd130 0x41
phy raw c45 0xd5 0x1 0xd131 0x0307
phy raw c45 0xd5 0x1 0xd130 0x55
phy raw c45 0xd5 0x1 0xd131 0x609
phy raw c45 0xd5 0x1 0xd134 1
phy raw c45 0xe1 0x1 0xffde 0
phy raw c45 0xe1 0x1 0xd130 0x41
phy raw c45 0xe1 0x1 0xd131 0x0307
phy raw c45 0xe1 0x1 0xd130 0x55
phy raw c45 0xe1 0x1 0xd131 0x609
phy raw c45 0xe1 0x1 0xd134 1
phy raw c45 0xe1 0x1 0xffde 1
phy raw c45 0xe1 0x1 0xd130 0x41
phy raw c45 0xe1 0x1 0xd131 0x0307
phy raw c45 0xe1 0x1 0xd130 0x55
phy raw c45 0xe1 0x1 0xd131 0x609
phy raw c45 0xe1 0x1 0xd134 1
phy raw c45 0xe1 0x1 0xffde 2
phy raw c45 0xe1 0x1 0xd130 0x41
phy raw c45 0xe1 0x1 0xd131 0x0307
phy raw c45 0xe1 0x1 0xd130 0x55
phy raw c45 0xe1 0x1 0xd131 0x609
phy raw c45 0xe1 0x1 0xd134 1
phy raw c45 0xe1 0x1 0xffde 3
phy raw c45 0xe1 0x1 0xd130 0x41
phy raw c45 0xe1 0x1 0xd131 0x0307
phy raw c45 0xe1 0x1 0xd130 0x55
phy raw c45 0xe1 0x1 0xd131 0x609
phy raw c45 0xe1 0x1 0xd134 1
phy raw c45 0xe5 0x1 0xffde 0
phy raw c45 0xe5 0x1 0xd130 0x41
phy raw c45 0xe5 0x1 0xd131 0x0307
phy raw c45 0xe5 0x1 0xd130 0x54
phy raw c45 0xe5 0x1 0xd131 0x60A
phy raw c45 0xe5 0x1 0xd134 1
phy raw c45 0xe5 0x1 0xffde 1
phy raw c45 0xe5 0x1 0xd130 0x41
phy raw c45 0xe5 0x1 0xd131 0x0307
phy raw c45 0xe5 0x1 0xd130 0x54
phy raw c45 0xe5 0x1 0xd131 0x60A
phy raw c45 0xe5 0x1 0xd134 1
phy raw c45 0xe5 0x1 0xffde 2
phy raw c45 0xe5 0x1 0xd130 0x41
phy raw c45 0xe5 0x1 0xd131 0x0307
phy raw c45 0xe5 0x1 0xd130 0x54
phy raw c45 0xe5 0x1 0xd131 0x60A
phy raw c45 0xe5 0x1 0xd134 1
phy raw c45 0xe5 0x1 0xffde 3
phy raw c45 0xe5 0x1 0xd130 0x41
phy raw c45 0xe5 0x1 0xd131 0x0307
phy raw c45 0xe5 0x1 0xd130 0x54
phy raw c45 0xe5 0x1 0xd131 0x60A
phy raw c45 0xe5 0x1 0xd134 1
phy raw c45 0xe9 0x1 0xffde 0
phy raw c45 0xe9 0x1 0xd130 0x41
phy raw c45 0xe9 0x1 0xd131 0x0307
phy raw c45 0xe9 0x1 0xd130 0x54
phy raw c45 0xe9 0x1 0xd131 0x60A
phy raw c45 0xe9 0x1 0xd134 1
phy raw c45 0xe9 0x1 0xffde 1
phy raw c45 0xe9 0x1 0xd130 0x41
phy raw c45 0xe9 0x1 0xd131 0x0307
phy raw c45 0xe9 0x1 0xd130 0x54
phy raw c45 0xe9 0x1 0xd131 0x60A
phy raw c45 0xe9 0x1 0xd134 1
phy raw c45 0xe9 0x1 0xffde 2
phy raw c45 0xe9 0x1 0xd130 0x41
phy raw c45 0xe9 0x1 0xd131 0x0307
phy raw c45 0xe9 0x1 0xd130 0x54
phy raw c45 0xe9 0x1 0xd131 0x60A
phy raw c45 0xe9 0x1 0xd134 1
phy raw c45 0xe9 0x1 0xffde 3
phy raw c45 0xe9 0x1 0xd130 0x41
phy raw c45 0xe9 0x1 0xd131 0x0307
phy raw c45 0xe9 0x1 0xd130 0x54
phy raw c45 0xe9 0x1 0xd131 0x60A
phy raw c45 0xe9 0x1 0xd134 1
phy raw c45 0xed 0x1 0xffde 0
phy raw c45 0xed 0x1 0xd130 0x41
phy raw c45 0xed 0x1 0xd131 0xb
phy raw c45 0xed 0x1 0xd130 0x53
phy raw c45 0xed 0x1 0xd131 0x60B
phy raw c45 0xed 0x1 0xd134 1
phy raw c45 0xed 0x1 0xffde 1
phy raw c45 0xed 0x1 0xd130 0x41
phy raw c45 0xed 0x1 0xd131 0xb
phy raw c45 0xed 0x1 0xd130 0x52
phy raw c45 0xed 0x1 0xd131 0x60C
phy raw c45 0xed 0x1 0xd134 1
phy raw c45 0xed 0x1 0xffde 2
phy raw c45 0xed 0x1 0xd130 0x41
phy raw c45 0xed 0x1 0xd131 0xb
phy raw c45 0xed 0x1 0xd130 0x54
phy raw c45 0xed 0x1 0xd131 0x60A
phy raw c45 0xed 0x1 0xd134 1
phy raw c45 0xed 0x1 0xffde 3
phy raw c45 0xed 0x1 0xd130 0x41
phy raw c45 0xed 0x1 0xd131 0xb
phy raw c45 0xed 0x1 0xd130 0x52
phy raw c45 0xed 0x1 0xd131 0x60C
phy raw c45 0xed 0x1 0xd134 1
phy raw c45 0x185 0x1 0xffde 0
phy raw c45 0x185 0x1 0xd130 0x41
phy raw c45 0x185 0x1 0xd131 0x0307
phy raw c45 0x185 0x1 0xd130 0x53
phy raw c45 0x185 0x1 0xd131 0x60B
phy raw c45 0x185 0x1 0xd134 1
phy raw c45 0x185 0x1 0xffde 1
phy raw c45 0x185 0x1 0xd130 0x41
phy raw c45 0x185 0x1 0xd131 0x0307
phy raw c45 0x185 0x1 0xd130 0x53
phy raw c45 0x185 0x1 0xd131 0x60B
phy raw c45 0x185 0x1 0xd134 1
phy raw c45 0x185 0x1 0xffde 2
phy raw c45 0x185 0x1 0xd130 0x41
phy raw c45 0x185 0x1 0xd131 0x0307
phy raw c45 0x185 0x1 0xd130 0x53
phy raw c45 0x185 0x1 0xd131 0x60B
phy raw c45 0x185 0x1 0xd134 1
phy raw c45 0x185 0x1 0xffde 3
phy raw c45 0x185 0x1 0xd130 0x41
phy raw c45 0x185 0x1 0xd131 0x0307
phy raw c45 0x185 0x1 0xd130 0x53
phy raw c45 0x185 0x1 0xd131 0x60B
phy raw c45 0x185 0x1 0xd134 1
phy raw c45 0x18d 0x1 0xffde 0
phy raw c45 0x18d 0x1 0xd130 0x41
phy raw c45 0x18d 0x1 0xd131 0x0307
phy raw c45 0x18d 0x1 0xd130 0x53
phy raw c45 0x18d 0x1 0xd131 0x60B
phy raw c45 0x18d 0x1 0xd134 1
phy raw c45 0x18d 0x1 0xffde 1
phy raw c45 0x18d 0x1 0xd130 0x41
phy raw c45 0x18d 0x1 0xd131 0x0307
phy raw c45 0x18d 0x1 0xd130 0x52
phy raw c45 0x18d 0x1 0xd131 0x60C
phy raw c45 0x18d 0x1 0xd134 1
phy raw c45 0x18d 0x1 0xffde 2
phy raw c45 0x18d 0x1 0xd130 0x41
phy raw c45 0x18d 0x1 0xd131 0x0307
phy raw c45 0x18d 0x1 0xd130 0x54
phy raw c45 0x18d 0x1 0xd131 0x60A
phy raw c45 0x18d 0x1 0xd134 1
phy raw c45 0x18d 0x1 0xffde 3
phy raw c45 0x18d 0x1 0xd130 0x41
phy raw c45 0x18d 0x1 0xd131 0x0307
phy raw c45 0x18d 0x1 0xd130 0x54
phy raw c45 0x18d 0x1 0xd131 0x60A
phy raw c45 0x18d 0x1 0xd134 1
phy raw c45 0x1a1 0x1 0xffde 0
phy raw c45 0x1a1 0x1 0xd130 0x41
phy raw c45 0x1a1 0x1 0xd131 0x0408
phy raw c45 0x1a1 0x1 0xd130 0x52
phy raw c45 0x1a1 0x1 0xd131 0x60C
phy raw c45 0x1a1 0x1 0xd134 1
phy raw c45 0x1a1 0x1 0xffde 1
phy raw c45 0x1a1 0x1 0xd130 0x41
phy raw c45 0x1a1 0x1 0xd131 0x0408
phy raw c45 0x1a1 0x1 0xd130 0x52
phy raw c45 0x1a1 0x1 0xd131 0x60C
phy raw c45 0x1a1 0x1 0xd134 1
phy raw c45 0x1a1 0x1 0xffde 2
phy raw c45 0x1a1 0x1 0xd130 0x41
phy raw c45 0x1a1 0x1 0xd131 0x0408
phy raw c45 0x1a1 0x1 0xd130 0x52
phy raw c45 0x1a1 0x1 0xd131 0x60C
phy raw c45 0x1a1 0x1 0xd134 1
phy raw c45 0x1a1 0x1 0xffde 3
phy raw c45 0x1a1 0x1 0xd130 0x41
phy raw c45 0x1a1 0x1 0xd131 0x0408
phy raw c45 0x1a1 0x1 0xd130 0x52
phy raw c45 0x1a1 0x1 0xd131 0x60C
phy raw c45 0x1a1 0x1 0xd134 1
phy raw c45 0x1a5 0x1 0xffde 0
phy raw c45 0x1a5 0x1 0xd130 0x41
phy raw c45 0x1a5 0x1 0xd131 0x0408
phy raw c45 0x1a5 0x1 0xd130 0x52
phy raw c45 0x1a5 0x1 0xd131 0x60C
phy raw c45 0x1a5 0x1 0xd134 1
phy raw c45 0x1a5 0x1 0xffde 1
phy raw c45 0x1a5 0x1 0xd130 0x41
phy raw c45 0x1a5 0x1 0xd131 0x0408
phy raw c45 0x1a5 0x1 0xd130 0x52
phy raw c45 0x1a5 0x1 0xd131 0x60C
phy raw c45 0x1a5 0x1 0xd134 1
phy raw c45 0x1a5 0x1 0xffde 2
phy raw c45 0x1a5 0x1 0xd130 0x41
phy raw c45 0x1a5 0x1 0xd131 0x0408
phy raw c45 0x1a5 0x1 0xd130 0x53
phy raw c45 0x1a5 0x1 0xd131 0x60B
phy raw c45 0x1a5 0x1 0xd134 1
phy raw c45 0x1a5 0x1 0xffde 3
phy raw c45 0x1a5 0x1 0xd130 0x41
phy raw c45 0x1a5 0x1 0xd131 0x0408
phy raw c45 0x1a5 0x1 0xd130 0x52
phy raw c45 0x1a5 0x1 0xd131 0x60C
phy raw c45 0x1a5 0x1 0xd134 1
phy raw c45 0x1a9 0x1 0xffde 0
phy raw c45 0x1a9 0x1 0xd130 0x41
phy raw c45 0x1a9 0x1 0xd131 0xb
phy raw c45 0x1a9 0x1 0xd130 0x50
phy raw c45 0x1a9 0x1 0xd131 0x60E
phy raw c45 0x1a9 0x1 0xd134 1
phy raw c45 0x1a9 0x1 0xffde 1
phy raw c45 0x1a9 0x1 0xd130 0x41
phy raw c45 0x1a9 0x1 0xd131 0xb
phy raw c45 0x1a9 0x1 0xd130 0x51
phy raw c45 0x1a9 0x1 0xd131 0x60D
phy raw c45 0x1a9 0x1 0xd134 1
phy raw c45 0x1a9 0x1 0xffde 2
phy raw c45 0x1a9 0x1 0xd130 0x41
phy raw c45 0x1a9 0x1 0xd131 0xb
phy raw c45 0x1a9 0x1 0xd130 0x51
phy raw c45 0x1a9 0x1 0xd131 0x60D
phy raw c45 0x1a9 0x1 0xd134 1
phy raw c45 0x1a9 0x1 0xffde 3
phy raw c45 0x1a9 0x1 0xd130 0x41
phy raw c45 0x1a9 0x1 0xd131 0xb
phy raw c45 0x1a9 0x1 0xd130 0x51
phy raw c45 0x1a9 0x1 0xd131 0x60D
phy raw c45 0x1a9 0x1 0xd134 1
phy raw c45 0x1ad 0x1 0xffde 0
phy raw c45 0x1ad 0x1 0xd130 0x41
phy raw c45 0x1ad 0x1 0xd131 0xc
phy raw c45 0x1ad 0x1 0xd130 0x50
phy raw c45 0x1ad 0x1 0xd131 0x60E
phy raw c45 0x1ad 0x1 0xd134 1
phy raw c45 0x1ad 0x1 0xffde 1
phy raw c45 0x1ad 0x1 0xd130 0x41
phy raw c45 0x1ad 0x1 0xd131 0xc
phy raw c45 0x1ad 0x1 0xd130 0x50
phy raw c45 0x1ad 0x1 0xd131 0x60E
phy raw c45 0x1ad 0x1 0xd134 1
phy raw c45 0x1ad 0x1 0xffde 2
phy raw c45 0x1ad 0x1 0xd130 0x41
phy raw c45 0x1ad 0x1 0xd131 0xc
phy raw c45 0x1ad 0x1 0xd130 0x51
phy raw c45 0x1ad 0x1 0xd131 0x60D
phy raw c45 0x1ad 0x1 0xd134 1
phy raw c45 0x1ad 0x1 0xffde 3
phy raw c45 0x1ad 0x1 0xd130 0x41
phy raw c45 0x1ad 0x1 0xd131 0xc
phy raw c45 0x1ad 0x1 0xd130 0x50
phy raw c45 0x1ad 0x1 0xd131 0x60E
phy raw c45 0x1ad 0x1 0xd134 1
phy raw c45 0x1b1 0x1 0xffde 0
phy raw c45 0x1b1 0x1 0xd130 0x41
phy raw c45 0x1b1 0x1 0xd131 0xd
phy raw c45 0x1b1 0x1 0xd130 0x4F
phy raw c45 0x1b1 0x1 0xd131 0x60F
phy raw c45 0x1b1 0x1 0xd134 1
phy raw c45 0x1b1 0x1 0xffde 1
phy raw c45 0x1b1 0x1 0xd130 0x41
phy raw c45 0x1b1 0x1 0xd131 0xd
phy raw c45 0x1b1 0x1 0xd130 0x4D
phy raw c45 0x1b1 0x1 0xd131 0x611
phy raw c45 0x1b1 0x1 0xd134 1
phy raw c45 0x1b1 0x1 0xffde 2
phy raw c45 0x1b1 0x1 0xd130 0x41
phy raw c45 0x1b1 0x1 0xd131 0xd
phy raw c45 0x1b1 0x1 0xd130 0x4E
phy raw c45 0x1b1 0x1 0xd131 0x610
phy raw c45 0x1b1 0x1 0xd134 1
phy raw c45 0x1b1 0x1 0xffde 3
phy raw c45 0x1b1 0x1 0xd130 0x41
phy raw c45 0x1b1 0x1 0xd131 0xd
phy raw c45 0x1b1 0x1 0xd130 0x4D
phy raw c45 0x1b1 0x1 0xd131 0x611
phy raw c45 0x1b1 0x1 0xd134 1
phy raw c45 0x1b5 0x1 0xffde 0
phy raw c45 0x1b5 0x1 0xd130 0x41
phy raw c45 0x1b5 0x1 0xd131 0xf
phy raw c45 0x1b5 0x1 0xd130 0x4E
phy raw c45 0x1b5 0x1 0xd131 0x610
phy raw c45 0x1b5 0x1 0xd134 1
phy raw c45 0x1b5 0x1 0xffde 1
phy raw c45 0x1b5 0x1 0xd130 0x41
phy raw c45 0x1b5 0x1 0xd131 0xf
phy raw c45 0x1b5 0x1 0xd130 0x4D
phy raw c45 0x1b5 0x1 0xd131 0x611
phy raw c45 0x1b5 0x1 0xd134 1
phy raw c45 0x1b5 0x1 0xffde 2
phy raw c45 0x1b5 0x1 0xd130 0x41
phy raw c45 0x1b5 0x1 0xd131 0xf
phy raw c45 0x1b5 0x1 0xd130 0x4E
phy raw c45 0x1b5 0x1 0xd131 0x610
phy raw c45 0x1b5 0x1 0xd134 1
phy raw c45 0x1b5 0x1 0xffde 3
phy raw c45 0x1b5 0x1 0xd130 0x41
phy raw c45 0x1b5 0x1 0xd131 0xf
phy raw c45 0x1b5 0x1 0xd130 0x4D
phy raw c45 0x1b5 0x1 0xd131 0x611
phy raw c45 0x1b5 0x1 0xd134 1
phy raw c45 0xf1 0x1 0xffde 0
phy raw c45 0xf1 0x1 0xd130 0x41
phy raw c45 0xf1 0x1 0xd131 0xd
phy raw c45 0xf1 0x1 0xd130 0x4F
phy raw c45 0xf1 0x1 0xd131 0x60F
phy raw c45 0xf1 0x1 0xd134 1
phy raw c45 0xf1 0x1 0xffde 1
phy raw c45 0xf1 0x1 0xd130 0x41
phy raw c45 0xf1 0x1 0xd131 0xd
phy raw c45 0xf1 0x1 0xd130 0x4E
phy raw c45 0xf1 0x1 0xd131 0x610
phy raw c45 0xf1 0x1 0xd134 1
phy raw c45 0xf1 0x1 0xffde 2
phy raw c45 0xf1 0x1 0xd130 0x41
phy raw c45 0xf1 0x1 0xd131 0xd
phy raw c45 0xf1 0x1 0xd130 0x4E
phy raw c45 0xf1 0x1 0xd131 0x610
phy raw c45 0xf1 0x1 0xd134 1
phy raw c45 0xf1 0x1 0xffde 3
phy raw c45 0xf1 0x1 0xd130 0x41
phy raw c45 0xf1 0x1 0xd131 0xd
phy raw c45 0xf1 0x1 0xd130 0x4E
phy raw c45 0xf1 0x1 0xd131 0x610
phy raw c45 0xf1 0x1 0xd134 1
phy raw c45 0xf5 0x1 0xffde 0
phy raw c45 0xf5 0x1 0xd130 0x41
phy raw c45 0xf5 0x1 0xd131 0xf
phy raw c45 0xf5 0x1 0xd130 0x4D
phy raw c45 0xf5 0x1 0xd131 0x611
phy raw c45 0xf5 0x1 0xd134 1
phy raw c45 0xf5 0x1 0xffde 1
phy raw c45 0xf5 0x1 0xd130 0x41
phy raw c45 0xf5 0x1 0xd131 0xf
phy raw c45 0xf5 0x1 0xd130 0x4D
phy raw c45 0xf5 0x1 0xd131 0x611
phy raw c45 0xf5 0x1 0xd134 1
phy raw c45 0xf5 0x1 0xffde 2
phy raw c45 0xf5 0x1 0xd130 0x41
phy raw c45 0xf5 0x1 0xd131 0xf
phy raw c45 0xf5 0x1 0xd130 0x4D
phy raw c45 0xf5 0x1 0xd131 0x611
phy raw c45 0xf5 0x1 0xd134 1
phy raw c45 0xf5 0x1 0xffde 3
phy raw c45 0xf5 0x1 0xd130 0x41
phy raw c45 0xf5 0x1 0xd131 0xf
phy raw c45 0xf5 0x1 0xd130 0x4D
phy raw c45 0xf5 0x1 0xd131 0x611
phy raw c45 0xf5 0x1 0xd134 1
phy raw c45 0x181 0x1 0xffde 0
phy raw c45 0x181 0x1 0xd130 0x41
phy raw c45 0x181 0x1 0xd131 0xd
phy raw c45 0x181 0x1 0xd130 0x4E
phy raw c45 0x181 0x1 0xd131 0x610
phy raw c45 0x181 0x1 0xd134 1
phy raw c45 0x181 0x1 0xffde 1
phy raw c45 0x181 0x1 0xd130 0x41
phy raw c45 0x181 0x1 0xd131 0xd
phy raw c45 0x181 0x1 0xd130 0x4D
phy raw c45 0x181 0x1 0xd131 0x611
phy raw c45 0x181 0x1 0xd134 1
phy raw c45 0x181 0x1 0xffde 2
phy raw c45 0x181 0x1 0xd130 0x41
phy raw c45 0x181 0x1 0xd131 0xd
phy raw c45 0x181 0x1 0xd130 0x4E
phy raw c45 0x181 0x1 0xd131 0x610
phy raw c45 0x181 0x1 0xd134 1
phy raw c45 0x181 0x1 0xffde 3
phy raw c45 0x181 0x1 0xd130 0x41
phy raw c45 0x181 0x1 0xd131 0xd
phy raw c45 0x181 0x1 0xd130 0x4D
phy raw c45 0x181 0x1 0xd131 0x611
phy raw c45 0x181 0x1 0xd134 1
phy raw c45 0x189 0x1 0xffde 0
phy raw c45 0x189 0x1 0xd130 0x41
phy raw c45 0x189 0x1 0xd131 0xe
phy raw c45 0x189 0x1 0xd130 0x4E
phy raw c45 0x189 0x1 0xd131 0x610
phy raw c45 0x189 0x1 0xd134 1
phy raw c45 0x189 0x1 0xffde 1
phy raw c45 0x189 0x1 0xd130 0x41
phy raw c45 0x189 0x1 0xd131 0xe
phy raw c45 0x189 0x1 0xd130 0x4E
phy raw c45 0x189 0x1 0xd131 0x610
phy raw c45 0x189 0x1 0xd134 1
phy raw c45 0x189 0x1 0xffde 2
phy raw c45 0x189 0x1 0xd130 0x41
phy raw c45 0x189 0x1 0xd131 0xe
phy raw c45 0x189 0x1 0xd130 0x4D
phy raw c45 0x189 0x1 0xd131 0x611
phy raw c45 0x189 0x1 0xd134 1
phy raw c45 0x189 0x1 0xffde 3
phy raw c45 0x189 0x1 0xd130 0x41
phy raw c45 0x189 0x1 0xd131 0xe
phy raw c45 0x189 0x1 0xd130 0x4D
phy raw c45 0x189 0x1 0xd131 0x611
phy raw c45 0x189 0x1 0xd134 1

View File

@ -0,0 +1,31 @@
{
"GLOBAL_MEDIA_SETTINGS": {
"1-48": {
"Default": {
"preemphasis": {
"lane0": "0x0a5503"
}
}
},
"49,51-56": {
"Default": {
"preemphasis": {
"lane0": "0x0a5703",
"lane1": "0x0a5703",
"lane2": "0x0a5703",
"lane3": "0x0a5703"
}
}
},
"50-50": {
"Default": {
"preemphasis": {
"lane0": "0x0a5003",
"lane1": "0x0a5003",
"lane2": "0x0a5003",
"lane3": "0x0a5003"
}
}
}
}
}

View File

@ -6,320 +6,320 @@ linkscan off
phy raw c45 0xd1 0x1 0xffde 0
phy raw c45 0xd1 0x1 0xd130 0x55
phy raw c45 0xd1 0x1 0xd131 0x303
phy raw c45 0xd1 0x1 0xd131 0x30a
phy raw c45 0xd1 0x1 0xd134 0x1
phy raw c45 0xd1 0x1 0xffde 1
phy raw c45 0xd1 0x1 0xd130 0x55
phy raw c45 0xd1 0x1 0xd131 0x303
phy raw c45 0xd1 0x1 0xd131 0x30a
phy raw c45 0xd1 0x1 0xd134 0x1
phy raw c45 0xd1 0x1 0xffde 2
phy raw c45 0xd1 0x1 0xd130 0x55
phy raw c45 0xd1 0x1 0xd131 0x303
phy raw c45 0xd1 0x1 0xd131 0x30a
phy raw c45 0xd1 0x1 0xd134 0x1
phy raw c45 0xd1 0x1 0xffde 3
phy raw c45 0xd1 0x1 0xd130 0x55
phy raw c45 0xd1 0x1 0xd131 0x303
phy raw c45 0xd1 0x1 0xd131 0x30a
phy raw c45 0xd1 0x1 0xd134 0x1
phy raw c45 0xd5 0x1 0xffde 0
phy raw c45 0xd5 0x1 0xd130 0x55
phy raw c45 0xd5 0x1 0xd131 0x303
phy raw c45 0xd5 0x1 0xd131 0x30a
phy raw c45 0xd5 0x1 0xd134 0x1
phy raw c45 0xd5 0x1 0xffde 1
phy raw c45 0xd5 0x1 0xd130 0x55
phy raw c45 0xd5 0x1 0xd131 0x303
phy raw c45 0xd5 0x1 0xd131 0x30a
phy raw c45 0xd5 0x1 0xd134 0x1
phy raw c45 0xd5 0x1 0xffde 2
phy raw c45 0xd5 0x1 0xd130 0x55
phy raw c45 0xd5 0x1 0xd131 0x303
phy raw c45 0xd5 0x1 0xd131 0x30a
phy raw c45 0xd5 0x1 0xd134 0x1
phy raw c45 0xd5 0x1 0xffde 3
phy raw c45 0xd5 0x1 0xd130 0x55
phy raw c45 0xd5 0x1 0xd131 0x303
phy raw c45 0xd5 0x1 0xd131 0x30a
phy raw c45 0xd5 0x1 0xd134 0x1
phy raw c45 0xc9 0x1 0xffde 0
phy raw c45 0xc9 0x1 0xd130 0x55
phy raw c45 0xc9 0x1 0xd131 0x303
phy raw c45 0xc9 0x1 0xd131 0x30a
phy raw c45 0xc9 0x1 0xd134 0x1
phy raw c45 0xc9 0x1 0xffde 1
phy raw c45 0xc9 0x1 0xd130 0x55
phy raw c45 0xc9 0x1 0xd131 0x303
phy raw c45 0xc9 0x1 0xd131 0x30a
phy raw c45 0xc9 0x1 0xd134 0x1
phy raw c45 0xc9 0x1 0xffde 2
phy raw c45 0xc9 0x1 0xd130 0x55
phy raw c45 0xc9 0x1 0xd131 0x303
phy raw c45 0xc9 0x1 0xd131 0x30a
phy raw c45 0xc9 0x1 0xd134 0x1
phy raw c45 0xc9 0x1 0xffde 3
phy raw c45 0xc9 0x1 0xd130 0x55
phy raw c45 0xc9 0x1 0xd131 0x303
phy raw c45 0xc9 0x1 0xd131 0x30a
phy raw c45 0xc9 0x1 0xd134 0x1
phy raw c45 0x81 0x1 0xffde 0
phy raw c45 0x81 0x1 0xd130 0x55
phy raw c45 0x81 0x1 0xd131 0x303
phy raw c45 0x81 0x1 0xd131 0x30a
phy raw c45 0x81 0x1 0xd134 0x1
phy raw c45 0x81 0x1 0xffde 1
phy raw c45 0x81 0x1 0xd130 0x55
phy raw c45 0x81 0x1 0xd131 0x303
phy raw c45 0x81 0x1 0xd131 0x30a
phy raw c45 0x81 0x1 0xd134 0x1
phy raw c45 0x81 0x1 0xffde 2
phy raw c45 0x81 0x1 0xd130 0x55
phy raw c45 0x81 0x1 0xd131 0x303
phy raw c45 0x81 0x1 0xd131 0x30a
phy raw c45 0x81 0x1 0xd134 0x1
phy raw c45 0x81 0x1 0xffde 3
phy raw c45 0x81 0x1 0xd130 0x55
phy raw c45 0x81 0x1 0xd131 0x303
phy raw c45 0x81 0x1 0xd131 0x30a
phy raw c45 0x81 0x1 0xd134 0x1
phy raw c45 0x85 0x1 0xffde 0
phy raw c45 0x85 0x1 0xd130 0x55
phy raw c45 0x85 0x1 0xd131 0x303
phy raw c45 0x85 0x1 0xd131 0x30a
phy raw c45 0x85 0x1 0xd134 0x1
phy raw c45 0x85 0x1 0xffde 1
phy raw c45 0x85 0x1 0xd130 0x55
phy raw c45 0x85 0x1 0xd131 0x303
phy raw c45 0x85 0x1 0xd131 0x30a
phy raw c45 0x85 0x1 0xd134 0x1
phy raw c45 0x85 0x1 0xffde 2
phy raw c45 0x85 0x1 0xd130 0x55
phy raw c45 0x85 0x1 0xd131 0x303
phy raw c45 0x85 0x1 0xd131 0x30a
phy raw c45 0x85 0x1 0xd134 0x1
phy raw c45 0x85 0x1 0xffde 3
phy raw c45 0x85 0x1 0xd130 0x55
phy raw c45 0x85 0x1 0xd131 0x303
phy raw c45 0x85 0x1 0xd131 0x30a
phy raw c45 0x85 0x1 0xd134 0x1
phy raw c45 0x8d 0x1 0xffde 0
phy raw c45 0x8d 0x1 0xd130 0x55
phy raw c45 0x8d 0x1 0xd131 0x303
phy raw c45 0x8d 0x1 0xd131 0x30a
phy raw c45 0x8d 0x1 0xd134 0x1
phy raw c45 0x8d 0x1 0xffde 1
phy raw c45 0x8d 0x1 0xd130 0x55
phy raw c45 0x8d 0x1 0xd131 0x303
phy raw c45 0x8d 0x1 0xd131 0x30a
phy raw c45 0x8d 0x1 0xd134 0x1
phy raw c45 0x8d 0x1 0xffde 2
phy raw c45 0x8d 0x1 0xd130 0x55
phy raw c45 0x8d 0x1 0xd131 0x303
phy raw c45 0x8d 0x1 0xd131 0x30a
phy raw c45 0x8d 0x1 0xd134 0x1
phy raw c45 0x8d 0x1 0xffde 3
phy raw c45 0x8d 0x1 0xd130 0x55
phy raw c45 0x8d 0x1 0xd131 0x303
phy raw c45 0x8d 0x1 0xd131 0x30a
phy raw c45 0x8d 0x1 0xd134 0x1
phy raw c45 0x95 0x1 0xffde 0
phy raw c45 0x95 0x1 0xd130 0x55
phy raw c45 0x95 0x1 0xd131 0x303
phy raw c45 0x95 0x1 0xd131 0x30a
phy raw c45 0x95 0x1 0xd134 0x1
phy raw c45 0x95 0x1 0xffde 1
phy raw c45 0x95 0x1 0xd130 0x55
phy raw c45 0x95 0x1 0xd131 0x303
phy raw c45 0x95 0x1 0xd131 0x30a
phy raw c45 0x95 0x1 0xd134 0x1
phy raw c45 0x95 0x1 0xffde 2
phy raw c45 0x95 0x1 0xd130 0x55
phy raw c45 0x95 0x1 0xd131 0x303
phy raw c45 0x95 0x1 0xd131 0x30a
phy raw c45 0x95 0x1 0xd134 0x1
phy raw c45 0x95 0x1 0xffde 3
phy raw c45 0x95 0x1 0xd130 0x55
phy raw c45 0x95 0x1 0xd131 0x303
phy raw c45 0x95 0x1 0xd131 0x30a
phy raw c45 0x95 0x1 0xd134 0x1
phy raw c45 0xa5 0x1 0xffde 0
phy raw c45 0xa5 0x1 0xd130 0x55
phy raw c45 0xa5 0x1 0xd131 0x303
phy raw c45 0xa5 0x1 0xd131 0x30a
phy raw c45 0xa5 0x1 0xd134 0x1
phy raw c45 0xa5 0x1 0xffde 1
phy raw c45 0xa5 0x1 0xd130 0x55
phy raw c45 0xa5 0x1 0xd131 0x303
phy raw c45 0xa5 0x1 0xd131 0x30a
phy raw c45 0xa5 0x1 0xd134 0x1
phy raw c45 0xa5 0x1 0xffde 2
phy raw c45 0xa5 0x1 0xd130 0x55
phy raw c45 0xa5 0x1 0xd131 0x303
phy raw c45 0xa5 0x1 0xd131 0x30a
phy raw c45 0xa5 0x1 0xd134 0x1
phy raw c45 0xa5 0x1 0xffde 3
phy raw c45 0xa5 0x1 0xd130 0x55
phy raw c45 0xa5 0x1 0xd131 0x303
phy raw c45 0xa5 0x1 0xd131 0x30a
phy raw c45 0xa5 0x1 0xd134 0x1
phy raw c45 0xa9 0x1 0xffde 0
phy raw c45 0xa9 0x1 0xd130 0x55
phy raw c45 0xa9 0x1 0xd131 0x303
phy raw c45 0xa9 0x1 0xd131 0x30a
phy raw c45 0xa9 0x1 0xd134 0x1
phy raw c45 0xa9 0x1 0xffde 1
phy raw c45 0xa9 0x1 0xd130 0x55
phy raw c45 0xa9 0x1 0xd131 0x303
phy raw c45 0xa9 0x1 0xd131 0x30a
phy raw c45 0xa9 0x1 0xd134 0x1
phy raw c45 0xa9 0x1 0xffde 2
phy raw c45 0xa9 0x1 0xd130 0x55
phy raw c45 0xa9 0x1 0xd131 0x303
phy raw c45 0xa9 0x1 0xd131 0x30a
phy raw c45 0xa9 0x1 0xd134 0x1
phy raw c45 0xa9 0x1 0xffde 3
phy raw c45 0xa9 0x1 0xd130 0x55
phy raw c45 0xa9 0x1 0xd131 0x303
phy raw c45 0xa9 0x1 0xd131 0x30a
phy raw c45 0xa9 0x1 0xd134 0x1
phy raw c45 0xc1 0x1 0xffde 0
phy raw c45 0xc1 0x1 0xd130 0x55
phy raw c45 0xc1 0x1 0xd131 0x303
phy raw c45 0xc1 0x1 0xd131 0x30a
phy raw c45 0xc1 0x1 0xd134 0x1
phy raw c45 0xc1 0x1 0xffde 1
phy raw c45 0xc1 0x1 0xd130 0x55
phy raw c45 0xc1 0x1 0xd131 0x303
phy raw c45 0xc1 0x1 0xd131 0x30a
phy raw c45 0xc1 0x1 0xd134 0x1
phy raw c45 0xc1 0x1 0xffde 2
phy raw c45 0xc1 0x1 0xd130 0x55
phy raw c45 0xc1 0x1 0xd131 0x303
phy raw c45 0xc1 0x1 0xd131 0x30a
phy raw c45 0xc1 0x1 0xd134 0x1
phy raw c45 0xc1 0x1 0xffde 3
phy raw c45 0xc1 0x1 0xd130 0x55
phy raw c45 0xc1 0x1 0xd131 0x303
phy raw c45 0xc1 0x1 0xd131 0x30a
phy raw c45 0xc1 0x1 0xd134 0x1
phy raw c45 0xf5 0x1 0xffde 0
phy raw c45 0xf5 0x1 0xd130 0x55
phy raw c45 0xf5 0x1 0xd131 0x303
phy raw c45 0xf5 0x1 0xd131 0x30a
phy raw c45 0xf5 0x1 0xd134 0x1
phy raw c45 0xf5 0x1 0xffde 1
phy raw c45 0xf5 0x1 0xd130 0x55
phy raw c45 0xf5 0x1 0xd131 0x303
phy raw c45 0xf5 0x1 0xd131 0x30a
phy raw c45 0xf5 0x1 0xd134 0x1
phy raw c45 0xf5 0x1 0xffde 2
phy raw c45 0xf5 0x1 0xd130 0x55
phy raw c45 0xf5 0x1 0xd131 0x303
phy raw c45 0xf5 0x1 0xd131 0x30a
phy raw c45 0xf5 0x1 0xd134 0x1
phy raw c45 0xf5 0x1 0xffde 3
phy raw c45 0xf5 0x1 0xd130 0x55
phy raw c45 0xf5 0x1 0xd131 0x303
phy raw c45 0xf5 0x1 0xd131 0x30a
phy raw c45 0xf5 0x1 0xd134 0x1
phy raw c45 0x185 0x1 0xffde 0
phy raw c45 0x185 0x1 0xd130 0x55
phy raw c45 0x185 0x1 0xd131 0x303
phy raw c45 0x185 0x1 0xd131 0x30a
phy raw c45 0x185 0x1 0xd134 0x1
phy raw c45 0x185 0x1 0xffde 1
phy raw c45 0x185 0x1 0xd130 0x55
phy raw c45 0x185 0x1 0xd131 0x303
phy raw c45 0x185 0x1 0xd131 0x30a
phy raw c45 0x185 0x1 0xd134 0x1
phy raw c45 0x185 0x1 0xffde 2
phy raw c45 0x185 0x1 0xd130 0x55
phy raw c45 0x185 0x1 0xd131 0x303
phy raw c45 0x185 0x1 0xd131 0x30a
phy raw c45 0x185 0x1 0xd134 0x1
phy raw c45 0x185 0x1 0xffde 3
phy raw c45 0x185 0x1 0xd130 0x55
phy raw c45 0x185 0x1 0xd131 0x303
phy raw c45 0x185 0x1 0xd131 0x30a
phy raw c45 0x185 0x1 0xd134 0x1
# Start of 8x100G
phy raw c45 0xe1 0x1 0xffde 0
phy raw c45 0xe1 0x1 0xd130 0x55
phy raw c45 0xe1 0x1 0xd131 0x303
phy raw c45 0xe1 0x1 0xd130 0x57
phy raw c45 0xe1 0x1 0xd131 0x30a
phy raw c45 0xe1 0x1 0xffde 1
phy raw c45 0xe1 0x1 0xd130 0x55
phy raw c45 0xe1 0x1 0xd131 0x303
phy raw c45 0xe1 0x1 0xd130 0x57
phy raw c45 0xe1 0x1 0xd131 0x30a
phy raw c45 0xe1 0x1 0xffde 2
phy raw c45 0xe1 0x1 0xd130 0x55
phy raw c45 0xe1 0x1 0xd131 0x303
phy raw c45 0xe1 0x1 0xd130 0x57
phy raw c45 0xe1 0x1 0xd131 0x30a
phy raw c45 0xe1 0x1 0xffde 3
phy raw c45 0xe1 0x1 0xd130 0x59
phy raw c45 0xe1 0x1 0xd131 0x505
phy raw c45 0xe1 0x1 0xd130 0x57
phy raw c45 0xe1 0x1 0xd131 0x30a
phy raw c45 0xe1 0x1 0xd134 0x1
phy raw c45 0xe5 0x1 0xffde 0
phy raw c45 0xe5 0x1 0xd130 0x59
phy raw c45 0xe5 0x1 0xd131 0x502
phy raw c45 0xe5 0x1 0xd130 0x50
phy raw c45 0xe5 0x1 0xd131 0x30a
phy raw c45 0xe5 0x1 0xffde 1
phy raw c45 0xe5 0x1 0xd130 0x59
phy raw c45 0xe5 0x1 0xd131 0x502
phy raw c45 0xe5 0x1 0xd130 0x50
phy raw c45 0xe5 0x1 0xd131 0x30a
phy raw c45 0xe5 0x1 0xffde 2
phy raw c45 0xe5 0x1 0xd130 0x59
phy raw c45 0xe5 0x1 0xd131 0x502
phy raw c45 0xe5 0x1 0xd130 0x50
phy raw c45 0xe5 0x1 0xd131 0x30a
phy raw c45 0xe5 0x1 0xffde 3
phy raw c45 0xe5 0x1 0xd130 0x59
phy raw c45 0xe5 0x1 0xd131 0x502
phy raw c45 0xe5 0x1 0xd130 0x50
phy raw c45 0xe5 0x1 0xd131 0x30a
phy raw c45 0xe5 0x1 0xd134 0x1
phy raw c45 0xed 0x1 0xffde 0
phy raw c45 0xed 0x1 0xd130 0x59
phy raw c45 0xed 0x1 0xd131 0x502
phy raw c45 0xed 0x1 0xd130 0x57
phy raw c45 0xed 0x1 0xd131 0x30a
phy raw c45 0xed 0x1 0xffde 1
phy raw c45 0xed 0x1 0xd130 0x59
phy raw c45 0xed 0x1 0xd131 0x502
phy raw c45 0xed 0x1 0xd130 0x57
phy raw c45 0xed 0x1 0xd131 0x30a
phy raw c45 0xed 0x1 0xffde 2
phy raw c45 0xed 0x1 0xd130 0x59
phy raw c45 0xed 0x1 0xd131 0x502
phy raw c45 0xed 0x1 0xd130 0x57
phy raw c45 0xed 0x1 0xd131 0x30a
phy raw c45 0xed 0x1 0xffde 3
phy raw c45 0xed 0x1 0xd130 0x59
phy raw c45 0xed 0x1 0xd131 0x502
phy raw c45 0xed 0x1 0xd130 0x57
phy raw c45 0xed 0x1 0xd131 0x30a
phy raw c45 0xed 0x1 0xd134 0x1
phy raw c45 0x189 0x1 0xffde 0
phy raw c45 0x189 0x1 0xd130 0x59
phy raw c45 0x189 0x1 0xd131 0x502
phy raw c45 0x189 0x1 0xd130 0x57
phy raw c45 0x189 0x1 0xd131 0x30a
phy raw c45 0x189 0x1 0xffde 1
phy raw c45 0x189 0x1 0xd130 0x59
phy raw c45 0x189 0x1 0xd131 0x502
phy raw c45 0x189 0x1 0xd130 0x57
phy raw c45 0x189 0x1 0xd131 0x30a
phy raw c45 0x189 0x1 0xffde 2
phy raw c45 0x189 0x1 0xd130 0x59
phy raw c45 0x189 0x1 0xd131 0x502
phy raw c45 0x189 0x1 0xd130 0x57
phy raw c45 0x189 0x1 0xd131 0x30a
phy raw c45 0x189 0x1 0xffde 3
phy raw c45 0x189 0x1 0xd130 0x59
phy raw c45 0x189 0x1 0xd131 0x502
phy raw c45 0x189 0x1 0xd130 0x57
phy raw c45 0x189 0x1 0xd131 0x30a
phy raw c45 0x189 0x1 0xd134 0x1
phy raw c45 0x1a1 0x1 0xffde 0
phy raw c45 0x1a1 0x1 0xd130 0x59
phy raw c45 0x1a1 0x1 0xd131 0x502
phy raw c45 0x1a1 0x1 0xd130 0x57
phy raw c45 0x1a1 0x1 0xd131 0x30a
phy raw c45 0x1a1 0x1 0xffde 1
phy raw c45 0x1a1 0x1 0xd130 0x59
phy raw c45 0x1a1 0x1 0xd131 0x502
phy raw c45 0x1a1 0x1 0xd130 0x57
phy raw c45 0x1a1 0x1 0xd131 0x30a
phy raw c45 0x1a1 0x1 0xffde 2
phy raw c45 0x1a1 0x1 0xd130 0x59
phy raw c45 0x1a1 0x1 0xd131 0x502
phy raw c45 0x1a1 0x1 0xd130 0x57
phy raw c45 0x1a1 0x1 0xd131 0x30a
phy raw c45 0x1a1 0x1 0xffde 3
phy raw c45 0x1a1 0x1 0xd130 0x59
phy raw c45 0x1a1 0x1 0xd131 0x502
phy raw c45 0x1a1 0x1 0xd130 0x57
phy raw c45 0x1a1 0x1 0xd131 0x30a
phy raw c45 0x1a1 0x1 0xd134 0x1
phy raw c45 0x1a9 0x1 0xffde 0
phy raw c45 0x1a9 0x1 0xd130 0x59
phy raw c45 0x1a9 0x1 0xd131 0x502
phy raw c45 0x1a9 0x1 0xd130 0x57
phy raw c45 0x1a9 0x1 0xd131 0x30a
phy raw c45 0x1a9 0x1 0xffde 1
phy raw c45 0x1a9 0x1 0xd130 0x59
phy raw c45 0x1a9 0x1 0xd131 0x502
phy raw c45 0x1a9 0x1 0xd130 0x57
phy raw c45 0x1a9 0x1 0xd131 0x30a
phy raw c45 0x1a9 0x1 0xffde 2
phy raw c45 0x1a9 0x1 0xd130 0x59
phy raw c45 0x1a9 0x1 0xd131 0x502
phy raw c45 0x1a9 0x1 0xd130 0x57
phy raw c45 0x1a9 0x1 0xd131 0x30a
phy raw c45 0x1a9 0x1 0xffde 3
phy raw c45 0x1a9 0x1 0xd130 0x59
phy raw c45 0x1a9 0x1 0xd131 0x502
phy raw c45 0x1a9 0x1 0xd130 0x57
phy raw c45 0x1a9 0x1 0xd131 0x30a
phy raw c45 0x1a9 0x1 0xd134 0x1
phy raw c45 0x1b1 0x1 0xffde 0
phy raw c45 0x1b1 0x1 0xd130 0x59
phy raw c45 0x1b1 0x1 0xd131 0x502
phy raw c45 0x1b1 0x1 0xd130 0x57
phy raw c45 0x1b1 0x1 0xd131 0x30a
phy raw c45 0x1b1 0x1 0xffde 1
phy raw c45 0x1b1 0x1 0xd130 0x59
phy raw c45 0x1b1 0x1 0xd131 0x502
phy raw c45 0x1b1 0x1 0xd130 0x57
phy raw c45 0x1b1 0x1 0xd131 0x30a
phy raw c45 0x1b1 0x1 0xffde 2
phy raw c45 0x1b1 0x1 0xd130 0x59
phy raw c45 0x1b1 0x1 0xd131 0x502
phy raw c45 0x1b1 0x1 0xd130 0x57
phy raw c45 0x1b1 0x1 0xd131 0x30a
phy raw c45 0x1b1 0x1 0xffde 3
phy raw c45 0x1b1 0x1 0xd130 0x59
phy raw c45 0x1b1 0x1 0xd131 0x502
phy raw c45 0x1b1 0x1 0xd130 0x57
phy raw c45 0x1b1 0x1 0xd131 0x30a
phy raw c45 0x1b1 0x1 0xd134 0x1
phy raw c45 0x1b5 0x1 0xffde 0
phy raw c45 0x1b5 0x1 0xd130 0x59
phy raw c45 0x1b5 0x1 0xd131 0x502
phy raw c45 0x1b5 0x1 0xd130 0x57
phy raw c45 0x1b5 0x1 0xd131 0x30a
phy raw c45 0x1b5 0x1 0xffde 1
phy raw c45 0x1b5 0x1 0xd130 0x59
phy raw c45 0x1b5 0x1 0xd131 0x502
phy raw c45 0x1b5 0x1 0xd130 0x57
phy raw c45 0x1b5 0x1 0xd131 0x30a
phy raw c45 0x1b5 0x1 0xffde 2
phy raw c45 0x1b5 0x1 0xd130 0x59
phy raw c45 0x1b5 0x1 0xd131 0x502
phy raw c45 0x1b5 0x1 0xd130 0x57
phy raw c45 0x1b5 0x1 0xd131 0x30a
phy raw c45 0x1b5 0x1 0xffde 3
phy raw c45 0x1b5 0x1 0xd130 0x59
phy raw c45 0x1b5 0x1 0xd131 0x502
phy raw c45 0x1b5 0x1 0xd130 0x57
phy raw c45 0x1b5 0x1 0xd131 0x30a
phy raw c45 0x1b5 0x1 0xd134 0x1
linkscan on

View File

@ -0,0 +1,21 @@
{
"GLOBAL_MEDIA_SETTINGS": {
"1-48": {
"Default": {
"preemphasis": {
"lane0": "0x063203"
}
}
},
"49-56": {
"Default": {
"preemphasis": {
"lane0": "0x0a500a",
"lane1": "0x0a500a",
"lane2": "0x0a500a",
"lane3": "0x0a500a"
}
}
}
}
}

View File

@ -479,84 +479,83 @@ phy_chain_rx_polarity_flip_physical{131.0}=0x0
phy_chain_rx_polarity_flip_physical{132.0}=0x0
serdes_preemphasis_1=0x35503
serdes_preemphasis_2=0x35503
serdes_preemphasis_3=0x35503
serdes_preemphasis_4=0x35503
serdes_preemphasis_5=0x35503
serdes_preemphasis_6=0x35503
serdes_preemphasis_7=0x35503
serdes_preemphasis_8=0x35503
serdes_preemphasis_13=0x35503
serdes_preemphasis_14=0x35503
serdes_preemphasis_15=0x35503
serdes_preemphasis_16=0x35503
serdes_preemphasis_21=0x35503
serdes_preemphasis_22=0x35503
serdes_preemphasis_23=0x35503
serdes_preemphasis_24=0x35503
serdes_preemphasis_29=0x35503
serdes_preemphasis_30=0x35503
serdes_preemphasis_31=0x35503
serdes_preemphasis_32=0x35503
serdes_preemphasis_33=0x35503
serdes_preemphasis_34=0x35503
serdes_preemphasis_35=0x35503
serdes_preemphasis_36=0x35503
serdes_preemphasis_41=0x35503
serdes_preemphasis_42=0x35503
serdes_preemphasis_43=0x35503
serdes_preemphasis_44=0x35503
serdes_preemphasis_49=0x35503
serdes_preemphasis_50=0x35503
serdes_preemphasis_51=0x35503
serdes_preemphasis_52=0x35503
serdes_preemphasis_57=0x35503
serdes_preemphasis_58=0x35503
serdes_preemphasis_59=0x35503
serdes_preemphasis_60=0x35503
serdes_preemphasis_61=0x35503
serdes_preemphasis_62=0x35503
serdes_preemphasis_63=0x35503
serdes_preemphasis_64=0x35503
serdes_preemphasis_lane0_67=0x25905
serdes_preemphasis_lane1_67=0x25905
serdes_preemphasis_lane2_67=0x25905
serdes_preemphasis_lane3_67=0x25905
serdes_preemphasis_lane0_71=0x25905
serdes_preemphasis_lane1_71=0x25905
serdes_preemphasis_lane2_71=0x25905
serdes_preemphasis_lane3_71=0x25905
serdes_preemphasis_lane0_79=0x25905
serdes_preemphasis_lane1_79=0x25905
serdes_preemphasis_lane2_79=0x25905
serdes_preemphasis_lane3_79=0x25905
serdes_preemphasis_87=0x35503
serdes_preemphasis_88=0x35503
serdes_preemphasis_89=0x35503
serdes_preemphasis_90=0x35503
serdes_preemphasis_95=0x35503
serdes_preemphasis_96=0x35503
serdes_preemphasis_97=0x35503
serdes_preemphasis_98=0x35503
serdes_preemphasis_lane0_99=0x35503
serdes_preemphasis_lane1_99=0x35503
serdes_preemphasis_lane2_99=0x35503
serdes_preemphasis_lane3_99=0x55905
serdes_preemphasis_lane0_107=0x25905
serdes_preemphasis_lane1_107=0x25905
serdes_preemphasis_lane2_107=0x25905
serdes_preemphasis_lane3_107=0x25905
serdes_preemphasis_lane0_115=0x25905
serdes_preemphasis_lane1_115=0x25905
serdes_preemphasis_lane2_115=0x25905
serdes_preemphasis_lane3_115=0x25905
serdes_preemphasis_lane0_123=0x25905
serdes_preemphasis_lane1_123=0x25905
serdes_preemphasis_lane2_123=0x25905
serdes_preemphasis_lane3_123=0x25905
serdes_preemphasis_lane0_127=0x25905
serdes_preemphasis_lane1_127=0x25905
serdes_preemphasis_lane2_127=0x25905
serdes_preemphasis_lane3_127=0x25905
serdes_preemphasis_60=0x0c5602
serdes_preemphasis_59=0x0c5602
serdes_preemphasis_58=0x0c5602
serdes_preemphasis_57=0x0c5602
serdes_preemphasis_64=0x0c5602
serdes_preemphasis_63=0x0c5602
serdes_preemphasis_62=0x0c5602
serdes_preemphasis_61=0x0c5602
serdes_preemphasis_49=0x0c5602
serdes_preemphasis_50=0x0c5602
serdes_preemphasis_51=0x0c5602
serdes_preemphasis_52=0x0c5602
serdes_preemphasis_4=0x0c5602
serdes_preemphasis_3=0x0c5602
serdes_preemphasis_2=0x085804
serdes_preemphasis_1=0x0c5602
serdes_preemphasis_8=0x085804
serdes_preemphasis_7=0x085804
serdes_preemphasis_6=0x085804
serdes_preemphasis_5=0x085804
serdes_preemphasis_16=0x065806
serdes_preemphasis_15=0x085804
serdes_preemphasis_14=0x085804
serdes_preemphasis_13=0x085804
serdes_preemphasis_24=0x065806
serdes_preemphasis_23=0x065806
serdes_preemphasis_22=0x065806
serdes_preemphasis_21=0x065806
serdes_preemphasis_32=0x065806
serdes_preemphasis_31=0x065806
serdes_preemphasis_30=0x065806
serdes_preemphasis_29=0x075805
serdes_preemphasis_36=0x075805
serdes_preemphasis_35=0x075805
serdes_preemphasis_34=0x065806
serdes_preemphasis_33=0x085804
serdes_preemphasis_44=0x085804
serdes_preemphasis_43=0x085804
serdes_preemphasis_42=0x085804
serdes_preemphasis_41=0x085804
serdes_preemphasis_88=0x085804
serdes_preemphasis_87=0x085804
serdes_preemphasis_90=0x085804
serdes_preemphasis_89=0x085804
serdes_preemphasis_96=0x085804
serdes_preemphasis_95=0x085804
serdes_preemphasis_98=0x085804
serdes_preemphasis_97=0x085804
serdes_preemphasis_lane0_99=0x0c5404
serdes_preemphasis_lane1_99=0x0c5404
serdes_preemphasis_lane2_99=0x0c5404
serdes_preemphasis_lane3_99=0x0c5404
serdes_preemphasis_lane0_107=0x0c5404
serdes_preemphasis_lane1_107=0x0c5404
serdes_preemphasis_lane2_107=0x0c5404
serdes_preemphasis_lane3_107=0x0c5404
serdes_preemphasis_lane0_115=0x105202
serdes_preemphasis_lane1_115=0x105202
serdes_preemphasis_lane2_115=0x105202
serdes_preemphasis_lane3_115=0x105202
serdes_preemphasis_lane0_123=0x0c5404
serdes_preemphasis_lane1_123=0x0c5404
serdes_preemphasis_lane2_123=0x0c5404
serdes_preemphasis_lane3_123=0x0c5404
serdes_preemphasis_lane0_79=0x0d5205
serdes_preemphasis_lane1_79=0x0d5205
serdes_preemphasis_lane2_79=0x0d5205
serdes_preemphasis_lane3_79=0x0d5205
serdes_preemphasis_lane0_67=0x105202
serdes_preemphasis_lane1_67=0x105202
serdes_preemphasis_lane2_67=0x105202
serdes_preemphasis_lane3_67=0x105202
serdes_preemphasis_lane0_71=0x115201
serdes_preemphasis_lane1_71=0x115201
serdes_preemphasis_lane2_71=0x115201
serdes_preemphasis_lane3_71=0x115201
serdes_preemphasis_lane0_127=0x105202
serdes_preemphasis_lane1_127=0x105202
serdes_preemphasis_lane2_127=0x105202
serdes_preemphasis_lane3_127=0x105202

View File

@ -1,4 +1,2 @@
sleep 10
m0 Load 0 0x3800 /usr/share/sonic/platform/custom_led.bin
led auto on
m0 load 0 0x3800 /usr/share/sonic/platform/custom_led.bin
led start

View File

@ -0,0 +1,72 @@
{
"GLOBAL_MEDIA_SETTINGS": {
"1-14,16": {
"Default": {
"preemphasis": {
"lane0": "0x0c5602"
}
}
},
"15,17-20,22-24,36-48": {
"Default": {
"preemphasis": {
"lane0": "0x085804"
}
}
},
"21,25-31,35": {
"Default": {
"preemphasis": {
"lane0": "0x065806"
}
}
},
"32-34": {
"Default": {
"preemphasis": {
"lane0": "0x075805"
}
}
},
"49,50,52": {
"Default": {
"preemphasis": {
"lane0": "0x0c5404",
"lane1": "0x0c5404",
"lane2": "0x0c5404",
"lane3": "0x0c5404"
}
}
},
"51,54,56": {
"Default": {
"preemphasis": {
"lane0": "0x105202",
"lane1": "0x105202",
"lane2": "0x105202",
"lane3": "0x105202"
}
}
},
"53-53": {
"Default": {
"preemphasis": {
"lane0": "0x0d5205",
"lane1": "0x0d5205",
"lane2": "0x0d5205",
"lane3": "0x0d5205"
}
}
},
"55-55": {
"Default": {
"preemphasis": {
"lane0": "0x115201",
"lane1": "0x115201",
"lane2": "0x115201",
"lane3": "0x115201"
}
}
}
}
}

View File

@ -0,0 +1,132 @@
{
"interfaces": {
"Ethernet0": {
"default_brkout_mode": "1x400G",
"fec":"rs"
},
"Ethernet8": {
"default_brkout_mode": "1x400G",
"fec":"rs"
},
"Ethernet16": {
"default_brkout_mode": "1x400G",
"fec":"rs"
},
"Ethernet24": {
"default_brkout_mode": "1x400G",
"fec":"rs"
},
"Ethernet32": {
"default_brkout_mode": "1x400G",
"fec":"rs"
},
"Ethernet40": {
"default_brkout_mode": "1x400G",
"fec":"rs"
},
"Ethernet48": {
"default_brkout_mode": "1x400G",
"fec":"rs"
},
"Ethernet56": {
"default_brkout_mode": "1x400G",
"fec":"rs"
},
"Ethernet64": {
"default_brkout_mode": "1x400G",
"fec":"rs"
},
"Ethernet72": {
"default_brkout_mode": "1x400G",
"fec":"rs"
},
"Ethernet80": {
"default_brkout_mode": "1x400G",
"fec":"rs"
},
"Ethernet88": {
"default_brkout_mode": "1x400G",
"fec":"rs"
},
"Ethernet96": {
"default_brkout_mode": "1x400G",
"fec":"rs"
},
"Ethernet104": {
"default_brkout_mode": "1x400G",
"fec":"rs"
},
"Ethernet112": {
"default_brkout_mode": "1x400G",
"fec":"rs"
},
"Ethernet120": {
"default_brkout_mode": "1x400G",
"fec":"rs"
},
"Ethernet128": {
"default_brkout_mode": "1x400G",
"fec":"rs"
},
"Ethernet136": {
"default_brkout_mode": "1x400G",
"fec":"rs"
},
"Ethernet144": {
"default_brkout_mode": "1x400G",
"fec":"rs"
},
"Ethernet152": {
"default_brkout_mode": "1x400G",
"fec":"rs"
},
"Ethernet160": {
"default_brkout_mode": "1x400G",
"fec":"rs"
},
"Ethernet168": {
"default_brkout_mode": "1x400G",
"fec":"rs"
},
"Ethernet176": {
"default_brkout_mode": "1x400G",
"fec":"rs"
},
"Ethernet184": {
"default_brkout_mode": "1x400G",
"fec":"rs"
},
"Ethernet192": {
"default_brkout_mode": "1x400G",
"fec":"rs"
},
"Ethernet200": {
"default_brkout_mode": "1x400G",
"fec":"rs"
},
"Ethernet208": {
"default_brkout_mode": "1x400G",
"fec":"rs"
},
"Ethernet216": {
"default_brkout_mode": "1x400G",
"fec":"rs"
},
"Ethernet224": {
"default_brkout_mode": "1x400G",
"fec":"rs"
},
"Ethernet232": {
"default_brkout_mode": "1x400G",
"fec":"rs"
},
"Ethernet240": {
"default_brkout_mode": "1x400G",
"fec":"rs"
},
"Ethernet248": {
"default_brkout_mode": "1x400G",
"fec":"rs"
}
}
}

View File

@ -1,6 +1,7 @@
phy_null=1
pll_bypass=1
sai_tunnel_global_sip_mask_enable=1
core_clock_frequency=1325
dpr_clock_frequency=1000
device_clock_frequency=1325
@ -235,6 +236,8 @@ dport_map_port_132=125
dport_map_port_133=126
dport_map_port_134=127
dport_map_port_135=128
dport_map_port_136=129
dport_map_port_137=130
### lane swap and polarity follow front port order ###
phy_chain_tx_lane_map_physical{33.0}=0x75206431

View File

@ -1,6 +1,4 @@
sleep 10
m0 Load 0 0x3800 /usr/share/sonic/platform/custom_led.bin
led auto on
led start
rcload /usr/share/sonic/platform/preemphasis-32x400G.soc

View File

@ -0,0 +1,132 @@
{
"GLOBAL_MEDIA_SETTINGS": {
"1,3-32": {
"Default": {
"main":{
"lane0": "0x00000098",
"lane1": "0x00000098",
"lane2": "0x00000098",
"lane3": "0x00000098",
"lane4": "0x00000098",
"lane5": "0x00000098",
"lane6": "0x00000098",
"lane7": "0x00000098"
},
"post1":{
"lane0": "0x00000000",
"lane1": "0x00000000",
"lane2": "0x00000000",
"lane3": "0x00000000",
"lane4": "0x00000000",
"lane5": "0x00000000",
"lane6": "0x00000000",
"lane7": "0x00000000"
},
"post2":{
"lane0": "0x00000000",
"lane1": "0x00000000",
"lane2": "0x00000000",
"lane3": "0x00000000",
"lane4": "0x00000000",
"lane5": "0x00000000",
"lane6": "0x00000000",
"lane7": "0x00000000"
},
"post3":{
"lane0": "0x00000000",
"lane1": "0x00000000",
"lane2": "0x00000000",
"lane3": "0x00000000",
"lane4": "0x00000000",
"lane5": "0x00000000",
"lane6": "0x00000000",
"lane7": "0x00000000"
},
"pre1":{
"lane0": "0xfffffff0",
"lane1": "0xfffffff0",
"lane2": "0xfffffff0",
"lane3": "0xfffffff0",
"lane4": "0xfffffff0",
"lane5": "0xfffffff0",
"lane6": "0xfffffff0",
"lane7": "0xfffffff0"
},
"pre2":{
"lane0": "0x00000000",
"lane1": "0x00000000",
"lane2": "0x00000000",
"lane3": "0x00000000",
"lane4": "0x00000000",
"lane5": "0x00000000",
"lane6": "0x00000000",
"lane7": "0x00000000"
}
}
},
"2-2": {
"Default": {
"main":{
"lane0": "0x00000098",
"lane1": "0x00000098",
"lane2": "0x00000098",
"lane3": "0x00000098",
"lane4": "0x00000098",
"lane5": "0x00000098",
"lane6": "0x00000098",
"lane7": "0x00000090"
},
"post1":{
"lane0": "0x00000000",
"lane1": "0x00000000",
"lane2": "0x00000000",
"lane3": "0x00000000",
"lane4": "0x00000000",
"lane5": "0x00000000",
"lane6": "0x00000000",
"lane7": "0xfffffffc"
},
"post2":{
"lane0": "0x00000000",
"lane1": "0x00000000",
"lane2": "0x00000000",
"lane3": "0x00000000",
"lane4": "0x00000000",
"lane5": "0x00000000",
"lane6": "0x00000000",
"lane7": "0x00000000"
},
"post3":{
"lane0": "0x00000000",
"lane1": "0x00000000",
"lane2": "0x00000000",
"lane3": "0x00000000",
"lane4": "0x00000000",
"lane5": "0x00000000",
"lane6": "0x00000000",
"lane7": "0x00000000"
},
"pre1":{
"lane0": "0xfffffff0",
"lane1": "0xfffffff0",
"lane2": "0xfffffff0",
"lane3": "0xfffffff0",
"lane4": "0xfffffff0",
"lane5": "0xfffffff0",
"lane6": "0xfffffff0",
"lane7": "0xffffffee"
},
"pre2":{
"lane0": "0x00000000",
"lane1": "0x00000000",
"lane2": "0x00000000",
"lane3": "0x00000000",
"lane4": "0x00000000",
"lane5": "0x00000000",
"lane6": "0x00000000",
"lane7": "0x00000000"
}
}
}
}
}

View File

@ -0,0 +1,600 @@
{
"chassis": {
"name": "T9032-IX9",
"components": [
{
"name": "BIOS"
},
{
"name": "BMC"
},
{
"name": "BOOT_CPLD"
},
{
"name": "FAN_CPLD"
},
{
"name": "MB_CPLD_IO_1"
},
{
"name": "MB_CPLD_IO_2"
},
{
"name": "MB_CPLD_LED_1"
},
{
"name": "MB_CPLD_LED_2"
},
{
"name": "PCIe"
}
],
"fans": [
{
"name": "Fantray1_1"
},
{
"name": "Fantray1_2"
},
{
"name": "Fantray2_1"
},
{
"name": "Fantray2_2"
},
{
"name": "Fantray3_1"
},
{
"name": "Fantray3_2"
},
{
"name": "Fantray4_1"
},
{
"name": "Fantray4_2"
},
{
"name": "Fantray5_1"
},
{
"name": "Fantray5_2"
},
{
"name": "Fantray6_1"
},
{
"name": "Fantray6_2"
}
],
"fan_drawers": [
{
"name": "Fantray1",
"fans": [
{
"name": "Fantray1_1"
},
{
"name": "Fantray1_2"
}
]
},
{
"name": "Fantray2",
"fans": [
{
"name": "Fantray2_1"
},
{
"name": "Fantray2_2"
}
]
},
{
"name": "Fantray3",
"fans": [
{
"name": "Fantray3_1"
},
{
"name": "Fantray3_2"
}
]
},
{
"name": "Fantray4",
"fans": [
{
"name": "Fantray4_1"
},
{
"name": "Fantray4_2"
}
]
},
{
"name": "Fantray5",
"fans": [
{
"name": "Fantray5_1"
},
{
"name": "Fantray5_2"
}
]
},
{
"name": "Fantray6",
"fans": [
{
"name": "Fantray6_1"
},
{
"name": "Fantray6_2"
}
]
}
],
"psus": [
{
"name": "PSU 1",
"fans": [
{
"name": "PSU-1_FAN"
}
]
},
{
"name": "PSU 2",
"fans": [
{
"name": "PSU-2_FAN"
}
]
}
],
"thermals": [
{
"name": "PSU1_TEMP1"
},
{
"name": "PSU1_TEMP2"
},
{
"name": "PSU1_TEMP3"
},
{
"name": "PSU2_TEMP1"
},
{
"name": "PSU2_TEMP2"
},
{
"name": "PSU2_TEMP3"
},
{
"name": "Temp_1V05_PCH_VR"
},
{
"name": "Temp_Ambient_0"
},
{
"name": "Temp_Ambient_1"
},
{
"name": "Temp_Ambient_2"
},
{
"name": "Temp_Ambient_3"
},
{
"name": "Temp_Ambient_4"
},
{
"name": "Temp_Ambient_5"
},
{
"name": "Temp_CPU"
},
{
"name": "Temp_DDRAB_VR"
},
{
"name": "Temp_SOC_DIMMA0"
},
{
"name": "Temp_VCCGBE_VR"
},
{
"name": "Temp_VCCIN_VR"
}
],
"sfps": [
{
"name": "Ethernet0"
},
{
"name": "Ethernet8"
},
{
"name": "Ethernet16"
},
{
"name": "Ethernet24"
},
{
"name": "Ethernet32"
},
{
"name": "Ethernet40"
},
{
"name": "Ethernet48"
},
{
"name": "Ethernet56"
},
{
"name": "Ethernet64"
},
{
"name": "Ethernet72"
},
{
"name": "Ethernet80"
},
{
"name": "Ethernet88"
},
{
"name": "Ethernet96"
},
{
"name": "Ethernet104"
},
{
"name": "Ethernet112"
},
{
"name": "Ethernet120"
},
{
"name": "Ethernet128"
},
{
"name": "Ethernet136"
},
{
"name": "Ethernet144"
},
{
"name": "Ethernet152"
},
{
"name": "Ethernet160"
},
{
"name": "Ethernet168"
},
{
"name": "Ethernet176"
},
{
"name": "Ethernet184"
},
{
"name": "Ethernet192"
},
{
"name": "Ethernet200"
},
{
"name": "Ethernet208"
},
{
"name": "Ethernet216"
},
{
"name": "Ethernet224"
},
{
"name": "Ethernet232"
},
{
"name": "Ethernet240"
},
{
"name": "Ethernet248"
}
]
},
"interfaces": {
"Ethernet0": {
"breakout_modes": {
"1x400G": ["Eth1/1"],
"2x200G[100G]": ["Eth1/1/1", "Eth1/1/2"],
"4x100G[50G]": ["Eth1/1/1", "Eth1/1/2", "Eth1/1/3", "Eth1/1/4"]
},
"index": "1,1,1,1,1,1,1,1",
"lanes": "33,34,35,36,37,38,39,40"
},
"Ethernet8": {
"breakout_modes": {
"1x400G": ["Eth1/2"],
"2x200G[100G]": ["Eth1/2/1", "Eth1/2/2"],
"4x100G[50G]": ["Eth1/2/1", "Eth1/2/2", "Eth1/2/3", "Eth1/2/4"]
},
"index": "2,2,2,2,2,2,2,2",
"lanes": "25,26,27,28,29,30,31,32"
},
"Ethernet16": {
"breakout_modes": {
"1x400G": ["Eth1/3"],
"2x200G[100G]": ["Eth1/3/1", "Eth1/3/2"],
"4x100G[50G]": ["Eth1/3/1", "Eth1/3/2", "Eth1/3/3", "Eth1/3/4"]
},
"index": "3,3,3,3,3,3,3,3",
"lanes": "49,50,51,52,53,54,55,56"
},
"Ethernet24": {
"breakout_modes": {
"1x400G": ["Eth1/4"],
"2x200G[100G]": ["Eth1/4/1", "Eth1/4/2"],
"4x100G[50G]": ["Eth1/4/1", "Eth1/4/2", "Eth1/4/3", "Eth1/4/4"]
},
"index": "4,4,4,4,4,4,4,4",
"lanes": "57,58,59,60,61,62,63,64"
},
"Ethernet32": {
"breakout_modes": {
"1x400G": ["Eth1/5"],
"2x200G[100G]": ["Eth1/5/1", "Eth1/5/2"],
"4x100G[50G]": ["Eth1/5/1", "Eth1/5/2", "Eth1/5/3", "Eth1/5/4"]
},
"index": "5,5,5,5,5,5,5,5",
"lanes": "65,66,67,68,69,70,71,72"
},
"Ethernet40": {
"breakout_modes": {
"1x400G": ["Eth1/6"],
"2x200G[100G]": ["Eth1/6/1", "Eth1/6/2"],
"4x100G[50G]": ["Eth1/6/1", "Eth1/6/2", "Eth1/6/3", "Eth1/6/4"]
},
"index": "6,6,6,6,6,6,6,6",
"lanes": "73,74,75,76,77,78,79,80"
},
"Ethernet48": {
"breakout_modes": {
"1x400G": ["Eth1/7"],
"2x200G[100G]": ["Eth1/7/1", "Eth1/7/2"],
"4x100G[50G]": ["Eth1/7/1", "Eth1/7/2", "Eth1/7/3", "Eth1/7/4"]
},
"index": "7,7,7,7,7,7,7,7",
"lanes": "81,82,83,84,85,86,87,88"
},
"Ethernet56": {
"breakout_modes": {
"1x400G": ["Eth1/8"],
"2x200G[100G]": ["Eth1/8/1", "Eth1/8/2"],
"4x100G[50G]": ["Eth1/8/1", "Eth1/8/2", "Eth1/8/3", "Eth1/8/4"]
},
"index": "8,8,8,8,8,8,8,8",
"lanes": "89,90,91,92,93,94,95,96"
},
"Ethernet64": {
"breakout_modes": {
"1x400G": ["Eth1/9"],
"2x200G[100G]": ["Eth1/9/1", "Eth1/9/2"],
"4x100G[50G]": ["Eth1/9/1", "Eth1/9/2", "Eth1/9/3", "Eth1/9/4"]
},
"index": "9,9,9,9,9,9,9,9",
"lanes": "17,18,19,20,21,22,23,24"
},
"Ethernet72": {
"breakout_modes": {
"1x400G": ["Eth1/10"],
"2x200G[100G]": ["Eth1/10/1", "Eth1/10/2"],
"4x100G[50G]": ["Eth1/10/1", "Eth1/10/2", "Eth1/10/3", "Eth1/10/4"]
},
"index": "10,10,10,10,10,10,10,10",
"lanes": "97,98,99,100,101,102,103,104"
},
"Ethernet80": {
"breakout_modes": {
"1x400G": ["Eth1/11"],
"2x200G[100G]": ["Eth1/11/1", "Eth1/11/2"],
"4x100G[50G]": ["Eth1/11/1", "Eth1/11/2", "Eth1/11/3", "Eth1/11/4"]
},
"index": "11,11,11,11,11,11,11,11",
"lanes": "9,10,11,12,13,14,15,16"
},
"Ethernet88": {
"breakout_modes": {
"1x400G": ["Eth1/12"],
"2x200G[100G]": ["Eth1/12/1", "Eth1/12/2"],
"4x100G[50G]": ["Eth1/12/1", "Eth1/12/2", "Eth1/12/3", "Eth1/12/4"]
},
"index": "12,12,12,12,12,12,12,12",
"lanes": "41,42,43,44,45,46,47,48"
},
"Ethernet96": {
"breakout_modes": {
"1x400G": ["Eth1/13"],
"2x200G[100G]": ["Eth1/13/1", "Eth1/13/2"],
"4x100G[50G]": ["Eth1/13/1", "Eth1/13/2", "Eth1/13/3", "Eth1/13/4"]
},
"index": "13,13,13,13,13,13,13,13",
"lanes": "113,114,115,116,117,118,119,120"
},
"Ethernet104": {
"breakout_modes": {
"1x400G": ["Eth1/14"],
"2x200G[100G]": ["Eth1/14/1", "Eth1/14/2"],
"4x100G[50G]": ["Eth1/14/1", "Eth1/14/2", "Eth1/14/3", "Eth1/14/4"]
},
"index": "14,14,14,14,14,14,14,14",
"lanes": "105,106,107,108,109,110,111,112"
},
"Ethernet112": {
"breakout_modes": {
"1x400G": ["Eth1/15"],
"2x200G[100G]": ["Eth1/15/1", "Eth1/15/2"],
"4x100G[50G]": ["Eth1/15/1", "Eth1/15/2", "Eth1/15/3", "Eth1/15/4"]
},
"index": "15,15,15,15,15,15,15,15",
"lanes": "121,122,123,124,125,126,127,128"
},
"Ethernet120": {
"breakout_modes": {
"1x400G": ["Eth1/16"],
"2x200G[100G]": ["Eth1/16/1", "Eth1/16/2"],
"4x100G[50G]": ["Eth1/16/1", "Eth1/16/2", "Eth1/16/3", "Eth1/16/4"]
},
"index": "16,16,16,16,16,16,16,16",
"lanes": "1,2,3,4,5,6,7,8"
},
"Ethernet128": {
"breakout_modes": {
"1x400G": ["Eth1/17"],
"2x200G[100G]": ["Eth1/17/1", "Eth1/17/2"],
"4x100G[50G]": ["Eth1/17/1", "Eth1/17/2", "Eth1/17/3", "Eth1/17/4"]
},
"index": "17,17,17,17,17,17,17,17",
"lanes": "137,138,139,140,141,142,143,144"
},
"Ethernet136": {
"breakout_modes": {
"1x400G": ["Eth1/18"],
"2x200G[100G]": ["Eth1/18/1", "Eth1/18/2"],
"4x100G[50G]": ["Eth1/18/1", "Eth1/18/2", "Eth1/18/3", "Eth1/18/4"]
},
"index": "18,18,18,18,18,18,18,18",
"lanes": "129,130,131,132,133,134,135,136"
},
"Ethernet144": {
"breakout_modes": {
"1x400G": ["Eth1/19"],
"2x200G[100G]": ["Eth1/19/1", "Eth1/19/2"],
"4x100G[50G]": ["Eth1/19/1", "Eth1/19/2", "Eth1/19/3", "Eth1/19/4"]
},
"index": "19,19,19,19,19,19,19,19",
"lanes": "241,242,243,244,245,246,247,248"
},
"Ethernet152": {
"breakout_modes": {
"1x400G": ["Eth1/20"],
"2x200G[100G]": ["Eth1/20/1", "Eth1/20/2"],
"4x100G[50G]": ["Eth1/20/1", "Eth1/20/2", "Eth1/20/3", "Eth1/20/4"]
},
"index": "20,20,20,20,20,20,20,20",
"lanes": "249,250,251,252,253,254,255,256"
},
"Ethernet160": {
"breakout_modes": {
"1x400G": ["Eth1/21"],
"2x200G[100G]": ["Eth1/21/1", "Eth1/21/2"],
"4x100G[50G]": ["Eth1/21/1", "Eth1/21/2", "Eth1/21/3", "Eth1/21/4"]
},
"index": "21,21,21,21,21,21,21,21",
"lanes": "225,226,227,228,229,230,231,232"
},
"Ethernet168": {
"breakout_modes": {
"1x400G": ["Eth1/22"],
"2x200G[100G]": ["Eth1/22/1", "Eth1/22/2"],
"4x100G[50G]": ["Eth1/22/1", "Eth1/22/2", "Eth1/22/3", "Eth1/22/4"]
},
"index": "22,22,22,22,22,22,22,22",
"lanes": "145,146,147,148,149,150,151,152"
},
"Ethernet176": {
"breakout_modes": {
"1x400G": ["Eth1/23"],
"2x200G[100G]": ["Eth1/23/1", "Eth1/23/2"],
"4x100G[50G]": ["Eth1/23/1", "Eth1/23/2", "Eth1/23/3", "Eth1/23/4"]
},
"index": "23,23,23,23,23,23,23,23",
"lanes": "153,154,155,156,157,158,159,160"
},
"Ethernet184": {
"breakout_modes": {
"1x400G": ["Eth1/24"],
"2x200G[100G]": ["Eth1/24/1", "Eth1/24/2"],
"4x100G[50G]": ["Eth1/24/1", "Eth1/24/2", "Eth1/24/3", "Eth1/24/4"]
},
"index": "24,24,24,24,24,24,24,24",
"lanes": "233,234,235,236,237,238,239,240"
},
"Ethernet192": {
"breakout_modes": {
"1x400G": ["Eth1/25"],
"2x200G[100G]": ["Eth1/25/1", "Eth1/25/2"],
"4x100G[50G]": ["Eth1/25/1", "Eth1/25/2", "Eth1/25/3", "Eth1/25/4"]
},
"index": "25,25,25,25,25,25,25,25",
"lanes": "161,162,163,164,165,166,167,168"
},
"Ethernet200": {
"breakout_modes": {
"1x400G": ["Eth1/26"],
"2x200G[100G]": ["Eth1/26/1", "Eth1/26/2"],
"4x100G[50G]": ["Eth1/26/1", "Eth1/26/2", "Eth1/26/3", "Eth1/26/4"]
},
"index": "26,26,26,26,26,26,26,26",
"lanes": "169,170,171,172,173,174,175,176"
},
"Ethernet208": {
"breakout_modes": {
"1x400G": ["Eth1/27"],
"2x200G[100G]": ["Eth1/27/1", "Eth1/27/2"],
"4x100G[50G]": ["Eth1/27/1", "Eth1/27/2", "Eth1/27/3", "Eth1/27/4"]
},
"index": "27,27,27,27,27,27,27,27",
"lanes": "177,178,179,180,181,182,183,184"
},
"Ethernet216": {
"breakout_modes": {
"1x400G": ["Eth1/28"],
"2x200G[100G]": ["Eth1/28/1", "Eth1/28/2"],
"4x100G[50G]": ["Eth1/28/1", "Eth1/28/2", "Eth1/28/3", "Eth1/28/4"]
},
"index": "28,28,28,28,28,28,28,28",
"lanes": "185,186,187,188,189,190,191,192"
},
"Ethernet224": {
"breakout_modes": {
"1x400G": ["Eth1/29"]
},
"index": "29,29,29,29,29,29,29,29",
"lanes": "193,194,195,196,197,198,199,200"
},
"Ethernet232": {
"breakout_modes": {
"1x400G": ["Eth1/30"]
},
"index": "30,30,30,30,30,30,30,30",
"lanes": "201,202,203,204,205,206,207,208"
},
"Ethernet240": {
"breakout_modes": {
"1x400G": ["Eth1/31"],
"2x200G[100G]": ["Eth1/31/1", "Eth1/31/2"],
"4x100G[50G]": ["Eth1/31/1", "Eth1/31/2", "Eth1/31/3", "Eth1/31/4"],
"8x50G[25G][10G]": ["Eth1/31/1", "Eth1/31/2", "Eth1/31/3", "Eth1/31/4", "Eth1/31/5", "Eth1/31/6", "Eth1/31/7", "Eth1/31/8"]
},
"index": "31,31,31,31,31,31,31,31",
"lanes": "209,210,211,212,213,214,215,216"
},
"Ethernet248": {
"breakout_modes": {
"1x400G": ["Eth1/32"],
"2x200G[100G]": ["Eth1/32/1", "Eth1/32/2"],
"4x100G[50G]": ["Eth1/32/1", "Eth1/32/2", "Eth1/32/3", "Eth1/32/4"],
"8x50G[25G][10G]": ["Eth1/31/1", "Eth1/31/2", "Eth1/31/3", "Eth1/31/4", "Eth1/31/5", "Eth1/31/6", "Eth1/31/7", "Eth1/31/8"]
},
"index": "32,32,32,32,32,32,32,32",
"lanes": "217,218,219,220,221,222,223,224"
}
}
}

View File

@ -9,7 +9,7 @@ include $(PLATFORM_PATH)/platform-modules-accton.mk
#include $(PLATFORM_PATH)/platform-modules-inventec.mk
include $(PLATFORM_PATH)/platform-modules-cel.mk
#include $(PLATFORM_PATH)/platform-modules-delta.mk
#include $(PLATFORM_PATH)/platform-modules-quanta.mk
include $(PLATFORM_PATH)/platform-modules-quanta.mk
##include $(PLATFORM_PATH)/platform-modules-mitac.mk
include $(PLATFORM_PATH)/platform-modules-juniper.mk
#include $(PLATFORM_PATH)/platform-modules-brcm-xlr-gts.mk

View File

@ -49,7 +49,7 @@ static struct class *cpld_class = NULL;
struct cpld_data {
struct i2c_client *cpld_client;
char name[8];
char name[16];
u8 cpld_id;
};

View File

@ -86,6 +86,8 @@
#define IPMI_TIMEOUT (4 * HZ)
#define IPMI_MAX_WAIT_QUEUE 1
typedef struct ipmi_user *ipmi_user_t;
struct quanta_hwmon_ipmi_data
{
struct platform_device *ipmi_platform_dev;
@ -1829,7 +1831,7 @@ static int32_t __init quanta_hwmon_ipmi_init(void)
goto device_reg_err;
}
data->ipmi_hwmon_dev = hwmon_device_register_with_groups(NULL, DRVNAME, NULL,
data->ipmi_hwmon_dev = hwmon_device_register_with_groups(&data->ipmi_platform_dev->dev, DRVNAME, NULL,
NULL);
err = IS_ERR(data->ipmi_hwmon_dev);
if (err)
@ -1856,21 +1858,15 @@ static int32_t __init quanta_hwmon_ipmi_init(void)
return 0;
init_sensor_err:
if (g_sensor_data)
{
kfree(g_sensor_data);
g_sensor_data = NULL;
}
ipmi_create_err:
hwmon_device_unregister(data->ipmi_hwmon_dev);
hwmon_register_err:
platform_device_unregister(data->ipmi_platform_dev);
device_reg_err:
if (data)
{
kfree(data);
data = NULL;
}
alloc_err:
return err;
}
@ -1886,17 +1882,10 @@ static void __exit quanta_hwmon_ipmi_exit(void)
platform_device_unregister(data->ipmi_platform_dev);
if (g_sensor_data)
{
kfree(g_sensor_data);
g_sensor_data = NULL;
}
if (data)
{
kfree(data);
data = NULL;
}
}
module_init(quanta_hwmon_ipmi_init);

View File

@ -151,9 +151,9 @@ static int __init ix7_platform_init(void)
}
else
{
g_client[0] = i2c_new_device(adapter, &ix7_i2c_devices[0]); // pca9546
g_client[1] = i2c_new_device(adapter, &ix7_i2c_devices[1]); // pca9548
g_client[2] = i2c_new_device(adapter, &ix7_i2c_devices[10]); // pca9546 in CPU board
g_client[0] = i2c_new_client_device(adapter, &ix7_i2c_devices[0]); // pca9546
g_client[1] = i2c_new_client_device(adapter, &ix7_i2c_devices[1]); // pca9548
g_client[2] = i2c_new_client_device(adapter, &ix7_i2c_devices[10]); // pca9546 in CPU board
i2c_put_adapter(adapter);
}
@ -164,7 +164,7 @@ static int __init ix7_platform_init(void)
}
else
{
g_client[3] = i2c_new_device(adapter, &ix7_i2c_devices[11]); // CPU Board Data
g_client[3] = i2c_new_client_device(adapter, &ix7_i2c_devices[11]); // CPU Board Data
i2c_put_adapter(adapter);
}
@ -175,8 +175,8 @@ static int __init ix7_platform_init(void)
}
else
{
g_client[4] = i2c_new_device(adapter, &ix7_i2c_devices[8]); // CPLD2
g_client[5] = i2c_new_device(adapter, &ix7_i2c_devices[13]); // CPLD_led_1
g_client[4] = i2c_new_client_device(adapter, &ix7_i2c_devices[8]); // CPLD2
g_client[5] = i2c_new_client_device(adapter, &ix7_i2c_devices[13]); // CPLD_led_1
i2c_put_adapter(adapter);
}
@ -187,8 +187,8 @@ static int __init ix7_platform_init(void)
}
else
{
g_client[6] = i2c_new_device(adapter, &ix7_i2c_devices[9]); // CPLD3
g_client[7] = i2c_new_device(adapter, &ix7_i2c_devices[14]); // CPLD_led_2
g_client[6] = i2c_new_client_device(adapter, &ix7_i2c_devices[9]); // CPLD3
g_client[7] = i2c_new_client_device(adapter, &ix7_i2c_devices[14]); // CPLD_led_2
i2c_put_adapter(adapter);
}
@ -199,7 +199,7 @@ static int __init ix7_platform_init(void)
}
else
{
g_client[8] = i2c_new_device(adapter, &ix7_i2c_devices[2]); // MB_BOARDINFO_EEPROM
g_client[8] = i2c_new_client_device(adapter, &ix7_i2c_devices[2]); // MB_BOARDINFO_EEPROM
i2c_put_adapter(adapter);
}
@ -210,7 +210,7 @@ static int __init ix7_platform_init(void)
}
else
{
g_client[9] = i2c_new_device(adapter, &ix7_i2c_devices[7]); // pca9555 MB Board Data
g_client[9] = i2c_new_client_device(adapter, &ix7_i2c_devices[7]); // pca9555 MB Board Data
i2c_put_adapter(adapter);
}
@ -221,7 +221,7 @@ static int __init ix7_platform_init(void)
}
else
{
g_client[10] = i2c_new_device(adapter, &ix7_i2c_devices[3]); // pca9548_1 SFP
g_client[10] = i2c_new_client_device(adapter, &ix7_i2c_devices[3]); // pca9548_1 SFP
i2c_put_adapter(adapter);
}
@ -232,7 +232,7 @@ static int __init ix7_platform_init(void)
}
else
{
g_client[11] = i2c_new_device(adapter, &ix7_i2c_devices[4]); // pca9548_2 SFP
g_client[11] = i2c_new_client_device(adapter, &ix7_i2c_devices[4]); // pca9548_2 SFP
i2c_put_adapter(adapter);
}
@ -243,7 +243,7 @@ static int __init ix7_platform_init(void)
}
else
{
g_client[12] = i2c_new_device(adapter, &ix7_i2c_devices[5]); // pca9548_3 SFP
g_client[12] = i2c_new_client_device(adapter, &ix7_i2c_devices[5]); // pca9548_3 SFP
i2c_put_adapter(adapter);
}
@ -254,7 +254,7 @@ static int __init ix7_platform_init(void)
}
else
{
g_client[13] = i2c_new_device(adapter, &ix7_i2c_devices[6]); // pca9548_4 SFP
g_client[13] = i2c_new_client_device(adapter, &ix7_i2c_devices[6]); // pca9548_4 SFP
i2c_put_adapter(adapter);
}
@ -266,7 +266,7 @@ static int __init ix7_platform_init(void)
}
else
{
g_client_port[i - 17] = i2c_new_device(adapter, &ix7_i2c_devices[12]);
g_client_port[i - 17] = i2c_new_client_device(adapter, &ix7_i2c_devices[12]);
i2c_put_adapter(adapter);
}
}

View File

@ -72,6 +72,13 @@ class Chassis(ChassisBase):
for index in range(1, self.__num_of_ports + 1):
self.__xcvr_presence[index] = self._sfp_list[index-1].get_presence()
# Initialize components
from sonic_platform.component import ComponentBIOS, ComponentBMC, ComponentCPLD, ComponentPCIE
self._component_list.append(ComponentBIOS())
self._component_list.append(ComponentBMC())
self._component_list.extend(ComponentCPLD.get_component_list())
self._component_list.append(ComponentPCIE())
##############################################
# Device methods
##############################################
@ -189,19 +196,7 @@ class Chassis(ChassisBase):
is "REBOOT_CAUSE_HARDWARE_OTHER", the second string can be used
to pass a description of the reboot cause.
"""
hw_reboot_cause = ""
with open("/sys/class/watchdog/watchdog0/reboot_reason", "r") as f:
hw_reboot_cause = f.read().strip('\n')
if hw_reboot_cause == "2":
reboot_cause = self.REBOOT_CAUSE_WATCHDOG
description = 'Hardware Watchdog Reset'
else:
reboot_cause = self.REBOOT_CAUSE_NON_HARDWARE
description = 'Unknown reason'
return (reboot_cause, description)
return (ChassisBase.REBOOT_CAUSE_HARDWARE_OTHER, "Invalid Reason")
##############################################
# Other methods
@ -239,10 +234,10 @@ class Chassis(ChassisBase):
cur_xcvr_presence = self._sfp_list[index-1].get_presence()
if cur_xcvr_presence != self.__xcvr_presence[index]:
if cur_xcvr_presence is True:
xcvr_change_event_dict[str(index)] = '1'
xcvr_change_event_dict[index] = '1'
self.__xcvr_presence[index] = True
elif cur_xcvr_presence is False:
xcvr_change_event_dict[str(index)] = '0'
xcvr_change_event_dict[index] = '0'
self.__xcvr_presence[index] = False
event = True

View File

@ -0,0 +1,202 @@
#!/usr/bin/env python
########################################################################
# Quanta IX7
#
# Name: component.py, version: 1.3
# Module contains an implementation of SONiC Platform Base API and
# provides the Components' (e.g., BIOS, CPLD, FPGA, etc.) available in
# the platform
#
########################################################################
try:
import subprocess
from sonic_platform_base.component_base import ComponentBase
from collections import namedtuple
except ImportError as e:
raise ImportError(str(e) + "- required module not found")
class Component(ComponentBase):
def __init__(self):
ComponentBase.__init__(self)
self.name = None
self.description = None
def get_name(self):
return self.name
def get_description(self):
return self.description
def install_firmware(self, image_path):
"""
Installs firmware to the component
Args:
image_path: A string, path to firmware image
Returns:
A boolean, True if install was successful, False if not
"""
return False
@staticmethod
def _get_command_result(cmdline):
try:
proc = subprocess.Popen(cmdline,
stdout=subprocess.PIPE,
shell=True, stderr=subprocess.STDOUT,
universal_newlines=True)
stdout = proc.communicate()[0]
rc = proc.wait()
result = stdout.rstrip('\n')
if rc != 0:
raise RuntimeError("Failed to execute command {}, return code {}, {}".format(cmdline, rc, stdout))
except OSError as e:
raise RuntimeError("Failed to execute command {} due to {}".format(cmdline, repr(e)))
return result
class ComponentBIOS(Component):
COMPONENT_NAME = 'BIOS'
COMPONENT_DESCRIPTION = 'BIOS - Basic Input/Output System'
BIOS_QUERY_VERSION_COMMAND = "dmidecode -s bios-version"
def __init__(self):
super(ComponentBIOS, self).__init__()
self.name = self.COMPONENT_NAME
self.description = self.COMPONENT_DESCRIPTION
def get_firmware_version(self):
"""
Retrieves the firmware version of the component
Returns:
A string containing the firmware version of the component
"""
bios_ver = self._get_command_result(self.BIOS_QUERY_VERSION_COMMAND)
if not bios_ver:
return 'ERR'
else:
return bios_ver
class ComponentBMC(Component):
COMPONENT_NAME = 'BMC'
COMPONENT_DESCRIPTION = 'BMC - Board Management Controller'
BMC_QUERY_VERSION_COMMAND = "ipmitool mc info | grep 'Firmware Revision'"
def __init__(self):
super(ComponentBMC, self).__init__()
self.name = self.COMPONENT_NAME
self.description = self.COMPONENT_DESCRIPTION
def get_firmware_version(self):
"""
Retrieves the firmware version of the component
Returns:
A string containing the firmware version of the component
"""
bmc_ver = self._get_command_result(self.BMC_QUERY_VERSION_COMMAND)
if not bmc_ver:
return 'ERR'
else:
bmc_ver = bmc_ver.split(": ")[1]
return bmc_ver.strip()
class ComponentCPLD(Component):
Cpld = namedtuple("Cpld", ['name', 'cmd_index', 'description'])
cplds = {
1: Cpld("UART_CPLD", 1, "UART"),
2: Cpld("BOOT_CPLD", 2, "Power sequence"),
3: Cpld("FAN_CPLD", 3, "Fan"),
4: Cpld("MB_CPLD_IO_1", 5, "Port IO-1"),
5: Cpld("MB_CPLD_IO_2", 6, "Port IO-2"),
6: Cpld("MB_CPLD_LED_1", 4, "Port LED-1"),
7: Cpld("MB_CPLD_LED_2", 7, "Port LED-2"),
}
def __init__(self, component_index):
super(ComponentCPLD, self).__init__()
self.index = component_index
def get_name(self):
"""
Retrieves the name of the component
Returns:
A string containing the name of the component
"""
self.name = self.cplds[self.index].name
return self.name
def get_description(self):
"""
Retrieves the description of the component
Returns:
A string containing the description of the component
"""
self.description = self.cplds[self.index].description
return self.description
def get_firmware_version(self):
"""
Retrieves the firmware version of the component
Returns:
A string containing the firmware version of the component
"""
res = self._get_command_result("ipmitool raw 0x32 0xff 0x02 {}".format(self.cplds[self.index].cmd_index))
if not res:
return 'ERR'
else:
return res.split()[3].upper() + res.split()[2].upper() + res.split()[1].upper() + res.split()[0].upper()
@classmethod
def get_component_list(cls):
component_list = []
cpld_number = len(cls.cplds)
for cpld_idx in range(1, cpld_number + 1):
component_list.append(cls(cpld_idx))
return component_list
class ComponentPCIE(Component):
COMPONENT_NAME = 'PCIe'
COMPONENT_DESCRIPTION = 'ASIC PCIe Firmware'
PCIE_QUERY_VERSION_COMMAND = "bcmcmd 'pciephy fw version' | grep 'FW version'"
def __init__(self):
super(ComponentPCIE, self).__init__()
self.name = self.COMPONENT_NAME
self.description = self.COMPONENT_DESCRIPTION
def get_firmware_version(self):
"""
Retrieves the firmware version of the component
Returns:
A string containing the firmware version of the component
"""
version = self._get_command_result(self.PCIE_QUERY_VERSION_COMMAND)
if not version:
return 'ERR'
else:
version = version.split(": ")[1]
return version.strip()

View File

@ -28,7 +28,7 @@ class FanDrawer(FanDrawerBase):
Returns:
string: The name of the device
"""
return 'Fan {}'.format(self._index)
return 'Fantray{}'.format(self._index)
def get_presence(self):
"""

View File

@ -213,10 +213,10 @@ class Psu(PsuBase):
def get_input_voltage(self):
"""
Retrieves current PSU voltage output
Retrieves current PSU voltage input
Returns:
A float number, the output voltage in volts,
A float number, the input voltage in volts,
e.g. 12.1
"""
voltage_in = 0.0

View File

@ -10,13 +10,10 @@
import os
import time
#import subprocess
#import sonic_device_util
from ctypes import create_string_buffer
try:
from sonic_platform_base.sfp_base import SfpBase
# from sonic_platform_base.sonic_eeprom import eeprom_dts
from sonic_platform_base.sonic_sfp.sff8472 import sff8472InterfaceId
from sonic_platform_base.sonic_sfp.sff8472 import sff8472Dom
from sonic_platform_base.sonic_sfp.sff8436 import sff8436InterfaceId
@ -175,7 +172,6 @@ class Sfp(SfpBase):
# Init index
self.index = sfp_index
self.port_num = self.index
#self.dom_supported = False
self.sfp_type = sfp_type
self.lpmode_path = "/sys/class/cpld-qsfp28/port-"+str(self.port_num)+"/lpmode"
self.reset_path = "/sys/class/cpld-qsfp28/port-"+str(self.port_num)+"/reset"
@ -262,15 +258,6 @@ class Sfp(SfpBase):
else:
return 'N/A'
def __read_txt_file(self, file_path):
try:
with open(file_path, 'r') as fd:
data = fd.read()
return data.strip()
except IOError:
pass
return ""
def __is_host(self):
return os.system(self.HOST_CHK_CMD) == 0
@ -325,26 +312,6 @@ class Sfp(SfpBase):
return eeprom_raw
def __convert_string_to_num(self, value_str):
if "-inf" in value_str:
return 'N/A'
elif "Unknown" in value_str:
return 'N/A'
elif 'dBm' in value_str:
t_str = value_str.rstrip('dBm')
return float(t_str)
elif 'mA' in value_str:
t_str = value_str.rstrip('mA')
return float(t_str)
elif 'C' in value_str:
t_str = value_str.rstrip('C')
return float(t_str)
elif 'Volts' in value_str:
t_str = value_str.rstrip('Volts')
return float(t_str)
else:
return 'N/A'
def _dom_capability_detect(self):
if not self.get_presence():
self.dom_supported = False
@ -503,9 +470,7 @@ class Sfp(SfpBase):
else:
if not self.get_presence():
return transceiver_info_dict
elif i == max_retry-1:
pass
else:
elif i < max_retry-1:
time.sleep(0.5)
if sfp_interface_bulk_raw is None:
@ -560,7 +525,8 @@ class Sfp(SfpBase):
['data']['Extended Identifier']['value']
transceiver_info_dict['ext_rateselect_compliance'] = sfp_interface_bulk_data \
['data']['RateIdentifier']['value']
transceiver_info_dict['type_abbrv_name'] = 'N/A'
transceiver_info_dict['type_abbrv_name'] = sfp_interface_bulk_data \
['data']['type_abbrv_name']['value']
if self.sfp_type == QSFP_TYPE:
for key in qsfp_cable_length_tup:
if key in sfp_interface_bulk_data['data']:
@ -830,7 +796,7 @@ class Sfp(SfpBase):
transceiver_dom_threshold_dict['txbiaslowwarning'] = channel_threshold_data['TxBiasLowWarning']['value']
for key in transceiver_dom_threshold_dict:
transceiver_dom_threshold_dict[key] = self.__convert_string_to_num(transceiver_dom_threshold_dict[key])
transceiver_dom_threshold_dict[key] = self._convert_string_to_num(transceiver_dom_threshold_dict[key])
return transceiver_dom_threshold_dict
@ -878,7 +844,7 @@ class Sfp(SfpBase):
transceiver_dom_threshold_info_dict['rxpowerlowwarning'] = dom_module_threshold_data['data']['RXPowerLowWarning']['value']
for key in transceiver_dom_threshold_info_dict:
transceiver_dom_threshold_info_dict[key] = self.__convert_string_to_num(transceiver_dom_threshold_info_dict[key])
transceiver_dom_threshold_info_dict[key] = self._convert_string_to_num(transceiver_dom_threshold_info_dict[key])
return transceiver_dom_threshold_info_dict
@ -1425,7 +1391,7 @@ class Sfp(SfpBase):
sysfsfile_eeprom = open(
sysfs_sfp_i2c_client_eeprom_path, mode="r+b", buffering=0)
buffer = create_string_buffer(1)
buffer[0] = chr(tx_disable_ctl)
buffer[0] = tx_disable_ctl
# Write to eeprom
sysfsfile_eeprom.seek(offset + SFP_STATUS_CONTROL_OFFSET)
sysfsfile_eeprom.write(buffer[0])
@ -1478,7 +1444,7 @@ class Sfp(SfpBase):
else:
tx_disable_ctl = channel_state & (~channel)
buffer = create_string_buffer(1)
buffer[0] = chr(tx_disable_ctl)
buffer[0] = tx_disable_ctl
# Write to eeprom
sysfsfile_eeprom = open(
self.port_to_eeprom_mapping[self.port_num], "r+b")
@ -1565,7 +1531,7 @@ class Sfp(SfpBase):
power_set_bit |= 1 << 1
buffer = create_string_buffer(1)
buffer[0] = chr(power_override_bit | power_set_bit)
buffer[0] = power_override_bit | power_set_bit
# Write to eeprom
sysfsfile_eeprom = open(self.port_to_eeprom_mapping[self.port_num], "r+b")
sysfsfile_eeprom.seek(QSFP_POWEROVERRIDE_OFFSET)

View File

@ -1,7 +1,7 @@
#!/usr/bin/env python
#############################################################################
# Quanta
# Quanta IX7
#
# Module contains an implementation of SONiC Platform Base API and
# provides the Thermal information
@ -57,7 +57,7 @@ class Thermal(ThermalBase):
with open(attr_path, 'r') as fd:
retval = fd.read()
except Exception as error:
logging.error("Unable to open ", attr_path, " file !")
logging.error("Unable to open " + attr_path + " file !")
retval = retval.rstrip(' \t\n\r')
return retval

View File

@ -48,12 +48,16 @@ WD_MAIN_IDENTITY = "iTCO_wdt"
WDT_SYSFS_PATH = "/sys/class/watchdog/"
DEFAULT_TIMEOUT=180
watchdog=0
class Watchdog(WatchdogBase):
def __init__(self):
self.watchdog, self.wdt_main_dev_name = self._get_wdt()
if self.wdt_main_dev_name is None:
raise Exception("Watchdog device is not instantiated")
self.status_path = "/sys/class/watchdog/%s/status" % self.wdt_main_dev_name
self.state_path = "/sys/class/watchdog/%s/state" % self.wdt_main_dev_name
self.timeout_path = "/sys/class/watchdog/%s/timeout" % self.wdt_main_dev_name
@ -74,14 +78,16 @@ class Watchdog(WatchdogBase):
"""
Retrieves watchdog device
"""
global watchdog
wdt_main_dev_list = [dev for dev in os.listdir(
"/dev/") if dev.startswith("watchdog") and self._is_wd_main(dev)]
if not wdt_main_dev_list:
return None
return (None, None)
wdt_main_dev_name = wdt_main_dev_list[0]
watchdog_device_path = "/dev/{}".format(wdt_main_dev_name)
self.watchdog = os.open(watchdog_device_path, os.O_RDWR)
return self.watchdog, wdt_main_dev_name
if not watchdog:
watchdog = os.open(watchdog_device_path, os.O_RDWR)
return watchdog, wdt_main_dev_name
def _read_file(self, file_path):
"""
@ -228,6 +234,7 @@ class Watchdog(WatchdogBase):
Close watchdog
"""
if self.watchdog is not None :
os.close(self.watchdog)

View File

@ -28,7 +28,7 @@ command:
"""
import os
import commands
import subprocess
import sys, getopt
import logging
import time
@ -38,18 +38,16 @@ args = []
FORCE = 0
i2c_prefix = '/sys/bus/i2c/devices/'
if DEBUG == True:
print sys.argv[0]
print 'ARGV :', sys.argv[1:]
print(sys.argv[0])
print('ARGV :', sys.argv[1:])
def main():
global DEBUG
global args
global FORCE
if len(sys.argv)<2:
if len(sys.argv) < 2:
show_help()
options, args = getopt.getopt(sys.argv[1:], 'hdf', ['help',
@ -57,9 +55,9 @@ def main():
'force',
])
if DEBUG == True:
print options
print args
print len(sys.argv)
print(options)
print(args)
print(len(sys.argv))
for opt, arg in options:
if opt in ('-h', '--help'):
@ -79,29 +77,38 @@ def main():
else:
show_help()
return 0
def show_help():
print __doc__ % {'scriptName' : sys.argv[0].split("/")[-1]}
print(__doc__ % {'scriptName' : sys.argv[0].split("/")[-1]})
sys.exit(0)
def show_log(txt):
if DEBUG == True:
print "[IX7-32X]"+txt
print("[IX7-32X]" + txt)
return
def exec_cmd(cmd, show):
logging.info('Run :'+cmd)
status, output = commands.getstatusoutput(cmd)
logging.info('Run :' + cmd)
status, output = subprocess.getstatusoutput(cmd)
show_log (cmd +"with result:" + str(status))
show_log (" output:"+output)
show_log (" output:" + output)
if status:
logging.info('Failed :'+cmd)
logging.info('Failed :' + cmd)
if show:
print('Failed :'+cmd)
print('Failed :' + cmd)
return status, output
pca954x_bus_addr =[
'0-0071',
'0-0072',
'0-0077',
'5-0073',
'6-0073',
'7-0073',
'8-0073'
]
instantiate =[
#Enable front-ports LED decoding
'echo 1 > /sys/class/cpld-led/CPLDLED-1/led_decode',
@ -119,7 +126,7 @@ drivers =[
'lpc_ich',
'i2c-i801',
'i2c-dev',
'i2c-mux-pca954x force_deselect_on_exit=1',
'i2c-mux-pca954x',
'gpio-pca953x',
'optoe',
'qci_cpld',
@ -155,12 +162,25 @@ def system_install():
exec_cmd("depmod -a ", 1)
#install drivers
for i in range(0,len(drivers)):
status, output = exec_cmd("modprobe "+drivers[i], 1)
status, output = exec_cmd("modprobe " + drivers[i], 1)
if status:
print output
if FORCE == 0:
print(output)
#retry quanta_hwmon_ipmi in case it init failed due to ipmi_msghandler init uncompleted
if drivers[i] == 'quanta_hwmon_ipmi':
for _ in range(0, 3):
time.sleep(3)
ret, out = exec_cmd("modprobe quanta_hwmon_ipmi ", 1)
if ret == 0:
break
if ret and FORCE == 0:
return ret
elif FORCE == 0:
return status
# set pca954x idle_state as -2: MUX_IDLE_DISCONNECT
for i in range(0,len(pca954x_bus_addr)):
exec_cmd("echo -2 > /sys/bus/i2c/drivers/pca954x/{}/idle_state".format(pca954x_bus_addr[i]), 1)
#turn on module power
exec_cmd("echo 21 > /sys/class/gpio/export ", 1)
exec_cmd("echo high > /sys/class/gpio/gpio21/direction ", 1)
@ -174,15 +194,15 @@ def system_install():
exec_cmd("echo 1 >/sys/class/gpio/gpio33/value", 1)
#instantiate devices
for i in range(0,len(instantiate)):
for i in range(0, len(instantiate)):
status, output = exec_cmd(instantiate[i], 1)
if status:
print output
print(output)
if FORCE == 0:
return status
#QSFP for 1~32 port
for port_number in range(1,33):
for port_number in range(1, 33):
bus_number = port_number + 16
os.system("echo %d >/sys/bus/i2c/devices/%d-0050/port_name" % (port_number, bus_number))
return
@ -195,7 +215,7 @@ def system_ready():
def install():
if not device_found():
print "No device, installing...."
print("No device, installing....")
status = system_install()
if status:
if FORCE == 0:
@ -203,28 +223,29 @@ def install():
status, output = exec_cmd("pip3 install /usr/share/sonic/device/x86_64-quanta_ix7_rglbmc-r0/sonic_platform-1.0-py3-none-any.whl",1)
if status:
print output
print(output)
if FORCE == 0:
return status
else:
print " ix7 driver already installed...."
print(" ix7 driver already installed....")
return
def uninstall():
global FORCE
#uninstall drivers
for i in range(len(un_drivers)-1,-1,-1):
status, output = exec_cmd("rmmod "+un_drivers[i], 1)
for i in range(len(un_drivers) - 1, -1, -1):
status, output = exec_cmd("rmmod " + un_drivers[i], 1)
if status:
print output
print(output)
if FORCE == 0:
return status
status, output = exec_cmd("pip3 uninstall sonic-platform -y ",1)
if status:
print output
print(output)
if FORCE == 0:
return status
return
def device_found():

View File

@ -51,7 +51,7 @@ static struct class *cpld_class = NULL;
struct cpld_data {
struct i2c_client *cpld_client;
char name[8];
char name[16];
u8 cpld_id;
};

View File

@ -86,6 +86,8 @@
#define IPMI_TIMEOUT (4 * HZ)
#define IPMI_MAX_WAIT_QUEUE 1
typedef struct ipmi_user *ipmi_user_t;
struct quanta_hwmon_ipmi_data
{
struct platform_device *ipmi_platform_dev;
@ -1829,7 +1831,7 @@ static int32_t __init quanta_hwmon_ipmi_init(void)
goto device_reg_err;
}
data->ipmi_hwmon_dev = hwmon_device_register_with_groups(NULL, DRVNAME, NULL,
data->ipmi_hwmon_dev = hwmon_device_register_with_groups(&data->ipmi_platform_dev->dev, DRVNAME, NULL,
NULL);
err = IS_ERR(data->ipmi_hwmon_dev);
if (err)
@ -1856,21 +1858,15 @@ static int32_t __init quanta_hwmon_ipmi_init(void)
return 0;
init_sensor_err:
if (g_sensor_data)
{
kfree(g_sensor_data);
g_sensor_data = NULL;
}
ipmi_create_err:
hwmon_device_unregister(data->ipmi_hwmon_dev);
hwmon_register_err:
platform_device_unregister(data->ipmi_platform_dev);
device_reg_err:
if (data)
{
kfree(data);
data = NULL;
}
alloc_err:
return err;
}
@ -1886,17 +1882,10 @@ static void __exit quanta_hwmon_ipmi_exit(void)
platform_device_unregister(data->ipmi_platform_dev);
if (g_sensor_data)
{
kfree(g_sensor_data);
g_sensor_data = NULL;
}
if (data)
{
kfree(data);
data = NULL;
}
}
module_init(quanta_hwmon_ipmi_init);

View File

@ -148,9 +148,9 @@ static int __init ix7_bwde_platform_init(void)
}
else
{
g_client[0] = i2c_new_device(adapter, &ix7_bwde_i2c_devices[0]); // pca9546
g_client[1] = i2c_new_device(adapter, &ix7_bwde_i2c_devices[1]); // pca9548
g_client[2] = i2c_new_device(adapter, &ix7_bwde_i2c_devices[10]); // CPU Board Data
g_client[0] = i2c_new_client_device(adapter, &ix7_bwde_i2c_devices[0]); // pca9546
g_client[1] = i2c_new_client_device(adapter, &ix7_bwde_i2c_devices[1]); // pca9548
g_client[2] = i2c_new_client_device(adapter, &ix7_bwde_i2c_devices[10]); // CPU Board Data
i2c_put_adapter(adapter);
}
@ -161,8 +161,8 @@ static int __init ix7_bwde_platform_init(void)
}
else
{
g_client[3] = i2c_new_device(adapter, &ix7_bwde_i2c_devices[8]); // CPLD2
g_client[4] = i2c_new_device(adapter, &ix7_bwde_i2c_devices[12]); // CPLD_led_1
g_client[3] = i2c_new_client_device(adapter, &ix7_bwde_i2c_devices[8]); // CPLD2
g_client[4] = i2c_new_client_device(adapter, &ix7_bwde_i2c_devices[12]); // CPLD_led_1
i2c_put_adapter(adapter);
}
@ -173,8 +173,8 @@ static int __init ix7_bwde_platform_init(void)
}
else
{
g_client[5] = i2c_new_device(adapter, &ix7_bwde_i2c_devices[9]); // CPLD3
g_client[6] = i2c_new_device(adapter, &ix7_bwde_i2c_devices[13]); // CPLD_led_2
g_client[5] = i2c_new_client_device(adapter, &ix7_bwde_i2c_devices[9]); // CPLD3
g_client[6] = i2c_new_client_device(adapter, &ix7_bwde_i2c_devices[13]); // CPLD_led_2
i2c_put_adapter(adapter);
}
@ -185,7 +185,7 @@ static int __init ix7_bwde_platform_init(void)
}
else
{
g_client[7] = i2c_new_device(adapter, &ix7_bwde_i2c_devices[2]); // MB_BOARDINFO_EEPROM
g_client[7] = i2c_new_client_device(adapter, &ix7_bwde_i2c_devices[2]); // MB_BOARDINFO_EEPROM
i2c_put_adapter(adapter);
}
@ -196,7 +196,7 @@ static int __init ix7_bwde_platform_init(void)
}
else
{
g_client[8] = i2c_new_device(adapter, &ix7_bwde_i2c_devices[7]); // pca9555 MB Board Data
g_client[8] = i2c_new_client_device(adapter, &ix7_bwde_i2c_devices[7]); // pca9555 MB Board Data
i2c_put_adapter(adapter);
}
@ -207,7 +207,7 @@ static int __init ix7_bwde_platform_init(void)
}
else
{
g_client[9] = i2c_new_device(adapter, &ix7_bwde_i2c_devices[3]); // pca9548_1 SFP
g_client[9] = i2c_new_client_device(adapter, &ix7_bwde_i2c_devices[3]); // pca9548_1 SFP
i2c_put_adapter(adapter);
}
@ -218,7 +218,7 @@ static int __init ix7_bwde_platform_init(void)
}
else
{
g_client[10] = i2c_new_device(adapter, &ix7_bwde_i2c_devices[4]); // pca9548_2 SFP
g_client[10] = i2c_new_client_device(adapter, &ix7_bwde_i2c_devices[4]); // pca9548_2 SFP
i2c_put_adapter(adapter);
}
@ -229,7 +229,7 @@ static int __init ix7_bwde_platform_init(void)
}
else
{
g_client[11] = i2c_new_device(adapter, &ix7_bwde_i2c_devices[5]); // pca9548_3 SFP
g_client[11] = i2c_new_client_device(adapter, &ix7_bwde_i2c_devices[5]); // pca9548_3 SFP
i2c_put_adapter(adapter);
}
@ -240,7 +240,7 @@ static int __init ix7_bwde_platform_init(void)
}
else
{
g_client[12] = i2c_new_device(adapter, &ix7_bwde_i2c_devices[6]); // pca9548_4 SFP
g_client[12] = i2c_new_client_device(adapter, &ix7_bwde_i2c_devices[6]); // pca9548_4 SFP
i2c_put_adapter(adapter);
}
@ -252,7 +252,7 @@ static int __init ix7_bwde_platform_init(void)
}
else
{
g_client_port[i - 13] = i2c_new_device(adapter, &ix7_bwde_i2c_devices[11]);
g_client_port[i - 13] = i2c_new_client_device(adapter, &ix7_bwde_i2c_devices[11]);
i2c_put_adapter(adapter);
}
}

View File

@ -8,6 +8,7 @@
try:
import sys
import time
import syslog
from sonic_platform_base.chassis_base import ChassisBase
from sonic_platform.eeprom import Eeprom
from sonic_platform.psu import Psu
@ -71,6 +72,13 @@ class Chassis(ChassisBase):
for index in range(1, self.__num_of_ports + 1):
self.__xcvr_presence[index] = self._sfp_list[index-1].get_presence()
# Initialize components
from sonic_platform.component import ComponentBIOS, ComponentBMC, ComponentCPLD, ComponentPCIE
self._component_list.append(ComponentBIOS())
self._component_list.append(ComponentBMC())
self._component_list.extend(ComponentCPLD.get_component_list())
self._component_list.append(ComponentPCIE())
##############################################
# Device methods
##############################################
@ -178,6 +186,39 @@ class Chassis(ChassisBase):
"""
return self._eeprom.system_eeprom_info()
def get_reboot_cause(self):
"""
Retrieves the cause of the previous reboot
Returns:
A tuple (string, string) where the first element is a string
containing the cause of the previous reboot. This string must be
one of the predefined strings in this class. If the first string
is "REBOOT_CAUSE_HARDWARE_OTHER", the second string can be used
to pass a description of the reboot cause.
"""
return (ChassisBase.REBOOT_CAUSE_HARDWARE_OTHER, "Invalid Reason")
##############################################
# Other methods
##############################################
def get_watchdog(self):
"""
Retreives hardware watchdog device on this chassis
Returns:
An object derived from WatchdogBase representing the hardware
watchdog device
"""
try:
if self._watchdog is None:
from sonic_platform.watchdog import Watchdog
# Create the watchdog Instance
self._watchdog = Watchdog()
except Exception as e:
syslog.syslog(syslog.LOG_ERR, "Fail to load watchdog due to {}".format(e))
return self._watchdog
def get_change_event(self, timeout=0):
"""
Currently only support transceiver change events
@ -193,10 +234,10 @@ class Chassis(ChassisBase):
cur_xcvr_presence = self._sfp_list[index-1].get_presence()
if cur_xcvr_presence != self.__xcvr_presence[index]:
if cur_xcvr_presence is True:
xcvr_change_event_dict[str(index)] = '1'
xcvr_change_event_dict[index] = '1'
self.__xcvr_presence[index] = True
elif cur_xcvr_presence is False:
xcvr_change_event_dict[str(index)] = '0'
xcvr_change_event_dict[index] = '0'
self.__xcvr_presence[index] = False
event = True

View File

@ -0,0 +1,203 @@
#!/usr/bin/env python
########################################################################
# Quanta IX7_BDE
#
# Name: component.py, version: 1.3
# Module contains an implementation of SONiC Platform Base API and
# provides the Components' (e.g., BIOS, CPLD, FPGA, etc.) available in
# the platform
#
########################################################################
try:
import subprocess
from sonic_platform_base.component_base import ComponentBase
from collections import namedtuple
except ImportError as e:
raise ImportError(str(e) + "- required module not found")
class Component(ComponentBase):
def __init__(self):
ComponentBase.__init__(self)
self.name = None
self.description = None
def get_name(self):
return self.name
def get_description(self):
return self.description
def install_firmware(self, image_path):
"""
Installs firmware to the component
Args:
image_path: A string, path to firmware image
Returns:
A boolean, True if install was successful, False if not
"""
return False
@staticmethod
def _get_command_result(cmdline):
try:
proc = subprocess.Popen(cmdline,
stdout=subprocess.PIPE,
shell=True, stderr=subprocess.STDOUT,
universal_newlines=True)
stdout = proc.communicate()[0]
rc = proc.wait()
result = stdout.rstrip('\n')
if rc != 0:
raise RuntimeError("Failed to execute command {}, return code {}, {}".format(cmdline, rc, stdout))
except OSError as e:
raise RuntimeError("Failed to execute command {} due to {}".format(cmdline, repr(e)))
return result
class ComponentBIOS(Component):
COMPONENT_NAME = 'BIOS'
COMPONENT_DESCRIPTION = 'BIOS - Basic Input/Output System'
BIOS_QUERY_VERSION_COMMAND = "dmidecode -s bios-version"
def __init__(self):
super(ComponentBIOS, self).__init__()
self.name = self.COMPONENT_NAME
self.description = self.COMPONENT_DESCRIPTION
def get_firmware_version(self):
"""
Retrieves the firmware version of the component
Returns:
A string containing the firmware version of the component
"""
bios_ver = self._get_command_result(self.BIOS_QUERY_VERSION_COMMAND)
if not bios_ver:
return 'ERR'
else:
return bios_ver
class ComponentBMC(Component):
COMPONENT_NAME = 'BMC'
COMPONENT_DESCRIPTION = 'BMC - Board Management Controller'
BMC_QUERY_VERSION_COMMAND = "ipmitool mc info | grep 'Firmware Revision'"
def __init__(self):
super(ComponentBMC, self).__init__()
self.name = self.COMPONENT_NAME
self.description = self.COMPONENT_DESCRIPTION
def get_firmware_version(self):
"""
Retrieves the firmware version of the component
Returns:
A string containing the firmware version of the component
"""
bmc_ver = self._get_command_result(self.BMC_QUERY_VERSION_COMMAND)
if not bmc_ver:
return 'ERR'
else:
bmc_ver = bmc_ver.split(": ")[1]
return bmc_ver.strip()
class ComponentCPLD(Component):
Cpld = namedtuple("Cpld", ['name', 'cmd_index', 'description'])
cplds = {
1: Cpld("BOOT_CPLD", 1, "Power sequence"),
2: Cpld("FAN_CPLD", 2, "Fan"),
3: Cpld("MB_CPLD_IO_1", 4, "Port IO-1"),
4: Cpld("MB_CPLD_IO_2", 5, "Port IO-2"),
5: Cpld("MB_CPLD_LED_1", 3, "Port LED-1"),
6: Cpld("MB_CPLD_LED_2", 6, "Port LED-2"),
}
def __init__(self, component_index):
super(ComponentCPLD, self).__init__()
self.index = component_index
def get_name(self):
"""
Retrieves the name of the component
Returns:
A string containing the name of the component
"""
self.name = self.cplds[self.index].name
return self.name
def get_description(self):
"""
Retrieves the description of the component
Returns:
A string containing the description of the component
"""
self.description = self.cplds[self.index].description
return self.description
def get_firmware_version(self):
"""
Retrieves the firmware version of the component
Returns:
A string containing the firmware version of the component
"""
self._get_command_result("ipmitool raw 0x30 0xe0 0xd0 0x01 0x01")
res = self._get_command_result("ipmitool raw 0x32 0xff 0x02 {}".format(self.cplds[self.index].cmd_index))
self._get_command_result("ipmitool raw 0x30 0xe0 0xd0 0x01 0x00")
if not res:
return 'ERR'
else:
return res.split()[3].upper() + res.split()[2].upper() + res.split()[1].upper() + res.split()[0].upper()
@classmethod
def get_component_list(cls):
component_list = []
cpld_number = len(cls.cplds)
for cpld_idx in range(1, cpld_number + 1):
component_list.append(cls(cpld_idx))
return component_list
class ComponentPCIE(Component):
COMPONENT_NAME = 'PCIe'
COMPONENT_DESCRIPTION = 'ASIC PCIe Firmware'
PCIE_QUERY_VERSION_COMMAND = "bcmcmd 'pciephy fw version' | grep 'FW version'"
def __init__(self):
super(ComponentPCIE, self).__init__()
self.name = self.COMPONENT_NAME
self.description = self.COMPONENT_DESCRIPTION
def get_firmware_version(self):
"""
Retrieves the firmware version of the component
Returns:
A string containing the firmware version of the component
"""
version = self._get_command_result(self.PCIE_QUERY_VERSION_COMMAND)
if not version:
return 'ERR'
else:
version = version.split(": ")[1]
return version.strip()

View File

@ -1,7 +1,7 @@
#!/usr/bin/env python
#############################################################################
# Quanta IX7
# Quanta IX7_BDE
#
# Module contains an implementation of SONiC Platform Base API and
# provides the FAN information
@ -11,6 +11,7 @@
try:
import logging
import os
import glob
from sonic_platform_base.fan_base import FanBase
except ImportError as e:
raise ImportError(str(e) + "- required module not found")
@ -19,9 +20,7 @@ except ImportError as e:
###############
# Global
###############
HWMON_DIR = "/sys/class/hwmon/hwmon2/"
FAN_INDEX_START = 18
NUM_FANTRAYS = 6
HWMON_IPMI_DIR = "/sys/devices/platform/quanta_hwmon_ipmi/hwmon/hwmon*/"
FANS_PERTRAY = 2
class Fan(FanBase):
@ -30,30 +29,46 @@ class Fan(FanBase):
def __init__(self, index, is_psu_fan=False):
self.is_psu_fan = is_psu_fan
self.fan_index = index
self.psu_fan_index_mapping = {
1:37,
2:47,
}
self.psu_index_mapping = {
1:39,
2:49,
}
hwmon_dir=glob.glob(HWMON_IPMI_DIR)[0]
if self.is_psu_fan:
self.fan_presence_attr = "power{}_present".format(self.psu_index_mapping[index])
self.fan_pwm_attr = "fan{}_pwm".format(self.psu_fan_index_mapping[index])
self.fan_rpm_attr = "fan{}_input".format(self.psu_fan_index_mapping[index])
self.fan_direction_attr = "fan{}_direction".format(self.psu_fan_index_mapping[index])
power_out_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_POWER_OUT".format(self.fan_index), 'power')
fan_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_Fan".format(self.fan_index), 'fan')
self.fan_presence_attr = power_out_prefix + 'present'
self.fan_pwm_attr = fan_prefix + 'pwm'
self.fan_rpm_attr = fan_prefix + 'input'
self.fan_direction_attr = fan_prefix + 'direction'
else:
self.fan_presence_attr = "fan{}_present".format(FAN_INDEX_START+(index-1))
self.fan_pwm_attr = "fan{}_pwm".format(FAN_INDEX_START+(index-1))
self.fan_rpm_attr = "fan{}_input".format(FAN_INDEX_START+(index-1))
self.fan_direction_attr = "fan{}_direction".format(FAN_INDEX_START+(index-1))
fantray_index = (self.fan_index-1)//FANS_PERTRAY+1
fan_index_intray = self.fan_index - ((fantray_index-1)*FANS_PERTRAY)
fan_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "Fan_SYS_{}_{}".format(fantray_index, fan_index_intray), 'fan')
self.fan_presence_attr = fan_prefix + 'present'
self.fan_pwm_attr = fan_prefix + 'pwm'
self.fan_rpm_attr = fan_prefix + 'input'
self.fan_direction_attr = fan_prefix + 'direction'
#######################
# private function
#######################
def __get_hwmon_attr_prefix(self, dir, label, type):
retval = 'ERR'
if not os.path.isdir(dir):
return retval
try:
for filename in os.listdir(dir):
if filename[-5:] == 'label' and type in filename:
file_path = os.path.join(dir, filename)
if os.path.isfile(file_path) and label == self.__get_attr_value(file_path):
return file_path[0:-5]
except Exception as error:
logging.error("Error when getting {} label path: {}".format(label, error))
return retval
def __get_attr_value(self, attr_path):
retval = 'ERR'
@ -64,7 +79,7 @@ class Fan(FanBase):
with open(attr_path, 'r') as fd:
retval = fd.read()
except Exception as error:
logging.error("Unable to open " + attr_path + " file !")
logging.error("Unable to open {} file: {}".format(attr_path, error))
retval = retval.rstrip(' \t\n\r')
return retval
@ -95,8 +110,7 @@ class Fan(FanBase):
Returns:
bool: True if device is present, False if not
"""
attr_path = HWMON_DIR + self.fan_presence_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.fan_presence_attr)
if (attr_rv != 'ERR'):
if (attr_rv == '1'):
return True
@ -112,13 +126,15 @@ class Fan(FanBase):
Returns:
A boolean value, True if device is operating properly, False if not
"""
attr_path = HWMON_DIR + self.fan_rpm_attr
attr_rv = self.__get_attr_value(attr_path)
if self.get_presence():
attr_rv = self.__get_attr_value(self.fan_rpm_attr)
if (attr_rv != 'ERR' and attr_rv != '0.0'):
return True
else:
return False
else:
return False
#################
# fan base
@ -132,8 +148,7 @@ class Fan(FanBase):
A string, either FAN_DIRECTION_INTAKE or FAN_DIRECTION_EXHAUST
depending on fan direction
"""
attr_path = HWMON_DIR + self.fan_direction_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.fan_direction_attr)
if attr_rv == '2':
return self.FAN_DIRECTION_INTAKE
@ -148,13 +163,15 @@ class Fan(FanBase):
An integer, the percentage of full fan speed, in the range 0 (off)
to 100 (full speed)
"""
attr_path = HWMON_DIR + self.fan_pwm_attr
attr_rv = self.__get_attr_value(attr_path)
if self.get_presence():
attr_rv = self.__get_attr_value(self.fan_pwm_attr)
if (attr_rv != 'ERR'):
return int(float(attr_rv))
else:
return False
else:
return 0
def get_speed_rpm(self):
"""
@ -163,8 +180,7 @@ class Fan(FanBase):
Returns:
An integer, speed of the fan in RPM
"""
attr_path = HWMON_DIR + self.fan_rpm_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.fan_rpm_attr)
if (attr_rv != 'ERR'):
return int(float(attr_rv))
@ -179,8 +195,7 @@ class Fan(FanBase):
An integer, the percentage of full fan speed, in the range 0 (off)
to 100 (full speed)
"""
attr_path = HWMON_DIR + self.fan_pwm_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.fan_pwm_attr)
if (attr_rv != 'ERR'):
return int(float(attr_rv))

View File

@ -28,7 +28,7 @@ class FanDrawer(FanDrawerBase):
Returns:
string: The name of the device
"""
return 'Fan {}'.format(self._index)
return 'Fantray{}'.format(self._index)
def get_presence(self):
"""

View File

@ -8,58 +8,61 @@
try:
import logging
import os
import glob
from sonic_platform_base.psu_base import PsuBase
from sonic_platform.fan import Fan
except ImportError as e:
raise ImportError(str(e) + "- required module not found")
HWMON_DIR = "/sys/class/hwmon/hwmon2/"
HWMON_IPMI_DIR = "/sys/devices/platform/quanta_hwmon_ipmi/hwmon/hwmon*/"
class Psu(PsuBase):
def __init__(self, index):
PsuBase.__init__(self)
fan = Fan(index, True)
self._fan_list.append(fan)
self.psu_index_mapping = {
1:39,
2:49,
}
self.psu_powerin_index_mapping = {
1:38,
2:48,
}
self.psu_currentout_index_mapping = {
1:36,
2:46,
}
self.psu_currentin_index_mapping = {
1:35,
2:45,
}
self.psu_voltageout_index_mapping = {
1:44,
2:54,
}
self.psu_voltagein_index_mapping = {
1:43,
2:53,
}
self.index = index
self.psu_presence_attr = "power{}_present".format(self.psu_index_mapping[self.index])
self.psu_status_attr = "curr{}_input".format(self.psu_currentout_index_mapping[self.index])
self.psu_power_in_attr = "power{}_input".format(self.psu_powerin_index_mapping[self.index])
self.psu_power_out_attr = "power{}_input".format(self.psu_index_mapping[self.index])
self.psu_voltage_out_attr = "in{}_input".format(self.psu_voltageout_index_mapping[self.index])
self.psu_current_out_attr = "curr{}_input".format(self.psu_currentout_index_mapping[self.index])
self.psu_voltage_in_attr = "in{}_input".format(self.psu_voltagein_index_mapping[self.index])
self.psu_current_in_attr = "curr{}_input".format(self.psu_currentin_index_mapping[self.index])
self.psu_serial_attr = "power{}_sn".format(self.psu_index_mapping[self.index])
self.psu_model_attr = "power{}_model".format(self.psu_index_mapping[self.index])
self.psu_mfr_id_attr = "power{}_mfrid".format(self.psu_index_mapping[self.index])
self.psu_capacity_attr = "power{}_pout_max".format(self.psu_index_mapping[self.index])
self.psu_type_attr = "power{}_vin_type".format(self.psu_index_mapping[self.index])
hwmon_dir=glob.glob(HWMON_IPMI_DIR)[0]
current_in_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_CURRENT_IN".format(self.index), 'curr')
current_out_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_CURRENT_OUT".format(self.index), 'curr')
power_in_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_POWER_IN".format(self.index), 'power')
power_out_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_POWER_OUT".format(self.index), 'power')
voltage_in_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_VOLTAGE_IN".format(self.index), 'in')
voltage_out_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_VOLTAGE_OUT".format(self.index), 'in')
temp1_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_TEMP1".format(self.index), 'temp')
self.psu_current_in_attr = current_in_prefix + 'input'
self.psu_current_out_attr = current_out_prefix + 'input'
self.psu_power_in_attr = power_in_prefix + 'input'
self.psu_power_out_attr = power_out_prefix + 'input'
self.psu_voltage_in_attr = voltage_in_prefix + 'input'
self.psu_voltage_out_attr = voltage_out_prefix + 'input'
self.psu_status_attr = current_out_prefix + 'input'
self.psu_presence_attr = power_out_prefix + 'present'
self.psu_serial_attr = power_out_prefix + 'sn'
self.psu_model_attr = power_out_prefix + 'model'
self.psu_mfr_id_attr = power_out_prefix + 'mfrid'
self.psu_capacity_attr = power_out_prefix + 'pout_max'
self.psu_type_attr = power_out_prefix + 'vin_type'
self.psu_temp_attr = temp1_prefix + 'input'
def __get_hwmon_attr_prefix(self, dir, label, type):
retval = 'ERR'
if not os.path.isdir(dir):
return retval
try:
for filename in os.listdir(dir):
if filename[-5:] == 'label' and type in filename:
file_path = os.path.join(dir, filename)
if os.path.isfile(file_path) and label == self.__get_attr_value(file_path):
return file_path[0:-5]
except Exception as error:
logging.error("Error when getting {} label path: {}".format(label, error))
return retval
def __get_attr_value(self, attr_path):
@ -71,10 +74,9 @@ class Psu(PsuBase):
with open(attr_path, 'r') as fd:
retval = fd.read()
except Exception as error:
logging.error("Unable to open " + attr_path + " file !")
logging.error("Unable to open {} file: {}".format(attr_path, error))
retval = retval.rstrip(' \t\n\r')
fd.close()
return retval
##############################################
@ -98,10 +100,9 @@ class Psu(PsuBase):
bool: True if device is present, False if not
"""
presence = False
attr_path = HWMON_DIR+self.psu_presence_attr
attr_normal = '1'
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.psu_presence_attr)
if (attr_rv != 'ERR'):
if (attr_rv == attr_normal):
presence = True
@ -116,8 +117,7 @@ class Psu(PsuBase):
string: Model/part number of device
"""
model = "N/A"
attr_path = HWMON_DIR+self.psu_model_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.psu_model_attr)
if (attr_rv != 'ERR'):
model = attr_rv
@ -131,8 +131,7 @@ class Psu(PsuBase):
string: Manufacturer's id of device
"""
mfr_id = "N/A"
attr_path = HWMON_DIR+self.psu_mfr_id_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.psu_mfr_id_attr)
if (attr_rv != 'ERR'):
mfr_id = attr_rv
@ -146,9 +145,7 @@ class Psu(PsuBase):
string: Serial number of device
"""
serial = "N/A"
attr_path = HWMON_DIR+self.psu_serial_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.psu_serial_attr)
if (attr_rv != 'ERR'):
serial = attr_rv
@ -162,9 +159,7 @@ class Psu(PsuBase):
A boolean value, True if device is operating properly, False if not
"""
status = False
attr_path = HWMON_DIR+self.psu_status_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.psu_status_attr)
if (attr_rv != 'ERR'):
attr_rv, dummy = attr_rv.split('.', 1)
if (int(attr_rv) != 0):
@ -185,9 +180,7 @@ class Psu(PsuBase):
e.g. 12.1
"""
voltage_out = 0.0
attr_path = HWMON_DIR+self.psu_voltage_out_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.psu_voltage_out_attr)
if (attr_rv != 'ERR'):
attr_rv, dummy = attr_rv.split('.', 1)
voltage_out = float(attr_rv) / 1000
@ -202,9 +195,7 @@ class Psu(PsuBase):
A float number, the electric current in amperes, e.g 15.4
"""
current_out = 0.0
attr_path = HWMON_DIR+self.psu_current_out_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.psu_current_out_attr)
if (attr_rv != 'ERR'):
attr_rv, dummy = attr_rv.split('.', 1)
current_out = float(attr_rv) / 1000
@ -213,16 +204,14 @@ class Psu(PsuBase):
def get_input_voltage(self):
"""
Retrieves current PSU voltage output
Retrieves current PSU voltage input
Returns:
A float number, the output voltage in volts,
A float number, the input voltage in volts,
e.g. 12.1
"""
voltage_in = 0.0
attr_path = HWMON_DIR+self.psu_voltage_in_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.psu_voltage_in_attr)
if (attr_rv != 'ERR'):
attr_rv, dummy = attr_rv.split('.', 1)
voltage_in = float(attr_rv) / 1000
@ -237,9 +226,7 @@ class Psu(PsuBase):
A float number, the electric current in amperes, e.g 15.4
"""
current_in = 0.0
attr_path = HWMON_DIR+self.psu_current_in_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.psu_current_in_attr)
if (attr_rv != 'ERR'):
attr_rv, dummy = attr_rv.split('.', 1)
current_in = float(attr_rv) / 1000
@ -254,9 +241,7 @@ class Psu(PsuBase):
A float number, the power in watts, e.g. 302.6
"""
power_out = 0.0
attr_path = HWMON_DIR+self.psu_power_out_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.psu_power_out_attr)
if (attr_rv != 'ERR'):
attr_rv, dummy = attr_rv.split('.', 1)
power_out = float(attr_rv) / 1000
@ -293,8 +278,7 @@ class Psu(PsuBase):
A string, the type of PSU (AC/DC)
"""
type = "AC"
attr_path = HWMON_DIR+self.psu_type_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.psu_type_attr)
if (attr_rv != 'ERR'):
type = attr_rv
@ -308,8 +292,7 @@ class Psu(PsuBase):
An integer, the capacity of PSU
"""
capacity = 0
attr_path = HWMON_DIR+self.psu_capacity_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.psu_capacity_attr)
if (attr_rv != 'ERR'):
try:
capacity = int(attr_rv)
@ -318,3 +301,19 @@ class Psu(PsuBase):
return capacity
def get_temperature(self):
"""
Retrieves current temperature reading from PSU
Returns:
A float number of current temperature in Celsius up to nearest thousandth
of one degree Celsius, e.g. 30.125
"""
tout = 0.0
attr_rv = self.__get_attr_value(self.psu_temp_attr)
if (attr_rv != 'ERR'):
tout = float(attr_rv)
# tout is in milli degree celcius
return float(tout/1000.0)

View File

@ -10,13 +10,10 @@
import os
import time
#import subprocess
#import sonic_device_util
from ctypes import create_string_buffer
try:
from sonic_platform_base.sfp_base import SfpBase
# from sonic_platform_base.sonic_eeprom import eeprom_dts
from sonic_platform_base.sonic_sfp.sff8472 import sff8472InterfaceId
from sonic_platform_base.sonic_sfp.sff8472 import sff8472Dom
from sonic_platform_base.sonic_sfp.sff8436 import sff8436InterfaceId
@ -175,7 +172,6 @@ class Sfp(SfpBase):
# Init index
self.index = sfp_index
self.port_num = self.index
#self.dom_supported = False
self.sfp_type = sfp_type
self.lpmode_path = "/sys/class/cpld-qsfp28/port-"+str(self.port_num)+"/lpmode"
self.reset_path = "/sys/class/cpld-qsfp28/port-"+str(self.port_num)+"/reset"
@ -262,15 +258,6 @@ class Sfp(SfpBase):
else:
return 'N/A'
def __read_txt_file(self, file_path):
try:
with open(file_path, 'r') as fd:
data = fd.read()
return data.strip()
except IOError:
pass
return ""
def __is_host(self):
return os.system(self.HOST_CHK_CMD) == 0
@ -325,26 +312,6 @@ class Sfp(SfpBase):
return eeprom_raw
def __convert_string_to_num(self, value_str):
if "-inf" in value_str:
return 'N/A'
elif "Unknown" in value_str:
return 'N/A'
elif 'dBm' in value_str:
t_str = value_str.rstrip('dBm')
return float(t_str)
elif 'mA' in value_str:
t_str = value_str.rstrip('mA')
return float(t_str)
elif 'C' in value_str:
t_str = value_str.rstrip('C')
return float(t_str)
elif 'Volts' in value_str:
t_str = value_str.rstrip('Volts')
return float(t_str)
else:
return 'N/A'
def _dom_capability_detect(self):
if not self.get_presence():
self.dom_supported = False
@ -503,9 +470,7 @@ class Sfp(SfpBase):
else:
if not self.get_presence():
return transceiver_info_dict
elif i == max_retry-1:
pass
else:
elif i < max_retry-1:
time.sleep(0.5)
if sfp_interface_bulk_raw is None:
@ -560,7 +525,8 @@ class Sfp(SfpBase):
['data']['Extended Identifier']['value']
transceiver_info_dict['ext_rateselect_compliance'] = sfp_interface_bulk_data \
['data']['RateIdentifier']['value']
transceiver_info_dict['type_abbrv_name'] = 'N/A'
transceiver_info_dict['type_abbrv_name'] = sfp_interface_bulk_data \
['data']['type_abbrv_name']['value']
if self.sfp_type == QSFP_TYPE:
for key in qsfp_cable_length_tup:
if key in sfp_interface_bulk_data['data']:
@ -830,7 +796,7 @@ class Sfp(SfpBase):
transceiver_dom_threshold_dict['txbiaslowwarning'] = channel_threshold_data['TxBiasLowWarning']['value']
for key in transceiver_dom_threshold_dict:
transceiver_dom_threshold_dict[key] = self.__convert_string_to_num(transceiver_dom_threshold_dict[key])
transceiver_dom_threshold_dict[key] = self._convert_string_to_num(transceiver_dom_threshold_dict[key])
return transceiver_dom_threshold_dict
@ -878,7 +844,7 @@ class Sfp(SfpBase):
transceiver_dom_threshold_info_dict['rxpowerlowwarning'] = dom_module_threshold_data['data']['RXPowerLowWarning']['value']
for key in transceiver_dom_threshold_info_dict:
transceiver_dom_threshold_info_dict[key] = self.__convert_string_to_num(transceiver_dom_threshold_info_dict[key])
transceiver_dom_threshold_info_dict[key] = self._convert_string_to_num(transceiver_dom_threshold_info_dict[key])
return transceiver_dom_threshold_info_dict
@ -1425,7 +1391,7 @@ class Sfp(SfpBase):
sysfsfile_eeprom = open(
sysfs_sfp_i2c_client_eeprom_path, mode="r+b", buffering=0)
buffer = create_string_buffer(1)
buffer[0] = chr(tx_disable_ctl)
buffer[0] = tx_disable_ctl
# Write to eeprom
sysfsfile_eeprom.seek(offset + SFP_STATUS_CONTROL_OFFSET)
sysfsfile_eeprom.write(buffer[0])
@ -1478,7 +1444,7 @@ class Sfp(SfpBase):
else:
tx_disable_ctl = channel_state & (~channel)
buffer = create_string_buffer(1)
buffer[0] = chr(tx_disable_ctl)
buffer[0] = tx_disable_ctl
# Write to eeprom
sysfsfile_eeprom = open(
self.port_to_eeprom_mapping[self.port_num], "r+b")
@ -1565,7 +1531,7 @@ class Sfp(SfpBase):
power_set_bit |= 1 << 1
buffer = create_string_buffer(1)
buffer[0] = chr(power_override_bit | power_set_bit)
buffer[0] = power_override_bit | power_set_bit
# Write to eeprom
sysfsfile_eeprom = open(self.port_to_eeprom_mapping[self.port_num], "r+b")
sysfsfile_eeprom.seek(QSFP_POWEROVERRIDE_OFFSET)

View File

@ -1,7 +1,7 @@
#!/usr/bin/env python
#############################################################################
# Quanta
# Quanta IX7_BDE
#
# Module contains an implementation of SONiC Platform Base API and
# provides the Thermal information
@ -10,45 +10,68 @@
import logging
import os
import glob
try:
from sonic_platform_base.thermal_base import ThermalBase
except ImportError as e:
raise ImportError(str(e) + "- required module not found")
HWMON_DIR = "/sys/class/hwmon/hwmon2/"
HWMON_IPMI_DIR = "/sys/devices/platform/quanta_hwmon_ipmi/hwmon/hwmon*/"
thermal_index_mapping = {
1:40,
2:41,
3:42,
4:50,
5:51,
6:52,
7:73,
8:74,
9:75,
10:76,
11:77,
12:78,
13:79,
14:80,
15:81,
16:82,
17:83,
18:84
1:'PSU1_TEMP1',
2:'PSU1_TEMP2',
3:'PSU1_TEMP3',
4:'PSU2_TEMP1',
5:'PSU2_TEMP2',
6:'PSU2_TEMP3',
7:'Temp_1V05_PCH_VR',
8:'Temp_Ambient_1',
9:'Temp_Ambient_2',
10:'Temp_Ambient_3',
11:'Temp_Ambient_4',
12:'Temp_Ambient_5',
13:'Temp_Ambient_6',
14:'Temp_CPU',
15:'Temp_DDRAB_VR',
16:'Temp_SOC_DIMMA0',
17:'Temp_VCCGBE_VR',
18:'Temp_VCCIN_VR'
}
class Thermal(ThermalBase):
"""Platform-specific Thermal class"""
def __init__(self, thermal_index):
self.index = thermal_index
self.temp_attr = "temp{}_input".format(thermal_index_mapping[self.index])
self.high_th_attr = "temp{}_ncrit".format(thermal_index_mapping[self.index])
self.high_crit_th_attr = "temp{}_crit".format(thermal_index_mapping[self.index])
self.name_attr = "temp{}_label".format(thermal_index_mapping[self.index])
hwmon_dir=glob.glob(HWMON_IPMI_DIR)[0]
thermal_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, thermal_index_mapping[self.index], 'temp')
self.temp_attr = "{}input".format(thermal_prefix)
self.high_th_attr = "{}ncrit".format(thermal_prefix)
self.high_crit_th_attr = "{}crit".format(thermal_prefix)
self.low_th_attr = "{}lncrit".format(thermal_prefix)
self.low_crit_th_attr = "{}lcrit".format(thermal_prefix)
self.name_attr = "{}label".format(thermal_prefix)
def __get_hwmon_attr_prefix(self, dir, label, type):
retval = 'ERR'
if not os.path.isdir(dir):
return retval
try:
for filename in os.listdir(dir):
if filename[-5:] == 'label' and type in filename:
file_path = os.path.join(dir, filename)
if os.path.isfile(file_path) and label == self.__get_attr_value(file_path):
return file_path[0:-5]
except Exception as error:
logging.error("Error when getting {} label path: {}".format(label, error))
return retval
def __get_attr_value(self, attr_path):
@ -60,7 +83,7 @@ class Thermal(ThermalBase):
with open(attr_path, 'r') as fd:
retval = fd.read()
except Exception as error:
logging.error("Unable to open ", attr_path, " file !")
logging.error("Unable to open {} file: {}".format(attr_path, error))
retval = retval.rstrip(' \t\n\r')
return retval
@ -72,8 +95,7 @@ class Thermal(ThermalBase):
Returns:
string: The name of the device
"""
attr_path = HWMON_DIR + self.name_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.name_attr)
if (attr_rv != 'ERR'):
return attr_rv
@ -87,8 +109,7 @@ class Thermal(ThermalBase):
Returns:
bool: True if device is present, False if not
"""
attr_path = HWMON_DIR + self.name_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.name_attr)
if (attr_rv != 'ERR'):
return True
@ -115,8 +136,37 @@ class Thermal(ThermalBase):
A float number of current temperature in Celsius up to nearest thousandth
of one degree Celsius, e.g. 30.125
"""
attr_path = HWMON_DIR + self.temp_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.temp_attr)
if (attr_rv != 'ERR'):
return float(attr_rv) / 1000
else:
return None
def get_low_threshold(self):
"""
Retrieves the low threshold temperature of thermal
Returns:
A float number, the low threshold temperature of thermal in Celsius
up to nearest thousandth of one degree Celsius, e.g. 30.125
"""
attr_rv = self.__get_attr_value(self.low_th_attr)
if (attr_rv != 'ERR'):
return float(attr_rv) / 1000
else:
return None
def get_low_critical_threshold(self):
"""
Retrieves the low critical threshold temperature of thermal
Returns:
A float number, the low critical threshold temperature of thermal in Celsius
up to nearest thousandth of one degree Celsius, e.g. 30.125
"""
attr_rv = self.__get_attr_value(self.low_crit_th_attr)
if (attr_rv != 'ERR'):
return float(attr_rv) / 1000
@ -131,8 +181,7 @@ class Thermal(ThermalBase):
A float number, the high threshold temperature of thermal in Celsius
up to nearest thousandth of one degree Celsius, e.g. 30.125
"""
attr_path = HWMON_DIR + self.high_th_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.high_th_attr)
if (attr_rv != 'ERR'):
return float(attr_rv) / 1000
@ -147,8 +196,7 @@ class Thermal(ThermalBase):
A float number, the high threshold temperature of thermal in Celsius
up to nearest thousandth of one degree Celsius, e.g. 30.125
"""
attr_path = HWMON_DIR + self.high_crit_th_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.high_crit_th_attr)
if (attr_rv != 'ERR'):
return float(attr_rv) / 1000

View File

@ -0,0 +1,241 @@
#!/usr/bin/env python
#############################################################################
#
# Watchdog contains an implementation of SONiC Platform Base Watchdog API
#
#############################################################################
import fcntl
import os
import array
try:
from sonic_platform_base.watchdog_base import WatchdogBase
except ImportError as e:
raise ImportError(str(e) + "- required module not found")
""" ioctl constants """
IO_WRITE = 0x40000000
IO_READ = 0x80000000
IO_READ_WRITE = 0xC0000000
IO_SIZE_INT = 0x00040000
IO_SIZE_40 = 0x00280000
IO_TYPE_WATCHDOG = ord('W') << 8
WDR_INT = IO_READ | IO_SIZE_INT | IO_TYPE_WATCHDOG
WDR_40 = IO_READ | IO_SIZE_40 | IO_TYPE_WATCHDOG
WDWR_INT = IO_READ_WRITE | IO_SIZE_INT | IO_TYPE_WATCHDOG
""" Watchdog ioctl commands """
WDIOC_GETSUPPORT = 0 | WDR_40
WDIOC_GETSTATUS = 1 | WDR_INT
WDIOC_GETBOOTSTATUS = 2 | WDR_INT
WDIOC_GETTEMP = 3 | WDR_INT
WDIOC_SETOPTIONS = 4 | WDR_INT
WDIOC_KEEPALIVE = 5 | WDR_INT
WDIOC_SETTIMEOUT = 6 | WDWR_INT
WDIOC_GETTIMEOUT = 7 | WDR_INT
WDIOC_SETPRETIMEOUT = 8 | WDWR_INT
WDIOC_GETPRETIMEOUT = 9 | WDR_INT
WDIOC_GETTIMELEFT = 10 | WDR_INT
""" Watchdog status constants """
WDIOS_DISABLECARD = 0x0001
WDIOS_ENABLECARD = 0x0002
WDT_COMMON_ERROR = -1
WD_MAIN_IDENTITY = "iTCO_wdt"
WDT_SYSFS_PATH = "/sys/class/watchdog/"
DEFAULT_TIMEOUT=180
watchdog=0
class Watchdog(WatchdogBase):
def __init__(self):
self.watchdog, self.wdt_main_dev_name = self._get_wdt()
if self.wdt_main_dev_name is None:
raise Exception("Watchdog device is not instantiated")
self.status_path = "/sys/class/watchdog/%s/status" % self.wdt_main_dev_name
self.state_path = "/sys/class/watchdog/%s/state" % self.wdt_main_dev_name
self.timeout_path = "/sys/class/watchdog/%s/timeout" % self.wdt_main_dev_name
# Set default value
self._disable()
self.armed = False
self.timeout = DEFAULT_TIMEOUT
def _is_wd_main(self, dev):
"""
Checks watchdog identity
"""
identity = self._read_file(
"{}/{}/identity".format(WDT_SYSFS_PATH, dev))
return identity == WD_MAIN_IDENTITY
def _get_wdt(self):
"""
Retrieves watchdog device
"""
global watchdog
wdt_main_dev_list = [dev for dev in os.listdir(
"/dev/") if dev.startswith("watchdog") and self._is_wd_main(dev)]
if not wdt_main_dev_list:
return (None, None)
wdt_main_dev_name = wdt_main_dev_list[0]
watchdog_device_path = "/dev/{}".format(wdt_main_dev_name)
if not watchdog:
watchdog = os.open(watchdog_device_path, os.O_RDWR)
return watchdog, wdt_main_dev_name
def _read_file(self, file_path):
"""
Read text file
"""
try:
with open(file_path, "r") as fd:
txt = fd.read()
except IOError:
return WDT_COMMON_ERROR
return txt.strip()
def _enable(self):
"""
Turn on the watchdog timer
"""
req = array.array('h', [WDIOS_ENABLECARD])
fcntl.ioctl(self.watchdog, WDIOC_SETOPTIONS, req, False)
def _disable(self):
"""
Turn off the watchdog timer
"""
req = array.array('h', [WDIOS_DISABLECARD])
fcntl.ioctl(self.watchdog, WDIOC_SETOPTIONS, req, False)
def _keepalive(self):
"""
Keep alive watchdog timer
"""
fcntl.ioctl(self.watchdog, WDIOC_KEEPALIVE)
def _settimeout(self, seconds):
"""
Set watchdog timer timeout
@param seconds - timeout in seconds
@return is the actual set timeout
"""
req = array.array('I', [seconds])
fcntl.ioctl(self.watchdog, WDIOC_SETTIMEOUT, req, True)
return int(req[0])
def _gettimeout(self, timeout_path):
"""
Get watchdog timeout
@return watchdog timeout
"""
req = array.array('I', [0])
fcntl.ioctl(self.watchdog, WDIOC_GETTIMEOUT, req, True)
return int(req[0])
def _gettimeleft(self):
"""
Get time left before watchdog timer expires
@return time left in seconds
"""
req = array.array('I', [0])
fcntl.ioctl(self.watchdog, WDIOC_GETTIMELEFT, req, True)
return int(req[0])
#################################################################
def arm(self, seconds):
"""
Arm the hardware watchdog with a timeout of <seconds> seconds.
If the watchdog is currently armed, calling this function will
simply reset the timer to the provided value. If the underlying
hardware does not support the value provided in <seconds>, this
method should arm the watchdog with the *next greater* available
value.
Returns:
An integer specifying the *actual* number of seconds the watchdog
was armed with. On failure returns -1.
"""
ret = WDT_COMMON_ERROR
if seconds < 0:
return ret
try:
if self.timeout != seconds:
self.timeout = self._settimeout(seconds)
if self.armed:
self._keepalive()
else:
self._settimeout(seconds)
self._enable()
self.armed = True
ret = self.timeout
except IOError as e:
pass
return ret
def disarm(self):
"""
Disarm the hardware watchdog
Returns:
A boolean, True if watchdog is disarmed successfully, False if not
"""
disarmed = False
if self.is_armed():
try:
self._disable()
self.armed = False
disarmed = True
except IOError:
pass
return disarmed
def is_armed(self):
"""
Retrieves the armed state of the hardware watchdog.
Returns:
A boolean, True if watchdog is armed, False if not
"""
return self.armed
def get_remaining_time(self):
"""
If the watchdog is armed, retrieve the number of seconds remaining on
the watchdog timer
Returns:
An integer specifying the number of seconds remaining on thei
watchdog timer. If the watchdog is not armed, returns -1.
"""
timeleft = WDT_COMMON_ERROR
if self.armed:
try:
timeleft = self._gettimeleft()
except IOError:
pass
return timeleft
def __del__(self):
"""
Close watchdog
"""
if self.watchdog is not None :
os.close(self.watchdog)

View File

@ -28,27 +28,26 @@ command:
"""
import os
import commands
import subprocess
import sys, getopt
import logging
import time
DEBUG = False
args = []
FORCE = 0
i2c_prefix = '/sys/bus/i2c/devices/'
if DEBUG == True:
print sys.argv[0]
print 'ARGV :', sys.argv[1:]
print(sys.argv[0])
print('ARGV :', sys.argv[1:])
def main():
global DEBUG
global args
global FORCE
if len(sys.argv)<2:
if len(sys.argv) < 2:
show_help()
options, args = getopt.getopt(sys.argv[1:], 'hdf', ['help',
@ -56,9 +55,9 @@ def main():
'force',
])
if DEBUG == True:
print options
print args
print len(sys.argv)
print(options)
print(args)
print(len(sys.argv))
for opt, arg in options:
if opt in ('-h', '--help'):
@ -78,29 +77,37 @@ def main():
else:
show_help()
return 0
def show_help():
print __doc__ % {'scriptName' : sys.argv[0].split("/")[-1]}
print(__doc__ % {'scriptName' : sys.argv[0].split("/")[-1]})
sys.exit(0)
def show_log(txt):
if DEBUG == True:
print "[IX7-BWDE-32X]"+txt
print("[IX7-BWDE-32X]"+txt)
return
def exec_cmd(cmd, show):
logging.info('Run :'+cmd)
status, output = commands.getstatusoutput(cmd)
logging.info('Run :' + cmd)
status, output = subprocess.getstatusoutput(cmd)
show_log (cmd +"with result:" + str(status))
show_log (" output:"+output)
show_log (" output:" + output)
if status:
logging.info('Failed :'+cmd)
logging.info('Failed :' + cmd)
if show:
print('Failed :'+cmd)
print('Failed :' + cmd)
return status, output
pca954x_bus_addr =[
'0-0072',
'0-0077',
'5-0073',
'6-0073',
'7-0073',
'8-0073'
]
instantiate =[
#Enable front-ports LED decoding
'echo 1 > /sys/class/cpld-led/CPLDLED-1/led_decode',
@ -118,7 +125,7 @@ drivers =[
'lpc_ich',
'i2c-i801',
'i2c-dev',
'i2c-mux-pca954x force_deselect_on_exit=1',
'i2c-mux-pca954x',
'gpio-pca953x',
'optoe',
'qci_cpld',
@ -149,18 +156,30 @@ def system_install():
exec_cmd("depmod -a ", 1)
#install drivers
for i in range(0,len(drivers)):
status, output = exec_cmd("modprobe "+drivers[i], 1)
status, output = exec_cmd("modprobe " + drivers[i], 1)
if status:
print output
if FORCE == 0:
print(output)
#retry quanta_hwmon_ipmi in case it init failed due to ipmi_msghandler init uncompleted
if drivers[i] == 'quanta_hwmon_ipmi':
for _ in range(0, 3):
time.sleep(3)
ret, out = exec_cmd("modprobe quanta_hwmon_ipmi ", 1)
if ret == 0:
break
if ret and FORCE == 0:
return ret
elif FORCE == 0:
return status
#reload ethernet drivers for correct order
exec_cmd("rmmod ixgbe ", 1)
exec_cmd("rmmod igb ", 1)
exec_cmd("modprobe igb ", 1)
exec_cmd("modprobe ixgbe ", 1)
# set pca954x idle_state as -2: MUX_IDLE_DISCONNECT
for i in range(0,len(pca954x_bus_addr)):
exec_cmd("echo -2 > /sys/bus/i2c/drivers/pca954x/{}/idle_state".format(pca954x_bus_addr[i]), 1)
#turn on module power
exec_cmd("echo 21 > /sys/class/gpio/export ", 1)
exec_cmd("echo high > /sys/class/gpio/gpio21/direction ", 1)
@ -174,21 +193,21 @@ def system_install():
exec_cmd("echo 1 >/sys/class/gpio/gpio33/value", 1)
#instantiate devices
for i in range(0,len(instantiate)):
for i in range(0, len(instantiate)):
status, output = exec_cmd(instantiate[i], 1)
if status:
print output
print(output)
if FORCE == 0:
return status
#QSFP for 1~32 port
for port_number in range(1,33):
for port_number in range(1, 33):
bus_number = port_number + 12
os.system("echo %d >/sys/bus/i2c/devices/%d-0050/port_name" % (port_number, bus_number))
status, output = exec_cmd("pip3 install /usr/share/sonic/device/x86_64-quanta_ix7_bwde-r0/sonic_platform-1.0-py3-none-any.whl",1)
if status:
print output
print(output)
if FORCE == 0:
return status
@ -202,27 +221,27 @@ def system_ready():
def install():
if not device_found():
print "No device, installing...."
print("No device, installing....")
status = system_install()
if status:
if FORCE == 0:
return status
else:
print " ix7-bwde driver already installed...."
print(" ix7-bwde driver already installed....")
return
def uninstall():
global FORCE
#uninstall drivers
for i in range(len(un_drivers)-1,-1,-1):
status, output = exec_cmd("rmmod "+un_drivers[i], 1)
for i in range(len(un_drivers) - 1, -1, -1):
status, output = exec_cmd("rmmod " + un_drivers[i], 1)
if status:
print output
print(output)
if FORCE == 0:
return status
status, output = exec_cmd("pip3 uninstall sonic-platform -y ",1)
if status:
print output
print(output)
if FORCE == 0:
return status
return

View File

@ -49,7 +49,7 @@ static struct class *cpld_class = NULL;
struct cpld_data {
struct i2c_client *cpld_client;
char name[8];
char name[16];
u8 cpld_id;
};

View File

@ -192,9 +192,9 @@ static int __init ix8_platform_init(void)
}
else
{
g_client[0] = i2c_new_device(adapter, &ix8_i2c_devices[0]); // pca9546
g_client[1] = i2c_new_device(adapter, &ix8_i2c_devices[1]); // pca9548
g_client[2] = i2c_new_device(adapter, &ix8_i2c_devices[16]); // pca9546cpu
g_client[0] = i2c_new_client_device(adapter, &ix8_i2c_devices[0]); // pca9546
g_client[1] = i2c_new_client_device(adapter, &ix8_i2c_devices[1]); // pca9548
g_client[2] = i2c_new_client_device(adapter, &ix8_i2c_devices[16]); // pca9546cpu
i2c_put_adapter(adapter);
}
@ -205,7 +205,7 @@ static int __init ix8_platform_init(void)
}
else
{
g_client[3] = i2c_new_device(adapter, &ix8_i2c_devices[17]); // CPU Board Data
g_client[3] = i2c_new_client_device(adapter, &ix8_i2c_devices[17]); // CPU Board Data
i2c_put_adapter(adapter);
}
@ -216,9 +216,9 @@ static int __init ix8_platform_init(void)
}
else
{
g_client[4] = i2c_new_device(adapter, &ix8_i2c_devices[10]); // CPLD_1
g_client[5] = i2c_new_device(adapter, &ix8_i2c_devices[18]); // CPLD_4
g_client[6] = i2c_new_device(adapter, &ix8_i2c_devices[19]); // CPLD_6
g_client[4] = i2c_new_client_device(adapter, &ix8_i2c_devices[10]); // CPLD_1
g_client[5] = i2c_new_client_device(adapter, &ix8_i2c_devices[18]); // CPLD_4
g_client[6] = i2c_new_client_device(adapter, &ix8_i2c_devices[19]); // CPLD_6
i2c_put_adapter(adapter);
}
@ -229,7 +229,7 @@ static int __init ix8_platform_init(void)
}
else
{
g_client[7] = i2c_new_device(adapter, &ix8_i2c_devices[11]); // CPLD_2
g_client[7] = i2c_new_client_device(adapter, &ix8_i2c_devices[11]); // CPLD_2
i2c_put_adapter(adapter);
}
@ -240,8 +240,8 @@ static int __init ix8_platform_init(void)
}
else
{
g_client[8] = i2c_new_device(adapter, &ix8_i2c_devices[12]); // CPLD_3
g_client[9] = i2c_new_device(adapter, &ix8_i2c_devices[2]); // MB_BOARDINFO_EEPROM
g_client[8] = i2c_new_client_device(adapter, &ix8_i2c_devices[12]); // CPLD_3
g_client[9] = i2c_new_client_device(adapter, &ix8_i2c_devices[2]); // MB_BOARDINFO_EEPROM
i2c_put_adapter(adapter);
}
@ -252,8 +252,8 @@ static int __init ix8_platform_init(void)
}
else
{
g_client[10] = i2c_new_device(adapter, &ix8_i2c_devices[13]); // MB Board Data
g_client[11] = i2c_new_device(adapter, &ix8_i2c_devices[14]); // QSFP:49~52
g_client[10] = i2c_new_client_device(adapter, &ix8_i2c_devices[13]); // MB Board Data
g_client[11] = i2c_new_client_device(adapter, &ix8_i2c_devices[14]); // QSFP:49~52
i2c_put_adapter(adapter);
}
@ -264,7 +264,7 @@ static int __init ix8_platform_init(void)
}
else
{
g_client[12] = i2c_new_device(adapter, &ix8_i2c_devices[3]); // pca9548_1 SFP
g_client[12] = i2c_new_client_device(adapter, &ix8_i2c_devices[3]); // pca9548_1 SFP
i2c_put_adapter(adapter);
}
@ -275,7 +275,7 @@ static int __init ix8_platform_init(void)
}
else
{
g_client[13] = i2c_new_device(adapter, &ix8_i2c_devices[4]); // pca9548_2 SFP
g_client[13] = i2c_new_client_device(adapter, &ix8_i2c_devices[4]); // pca9548_2 SFP
i2c_put_adapter(adapter);
}
@ -286,7 +286,7 @@ static int __init ix8_platform_init(void)
}
else
{
g_client[14] = i2c_new_device(adapter, &ix8_i2c_devices[5]); // pca9548_3 SFP
g_client[14] = i2c_new_client_device(adapter, &ix8_i2c_devices[5]); // pca9548_3 SFP
i2c_put_adapter(adapter);
}
@ -297,7 +297,7 @@ static int __init ix8_platform_init(void)
}
else
{
g_client[15] = i2c_new_device(adapter, &ix8_i2c_devices[6]); // pca9548_4 SFP
g_client[15] = i2c_new_client_device(adapter, &ix8_i2c_devices[6]); // pca9548_4 SFP
i2c_put_adapter(adapter);
}
@ -308,7 +308,7 @@ static int __init ix8_platform_init(void)
}
else
{
g_client[16] = i2c_new_device(adapter, &ix8_i2c_devices[7]); // pca9548_5 SFP
g_client[16] = i2c_new_client_device(adapter, &ix8_i2c_devices[7]); // pca9548_5 SFP
i2c_put_adapter(adapter);
}
@ -319,7 +319,7 @@ static int __init ix8_platform_init(void)
}
else
{
g_client[17] = i2c_new_device(adapter, &ix8_i2c_devices[8]); // pca9548_6 SFP
g_client[17] = i2c_new_client_device(adapter, &ix8_i2c_devices[8]); // pca9548_6 SFP
i2c_put_adapter(adapter);
}
@ -330,7 +330,7 @@ static int __init ix8_platform_init(void)
}
else
{
g_client[18] = i2c_new_device(adapter, &ix8_i2c_devices[9]); // pca9548_7 QSFP
g_client[18] = i2c_new_client_device(adapter, &ix8_i2c_devices[9]); // pca9548_7 QSFP
i2c_put_adapter(adapter);
}
@ -342,7 +342,7 @@ static int __init ix8_platform_init(void)
}
else
{
g_client_port[i - 17] = i2c_new_device(adapter, &ix8_i2c_devices[15]);
g_client_port[i - 17] = i2c_new_client_device(adapter, &ix8_i2c_devices[15]);
i2c_put_adapter(adapter);
}
}
@ -355,7 +355,7 @@ static int __init ix8_platform_init(void)
else
{
adapter = i2c_get_adapter_wait(i);
g_client_port[i - 17] = i2c_new_device(adapter, &ix8_i2c_devices[20]);
g_client_port[i - 17] = i2c_new_client_device(adapter, &ix8_i2c_devices[20]);
i2c_put_adapter(adapter);
}
}

View File

@ -86,6 +86,8 @@
#define IPMI_TIMEOUT (4 * HZ)
#define IPMI_MAX_WAIT_QUEUE 1
typedef struct ipmi_user *ipmi_user_t;
struct quanta_hwmon_ipmi_data
{
struct platform_device *ipmi_platform_dev;
@ -1090,7 +1092,7 @@ int32_t sdr_convert_sensor_reading(uint8_t idx, uint8_t val,
result = (m * (int16_t)val) * decimal_point + b;
break;
default:
return;
return result;
}
pow_convert(&result, k2);
@ -1830,7 +1832,7 @@ static int32_t __init quanta_hwmon_ipmi_init(void)
goto device_reg_err;
}
data->ipmi_hwmon_dev = hwmon_device_register_with_groups(NULL, DRVNAME, NULL,
data->ipmi_hwmon_dev = hwmon_device_register_with_groups(&data->ipmi_platform_dev->dev, DRVNAME, NULL,
NULL);
err = IS_ERR(data->ipmi_hwmon_dev);
if (err)
@ -1857,21 +1859,15 @@ static int32_t __init quanta_hwmon_ipmi_init(void)
return 0;
init_sensor_err:
if (g_sensor_data)
{
kfree(g_sensor_data);
g_sensor_data = NULL;
}
ipmi_create_err:
hwmon_device_unregister(data->ipmi_hwmon_dev);
hwmon_register_err:
platform_device_unregister(data->ipmi_platform_dev);
device_reg_err:
if (data)
{
kfree(data);
data = NULL;
}
alloc_err:
return err;
}
@ -1887,17 +1883,10 @@ static void __exit quanta_hwmon_ipmi_exit(void)
platform_device_unregister(data->ipmi_platform_dev);
if (g_sensor_data)
{
kfree(g_sensor_data);
g_sensor_data = NULL;
}
if (data)
{
kfree(data);
data = NULL;
}
}
module_init(quanta_hwmon_ipmi_init);

View File

@ -72,6 +72,13 @@ class Chassis(ChassisBase):
for index in range(1, self.__num_of_ports + 1):
self.__xcvr_presence[index] = self._sfp_list[index-1].get_presence()
# Initialize components
from sonic_platform.component import ComponentBIOS, ComponentBMC, ComponentCPLD, ComponentPCIE
self._component_list.append(ComponentBIOS())
self._component_list.append(ComponentBMC())
self._component_list.extend(ComponentCPLD.get_component_list())
self._component_list.append(ComponentPCIE())
##############################################
# Device methods
##############################################
@ -79,7 +86,7 @@ class Chassis(ChassisBase):
def get_sfp(self, index):
"""
Retrieves sfp represented by (1-based) index <index>
For Quanta IX8 the index in sfputil.py starts from 1, so override
For Quanta the index in sfputil.py starts from 1, so override
Args:
index: An integer, the index (1-based) of the sfp to retrieve.
@ -179,6 +186,18 @@ class Chassis(ChassisBase):
"""
return self._eeprom.system_eeprom_info()
def get_reboot_cause(self):
"""
Retrieves the cause of the previous reboot
Returns:
A tuple (string, string) where the first element is a string
containing the cause of the previous reboot. This string must be
one of the predefined strings in this class. If the first string
is "REBOOT_CAUSE_HARDWARE_OTHER", the second string can be used
to pass a description of the reboot cause.
"""
return (ChassisBase.REBOOT_CAUSE_HARDWARE_OTHER, "Invalid Reason")
##############################################
# Other methods
##############################################
@ -215,10 +234,10 @@ class Chassis(ChassisBase):
cur_xcvr_presence = self._sfp_list[index-1].get_presence()
if cur_xcvr_presence != self.__xcvr_presence[index]:
if cur_xcvr_presence is True:
xcvr_change_event_dict[str(index)] = '1'
xcvr_change_event_dict[index] = '1'
self.__xcvr_presence[index] = True
elif cur_xcvr_presence is False:
xcvr_change_event_dict[str(index)] = '0'
xcvr_change_event_dict[index] = '0'
self.__xcvr_presence[index] = False
event = True

View File

@ -0,0 +1,203 @@
#!/usr/bin/env python
########################################################################
# Quanta IX8
#
# Name: component.py, version: 1.3
# Module contains an implementation of SONiC Platform Base API and
# provides the Components' (e.g., BIOS, CPLD, FPGA, etc.) available in
# the platform
#
########################################################################
try:
import subprocess
from sonic_platform_base.component_base import ComponentBase
from collections import namedtuple
except ImportError as e:
raise ImportError(str(e) + "- required module not found")
class Component(ComponentBase):
def __init__(self):
ComponentBase.__init__(self)
self.name = None
self.description = None
def get_name(self):
return self.name
def get_description(self):
return self.description
def install_firmware(self, image_path):
"""
Installs firmware to the component
Args:
image_path: A string, path to firmware image
Returns:
A boolean, True if install was successful, False if not
"""
return False
@staticmethod
def _get_command_result(cmdline):
try:
proc = subprocess.Popen(cmdline,
stdout=subprocess.PIPE,
shell=True, stderr=subprocess.STDOUT,
universal_newlines=True)
stdout = proc.communicate()[0]
rc = proc.wait()
result = stdout.rstrip('\n')
if rc != 0:
raise RuntimeError("Failed to execute command {}, return code {}, {}".format(cmdline, rc, stdout))
except OSError as e:
raise RuntimeError("Failed to execute command {} due to {}".format(cmdline, repr(e)))
return result
class ComponentBIOS(Component):
COMPONENT_NAME = 'BIOS'
COMPONENT_DESCRIPTION = 'BIOS - Basic Input/Output System'
BIOS_QUERY_VERSION_COMMAND = "dmidecode -s bios-version"
def __init__(self):
super(ComponentBIOS, self).__init__()
self.name = self.COMPONENT_NAME
self.description = self.COMPONENT_DESCRIPTION
def get_firmware_version(self):
"""
Retrieves the firmware version of the component
Returns:
A string containing the firmware version of the component
"""
bios_ver = self._get_command_result(self.BIOS_QUERY_VERSION_COMMAND)
if not bios_ver:
return 'ERR'
else:
return bios_ver
class ComponentBMC(Component):
COMPONENT_NAME = 'BMC'
COMPONENT_DESCRIPTION = 'BMC - Board Management Controller'
BMC_QUERY_VERSION_COMMAND = "ipmitool mc info | grep 'Firmware Revision'"
def __init__(self):
super(ComponentBMC, self).__init__()
self.name = self.COMPONENT_NAME
self.description = self.COMPONENT_DESCRIPTION
def get_firmware_version(self):
"""
Retrieves the firmware version of the component
Returns:
A string containing the firmware version of the component
"""
bmc_ver = self._get_command_result(self.BMC_QUERY_VERSION_COMMAND)
if not bmc_ver:
return 'ERR'
else:
bmc_ver = bmc_ver.split(": ")[1]
return bmc_ver.strip()
class ComponentCPLD(Component):
Cpld = namedtuple("Cpld", ['name', 'cmd_index', 'description'])
cplds = {
1: Cpld("UART_CPLD", 1, "UART"),
2: Cpld("BOOT_CPLD", 2, "Power sequence"),
3: Cpld("FAN_CPLD", 3, "Fan"),
4: Cpld("MB_CPLD_IO_1", 5, "Port IO-1"),
5: Cpld("MB_CPLD_IO_2", 6, "Port IO-2"),
6: Cpld("MB_CPLD_IO_3", 8, "Port IO-3"),
7: Cpld("MB_CPLD_LED_1", 7, "Port LED-1"),
8: Cpld("MB_CPLD_LED_2", 4, "Port LED-2"),
}
def __init__(self, component_index):
super(ComponentCPLD, self).__init__()
self.index = component_index
def get_name(self):
"""
Retrieves the name of the component
Returns:
A string containing the name of the component
"""
self.name = self.cplds[self.index].name
return self.name
def get_description(self):
"""
Retrieves the description of the component
Returns:
A string containing the description of the component
"""
self.description = self.cplds[self.index].description
return self.description
def get_firmware_version(self):
"""
Retrieves the firmware version of the component
Returns:
A string containing the firmware version of the component
"""
res = self._get_command_result("ipmitool raw 0x32 0xff 0x02 {}".format(self.cplds[self.index].cmd_index))
if not res:
return 'ERR'
else:
return res.split()[3].upper() + res.split()[2].upper() + res.split()[1].upper() + res.split()[0].upper()
@classmethod
def get_component_list(cls):
component_list = []
cpld_number = len(cls.cplds)
for cpld_idx in range(1, cpld_number + 1):
component_list.append(cls(cpld_idx))
return component_list
class ComponentPCIE(Component):
COMPONENT_NAME = 'PCIe'
COMPONENT_DESCRIPTION = 'ASIC PCIe Firmware'
PCIE_QUERY_VERSION_COMMAND = "bcmcmd 'pciephy fw version' | grep 'FW version'"
def __init__(self):
super(ComponentPCIE, self).__init__()
self.name = self.COMPONENT_NAME
self.description = self.COMPONENT_DESCRIPTION
def get_firmware_version(self):
"""
Retrieves the firmware version of the component
Returns:
A string containing the firmware version of the component
"""
version = self._get_command_result(self.PCIE_QUERY_VERSION_COMMAND)
if not version:
return 'ERR'
else:
version = version.split(": ")[1]
return version.strip()

View File

@ -28,7 +28,7 @@ class FanDrawer(FanDrawerBase):
Returns:
string: The name of the device
"""
return 'Fan {}'.format(self._index)
return 'Fantray{}'.format(self._index)
def get_presence(self):
"""

View File

@ -212,10 +212,10 @@ class Psu(PsuBase):
def get_input_voltage(self):
"""
Retrieves current PSU voltage output
Retrieves current PSU voltage input
Returns:
A float number, the output voltage in volts,
A float number, the input voltage in volts,
e.g. 12.1
"""
voltage_in = 0.0

View File

@ -10,13 +10,10 @@
import os
import time
#import subprocess
#import sonic_device_util
from ctypes import create_string_buffer
try:
from sonic_platform_base.sfp_base import SfpBase
# from sonic_platform_base.sonic_eeprom import eeprom_dts
from sonic_platform_base.sonic_sfp.sff8472 import sff8472InterfaceId
from sonic_platform_base.sonic_sfp.sff8472 import sff8472Dom
from sonic_platform_base.sonic_sfp.sff8436 import sff8436InterfaceId
@ -175,7 +172,6 @@ class Sfp(SfpBase):
# Init index
self.index = sfp_index
self.port_num = self.index
#self.dom_supported = False
self.sfp_type = sfp_type
# Init eeprom path
eeprom_path = '/sys/bus/i2c/devices/i2c-{0}/{0}-0050/eeprom'
@ -284,15 +280,6 @@ class Sfp(SfpBase):
else:
return 'N/A'
def __read_txt_file(self, file_path):
try:
with open(file_path, 'r') as fd:
data = fd.read()
return data.strip()
except IOError:
pass
return ""
def __is_host(self):
return os.system(self.HOST_CHK_CMD) == 0
@ -355,26 +342,6 @@ class Sfp(SfpBase):
return eeprom_raw
def __convert_string_to_num(self, value_str):
if "-inf" in value_str:
return 'N/A'
elif "Unknown" in value_str:
return 'N/A'
elif 'dBm' in value_str:
t_str = value_str.rstrip('dBm')
return float(t_str)
elif 'mA' in value_str:
t_str = value_str.rstrip('mA')
return float(t_str)
elif 'C' in value_str:
t_str = value_str.rstrip('C')
return float(t_str)
elif 'Volts' in value_str:
t_str = value_str.rstrip('Volts')
return float(t_str)
else:
return 'N/A'
def _dom_capability_detect(self):
if not self.get_presence():
self.dom_supported = False
@ -533,9 +500,7 @@ class Sfp(SfpBase):
else:
if not self.get_presence():
return transceiver_info_dict
elif i == max_retry-1:
pass
else:
elif i < max_retry-1:
time.sleep(0.5)
if sfp_interface_bulk_raw is None:
@ -590,7 +555,8 @@ class Sfp(SfpBase):
['data']['Extended Identifier']['value']
transceiver_info_dict['ext_rateselect_compliance'] = sfp_interface_bulk_data \
['data']['RateIdentifier']['value']
transceiver_info_dict['type_abbrv_name'] = 'N/A'
transceiver_info_dict['type_abbrv_name'] = sfp_interface_bulk_data \
['data']['type_abbrv_name']['value']
if self.sfp_type == QSFP_TYPE:
for key in qsfp_cable_length_tup:
if key in sfp_interface_bulk_data['data']:
@ -860,7 +826,7 @@ class Sfp(SfpBase):
transceiver_dom_threshold_dict['txbiaslowwarning'] = channel_threshold_data['TxBiasLowWarning']['value']
for key in transceiver_dom_threshold_dict:
transceiver_dom_threshold_dict[key] = self.__convert_string_to_num(transceiver_dom_threshold_dict[key])
transceiver_dom_threshold_dict[key] = self._convert_string_to_num(transceiver_dom_threshold_dict[key])
return transceiver_dom_threshold_dict
@ -908,7 +874,7 @@ class Sfp(SfpBase):
transceiver_dom_threshold_info_dict['rxpowerlowwarning'] = dom_module_threshold_data['data']['RXPowerLowWarning']['value']
for key in transceiver_dom_threshold_info_dict:
transceiver_dom_threshold_info_dict[key] = self.__convert_string_to_num(transceiver_dom_threshold_info_dict[key])
transceiver_dom_threshold_info_dict[key] = self._convert_string_to_num(transceiver_dom_threshold_info_dict[key])
return transceiver_dom_threshold_info_dict
@ -1453,7 +1419,7 @@ class Sfp(SfpBase):
sysfsfile_eeprom = open(
sysfs_sfp_i2c_client_eeprom_path, mode="r+b", buffering=0)
buffer = create_string_buffer(1)
buffer[0] = chr(tx_disable_ctl)
buffer[0] = tx_disable_ctl
# Write to eeprom
sysfsfile_eeprom.seek(offset + SFP_STATUS_CONTROL_OFFSET)
sysfsfile_eeprom.write(buffer[0])
@ -1506,7 +1472,7 @@ class Sfp(SfpBase):
else:
tx_disable_ctl = channel_state & (~channel)
buffer = create_string_buffer(1)
buffer[0] = chr(tx_disable_ctl)
buffer[0] = tx_disable_ctl
# Write to eeprom
sysfsfile_eeprom = open(
self.port_to_eeprom_mapping[self.port_num], "r+b")
@ -1594,7 +1560,7 @@ class Sfp(SfpBase):
power_set_bit |= 1 << 1
buffer = create_string_buffer(1)
buffer[0] = chr(power_override_bit | power_set_bit)
buffer[0] = power_override_bit | power_set_bit
# Write to eeprom
sysfsfile_eeprom = open(self.port_to_eeprom_mapping[self.port_num], "r+b")
sysfsfile_eeprom.seek(QSFP_POWEROVERRIDE_OFFSET)

View File

@ -1,7 +1,7 @@
#!/usr/bin/env python
#############################################################################
# Quanta
# Quanta IX8
#
# Module contains an implementation of SONiC Platform Base API and
# provides the Thermal information

View File

@ -48,12 +48,16 @@ WD_MAIN_IDENTITY = "iTCO_wdt"
WDT_SYSFS_PATH = "/sys/class/watchdog/"
DEFAULT_TIMEOUT=180
watchdog=0
class Watchdog(WatchdogBase):
def __init__(self):
self.watchdog, self.wdt_main_dev_name = self._get_wdt()
if self.wdt_main_dev_name is None:
raise Exception("Watchdog device is not instantiated")
self.status_path = "/sys/class/watchdog/%s/status" % self.wdt_main_dev_name
self.state_path = "/sys/class/watchdog/%s/state" % self.wdt_main_dev_name
self.timeout_path = "/sys/class/watchdog/%s/timeout" % self.wdt_main_dev_name
@ -74,14 +78,16 @@ class Watchdog(WatchdogBase):
"""
Retrieves watchdog device
"""
global watchdog
wdt_main_dev_list = [dev for dev in os.listdir(
"/dev/") if dev.startswith("watchdog") and self._is_wd_main(dev)]
if not wdt_main_dev_list:
return None
return (None, None)
wdt_main_dev_name = wdt_main_dev_list[0]
watchdog_device_path = "/dev/{}".format(wdt_main_dev_name)
self.watchdog = os.open(watchdog_device_path, os.O_RDWR)
return self.watchdog, wdt_main_dev_name
if not watchdog:
watchdog = os.open(watchdog_device_path, os.O_RDWR)
return watchdog, wdt_main_dev_name
def _read_file(self, file_path):
"""
@ -228,6 +234,7 @@ class Watchdog(WatchdogBase):
Close watchdog
"""
if self.watchdog is not None :
os.close(self.watchdog)

View File

@ -28,7 +28,7 @@ command:
"""
import os
import commands
import subprocess
import sys, getopt
import logging
import time
@ -38,18 +38,16 @@ args = []
FORCE = 0
i2c_prefix = '/sys/bus/i2c/devices/'
if DEBUG == True:
print sys.argv[0]
print 'ARGV :', sys.argv[1:]
print(sys.argv[0])
print('ARGV :', sys.argv[1:])
def main():
global DEBUG
global args
global FORCE
if len(sys.argv)<2:
if len(sys.argv) < 2:
show_help()
options, args = getopt.getopt(sys.argv[1:], 'hdf', ['help',
@ -57,9 +55,9 @@ def main():
'force',
])
if DEBUG == True:
print options
print args
print len(sys.argv)
print(options)
print(args)
print(len(sys.argv))
for opt, arg in options:
if opt in ('-h', '--help'):
@ -79,29 +77,41 @@ def main():
else:
show_help()
return 0
def show_help():
print __doc__ % {'scriptName' : sys.argv[0].split("/")[-1]}
print(__doc__ % {'scriptName' : sys.argv[0].split("/")[-1]})
sys.exit(0)
def show_log(txt):
if DEBUG == True:
print "[IX8-56X]"+txt
print("[IX8-56X]" + txt)
return
def exec_cmd(cmd, show):
logging.info('Run :'+cmd)
status, output = commands.getstatusoutput(cmd)
logging.info('Run :' + cmd)
status, output = subprocess.getstatusoutput(cmd)
show_log (cmd +"with result:" + str(status))
show_log (" output:"+output)
show_log (" output:" + output)
if status:
logging.info('Failed :'+cmd)
logging.info('Failed :' + cmd)
if show:
print('Failed :'+cmd)
print('Failed :' + cmd)
return status, output
pca954x_bus_addr =[
'0-0071',
'0-0072',
'0-0077',
'5-0073',
'6-0073',
'7-0073',
'8-0073',
'9-0073',
'10-0073',
'11-0073'
]
instantiate =[
#export pca9698 for qsfp present
'echo 34 > /sys/class/gpio/export',
@ -207,7 +217,7 @@ drivers =[
'lpc_ich',
'i2c-i801',
'i2c-dev',
'i2c-mux-pca954x force_deselect_on_exit=1',
'i2c-mux-pca954x',
'gpio-pca953x',
'optoe',
'qci_cpld_sfp28',
@ -243,12 +253,25 @@ def system_install():
exec_cmd("depmod -a ", 1)
#install drivers
for i in range(0,len(drivers)):
status, output = exec_cmd("modprobe "+drivers[i], 1)
status, output = exec_cmd("modprobe " + drivers[i], 1)
if status:
print output
if FORCE == 0:
print(output)
#retry quanta_hwmon_ipmi in case it init failed due to ipmi_msghandler init uncompleted
if drivers[i] == 'quanta_hwmon_ipmi':
for _ in range(0, 3):
time.sleep(3)
ret, out = exec_cmd("modprobe quanta_hwmon_ipmi ", 1)
if ret == 0:
break
if ret and FORCE == 0:
return ret
elif FORCE == 0:
return status
# set pca954x idle_state as -2: MUX_IDLE_DISCONNECT
for i in range(0,len(pca954x_bus_addr)):
exec_cmd("echo -2 > /sys/bus/i2c/drivers/pca954x/{}/idle_state".format(pca954x_bus_addr[i]), 1)
#turn on module power
exec_cmd("echo 21 > /sys/class/gpio/export ", 1)
exec_cmd("echo high > /sys/class/gpio/gpio21/direction ", 1)
@ -268,21 +291,21 @@ def system_install():
exec_cmd("echo 1 >/sys/class/gpio/gpio73/value", 1)
#instantiate devices
for i in range(0,len(instantiate)):
for i in range(0, len(instantiate)):
status, output = exec_cmd(instantiate[i], 1)
if status:
print output
print(output)
if FORCE == 0:
return status
#QSFP for 1~56 port
for port_number in range(1,57):
for port_number in range(1, 57):
bus_number = port_number + 16
os.system("echo %d >/sys/bus/i2c/devices/%d-0050/port_name" % (port_number, bus_number))
status, output = exec_cmd("pip3 install /usr/share/sonic/device/x86_64-quanta_ix8_rglbmc-r0/sonic_platform-1.0-py3-none-any.whl",1)
if status:
print output
print(output)
if FORCE == 0:
return status
@ -299,29 +322,31 @@ def system_ready():
def install():
if not device_found():
print "No device, installing...."
print("No device, installing....")
status = system_install()
if status:
if FORCE == 0:
return status
else:
print " ix8 driver already installed...."
print(" ix8 driver already installed....")
return
def uninstall():
global FORCE
#uninstall drivers
for i in range(len(un_drivers)-1,-1,-1):
status, output = exec_cmd("rmmod "+un_drivers[i], 1)
for i in range(len(un_drivers) - 1, -1, -1):
status, output = exec_cmd("rmmod " + un_drivers[i], 1)
if status:
print output
print(output)
if FORCE == 0:
return status
status, output = exec_cmd("pip3 uninstall sonic-platform -y ",1)
if status:
print output
print(output)
if FORCE == 0:
return status
return
def device_found():

View File

@ -49,7 +49,7 @@ static struct class *cpld_class = NULL;
struct cpld_data {
struct i2c_client *cpld_client;
char name[8];
char name[16];
u8 cpld_id;
};

View File

@ -170,9 +170,9 @@ static int __init ix8a_bwde_platform_init(void)
}
else
{
g_client[0] = i2c_new_device(adapter, &ix8a_bwde_i2c_devices[0]); // pca9546_1
g_client[1] = i2c_new_device(adapter, &ix8a_bwde_i2c_devices[1]); // pca9548_1
g_client[2] = i2c_new_device(adapter, &ix8a_bwde_i2c_devices[16]); // CPU Linking Board at CPU's I2C Bus //
g_client[0] = i2c_new_client_device(adapter, &ix8a_bwde_i2c_devices[0]); // pca9546_1
g_client[1] = i2c_new_client_device(adapter, &ix8a_bwde_i2c_devices[1]); // pca9548_1
g_client[2] = i2c_new_client_device(adapter, &ix8a_bwde_i2c_devices[16]); // CPU Linking Board at CPU's I2C Bus //
i2c_put_adapter(adapter);
}
@ -183,9 +183,9 @@ static int __init ix8a_bwde_platform_init(void)
}
else
{
g_client[3] = i2c_new_device(adapter, &ix8a_bwde_i2c_devices[11]); // CPLD_1
g_client[4] = i2c_new_device(adapter, &ix8a_bwde_i2c_devices[17]); // CPLD_4 //
g_client[5] = i2c_new_device(adapter, &ix8a_bwde_i2c_devices[18]); // CPLD_6 //
g_client[3] = i2c_new_client_device(adapter, &ix8a_bwde_i2c_devices[11]); // CPLD_1
g_client[4] = i2c_new_client_device(adapter, &ix8a_bwde_i2c_devices[17]); // CPLD_4 //
g_client[5] = i2c_new_client_device(adapter, &ix8a_bwde_i2c_devices[18]); // CPLD_6 //
i2c_put_adapter(adapter);
}
@ -196,7 +196,7 @@ static int __init ix8a_bwde_platform_init(void)
}
else
{
g_client[6] = i2c_new_device(adapter, &ix8a_bwde_i2c_devices[12]); // CPLD_2
g_client[6] = i2c_new_client_device(adapter, &ix8a_bwde_i2c_devices[12]); // CPLD_2
i2c_put_adapter(adapter);
}
@ -207,7 +207,7 @@ static int __init ix8a_bwde_platform_init(void)
}
else
{
g_client[7] = i2c_new_device(adapter, &ix8a_bwde_i2c_devices[13]); // CPLD_3
g_client[7] = i2c_new_client_device(adapter, &ix8a_bwde_i2c_devices[13]); // CPLD_3
i2c_put_adapter(adapter);
}
@ -218,8 +218,8 @@ static int __init ix8a_bwde_platform_init(void)
}
else
{
g_client[8] = i2c_new_device(adapter, &ix8a_bwde_i2c_devices[2]); // pca9539_1
g_client[9] = i2c_new_device(adapter, &ix8a_bwde_i2c_devices[14]); // pca9698_QSFP
g_client[8] = i2c_new_client_device(adapter, &ix8a_bwde_i2c_devices[2]); // pca9539_1
g_client[9] = i2c_new_client_device(adapter, &ix8a_bwde_i2c_devices[14]); // pca9698_QSFP
i2c_put_adapter(adapter);
}
@ -230,7 +230,7 @@ static int __init ix8a_bwde_platform_init(void)
}
else
{
g_client[10] = i2c_new_device(adapter, &ix8a_bwde_i2c_devices[4]); // pca9548_1 SFP
g_client[10] = i2c_new_client_device(adapter, &ix8a_bwde_i2c_devices[4]); // pca9548_1 SFP
i2c_put_adapter(adapter);
}
@ -241,7 +241,7 @@ static int __init ix8a_bwde_platform_init(void)
}
else
{
g_client[11] = i2c_new_device(adapter, &ix8a_bwde_i2c_devices[5]); // pca9548_2 SFP
g_client[11] = i2c_new_client_device(adapter, &ix8a_bwde_i2c_devices[5]); // pca9548_2 SFP
i2c_put_adapter(adapter);
}
@ -252,7 +252,7 @@ static int __init ix8a_bwde_platform_init(void)
}
else
{
g_client[12] = i2c_new_device(adapter, &ix8a_bwde_i2c_devices[6]); // pca9548_3 SFP
g_client[12] = i2c_new_client_device(adapter, &ix8a_bwde_i2c_devices[6]); // pca9548_3 SFP
i2c_put_adapter(adapter);
}
@ -263,7 +263,7 @@ static int __init ix8a_bwde_platform_init(void)
}
else
{
g_client[13] = i2c_new_device(adapter, &ix8a_bwde_i2c_devices[7]); // pca9548_4 SFP
g_client[13] = i2c_new_client_device(adapter, &ix8a_bwde_i2c_devices[7]); // pca9548_4 SFP
i2c_put_adapter(adapter);
}
@ -274,7 +274,7 @@ static int __init ix8a_bwde_platform_init(void)
}
else
{
g_client[14] = i2c_new_device(adapter, &ix8a_bwde_i2c_devices[8]); // pca9548_5 SFP
g_client[14] = i2c_new_client_device(adapter, &ix8a_bwde_i2c_devices[8]); // pca9548_5 SFP
i2c_put_adapter(adapter);
}
@ -285,7 +285,7 @@ static int __init ix8a_bwde_platform_init(void)
}
else
{
g_client[15] = i2c_new_device(adapter, &ix8a_bwde_i2c_devices[9]); // pca9548_6 SFP
g_client[15] = i2c_new_client_device(adapter, &ix8a_bwde_i2c_devices[9]); // pca9548_6 SFP
i2c_put_adapter(adapter);
}
@ -296,7 +296,7 @@ static int __init ix8a_bwde_platform_init(void)
}
else
{
g_client[16] = i2c_new_device(adapter, &ix8a_bwde_i2c_devices[10]); // pca9548_7 SFP
g_client[16] = i2c_new_client_device(adapter, &ix8a_bwde_i2c_devices[10]); // pca9548_7 SFP
i2c_put_adapter(adapter);
}
@ -307,7 +307,7 @@ static int __init ix8a_bwde_platform_init(void)
}
else
{
g_client[17] = i2c_new_device(adapter, &ix8a_bwde_i2c_devices[3]); // eeprom
g_client[17] = i2c_new_client_device(adapter, &ix8a_bwde_i2c_devices[3]); // eeprom
i2c_put_adapter(adapter);
}
@ -320,9 +320,9 @@ static int __init ix8a_bwde_platform_init(void)
else
{
if (i < 61) // SFP28 1~48 EEPROM
g_client_port[i - 13] = i2c_new_device(adapter, &ix8a_bwde_i2c_devices[19]);
g_client_port[i - 13] = i2c_new_client_device(adapter, &ix8a_bwde_i2c_devices[19]);
else // QSFP 49~56 EEPROM
g_client_port[i - 13] = i2c_new_device(adapter, &ix8a_bwde_i2c_devices[15]);
g_client_port[i - 13] = i2c_new_client_device(adapter, &ix8a_bwde_i2c_devices[15]);
i2c_put_adapter(adapter);
}
}

View File

@ -28,7 +28,7 @@
#define __TO_R_EXP(bacc) (int32_t)(tos32(((BSWAP_32(bacc) & 0xf0) >> 4), 4))
#define __TO_B_EXP(bacc) (int32_t)(tos32((BSWAP_32(bacc) & 0xf), 4))
#define SENSOR_ATTR_MAX 17
#define SENSOR_ATTR_MAX 19
#define SENSOR_ATTR_NAME_LENGTH 20
#define SENSOR_GET_CAP_LABEL 0x001
@ -53,6 +53,8 @@
#define SENSOR_GET_CAP_PSU_PRESENT 0x8000
#define SENSOR_GET_CAP_MFRID 0x10000
#define SENSOR_GET_CAP_VIN_TYPE 0x20000
#define SENSOR_GET_CAP_POUT_MAX 0x40000
#define SDR_SENSOR_TYPE_TEMP 0x01
#define SDR_SENSOR_TYPE_VOLT 0x02
@ -84,6 +86,8 @@
#define IPMI_TIMEOUT (4 * HZ)
#define IPMI_MAX_WAIT_QUEUE 1
typedef struct ipmi_user *ipmi_user_t;
struct quanta_hwmon_ipmi_data
{
struct platform_device *ipmi_platform_dev;
@ -1007,6 +1011,8 @@ void ipmi_sdr_set_sensor_factor(uint8_t idx,
g_sensor_data[idx].capability |= SENSOR_GET_CAP_SN;
g_sensor_data[idx].capability |= SENSOR_GET_CAP_MFRID;
g_sensor_data[idx].capability |= SENSOR_GET_CAP_PSU_PRESENT;
g_sensor_data[idx].capability |= SENSOR_GET_CAP_VIN_TYPE;
g_sensor_data[idx].capability |= SENSOR_GET_CAP_POUT_MAX;
}
sprintf(g_sensor_data[idx].attrinfo.attr_type_str, "power");
}
@ -1086,7 +1092,7 @@ int32_t sdr_convert_sensor_reading(uint8_t idx, uint8_t val,
result = (m * (int16_t)val) * decimal_point + b;
break;
default:
return;
return result;
}
pow_convert(&result, k2);
@ -1218,6 +1224,82 @@ int32_t ipmi_get_psu_info(uint8_t idx, uint8_t cmd, uint8_t *retbuf)
return sprintf(retbuf, "N/A\n");
}
int32_t ipmi_get_vin_type(uint8_t idx, uint8_t *retbuf)
{
uint8_t psu_slot = 0;
int32_t rv = 0;
uint8_t returnData = 0;
uint8_t msg_data[] = { 0x06, 0x52, 0x0f, 0x00, 0x01, 0xd8 }; // read line status
if (strstr(g_sensor_data[idx].sensor_idstring, "PSU1")) psu_slot = 1;
else psu_slot = 2;
msg_data[3] = (psu_slot == 1) ? 0xb0 : 0xb2;
if (ipmi_check_psu_present(psu_slot)) {
mutex_lock(&ipmi_lock);
rv = ipmi_send_system_cmd(msg_data, sizeof(msg_data), &returnData, 1);
mutex_unlock(&ipmi_lock);
if (rv) {
printk("BMC down at (%d)!!\n", __LINE__);
}
else {
switch (returnData)
{
case 0x7: //LVDC
case 0x3: //HVDC
return sprintf(retbuf, "DC\n");
default:
return sprintf(retbuf, "AC\n");
}
}
}
else {
//printk("Error ! cannot detect PSU%d\n", psu_slot);
}
return sprintf(retbuf, "N/A\n");
}
int32_t ipmi_get_pout_max(uint8_t idx, uint8_t *retbuf)
{
uint8_t psu_slot = 0;
int32_t rv = 0, pout_max = 0;
uint8_t returnData[2] = { 0 };
uint8_t msg_data[] = { 0x06, 0x52, 0x0f, 0x00, 0x02, 0xa7 };
if (strstr(g_sensor_data[idx].sensor_idstring, "PSU1")) psu_slot = 1;
else psu_slot = 2;
msg_data[3] = (psu_slot == 1) ? 0xb0 : 0xb2;
if (ipmi_check_psu_present(psu_slot)) {
mutex_lock(&ipmi_lock);
rv = ipmi_send_system_cmd(msg_data, sizeof(msg_data), returnData, 1);
mutex_unlock(&ipmi_lock);
if (rv) {
printk("BMC down at (%d)!!\n", __LINE__);
}
else {
/* MFR_POUT_MAX has 2 data format: Direct and Linear Data (see PMbus spec).
Query command is needed to tell the data format, but since we have not use PSU
whose output power is over 0x07ff (2047), just check the first 5 bits*/
if ((returnData[1] & 0xf8) == 0) // Direct
pout_max = (returnData[1] << 8) | returnData[0];
else // Linear Data
pout_max = (((returnData[1] & 0x07) << 8) | returnData[0]) << ((returnData[1] & 0xf8) >> 3);
return sprintf(retbuf, "%d\n", pout_max);
}
}
else {
//printk("Error ! cannot detect PSU%d\n", psu_slot);
}
return sprintf(retbuf, "N/A\n");
}
void ipmi_fan_control(uint8_t cmd_data1, uint8_t cmd_data2, uint8_t *retbuf)
{
int32_t rv = 0;
@ -1356,6 +1438,18 @@ static ssize_t show_mfrid(struct device *dev, struct device_attribute *devattr,
return ipmi_get_psu_info(attr->index + DEBUGUSE_SHIFT, 0x99, buf);
}
static ssize_t show_vin_type(struct device *dev, struct device_attribute *devattr, char *buf)
{
struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
return ipmi_get_vin_type(attr->index + DEBUGUSE_SHIFT, buf);
}
static ssize_t show_pout_max(struct device *dev, struct device_attribute *devattr, char *buf)
{
struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
return ipmi_get_pout_max(attr->index + DEBUGUSE_SHIFT, buf);
}
static ssize_t show_pwm(struct device *dev, struct device_attribute *devattr,
char *buf)
{
@ -1432,7 +1526,6 @@ static ssize_t show_fanpresent(struct device *dev,
uint8_t msg_data[] = { 0x36, 0xB9, 0x4C, 0x1C, 0x00, 0x02 }; /*netfn = 0x36; cmd = 0xB9; */
struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
struct kernel_ipmi_msg msg;
fan_idx = (g_sensor_data[attr->index].sensor_idstring[8] - '0') - 1;
@ -1465,7 +1558,8 @@ static ssize_t(*const attr_show_func_ptr[SENSOR_ATTR_MAX])(struct device *dev,
, show_unc, show_ucr, show_unr
, show_model, show_sn, show_pwm
, show_controlmode, show_direction, show_fanpresent
, show_psupresent, show_mfrid
, show_psupresent, show_mfrid, show_vin_type
, show_pout_max
};
static ssize_t(*const attr_store_func_ptr[SENSOR_ATTR_MAX])(struct device *dev,
@ -1476,7 +1570,8 @@ static ssize_t(*const attr_store_func_ptr[SENSOR_ATTR_MAX])(struct device *dev,
, NULL, NULL, NULL
, NULL, NULL, store_pwm
, store_controlmode, NULL, NULL
, NULL, NULL
, NULL, NULL, NULL
, NULL
};
static const char *const sensor_attrnames[SENSOR_ATTR_MAX] =
@ -1486,7 +1581,8 @@ static const char *const sensor_attrnames[SENSOR_ATTR_MAX] =
, "%s%d_ncrit", "%s%d_crit", "%s%d_max"
, "%s%d_model", "%s%d_sn", "%s%d_pwm"
, "%s%d_controlmode", "%s%d_direction", "%s%d_present"
, "%s%d_present", "%s%d_mfrid"
, "%s%d_present", "%s%d_mfrid", "%s%d_vin_type"
, "%s%d_pout_max"
};
static int32_t create_sensor_attrs(int32_t attr_no)
@ -1735,7 +1831,7 @@ static int32_t __init quanta_hwmon_ipmi_init(void)
goto device_reg_err;
}
data->ipmi_hwmon_dev = hwmon_device_register_with_groups(NULL, DRVNAME, NULL,
data->ipmi_hwmon_dev = hwmon_device_register_with_groups(&data->ipmi_platform_dev->dev, DRVNAME, NULL,
NULL);
err = IS_ERR(data->ipmi_hwmon_dev);
if (err)
@ -1762,21 +1858,15 @@ static int32_t __init quanta_hwmon_ipmi_init(void)
return 0;
init_sensor_err:
if (g_sensor_data)
{
kfree(g_sensor_data);
g_sensor_data = NULL;
}
ipmi_create_err:
hwmon_device_unregister(data->ipmi_hwmon_dev);
hwmon_register_err:
platform_device_unregister(data->ipmi_platform_dev);
device_reg_err:
if (data)
{
kfree(data);
data = NULL;
}
alloc_err:
return err;
}
@ -1792,23 +1882,16 @@ static void __exit quanta_hwmon_ipmi_exit(void)
platform_device_unregister(data->ipmi_platform_dev);
if (g_sensor_data)
{
kfree(g_sensor_data);
g_sensor_data = NULL;
}
if (data)
{
kfree(data);
data = NULL;
}
}
module_init(quanta_hwmon_ipmi_init);
module_exit(quanta_hwmon_ipmi_exit);
MODULE_AUTHOR("Charcar~~Charcar~Charlie li li");
MODULE_VERSION("2.0");
MODULE_VERSION("2.1");
MODULE_DESCRIPTION("Quanta BMC hardware monitor driver");
MODULE_LICENSE("GPL");

View File

@ -72,6 +72,13 @@ class Chassis(ChassisBase):
for index in range(1, self.__num_of_ports + 1):
self.__xcvr_presence[index] = self._sfp_list[index-1].get_presence()
# Initialize components
from sonic_platform.component import ComponentBIOS, ComponentBMC, ComponentCPLD, ComponentPCIE
self._component_list.append(ComponentBIOS())
self._component_list.append(ComponentBMC())
self._component_list.extend(ComponentCPLD.get_component_list())
self._component_list.append(ComponentPCIE())
##############################################
# Device methods
##############################################
@ -79,7 +86,7 @@ class Chassis(ChassisBase):
def get_sfp(self, index):
"""
Retrieves sfp represented by (1-based) index <index>
For Quanta IX8A the index in sfputil.py starts from 1, so override
For Quanta the index in sfputil.py starts from 1, so override
Args:
index: An integer, the index (1-based) of the sfp to retrieve.
@ -179,6 +186,18 @@ class Chassis(ChassisBase):
"""
return self._eeprom.system_eeprom_info()
def get_reboot_cause(self):
"""
Retrieves the cause of the previous reboot
Returns:
A tuple (string, string) where the first element is a string
containing the cause of the previous reboot. This string must be
one of the predefined strings in this class. If the first string
is "REBOOT_CAUSE_HARDWARE_OTHER", the second string can be used
to pass a description of the reboot cause.
"""
return (ChassisBase.REBOOT_CAUSE_HARDWARE_OTHER, "Invalid Reason")
##############################################
# Other methods
##############################################
@ -215,10 +234,10 @@ class Chassis(ChassisBase):
cur_xcvr_presence = self._sfp_list[index-1].get_presence()
if cur_xcvr_presence != self.__xcvr_presence[index]:
if cur_xcvr_presence is True:
xcvr_change_event_dict[str(index)] = '1'
xcvr_change_event_dict[index] = '1'
self.__xcvr_presence[index] = True
elif cur_xcvr_presence is False:
xcvr_change_event_dict[str(index)] = '0'
xcvr_change_event_dict[index] = '0'
self.__xcvr_presence[index] = False
event = True

View File

@ -0,0 +1,204 @@
#!/usr/bin/env python
########################################################################
# Quanta IX8A_BDE
#
# Name: component.py, version: 1.3
# Module contains an implementation of SONiC Platform Base API and
# provides the Components' (e.g., BIOS, CPLD, FPGA, etc.) available in
# the platform
#
########################################################################
try:
import subprocess
from sonic_platform_base.component_base import ComponentBase
from collections import namedtuple
except ImportError as e:
raise ImportError(str(e) + "- required module not found")
class Component(ComponentBase):
def __init__(self):
ComponentBase.__init__(self)
self.name = None
self.description = None
def get_name(self):
return self.name
def get_description(self):
return self.description
def install_firmware(self, image_path):
"""
Installs firmware to the component
Args:
image_path: A string, path to firmware image
Returns:
A boolean, True if install was successful, False if not
"""
return False
@staticmethod
def _get_command_result(cmdline):
try:
proc = subprocess.Popen(cmdline,
stdout=subprocess.PIPE,
shell=True, stderr=subprocess.STDOUT,
universal_newlines=True)
stdout = proc.communicate()[0]
rc = proc.wait()
result = stdout.rstrip('\n')
if rc != 0:
raise RuntimeError("Failed to execute command {}, return code {}, {}".format(cmdline, rc, stdout))
except OSError as e:
raise RuntimeError("Failed to execute command {} due to {}".format(cmdline, repr(e)))
return result
class ComponentBIOS(Component):
COMPONENT_NAME = 'BIOS'
COMPONENT_DESCRIPTION = 'BIOS - Basic Input/Output System'
BIOS_QUERY_VERSION_COMMAND = "dmidecode -s bios-version"
def __init__(self):
super(ComponentBIOS, self).__init__()
self.name = self.COMPONENT_NAME
self.description = self.COMPONENT_DESCRIPTION
def get_firmware_version(self):
"""
Retrieves the firmware version of the component
Returns:
A string containing the firmware version of the component
"""
bios_ver = self._get_command_result(self.BIOS_QUERY_VERSION_COMMAND)
if not bios_ver:
return 'ERR'
else:
return bios_ver
class ComponentBMC(Component):
COMPONENT_NAME = 'BMC'
COMPONENT_DESCRIPTION = 'BMC - Board Management Controller'
BMC_QUERY_VERSION_COMMAND = "ipmitool mc info | grep 'Firmware Revision'"
def __init__(self):
super(ComponentBMC, self).__init__()
self.name = self.COMPONENT_NAME
self.description = self.COMPONENT_DESCRIPTION
def get_firmware_version(self):
"""
Retrieves the firmware version of the component
Returns:
A string containing the firmware version of the component
"""
bmc_ver = self._get_command_result(self.BMC_QUERY_VERSION_COMMAND)
if not bmc_ver:
return 'ERR'
else:
bmc_ver = bmc_ver.split(": ")[1]
return bmc_ver.strip()
class ComponentCPLD(Component):
Cpld = namedtuple("Cpld", ['name', 'cmd_index', 'description'])
cplds = {
1: Cpld("BOOT_CPLD", 1, "Power sequence"),
2: Cpld("FAN_CPLD", 2, "Fan"),
3: Cpld("MB_CPLD_IO_1", 7, "Port IO-1"),
4: Cpld("MB_CPLD_IO_2", 5, "Port IO-2"),
5: Cpld("MB_CPLD_IO_3", 4, "Port IO-3"),
6: Cpld("MB_CPLD_LED_1", 6, "Port LED-1"),
7: Cpld("MB_CPLD_LED_2", 3, "Port LED-2"),
}
def __init__(self, component_index):
super(ComponentCPLD, self).__init__()
self.index = component_index
def get_name(self):
"""
Retrieves the name of the component
Returns:
A string containing the name of the component
"""
self.name = self.cplds[self.index].name
return self.name
def get_description(self):
"""
Retrieves the description of the component
Returns:
A string containing the description of the component
"""
self.description = self.cplds[self.index].description
return self.description
def get_firmware_version(self):
"""
Retrieves the firmware version of the component
Returns:
A string containing the firmware version of the component
"""
self._get_command_result("ipmitool raw 0x30 0xe0 0xd0 0x01 0x01")
res = self._get_command_result("ipmitool raw 0x32 0xff 0x02 {}".format(self.cplds[self.index].cmd_index))
self._get_command_result("ipmitool raw 0x30 0xe0 0xd0 0x01 0x00")
if not res:
return 'ERR'
else:
return res.split()[3].upper() + res.split()[2].upper() + res.split()[1].upper() + res.split()[0].upper()
@classmethod
def get_component_list(cls):
component_list = []
cpld_number = len(cls.cplds)
for cpld_idx in range(1, cpld_number + 1):
component_list.append(cls(cpld_idx))
return component_list
class ComponentPCIE(Component):
COMPONENT_NAME = 'PCIe'
COMPONENT_DESCRIPTION = 'ASIC PCIe Firmware'
PCIE_QUERY_VERSION_COMMAND = "bcmcmd 'pciephy fw version' | grep 'FW version'"
def __init__(self):
super(ComponentPCIE, self).__init__()
self.name = self.COMPONENT_NAME
self.description = self.COMPONENT_DESCRIPTION
def get_firmware_version(self):
"""
Retrieves the firmware version of the component
Returns:
A string containing the firmware version of the component
"""
version = self._get_command_result(self.PCIE_QUERY_VERSION_COMMAND)
if not version:
return 'ERR'
else:
version = version.split(": ")[1]
return version.strip()

View File

@ -1,7 +1,7 @@
#!/usr/bin/env python
#############################################################################
# Quanta IX8A-BWDE
# Quanta IX8A_BDE
#
# Module contains an implementation of SONiC Platform Base API and
# provides the FAN information
@ -11,6 +11,7 @@
try:
import logging
import os
import glob
from sonic_platform_base.fan_base import FanBase
except ImportError as e:
raise ImportError(str(e) + "- required module not found")
@ -19,9 +20,7 @@ except ImportError as e:
###############
# Global
###############
HWMON_DIR = "/sys/class/hwmon/hwmon2/"
FAN_INDEX_START = 18
NUM_FANTRAYS = 6
HWMON_IPMI_DIR = "/sys/devices/platform/quanta_hwmon_ipmi/hwmon/hwmon*/"
FANS_PERTRAY = 2
class Fan(FanBase):
@ -30,30 +29,46 @@ class Fan(FanBase):
def __init__(self, index, is_psu_fan=False):
self.is_psu_fan = is_psu_fan
self.fan_index = index
self.psu_fan_index_mapping = {
1:120,
2:132,
}
self.psu_index_mapping = {
1:114,
2:126,
}
hwmon_dir=glob.glob(HWMON_IPMI_DIR)[0]
if self.is_psu_fan:
self.fan_presence_attr = "power{}_present".format(self.psu_index_mapping[index])
self.fan_pwm_attr = "fan{}_pwm".format(self.psu_fan_index_mapping[index])
self.fan_rpm_attr = "fan{}_input".format(self.psu_fan_index_mapping[index])
self.fan_direction_attr = "fan{}_direction".format(self.psu_fan_index_mapping[index])
power_out_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_POWER_OUT".format(self.fan_index), 'power')
fan_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_Fan".format(self.fan_index), 'fan')
self.fan_presence_attr = power_out_prefix + 'present'
self.fan_pwm_attr = fan_prefix + 'pwm'
self.fan_rpm_attr = fan_prefix + 'input'
self.fan_direction_attr = fan_prefix + 'direction'
else:
self.fan_presence_attr = "fan{}_present".format(FAN_INDEX_START+(index-1))
self.fan_pwm_attr = "fan{}_pwm".format(FAN_INDEX_START+(index-1))
self.fan_rpm_attr = "fan{}_input".format(FAN_INDEX_START+(index-1))
self.fan_direction_attr = "fan{}_direction".format(FAN_INDEX_START+(index-1))
fantray_index = (self.fan_index-1)//FANS_PERTRAY+1
fan_index_intray = self.fan_index - ((fantray_index-1)*FANS_PERTRAY)
fan_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "Fan_SYS_{}_{}".format(fantray_index, fan_index_intray), 'fan')
self.fan_presence_attr = fan_prefix + 'present'
self.fan_pwm_attr = fan_prefix + 'pwm'
self.fan_rpm_attr = fan_prefix + 'input'
self.fan_direction_attr = fan_prefix + 'direction'
#######################
# private function
#######################
def __get_hwmon_attr_prefix(self, dir, label, type):
retval = 'ERR'
if not os.path.isdir(dir):
return retval
try:
for filename in os.listdir(dir):
if filename[-5:] == 'label' and type in filename:
file_path = os.path.join(dir, filename)
if os.path.isfile(file_path) and label == self.__get_attr_value(file_path):
return file_path[0:-5]
except Exception as error:
logging.error("Error when getting {} label path: {}".format(label, error))
return retval
def __get_attr_value(self, attr_path):
retval = 'ERR'
@ -64,7 +79,7 @@ class Fan(FanBase):
with open(attr_path, 'r') as fd:
retval = fd.read()
except Exception as error:
logging.error("Unable to open " + attr_path + " file !")
logging.error("Unable to open {} file: {}".format(attr_path, error))
retval = retval.rstrip(' \t\n\r')
return retval
@ -95,8 +110,7 @@ class Fan(FanBase):
Returns:
bool: True if device is present, False if not
"""
attr_path = HWMON_DIR + self.fan_presence_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.fan_presence_attr)
if (attr_rv != 'ERR'):
if (attr_rv == '1'):
return True
@ -113,8 +127,7 @@ class Fan(FanBase):
A boolean value, True if device is operating properly, False if not
"""
if self.get_presence():
attr_path = HWMON_DIR + self.fan_rpm_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.fan_rpm_attr)
if (attr_rv != 'ERR' and attr_rv != '0.0'):
return True
@ -135,8 +148,7 @@ class Fan(FanBase):
A string, either FAN_DIRECTION_INTAKE or FAN_DIRECTION_EXHAUST
depending on fan direction
"""
attr_path = HWMON_DIR + self.fan_direction_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.fan_direction_attr)
if attr_rv == '2':
return self.FAN_DIRECTION_INTAKE
@ -152,8 +164,7 @@ class Fan(FanBase):
to 100 (full speed)
"""
if self.get_presence():
attr_path = HWMON_DIR + self.fan_pwm_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.fan_pwm_attr)
if (attr_rv != 'ERR'):
return int(float(attr_rv))
@ -169,8 +180,7 @@ class Fan(FanBase):
Returns:
An integer, speed of the fan in RPM
"""
attr_path = HWMON_DIR + self.fan_rpm_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.fan_rpm_attr)
if (attr_rv != 'ERR'):
return int(float(attr_rv))
@ -185,8 +195,7 @@ class Fan(FanBase):
An integer, the percentage of full fan speed, in the range 0 (off)
to 100 (full speed)
"""
attr_path = HWMON_DIR + self.fan_pwm_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.fan_pwm_attr)
if (attr_rv != 'ERR'):
return int(float(attr_rv))

View File

@ -28,7 +28,7 @@ class FanDrawer(FanDrawerBase):
Returns:
string: The name of the device
"""
return 'Fan {}'.format(self._index)
return 'Fantray{}'.format(self._index)
def get_presence(self):
"""

View File

@ -8,57 +8,61 @@
try:
import logging
import os
import glob
from sonic_platform_base.psu_base import PsuBase
from sonic_platform.fan import Fan
except ImportError as e:
raise ImportError(str(e) + "- required module not found")
HWMON_DIR = "/sys/class/hwmon/hwmon2/"
HWMON_IPMI_DIR = "/sys/devices/platform/quanta_hwmon_ipmi/hwmon/hwmon*/"
class Psu(PsuBase):
def __init__(self, index):
PsuBase.__init__(self)
fan = Fan(index, True)
self._fan_list.append(fan)
self.psu_index_mapping = {
1:114,
2:126,
}
self.psu_powerin_index_mapping = {
1:119,
2:131,
}
self.psu_currentout_index_mapping = {
1:130,
2:115,
}
self.psu_currentin_index_mapping = {
1:130,
2:115,
}
self.psu_voltageout_index_mapping = {
1:129,
2:124,
}
self.psu_voltagein_index_mapping = {
1:125,
2:128,
}
self.index = index
self.psu_presence_attr = "power{}_present".format(self.psu_index_mapping[self.index])
self.psu_status_attr = "curr{}_input".format(self.psu_currentout_index_mapping[self.index])
self.psu_power_in_attr = "power{}_input".format(self.psu_powerin_index_mapping[self.index])
self.psu_power_out_attr = "power{}_input".format(self.psu_index_mapping[self.index])
self.psu_voltage_out_attr = "in{}_input".format(self.psu_voltageout_index_mapping[self.index])
self.psu_current_out_attr = "curr{}_input".format(self.psu_currentout_index_mapping[self.index])
self.psu_voltage_in_attr = "in{}_input".format(self.psu_voltagein_index_mapping[self.index])
self.psu_current_in_attr = "curr{}_input".format(self.psu_currentin_index_mapping[self.index])
self.psu_serial_attr = "power{}_sn".format(self.psu_index_mapping[self.index])
self.psu_model_attr = "power{}_model".format(self.psu_index_mapping[self.index])
self.psu_mfr_id_attr = "power{}_mfrid".format(self.psu_index_mapping[self.index])
self.psu_capacity_attr = "power{}_pout_max".format(self.psu_index_mapping[self.index])
self.psu_type_attr = "power{}_vin_type".format(self.psu_index_mapping[self.index])
hwmon_dir=glob.glob(HWMON_IPMI_DIR)[0]
current_in_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_CURRENT_IN".format(self.index), 'curr')
current_out_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_CURRENT_OUT".format(self.index), 'curr')
power_in_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_POWER_IN".format(self.index), 'power')
power_out_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_POWER_OUT".format(self.index), 'power')
voltage_in_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_VOLTAGE_IN".format(self.index), 'in')
voltage_out_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_VOLTAGE_OUT".format(self.index), 'in')
temp1_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_TEMP1".format(self.index), 'temp')
self.psu_current_in_attr = current_in_prefix + 'input'
self.psu_current_out_attr = current_out_prefix + 'input'
self.psu_power_in_attr = power_in_prefix + 'input'
self.psu_power_out_attr = power_out_prefix + 'input'
self.psu_voltage_in_attr = voltage_in_prefix + 'input'
self.psu_voltage_out_attr = voltage_out_prefix + 'input'
self.psu_status_attr = current_out_prefix + 'input'
self.psu_presence_attr = power_out_prefix + 'present'
self.psu_serial_attr = power_out_prefix + 'sn'
self.psu_model_attr = power_out_prefix + 'model'
self.psu_mfr_id_attr = power_out_prefix + 'mfrid'
self.psu_capacity_attr = power_out_prefix + 'pout_max'
self.psu_type_attr = power_out_prefix + 'vin_type'
self.psu_temp_attr = temp1_prefix + 'input'
def __get_hwmon_attr_prefix(self, dir, label, type):
retval = 'ERR'
if not os.path.isdir(dir):
return retval
try:
for filename in os.listdir(dir):
if filename[-5:] == 'label' and type in filename:
file_path = os.path.join(dir, filename)
if os.path.isfile(file_path) and label == self.__get_attr_value(file_path):
return file_path[0:-5]
except Exception as error:
logging.error("Error when getting {} label path: {}".format(label, error))
return retval
def __get_attr_value(self, attr_path):
@ -70,10 +74,9 @@ class Psu(PsuBase):
with open(attr_path, 'r') as fd:
retval = fd.read()
except Exception as error:
logging.error("Unable to open " + attr_path + " file !")
logging.error("Unable to open {} file: {}".format(attr_path, error))
retval = retval.rstrip(' \t\n\r')
fd.close()
return retval
##############################################
@ -97,10 +100,9 @@ class Psu(PsuBase):
bool: True if device is present, False if not
"""
presence = False
attr_path = HWMON_DIR+self.psu_presence_attr
attr_normal = '1'
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.psu_presence_attr)
if (attr_rv != 'ERR'):
if (attr_rv == attr_normal):
presence = True
@ -115,8 +117,7 @@ class Psu(PsuBase):
string: Model/part number of device
"""
model = "N/A"
attr_path = HWMON_DIR+self.psu_model_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.psu_model_attr)
if (attr_rv != 'ERR'):
model = attr_rv
@ -130,8 +131,7 @@ class Psu(PsuBase):
string: Manufacturer's id of device
"""
mfr_id = "N/A"
attr_path = HWMON_DIR+self.psu_mfr_id_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.psu_mfr_id_attr)
if (attr_rv != 'ERR'):
mfr_id = attr_rv
@ -145,9 +145,7 @@ class Psu(PsuBase):
string: Serial number of device
"""
serial = "N/A"
attr_path = HWMON_DIR+self.psu_serial_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.psu_serial_attr)
if (attr_rv != 'ERR'):
serial = attr_rv
@ -161,9 +159,7 @@ class Psu(PsuBase):
A boolean value, True if device is operating properly, False if not
"""
status = False
attr_path = HWMON_DIR+self.psu_status_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.psu_status_attr)
if (attr_rv != 'ERR'):
attr_rv, dummy = attr_rv.split('.', 1)
if (int(attr_rv) != 0):
@ -184,9 +180,7 @@ class Psu(PsuBase):
e.g. 12.1
"""
voltage_out = 0.0
attr_path = HWMON_DIR+self.psu_voltage_out_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.psu_voltage_out_attr)
if (attr_rv != 'ERR'):
attr_rv, dummy = attr_rv.split('.', 1)
voltage_out = float(attr_rv) / 1000
@ -201,9 +195,7 @@ class Psu(PsuBase):
A float number, the electric current in amperes, e.g 15.4
"""
current_out = 0.0
attr_path = HWMON_DIR+self.psu_current_out_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.psu_current_out_attr)
if (attr_rv != 'ERR'):
attr_rv, dummy = attr_rv.split('.', 1)
current_out = float(attr_rv) / 1000
@ -212,16 +204,14 @@ class Psu(PsuBase):
def get_input_voltage(self):
"""
Retrieves current PSU voltage output
Retrieves current PSU voltage input
Returns:
A float number, the output voltage in volts,
A float number, the input voltage in volts,
e.g. 12.1
"""
voltage_in = 0.0
attr_path = HWMON_DIR+self.psu_voltage_in_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.psu_voltage_in_attr)
if (attr_rv != 'ERR'):
attr_rv, dummy = attr_rv.split('.', 1)
voltage_in = float(attr_rv) / 1000
@ -236,9 +226,7 @@ class Psu(PsuBase):
A float number, the electric current in amperes, e.g 15.4
"""
current_in = 0.0
attr_path = HWMON_DIR+self.psu_current_in_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.psu_current_in_attr)
if (attr_rv != 'ERR'):
attr_rv, dummy = attr_rv.split('.', 1)
current_in = float(attr_rv) / 1000
@ -253,9 +241,7 @@ class Psu(PsuBase):
A float number, the power in watts, e.g. 302.6
"""
power_out = 0.0
attr_path = HWMON_DIR+self.psu_power_out_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.psu_power_out_attr)
if (attr_rv != 'ERR'):
attr_rv, dummy = attr_rv.split('.', 1)
power_out = float(attr_rv) / 1000
@ -292,8 +278,7 @@ class Psu(PsuBase):
A string, the type of PSU (AC/DC)
"""
type = "AC"
attr_path = HWMON_DIR+self.psu_type_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.psu_type_attr)
if (attr_rv != 'ERR'):
type = attr_rv
@ -307,8 +292,7 @@ class Psu(PsuBase):
An integer, the capacity of PSU
"""
capacity = 0
attr_path = HWMON_DIR+self.psu_capacity_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.psu_capacity_attr)
if (attr_rv != 'ERR'):
try:
capacity = int(attr_rv)
@ -317,3 +301,19 @@ class Psu(PsuBase):
return capacity
def get_temperature(self):
"""
Retrieves current temperature reading from PSU
Returns:
A float number of current temperature in Celsius up to nearest thousandth
of one degree Celsius, e.g. 30.125
"""
tout = 0.0
attr_rv = self.__get_attr_value(self.psu_temp_attr)
if (attr_rv != 'ERR'):
tout = float(attr_rv)
# tout is in milli degree celcius
return float(tout/1000.0)

View File

@ -10,13 +10,10 @@
import os
import time
#import subprocess
#import sonic_device_util
from ctypes import create_string_buffer
try:
from sonic_platform_base.sfp_base import SfpBase
# from sonic_platform_base.sonic_eeprom import eeprom_dts
from sonic_platform_base.sonic_sfp.sff8472 import sff8472InterfaceId
from sonic_platform_base.sonic_sfp.sff8472 import sff8472Dom
from sonic_platform_base.sonic_sfp.sff8436 import sff8436InterfaceId
@ -175,7 +172,6 @@ class Sfp(SfpBase):
# Init index
self.index = sfp_index
self.port_num = self.index
#self.dom_supported = False
self.sfp_type = sfp_type
# Init eeprom path
eeprom_path = '/sys/bus/i2c/devices/i2c-{0}/{0}-0050/eeprom'
@ -284,15 +280,6 @@ class Sfp(SfpBase):
else:
return 'N/A'
def __read_txt_file(self, file_path):
try:
with open(file_path, 'r') as fd:
data = fd.read()
return data.strip()
except IOError:
pass
return ""
def __is_host(self):
return os.system(self.HOST_CHK_CMD) == 0
@ -355,26 +342,6 @@ class Sfp(SfpBase):
return eeprom_raw
def __convert_string_to_num(self, value_str):
if "-inf" in value_str:
return 'N/A'
elif "Unknown" in value_str:
return 'N/A'
elif 'dBm' in value_str:
t_str = value_str.rstrip('dBm')
return float(t_str)
elif 'mA' in value_str:
t_str = value_str.rstrip('mA')
return float(t_str)
elif 'C' in value_str:
t_str = value_str.rstrip('C')
return float(t_str)
elif 'Volts' in value_str:
t_str = value_str.rstrip('Volts')
return float(t_str)
else:
return 'N/A'
def _dom_capability_detect(self):
if not self.get_presence():
self.dom_supported = False
@ -533,9 +500,7 @@ class Sfp(SfpBase):
else:
if not self.get_presence():
return transceiver_info_dict
elif i == max_retry-1:
pass
else:
elif i < max_retry-1:
time.sleep(0.5)
if sfp_interface_bulk_raw is None:
@ -590,7 +555,8 @@ class Sfp(SfpBase):
['data']['Extended Identifier']['value']
transceiver_info_dict['ext_rateselect_compliance'] = sfp_interface_bulk_data \
['data']['RateIdentifier']['value']
transceiver_info_dict['type_abbrv_name'] = 'N/A'
transceiver_info_dict['type_abbrv_name'] = sfp_interface_bulk_data \
['data']['type_abbrv_name']['value']
if self.sfp_type == QSFP_TYPE:
for key in qsfp_cable_length_tup:
if key in sfp_interface_bulk_data['data']:
@ -860,7 +826,7 @@ class Sfp(SfpBase):
transceiver_dom_threshold_dict['txbiaslowwarning'] = channel_threshold_data['TxBiasLowWarning']['value']
for key in transceiver_dom_threshold_dict:
transceiver_dom_threshold_dict[key] = self.__convert_string_to_num(transceiver_dom_threshold_dict[key])
transceiver_dom_threshold_dict[key] = self._convert_string_to_num(transceiver_dom_threshold_dict[key])
return transceiver_dom_threshold_dict
@ -908,7 +874,7 @@ class Sfp(SfpBase):
transceiver_dom_threshold_info_dict['rxpowerlowwarning'] = dom_module_threshold_data['data']['RXPowerLowWarning']['value']
for key in transceiver_dom_threshold_info_dict:
transceiver_dom_threshold_info_dict[key] = self.__convert_string_to_num(transceiver_dom_threshold_info_dict[key])
transceiver_dom_threshold_info_dict[key] = self._convert_string_to_num(transceiver_dom_threshold_info_dict[key])
return transceiver_dom_threshold_info_dict
@ -1461,7 +1427,7 @@ class Sfp(SfpBase):
sysfsfile_eeprom = open(
sysfs_sfp_i2c_client_eeprom_path, mode="r+b", buffering=0)
buffer = create_string_buffer(1)
buffer[0] = chr(tx_disable_ctl)
buffer[0] = tx_disable_ctl
# Write to eeprom
sysfsfile_eeprom.seek(offset + SFP_STATUS_CONTROL_OFFSET)
sysfsfile_eeprom.write(buffer[0])
@ -1514,7 +1480,7 @@ class Sfp(SfpBase):
else:
tx_disable_ctl = channel_state & (~channel)
buffer = create_string_buffer(1)
buffer[0] = chr(tx_disable_ctl)
buffer[0] = tx_disable_ctl
# Write to eeprom
sysfsfile_eeprom = open(
self.port_to_eeprom_mapping[self.port_num], "r+b")
@ -1602,7 +1568,7 @@ class Sfp(SfpBase):
power_set_bit |= 1 << 1
buffer = create_string_buffer(1)
buffer[0] = chr(power_override_bit | power_set_bit)
buffer[0] = power_override_bit | power_set_bit
# Write to eeprom
sysfsfile_eeprom = open(self.port_to_eeprom_mapping[self.port_num], "r+b")
sysfsfile_eeprom.seek(QSFP_POWEROVERRIDE_OFFSET)

View File

@ -1,7 +1,7 @@
#!/usr/bin/env python
#############################################################################
# Quanta
# Quanta IX8A_BDE
#
# Module contains an implementation of SONiC Platform Base API and
# provides the Thermal information
@ -10,43 +10,44 @@
import logging
import os
import glob
try:
from sonic_platform_base.thermal_base import ThermalBase
except ImportError as e:
raise ImportError(str(e) + "- required module not found")
HWMON_DIR = "/sys/class/hwmon/hwmon2/"
HWMON_IPMI_DIR = "/sys/devices/platform/quanta_hwmon_ipmi/hwmon/hwmon*/"
thermal_index_mapping = {
1:53,
2:54,
3:55,
4:56,
5:57,
6:58,
7:59,
8:60,
9:61,
10:62,
11:63,
12:64,
13:86,
14:87,
15:88,
16:89,
17:90,
18:91,
19:92,
20:93,
21:94,
22:109,
23:116,
24:117,
25:121,
26:122,
27:123,
28:127
1:'PSU1_TEMP1',
2:'PSU1_TEMP2',
3:'PSU1_TEMP3',
4:'PSU2_TEMP1',
5:'PSU2_TEMP2',
6:'PSU2_TEMP3',
7:'QMACTemp_0',
8:'QMACTemp_1',
9:'QMACTemp_2',
10:'QMACTemp_3',
11:'QMACTemp_4',
12:'QMACTemp_5',
13:'QMACTemp_6',
14:'QMACTemp_7',
15:'QMACTemp_8',
16:'QMACTemp_9',
17:'Temp_1V05_PCH_VR',
18:'Temp_Ambient_1',
19:'Temp_Ambient_2',
20:'Temp_Ambient_3',
21:'Temp_Ambient_4',
22:'Temp_Ambient_5',
23:'Temp_Ambient_6',
24:'Temp_CPU',
25:'Temp_DDRAB_VR',
26:'Temp_SOC_DIMMA0',
27:'Temp_VCCGBE_VR',
28:'Temp_VCCIN_VR'
}
@ -56,11 +57,31 @@ class Thermal(ThermalBase):
def __init__(self, thermal_index):
self.index = thermal_index
self.temp_attr = "temp{}_input".format(thermal_index_mapping[self.index])
self.high_th_attr = "temp{}_ncrit".format(thermal_index_mapping[self.index])
self.high_crit_th_attr = "temp{}_crit".format(thermal_index_mapping[self.index])
self.name_attr = "temp{}_label".format(thermal_index_mapping[self.index])
hwmon_dir=glob.glob(HWMON_IPMI_DIR)[0]
thermal_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, thermal_index_mapping[self.index], 'temp')
self.temp_attr = "{}input".format(thermal_prefix)
self.high_th_attr = "{}ncrit".format(thermal_prefix)
self.high_crit_th_attr = "{}crit".format(thermal_prefix)
self.low_th_attr = "{}lncrit".format(thermal_prefix)
self.low_crit_th_attr = "{}lcrit".format(thermal_prefix)
self.name_attr = "{}label".format(thermal_prefix)
def __get_hwmon_attr_prefix(self, dir, label, type):
retval = 'ERR'
if not os.path.isdir(dir):
return retval
try:
for filename in os.listdir(dir):
if filename[-5:] == 'label' and type in filename:
file_path = os.path.join(dir, filename)
if os.path.isfile(file_path) and label == self.__get_attr_value(file_path):
return file_path[0:-5]
except Exception as error:
logging.error("Error when getting {} label path: {}".format(label, error))
return retval
def __get_attr_value(self, attr_path):
@ -72,7 +93,7 @@ class Thermal(ThermalBase):
with open(attr_path, 'r') as fd:
retval = fd.read()
except Exception as error:
logging.error("Unable to open " + attr_path + " file !")
logging.error("Unable to open {} file: {}".format(attr_path, error))
retval = retval.rstrip(' \t\n\r')
return retval
@ -84,8 +105,7 @@ class Thermal(ThermalBase):
Returns:
string: The name of the device
"""
attr_path = HWMON_DIR + self.name_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.name_attr)
if (attr_rv != 'ERR'):
return attr_rv
@ -99,8 +119,7 @@ class Thermal(ThermalBase):
Returns:
bool: True if device is present, False if not
"""
attr_path = HWMON_DIR + self.name_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.name_attr)
if (attr_rv != 'ERR'):
return True
@ -127,8 +146,37 @@ class Thermal(ThermalBase):
A float number of current temperature in Celsius up to nearest thousandth
of one degree Celsius, e.g. 30.125
"""
attr_path = HWMON_DIR + self.temp_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.temp_attr)
if (attr_rv != 'ERR'):
return float(attr_rv) / 1000
else:
return None
def get_low_threshold(self):
"""
Retrieves the low threshold temperature of thermal
Returns:
A float number, the low threshold temperature of thermal in Celsius
up to nearest thousandth of one degree Celsius, e.g. 30.125
"""
attr_rv = self.__get_attr_value(self.low_th_attr)
if (attr_rv != 'ERR'):
return float(attr_rv) / 1000
else:
return None
def get_low_critical_threshold(self):
"""
Retrieves the low critical threshold temperature of thermal
Returns:
A float number, the low critical threshold temperature of thermal in Celsius
up to nearest thousandth of one degree Celsius, e.g. 30.125
"""
attr_rv = self.__get_attr_value(self.low_crit_th_attr)
if (attr_rv != 'ERR'):
return float(attr_rv) / 1000
@ -143,8 +191,7 @@ class Thermal(ThermalBase):
A float number, the high threshold temperature of thermal in Celsius
up to nearest thousandth of one degree Celsius, e.g. 30.125
"""
attr_path = HWMON_DIR + self.high_th_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.high_th_attr)
if (attr_rv != 'ERR'):
return float(attr_rv) / 1000
@ -159,8 +206,7 @@ class Thermal(ThermalBase):
A float number, the high threshold temperature of thermal in Celsius
up to nearest thousandth of one degree Celsius, e.g. 30.125
"""
attr_path = HWMON_DIR + self.high_crit_th_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.high_crit_th_attr)
if (attr_rv != 'ERR'):
return float(attr_rv) / 1000

View File

@ -48,12 +48,16 @@ WD_MAIN_IDENTITY = "iTCO_wdt"
WDT_SYSFS_PATH = "/sys/class/watchdog/"
DEFAULT_TIMEOUT=180
watchdog=0
class Watchdog(WatchdogBase):
def __init__(self):
self.watchdog, self.wdt_main_dev_name = self._get_wdt()
if self.wdt_main_dev_name is None:
raise Exception("Watchdog device is not instantiated")
self.status_path = "/sys/class/watchdog/%s/status" % self.wdt_main_dev_name
self.state_path = "/sys/class/watchdog/%s/state" % self.wdt_main_dev_name
self.timeout_path = "/sys/class/watchdog/%s/timeout" % self.wdt_main_dev_name
@ -74,14 +78,16 @@ class Watchdog(WatchdogBase):
"""
Retrieves watchdog device
"""
global watchdog
wdt_main_dev_list = [dev for dev in os.listdir(
"/dev/") if dev.startswith("watchdog") and self._is_wd_main(dev)]
if not wdt_main_dev_list:
return None
return (None, None)
wdt_main_dev_name = wdt_main_dev_list[0]
watchdog_device_path = "/dev/{}".format(wdt_main_dev_name)
self.watchdog = os.open(watchdog_device_path, os.O_RDWR)
return self.watchdog, wdt_main_dev_name
if not watchdog:
watchdog = os.open(watchdog_device_path, os.O_RDWR)
return watchdog, wdt_main_dev_name
def _read_file(self, file_path):
"""
@ -228,6 +234,7 @@ class Watchdog(WatchdogBase):
Close watchdog
"""
if self.watchdog is not None :
os.close(self.watchdog)

View File

@ -28,7 +28,7 @@ command:
"""
import os
import commands
import subprocess
import sys, getopt
import logging
import time
@ -39,8 +39,8 @@ FORCE = 0
i2c_prefix = '/sys/bus/i2c/devices/'
if DEBUG == True:
print sys.argv[0]
print 'ARGV :', sys.argv[1:]
print(sys.argv[0])
print('ARGV :', sys.argv[1:])
def main():
global DEBUG
@ -55,9 +55,9 @@ def main():
'force',
])
if DEBUG == True:
print options
print args
print len(sys.argv)
print(options)
print(args)
print(len(sys.argv))
for opt, arg in options:
if opt in ('-h', '--help'):
@ -80,17 +80,17 @@ def main():
return 0
def show_help():
print __doc__ % {'scriptName' : sys.argv[0].split("/")[-1]}
print(__doc__ % {'scriptName' : sys.argv[0].split("/")[-1]})
sys.exit(0)
def show_log(txt):
if DEBUG == True:
print "[IX8A-BWDE-56X]" + txt
print("[IX8A-BWDE-56X]" + txt)
return
def exec_cmd(cmd, show):
logging.info('Run :' + cmd)
status, output = commands.getstatusoutput(cmd)
status, output = subprocess.getstatusoutput(cmd)
show_log (cmd +"with result:" + str(status))
show_log (" output:" + output)
if status:
@ -99,6 +99,18 @@ def exec_cmd(cmd, show):
print('Failed :' + cmd)
return status, output
pca954x_bus_addr =[
'0-0072',
'0-0077',
'5-0073',
'6-0073',
'7-0073',
'8-0073',
'9-0073',
'10-0073',
'11-0073'
]
instantiate =[
#export pca9698 for qsfp present
'echo 34 > /sys/class/gpio/export',
@ -204,7 +216,7 @@ drivers =[
'lpc_ich',
'i2c-i801',
'i2c-dev',
'i2c-mux-pca954x force_deselect_on_exit=1',
'i2c-mux-pca954x',
'gpio-pca953x',
'optoe',
'qci_cpld_sfp28',
@ -237,8 +249,17 @@ def system_install():
for i in range(0,len(drivers)):
status, output = exec_cmd("modprobe " + drivers[i], 1)
if status:
print output
if FORCE == 0:
print(output)
#retry quanta_hwmon_ipmi in case it init failed due to ipmi_msghandler init uncompleted
if drivers[i] == 'quanta_hwmon_ipmi':
for _ in range(0, 3):
time.sleep(3)
ret, out = exec_cmd("modprobe quanta_hwmon_ipmi ", 1)
if ret == 0:
break
if ret and FORCE == 0:
return ret
elif FORCE == 0:
return status
#reload ethernet drivers in correct order
@ -247,6 +268,10 @@ def system_install():
exec_cmd("modprobe igb ", 1)
exec_cmd("modprobe ixgbe ", 1)
# set pca954x idle_state as -2: MUX_IDLE_DISCONNECT
for i in range(0,len(pca954x_bus_addr)):
exec_cmd("echo -2 > /sys/bus/i2c/drivers/pca954x/{}/idle_state".format(pca954x_bus_addr[i]), 1)
#turn on module power
exec_cmd("echo 21 > /sys/class/gpio/export ", 1)
exec_cmd("echo high > /sys/class/gpio/gpio21/direction ", 1)
@ -269,7 +294,7 @@ def system_install():
for i in range(0, len(instantiate)):
status, output = exec_cmd(instantiate[i], 1)
if status:
print output
print(output)
if FORCE == 0:
return status
@ -291,18 +316,18 @@ def system_ready():
def install():
if not device_found():
print "No device, installing...."
print("No device, installing....")
status = system_install()
if status:
if FORCE == 0:
return status
status, output = exec_cmd("pip3 install /usr/share/sonic/device/x86_64-quanta_ix8a_bwde-r0/sonic_platform-1.0-py3-none-any.whl",1)
if status:
print output
print(output)
if FORCE == 0:
return status
else:
print " ix8a-bwde driver already installed...."
print(" ix8a-bwde driver already installed....")
return
def uninstall():
@ -311,13 +336,13 @@ def uninstall():
for i in range(len(un_drivers) - 1, -1, -1):
status, output = exec_cmd("rmmod " + un_drivers[i], 1)
if status:
print output
print(output)
if FORCE == 0:
return status
status, output = exec_cmd("pip3 uninstall sonic-platform -y ",1)
if status:
print output
print(output)
if FORCE == 0:
return status

View File

@ -49,7 +49,7 @@ static struct class *cpld_class = NULL;
struct cpld_data {
struct i2c_client *cpld_client;
char name[8];
char name[16];
u8 cpld_id;
};

View File

@ -171,9 +171,9 @@ static int __init ix8c_platform_init(void)
}
else
{
g_client[0] = i2c_new_device(adapter, &ix8c_i2c_devices[0]); // pca9546
g_client[1] = i2c_new_device(adapter, &ix8c_i2c_devices[1]); // pca9548
g_client[2] = i2c_new_device(adapter, &ix8c_i2c_devices[16]); // CPU Linking Board at CPU's I2C Bus
g_client[0] = i2c_new_client_device(adapter, &ix8c_i2c_devices[0]); // pca9546
g_client[1] = i2c_new_client_device(adapter, &ix8c_i2c_devices[1]); // pca9548
g_client[2] = i2c_new_client_device(adapter, &ix8c_i2c_devices[16]); // CPU Linking Board at CPU's I2C Bus
i2c_put_adapter(adapter);
}
@ -184,9 +184,9 @@ static int __init ix8c_platform_init(void)
}
else
{
g_client[3] = i2c_new_device(adapter, &ix8c_i2c_devices[10]); // CPLD_1
g_client[4] = i2c_new_device(adapter, &ix8c_i2c_devices[17]); // CPLD_4
g_client[5] = i2c_new_device(adapter, &ix8c_i2c_devices[18]); // CPLD_6
g_client[3] = i2c_new_client_device(adapter, &ix8c_i2c_devices[10]); // CPLD_1
g_client[4] = i2c_new_client_device(adapter, &ix8c_i2c_devices[17]); // CPLD_4
g_client[5] = i2c_new_client_device(adapter, &ix8c_i2c_devices[18]); // CPLD_6
i2c_put_adapter(adapter);
}
@ -197,7 +197,7 @@ static int __init ix8c_platform_init(void)
}
else
{
g_client[6] = i2c_new_device(adapter, &ix8c_i2c_devices[11]); // CPLD_2
g_client[6] = i2c_new_client_device(adapter, &ix8c_i2c_devices[11]); // CPLD_2
i2c_put_adapter(adapter);
}
@ -208,8 +208,8 @@ static int __init ix8c_platform_init(void)
}
else
{
g_client[7] = i2c_new_device(adapter, &ix8c_i2c_devices[12]); // CPLD_3
g_client[8] = i2c_new_device(adapter, &ix8c_i2c_devices[2]); // MB_BOARDINFO_EEPROM
g_client[7] = i2c_new_client_device(adapter, &ix8c_i2c_devices[12]); // CPLD_3
g_client[8] = i2c_new_client_device(adapter, &ix8c_i2c_devices[2]); // MB_BOARDINFO_EEPROM
i2c_put_adapter(adapter);
}
@ -220,8 +220,8 @@ static int __init ix8c_platform_init(void)
}
else
{
g_client[9] = i2c_new_device(adapter, &ix8c_i2c_devices[13]); // MB Board Data
g_client[10] = i2c_new_device(adapter, &ix8c_i2c_devices[14]); // QSFP:49~52
g_client[9] = i2c_new_client_device(adapter, &ix8c_i2c_devices[13]); // MB Board Data
g_client[10] = i2c_new_client_device(adapter, &ix8c_i2c_devices[14]); // QSFP:49~52
i2c_put_adapter(adapter);
}
@ -232,7 +232,7 @@ static int __init ix8c_platform_init(void)
}
else
{
g_client[11] = i2c_new_device(adapter, &ix8c_i2c_devices[3]); // pca9548_1 SFP
g_client[11] = i2c_new_client_device(adapter, &ix8c_i2c_devices[3]); // pca9548_1 SFP
i2c_put_adapter(adapter);
}
@ -243,7 +243,7 @@ static int __init ix8c_platform_init(void)
}
else
{
g_client[12] = i2c_new_device(adapter, &ix8c_i2c_devices[4]); // pca9548_2 SFP
g_client[12] = i2c_new_client_device(adapter, &ix8c_i2c_devices[4]); // pca9548_2 SFP
i2c_put_adapter(adapter);
}
@ -254,7 +254,7 @@ static int __init ix8c_platform_init(void)
}
else
{
g_client[13] = i2c_new_device(adapter, &ix8c_i2c_devices[5]); // pca9548_3 SFP
g_client[13] = i2c_new_client_device(adapter, &ix8c_i2c_devices[5]); // pca9548_3 SFP
i2c_put_adapter(adapter);
}
@ -265,7 +265,7 @@ static int __init ix8c_platform_init(void)
}
else
{
g_client[14] = i2c_new_device(adapter, &ix8c_i2c_devices[6]); // pca9548_4 SFP
g_client[14] = i2c_new_client_device(adapter, &ix8c_i2c_devices[6]); // pca9548_4 SFP
i2c_put_adapter(adapter);
}
@ -276,7 +276,7 @@ static int __init ix8c_platform_init(void)
}
else
{
g_client[15] = i2c_new_device(adapter, &ix8c_i2c_devices[7]); // pca9548_5 SFP
g_client[15] = i2c_new_client_device(adapter, &ix8c_i2c_devices[7]); // pca9548_5 SFP
i2c_put_adapter(adapter);
}
@ -287,7 +287,7 @@ static int __init ix8c_platform_init(void)
}
else
{
g_client[16] = i2c_new_device(adapter, &ix8c_i2c_devices[8]); // pca9548_6 SFP
g_client[16] = i2c_new_client_device(adapter, &ix8c_i2c_devices[8]); // pca9548_6 SFP
i2c_put_adapter(adapter);
}
@ -298,7 +298,7 @@ static int __init ix8c_platform_init(void)
}
else
{
g_client[17] = i2c_new_device(adapter, &ix8c_i2c_devices[9]); // pca9548_7 QSFP
g_client[17] = i2c_new_client_device(adapter, &ix8c_i2c_devices[9]); // pca9548_7 QSFP
i2c_put_adapter(adapter);
}
@ -311,9 +311,9 @@ static int __init ix8c_platform_init(void)
else
{
if (i < 61) // SFP28 1~48 EEPROM
g_client_port[i - 13] = i2c_new_device(adapter, &ix8c_i2c_devices[19]);
g_client_port[i - 13] = i2c_new_client_device(adapter, &ix8c_i2c_devices[19]);
else // QSFP 49~56 EEPROM
g_client_port[i - 13] = i2c_new_device(adapter, &ix8c_i2c_devices[15]);
g_client_port[i - 13] = i2c_new_client_device(adapter, &ix8c_i2c_devices[15]);
i2c_put_adapter(adapter);
}
}

View File

@ -28,7 +28,7 @@
#define __TO_R_EXP(bacc) (int32_t)(tos32(((BSWAP_32(bacc) & 0xf0) >> 4), 4))
#define __TO_B_EXP(bacc) (int32_t)(tos32((BSWAP_32(bacc) & 0xf), 4))
#define SENSOR_ATTR_MAX 17
#define SENSOR_ATTR_MAX 19
#define SENSOR_ATTR_NAME_LENGTH 20
#define SENSOR_GET_CAP_LABEL 0x001
@ -53,6 +53,8 @@
#define SENSOR_GET_CAP_PSU_PRESENT 0x8000
#define SENSOR_GET_CAP_MFRID 0x10000
#define SENSOR_GET_CAP_VIN_TYPE 0x20000
#define SENSOR_GET_CAP_POUT_MAX 0x40000
#define SDR_SENSOR_TYPE_TEMP 0x01
#define SDR_SENSOR_TYPE_VOLT 0x02
@ -84,6 +86,8 @@
#define IPMI_TIMEOUT (4 * HZ)
#define IPMI_MAX_WAIT_QUEUE 1
typedef struct ipmi_user *ipmi_user_t;
struct quanta_hwmon_ipmi_data {
struct platform_device *ipmi_platform_dev;
struct device *ipmi_hwmon_dev;
@ -912,6 +916,8 @@ void ipmi_sdr_set_sensor_factor(uint8_t idx, struct sdr_record_full_sensor *sens
g_sensor_data[idx].capability |= SENSOR_GET_CAP_SN;
g_sensor_data[idx].capability |= SENSOR_GET_CAP_MFRID;
g_sensor_data[idx].capability |= SENSOR_GET_CAP_PSU_PRESENT;
g_sensor_data[idx].capability |= SENSOR_GET_CAP_VIN_TYPE;
g_sensor_data[idx].capability |= SENSOR_GET_CAP_POUT_MAX;
}
sprintf(g_sensor_data[idx].attrinfo.attr_type_str, "power");
}
@ -976,7 +982,7 @@ int32_t sdr_convert_sensor_reading(uint8_t idx, uint8_t val, int32_t *point_resu
result = (m * (int16_t)val) * decimal_point + b;
break;
default:
return;
return result;
}
pow_convert(&result, k2);
@ -1074,6 +1080,83 @@ int32_t ipmi_get_psu_info(uint8_t idx, uint8_t cmd, uint8_t *retbuf)
return sprintf(retbuf, "N/A\n");
}
int32_t ipmi_get_vin_type(uint8_t idx, uint8_t *retbuf)
{
uint8_t psu_slot = 0;
int32_t rv = 0;
uint8_t returnData = 0;
uint8_t msg_data[] = { 0x06, 0x52, 0x0f, 0x00, 0x01, 0xd8 }; // read line status
if (strstr(g_sensor_data[idx].sensor_idstring, "PSU1")) psu_slot = 1;
else psu_slot = 2;
msg_data[3] = (psu_slot == 1) ? 0xb0 : 0xb2;
if (ipmi_check_psu_present(psu_slot)) {
mutex_lock(&ipmi_lock);
rv = ipmi_send_system_cmd(msg_data, sizeof(msg_data), &returnData, 1);
mutex_unlock(&ipmi_lock);
if (rv) {
printk("BMC down at (%d)!!\n", __LINE__);
}
else {
switch (returnData)
{
case 0x7: //LVDC
case 0x3: //HVDC
return sprintf(retbuf, "DC\n");
default:
return sprintf(retbuf, "AC\n");
}
}
}
else {
//printk("Error ! cannot detect PSU%d\n", psu_slot);
}
return sprintf(retbuf, "N/A\n");
}
int32_t ipmi_get_pout_max(uint8_t idx, uint8_t *retbuf)
{
uint8_t psu_slot = 0;
int32_t rv = 0, pout_max = 0;
uint8_t returnData[2] = { 0 }, tempData[2] = { 0 };
uint8_t msg_data[] = { 0x06, 0x52, 0x0f, 0x00, 0x02, 0xa7 };
if (strstr(g_sensor_data[idx].sensor_idstring, "PSU1")) psu_slot = 1;
else psu_slot = 2;
msg_data[3] = (psu_slot == 1) ? 0xb0 : 0xb2;
if (ipmi_check_psu_present(psu_slot)) {
mutex_lock(&ipmi_lock);
rv = ipmi_send_system_cmd(msg_data, sizeof(msg_data), returnData, 1);
mutex_unlock(&ipmi_lock);
if (rv) {
printk("BMC down at (%d)!!\n", __LINE__);
}
else {
/* MFR_POUT_MAX has 2 data format: Direct and Linear Data (see PMbus spec).
Query command is needed to tell the data format, but since we have not use PSU
whose output power is over 0x07ff (2047), just check the first 5 bits*/
if (returnData[1] & 0xf8 == 0) // Direct
pout_max = (returnData[1] << 8) | returnData[0];
else // Linear Data
pout_max = (((returnData[1] & 0x07) << 8) | returnData[0]) << ((returnData[1] & 0xf8) >> 3);
return sprintf(retbuf, "%d\n", pout_max);
}
}
else {
//printk("Error ! cannot detect PSU%d\n", psu_slot);
}
return sprintf(retbuf, "N/A\n");
}
void ipmi_fan_control(uint8_t cmd_data1, uint8_t cmd_data2, uint8_t *retbuf)
{
int32_t rv = 0;
@ -1183,6 +1266,18 @@ static ssize_t show_mfrid(struct device *dev, struct device_attribute *devattr,
return ipmi_get_psu_info(attr->index + DEBUGUSE_SHIFT, 0x99, buf);
}
static ssize_t show_vin_type(struct device *dev, struct device_attribute *devattr, char *buf)
{
struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
return ipmi_get_vin_type(attr->index + DEBUGUSE_SHIFT, buf);
}
static ssize_t show_pout_max(struct device *dev, struct device_attribute *devattr, char *buf)
{
struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
return ipmi_get_pout_max(attr->index + DEBUGUSE_SHIFT, buf);
}
static ssize_t show_pwm(struct device *dev, struct device_attribute *devattr, char *buf)
{
uint8_t returnData[10] = { 0 };
@ -1277,7 +1372,8 @@ static ssize_t(*const attr_show_func_ptr[SENSOR_ATTR_MAX]) (struct device *dev,
, show_unc, show_ucr, show_unr
, show_model, show_sn, show_pwm
, show_controlmode, show_direction, show_fanpresent
, show_psupresent, show_mfrid
, show_psupresent, show_mfrid, show_vin_type
, show_pout_max
};
static ssize_t(*const attr_store_func_ptr[SENSOR_ATTR_MAX]) (struct device *dev, struct device_attribute *devattr, const char *buf, size_t count) =
@ -1287,7 +1383,8 @@ static ssize_t(*const attr_store_func_ptr[SENSOR_ATTR_MAX]) (struct device *dev,
, NULL, NULL, NULL
, NULL, NULL, store_pwm
, store_controlmode, NULL, NULL
, NULL, NULL
, NULL, NULL, NULL
, NULL
};
static const char *const sensor_attrnames[SENSOR_ATTR_MAX] =
@ -1297,7 +1394,8 @@ static const char *const sensor_attrnames[SENSOR_ATTR_MAX] =
, "%s%d_ncrit", "%s%d_crit", "%s%d_max"
, "%s%d_model", "%s%d_sn", "%s%d_pwm"
, "%s%d_controlmode", "%s%d_direction", "%s%d_present"
, "%s%d_present", "%s%d_mfrid"
, "%s%d_present", "%s%d_mfrid", "%s%d_vin_type"
, "%s%d_pout_max"
};
static int32_t create_sensor_attrs(int32_t attr_no)
@ -1516,7 +1614,7 @@ static int32_t __init quanta_hwmon_ipmi_init(void)
goto device_reg_err;
}
data->ipmi_hwmon_dev = hwmon_device_register_with_groups(NULL, DRVNAME, NULL, NULL);
data->ipmi_hwmon_dev = hwmon_device_register_with_groups(&data->ipmi_platform_dev->dev, DRVNAME, NULL, NULL);
err = IS_ERR(data->ipmi_hwmon_dev);
if (err) {
printk("hwmon register fail\n");
@ -1539,19 +1637,15 @@ static int32_t __init quanta_hwmon_ipmi_init(void)
return 0;
init_sensor_err:
if (g_sensor_data) {
kfree(g_sensor_data);
g_sensor_data = NULL;
}
ipmi_create_err:
hwmon_device_unregister(data->ipmi_hwmon_dev);
hwmon_register_err:
platform_device_unregister(data->ipmi_platform_dev);
device_reg_err:
if (data) {
kfree(data);
data = NULL;
}
alloc_err:
return err;
}
@ -1567,15 +1661,10 @@ static void __exit quanta_hwmon_ipmi_exit(void)
platform_device_unregister(data->ipmi_platform_dev);
if (g_sensor_data) {
kfree(g_sensor_data);
g_sensor_data = NULL;
}
if (data) {
kfree(data);
data = NULL;
}
}
module_init(quanta_hwmon_ipmi_init);

View File

@ -8,6 +8,7 @@
try:
import sys
import time
import syslog
from sonic_platform_base.chassis_base import ChassisBase
from sonic_platform.eeprom import Eeprom
from sonic_platform.psu import Psu
@ -71,6 +72,13 @@ class Chassis(ChassisBase):
for index in range(1, self.__num_of_ports + 1):
self.__xcvr_presence[index] = self._sfp_list[index-1].get_presence()
# Initialize components
from sonic_platform.component import ComponentBIOS, ComponentBMC, ComponentCPLD, ComponentPCIE
self._component_list.append(ComponentBIOS())
self._component_list.append(ComponentBMC())
self._component_list.extend(ComponentCPLD.get_component_list())
self._component_list.append(ComponentPCIE())
##############################################
# Device methods
##############################################
@ -78,7 +86,7 @@ class Chassis(ChassisBase):
def get_sfp(self, index):
"""
Retrieves sfp represented by (1-based) index <index>
For Quanta IX8C the index in sfputil.py starts from 1, so override
For Quanta the index in sfputil.py starts from 1, so override
Args:
index: An integer, the index (1-based) of the sfp to retrieve.
@ -188,13 +196,34 @@ class Chassis(ChassisBase):
is "REBOOT_CAUSE_HARDWARE_OTHER", the second string can be used
to pass a description of the reboot cause.
"""
#raise NotImplementedError
return (ChassisBase.REBOOT_CAUSE_HARDWARE_OTHER, "Invalid Reason")
##############################################
# Other methods
##############################################
def get_watchdog(self):
"""
Retreives hardware watchdog device on this chassis
Returns:
An object derived from WatchdogBase representing the hardware
watchdog device
"""
try:
if self._watchdog is None:
from sonic_platform.watchdog import Watchdog
# Create the watchdog Instance
self._watchdog = Watchdog()
except Exception as e:
syslog.syslog(syslog.LOG_ERR, "Fail to load watchdog due to {}".format(e))
return self._watchdog
def get_change_event(self, timeout=0):
"""
Currently only support transceiver change events
"""
start_ms = time.time() * 1000
xcvr_change_event_dict = {}
event = False
@ -205,10 +234,10 @@ class Chassis(ChassisBase):
cur_xcvr_presence = self._sfp_list[index-1].get_presence()
if cur_xcvr_presence != self.__xcvr_presence[index]:
if cur_xcvr_presence is True:
xcvr_change_event_dict[str(index)] = '1'
xcvr_change_event_dict[index] = '1'
self.__xcvr_presence[index] = True
elif cur_xcvr_presence is False:
xcvr_change_event_dict[str(index)] = '0'
xcvr_change_event_dict[index] = '0'
self.__xcvr_presence[index] = False
event = True

View File

@ -0,0 +1,204 @@
#!/usr/bin/env python
########################################################################
# Quanta IX8C
#
# Name: component.py, version: 1.3
# Module contains an implementation of SONiC Platform Base API and
# provides the Components' (e.g., BIOS, CPLD, FPGA, etc.) available in
# the platform
#
########################################################################
try:
import subprocess
from sonic_platform_base.component_base import ComponentBase
from collections import namedtuple
except ImportError as e:
raise ImportError(str(e) + "- required module not found")
class Component(ComponentBase):
def __init__(self):
ComponentBase.__init__(self)
self.name = None
self.description = None
def get_name(self):
return self.name
def get_description(self):
return self.description
def install_firmware(self, image_path):
"""
Installs firmware to the component
Args:
image_path: A string, path to firmware image
Returns:
A boolean, True if install was successful, False if not
"""
return False
@staticmethod
def _get_command_result(cmdline):
try:
proc = subprocess.Popen(cmdline,
stdout=subprocess.PIPE,
shell=True, stderr=subprocess.STDOUT,
universal_newlines=True)
stdout = proc.communicate()[0]
rc = proc.wait()
result = stdout.rstrip('\n')
if rc != 0:
raise RuntimeError("Failed to execute command {}, return code {}, {}".format(cmdline, rc, stdout))
except OSError as e:
raise RuntimeError("Failed to execute command {} due to {}".format(cmdline, repr(e)))
return result
class ComponentBIOS(Component):
COMPONENT_NAME = 'BIOS'
COMPONENT_DESCRIPTION = 'BIOS - Basic Input/Output System'
BIOS_QUERY_VERSION_COMMAND = "dmidecode -s bios-version"
def __init__(self):
super(ComponentBIOS, self).__init__()
self.name = self.COMPONENT_NAME
self.description = self.COMPONENT_DESCRIPTION
def get_firmware_version(self):
"""
Retrieves the firmware version of the component
Returns:
A string containing the firmware version of the component
"""
bios_ver = self._get_command_result(self.BIOS_QUERY_VERSION_COMMAND)
if not bios_ver:
return 'ERR'
else:
return bios_ver
class ComponentBMC(Component):
COMPONENT_NAME = 'BMC'
COMPONENT_DESCRIPTION = 'BMC - Board Management Controller'
BMC_QUERY_VERSION_COMMAND = "ipmitool mc info | grep 'Firmware Revision'"
def __init__(self):
super(ComponentBMC, self).__init__()
self.name = self.COMPONENT_NAME
self.description = self.COMPONENT_DESCRIPTION
def get_firmware_version(self):
"""
Retrieves the firmware version of the component
Returns:
A string containing the firmware version of the component
"""
bmc_ver = self._get_command_result(self.BMC_QUERY_VERSION_COMMAND)
if not bmc_ver:
return 'ERR'
else:
bmc_ver = bmc_ver.split(": ")[1]
return bmc_ver.strip()
class ComponentCPLD(Component):
Cpld = namedtuple("Cpld", ['name', 'cmd_index', 'description'])
cplds = {
1: Cpld("BOOT_CPLD", 1, "Power sequence"),
2: Cpld("FAN_CPLD", 2, "Fan"),
3: Cpld("MB_CPLD_IO_1", 7, "Port IO-1"),
4: Cpld("MB_CPLD_IO_2", 5, "Port IO-2"),
5: Cpld("MB_CPLD_IO_3", 4, "Port IO-3"),
6: Cpld("MB_CPLD_LED_1", 6, "Port LED-1"),
7: Cpld("MB_CPLD_LED_2", 3, "Port LED-2"),
}
def __init__(self, component_index):
super(ComponentCPLD, self).__init__()
self.index = component_index
def get_name(self):
"""
Retrieves the name of the component
Returns:
A string containing the name of the component
"""
self.name = self.cplds[self.index].name
return self.name
def get_description(self):
"""
Retrieves the description of the component
Returns:
A string containing the description of the component
"""
self.description = self.cplds[self.index].description
return self.description
def get_firmware_version(self):
"""
Retrieves the firmware version of the component
Returns:
A string containing the firmware version of the component
"""
self._get_command_result("ipmitool raw 0x30 0xe0 0xd0 0x01 0x01")
res = self._get_command_result("ipmitool raw 0x32 0xff 0x02 {}".format(self.cplds[self.index].cmd_index))
self._get_command_result("ipmitool raw 0x30 0xe0 0xd0 0x01 0x00")
if not res:
return 'ERR'
else:
return res.split()[3].upper() + res.split()[2].upper() + res.split()[1].upper() + res.split()[0].upper()
@classmethod
def get_component_list(cls):
component_list = []
cpld_number = len(cls.cplds)
for cpld_idx in range(1, cpld_number + 1):
component_list.append(cls(cpld_idx))
return component_list
class ComponentPCIE(Component):
COMPONENT_NAME = 'PCIe'
COMPONENT_DESCRIPTION = 'ASIC PCIe Firmware'
PCIE_QUERY_VERSION_COMMAND = "bcmcmd 'pciephy fw version' | grep 'FW version'"
def __init__(self):
super(ComponentPCIE, self).__init__()
self.name = self.COMPONENT_NAME
self.description = self.COMPONENT_DESCRIPTION
def get_firmware_version(self):
"""
Retrieves the firmware version of the component
Returns:
A string containing the firmware version of the component
"""
version = self._get_command_result(self.PCIE_QUERY_VERSION_COMMAND)
if not version:
return 'ERR'
else:
version = version.split(": ")[1]
return version.strip()

View File

@ -1,7 +1,7 @@
#!/usr/bin/env python
#############################################################################
# Inventec d7264
# Quanta IX8C
#
# Module contains an implementation of SONiC Platform Base API and
# provides the FAN information
@ -11,6 +11,7 @@
try:
import logging
import os
import glob
from sonic_platform_base.fan_base import FanBase
except ImportError as e:
raise ImportError(str(e) + "- required module not found")
@ -19,9 +20,7 @@ except ImportError as e:
###############
# Global
###############
HWMON_DIR = "/sys/class/hwmon/hwmon2/"
FAN_INDEX_START = 20
NUM_FANTRAYS = 6
HWMON_IPMI_DIR = "/sys/devices/platform/quanta_hwmon_ipmi/hwmon/hwmon*/"
FANS_PERTRAY = 2
class Fan(FanBase):
@ -30,30 +29,46 @@ class Fan(FanBase):
def __init__(self, index, is_psu_fan=False):
self.is_psu_fan = is_psu_fan
self.fan_index = index
self.psu_fan_index_mapping = {
1:39,
2:49,
}
self.psu_index_mapping = {
1:41,
2:51,
}
hwmon_dir=glob.glob(HWMON_IPMI_DIR)[0]
if self.is_psu_fan:
self.fan_presence_attr = "power{}_present".format(self.psu_index_mapping[index])
self.fan_pwm_attr = "fan{}_pwm".format(self.psu_fan_index_mapping[index])
self.fan_rpm_attr = "fan{}_input".format(self.psu_fan_index_mapping[index])
self.fan_direction_attr = "fan{}_direction".format(self.psu_fan_index_mapping[index])
power_out_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_POWER_OUT".format(self.fan_index), 'power')
fan_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_Fan".format(self.fan_index), 'fan')
self.fan_presence_attr = power_out_prefix + 'present'
self.fan_pwm_attr = fan_prefix + 'pwm'
self.fan_rpm_attr = fan_prefix + 'input'
self.fan_direction_attr = fan_prefix + 'direction'
else:
self.fan_presence_attr = "fan{}_present".format(FAN_INDEX_START+(index-1))
self.fan_pwm_attr = "fan{}_pwm".format(FAN_INDEX_START+(index-1))
self.fan_rpm_attr = "fan{}_input".format(FAN_INDEX_START+(index-1))
self.fan_direction_attr = "fan{}_direction".format(FAN_INDEX_START+(index-1))
fantray_index = (self.fan_index-1)//FANS_PERTRAY+1
fan_index_intray = self.fan_index - ((fantray_index-1)*FANS_PERTRAY)
fan_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "Fan_SYS_{}_{}".format(fantray_index, fan_index_intray), 'fan')
self.fan_presence_attr = fan_prefix + 'present'
self.fan_pwm_attr = fan_prefix + 'pwm'
self.fan_rpm_attr = fan_prefix + 'input'
self.fan_direction_attr = fan_prefix + 'direction'
#######################
# private function
#######################
def __get_hwmon_attr_prefix(self, dir, label, type):
retval = 'ERR'
if not os.path.isdir(dir):
return retval
try:
for filename in os.listdir(dir):
if filename[-5:] == 'label' and type in filename:
file_path = os.path.join(dir, filename)
if os.path.isfile(file_path) and label == self.__get_attr_value(file_path):
return file_path[0:-5]
except Exception as error:
logging.error("Error when getting {} label path: {}".format(label, error))
return retval
def __get_attr_value(self, attr_path):
retval = 'ERR'
@ -64,7 +79,7 @@ class Fan(FanBase):
with open(attr_path, 'r') as fd:
retval = fd.read()
except Exception as error:
logging.error("Unable to open " + attr_path + " file !")
logging.error("Unable to open {} file: {}".format(attr_path, error))
retval = retval.rstrip(' \t\n\r')
return retval
@ -84,7 +99,7 @@ class Fan(FanBase):
if self.is_psu_fan:
return "PSU-{}_FAN".format(self.fan_index)
else:
fantray_index = (self.fan_index-1)/FANS_PERTRAY+1
fantray_index = (self.fan_index-1)//FANS_PERTRAY+1
fan_index_intray = self.fan_index - ((fantray_index-1)*FANS_PERTRAY)
return "Fantray{}_{}".format(fantray_index, fan_index_intray)
@ -95,8 +110,7 @@ class Fan(FanBase):
Returns:
bool: True if device is present, False if not
"""
attr_path = HWMON_DIR + self.fan_presence_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.fan_presence_attr)
if (attr_rv != 'ERR'):
if (attr_rv == '1'):
return True
@ -113,8 +127,7 @@ class Fan(FanBase):
A boolean value, True if device is operating properly, False if not
"""
if self.get_presence():
attr_path = HWMON_DIR + self.fan_rpm_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.fan_rpm_attr)
if (attr_rv != 'ERR' and attr_rv != '0.0'):
return True
@ -135,8 +148,7 @@ class Fan(FanBase):
A string, either FAN_DIRECTION_INTAKE or FAN_DIRECTION_EXHAUST
depending on fan direction
"""
attr_path = HWMON_DIR + self.fan_direction_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.fan_direction_attr)
if attr_rv == '2':
return self.FAN_DIRECTION_INTAKE
@ -152,8 +164,7 @@ class Fan(FanBase):
to 100 (full speed)
"""
if self.get_presence():
attr_path = HWMON_DIR + self.fan_pwm_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.fan_pwm_attr)
if (attr_rv != 'ERR'):
return int(float(attr_rv))
@ -169,8 +180,7 @@ class Fan(FanBase):
Returns:
An integer, speed of the fan in RPM
"""
attr_path = HWMON_DIR + self.fan_rpm_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.fan_rpm_attr)
if (attr_rv != 'ERR'):
return int(float(attr_rv))
@ -185,8 +195,7 @@ class Fan(FanBase):
An integer, the percentage of full fan speed, in the range 0 (off)
to 100 (full speed)
"""
attr_path = HWMON_DIR + self.fan_pwm_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.fan_pwm_attr)
if (attr_rv != 'ERR'):
return int(float(attr_rv))

View File

@ -28,7 +28,7 @@ class FanDrawer(FanDrawerBase):
Returns:
string: The name of the device
"""
return 'Fan {}'.format(self._index)
return 'Fantray{}'.format(self._index)
def get_presence(self):
"""

View File

@ -8,44 +8,61 @@
try:
import logging
import os
import glob
from sonic_platform_base.psu_base import PsuBase
from sonic_platform.fan import Fan
except ImportError as e:
raise ImportError(str(e) + "- required module not found")
HWMON_DIR = "/sys/class/hwmon/hwmon2/"
HWMON_IPMI_DIR = "/sys/devices/platform/quanta_hwmon_ipmi/hwmon/hwmon*/"
class Psu(PsuBase):
def __init__(self, index):
PsuBase.__init__(self)
fan = Fan(index, True)
self._fan_list.append(fan)
self.psu_index_mapping = {
1:41,
2:51,
}
self.psu_powerin_index_mapping = {
1:40,
2:50,
}
self.psu_current_index_mapping = {
1:38,
2:48,
}
self.psu_voltageout_index_mapping = {
1:46,
2:56,
}
self.index = index
self.psu_presence_attr = "power{}_present".format(self.psu_index_mapping[self.index])
self.psu_status_attr = "curr{}_input".format(self.psu_current_index_mapping[self.index])
self.psu_power_in_attr = "power{}_input".format(self.psu_powerin_index_mapping[self.index])
self.psu_power_out_attr = "power{}_input".format(self.psu_index_mapping[self.index])
self.psu_voltage_out_attr = "in{}_input".format(self.psu_voltageout_index_mapping[self.index])
self.psu_current_out_attr = "curr{}_input".format(self.psu_current_index_mapping[self.index])
self.psu_serial_attr = "power{}_sn".format(self.psu_index_mapping[self.index])
self.psu_model_attr = "power{}_model".format(self.psu_index_mapping[self.index])
hwmon_dir=glob.glob(HWMON_IPMI_DIR)[0]
current_in_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_CURRENT_IN".format(self.index), 'curr')
current_out_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_CURRENT_OUT".format(self.index), 'curr')
power_in_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_POWER_IN".format(self.index), 'power')
power_out_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_POWER_OUT".format(self.index), 'power')
voltage_in_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_VOLTAGE_IN".format(self.index), 'in')
voltage_out_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_VOLTAGE_OUT".format(self.index), 'in')
temp1_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_TEMP1".format(self.index), 'temp')
self.psu_current_in_attr = current_in_prefix + 'input'
self.psu_current_out_attr = current_out_prefix + 'input'
self.psu_power_in_attr = power_in_prefix + 'input'
self.psu_power_out_attr = power_out_prefix + 'input'
self.psu_voltage_in_attr = voltage_in_prefix + 'input'
self.psu_voltage_out_attr = voltage_out_prefix + 'input'
self.psu_status_attr = current_out_prefix + 'input'
self.psu_presence_attr = power_out_prefix + 'present'
self.psu_serial_attr = power_out_prefix + 'sn'
self.psu_model_attr = power_out_prefix + 'model'
self.psu_mfr_id_attr = power_out_prefix + 'mfrid'
self.psu_capacity_attr = power_out_prefix + 'pout_max'
self.psu_type_attr = power_out_prefix + 'vin_type'
self.psu_temp_attr = temp1_prefix + 'input'
def __get_hwmon_attr_prefix(self, dir, label, type):
retval = 'ERR'
if not os.path.isdir(dir):
return retval
try:
for filename in os.listdir(dir):
if filename[-5:] == 'label' and type in filename:
file_path = os.path.join(dir, filename)
if os.path.isfile(file_path) and label == self.__get_attr_value(file_path):
return file_path[0:-5]
except Exception as error:
logging.error("Error when getting {} label path: {}".format(label, error))
return retval
def __get_attr_value(self, attr_path):
@ -57,10 +74,9 @@ class Psu(PsuBase):
with open(attr_path, 'r') as fd:
retval = fd.read()
except Exception as error:
logging.error("Unable to open " + attr_path + " file !")
logging.error("Unable to open {} file: {}".format(attr_path, error))
retval = retval.rstrip(' \t\n\r')
fd.close()
return retval
##############################################
@ -84,10 +100,9 @@ class Psu(PsuBase):
bool: True if device is present, False if not
"""
presence = False
attr_path = HWMON_DIR+self.psu_presence_attr
attr_normal = '1'
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.psu_presence_attr)
if (attr_rv != 'ERR'):
if (attr_rv == attr_normal):
presence = True
@ -102,13 +117,26 @@ class Psu(PsuBase):
string: Model/part number of device
"""
model = "N/A"
attr_path = HWMON_DIR+self.psu_model_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.psu_model_attr)
if (attr_rv != 'ERR'):
model = attr_rv
return model
def get_mfr_id(self):
"""
Retrieves the manufacturer's name (or id) of the device
Returns:
string: Manufacturer's id of device
"""
mfr_id = "N/A"
attr_rv = self.__get_attr_value(self.psu_mfr_id_attr)
if (attr_rv != 'ERR'):
mfr_id = attr_rv
return mfr_id
def get_serial(self):
"""
Retrieves the serial number of the device
@ -117,9 +145,7 @@ class Psu(PsuBase):
string: Serial number of device
"""
serial = "N/A"
attr_path = HWMON_DIR+self.psu_serial_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.psu_serial_attr)
if (attr_rv != 'ERR'):
serial = attr_rv
@ -133,9 +159,7 @@ class Psu(PsuBase):
A boolean value, True if device is operating properly, False if not
"""
status = False
attr_path = HWMON_DIR+self.psu_status_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.psu_status_attr)
if (attr_rv != 'ERR'):
attr_rv, dummy = attr_rv.split('.', 1)
if (int(attr_rv) != 0):
@ -156,9 +180,7 @@ class Psu(PsuBase):
e.g. 12.1
"""
voltage_out = 0.0
attr_path = HWMON_DIR+self.psu_voltage_out_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.psu_voltage_out_attr)
if (attr_rv != 'ERR'):
attr_rv, dummy = attr_rv.split('.', 1)
voltage_out = float(attr_rv) / 1000
@ -173,15 +195,44 @@ class Psu(PsuBase):
A float number, the electric current in amperes, e.g 15.4
"""
current_out = 0.0
attr_path = HWMON_DIR+self.psu_current_out_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.psu_current_out_attr)
if (attr_rv != 'ERR'):
attr_rv, dummy = attr_rv.split('.', 1)
current_out = float(attr_rv) / 1000
return current_out
def get_input_voltage(self):
"""
Retrieves current PSU voltage input
Returns:
A float number, the input voltage in volts,
e.g. 12.1
"""
voltage_in = 0.0
attr_rv = self.__get_attr_value(self.psu_voltage_in_attr)
if (attr_rv != 'ERR'):
attr_rv, dummy = attr_rv.split('.', 1)
voltage_in = float(attr_rv) / 1000
return voltage_in
def get_input_current(self):
"""
Retrieves present electric current supplied by PSU
Returns:
A float number, the electric current in amperes, e.g 15.4
"""
current_in = 0.0
attr_rv = self.__get_attr_value(self.psu_current_in_attr)
if (attr_rv != 'ERR'):
attr_rv, dummy = attr_rv.split('.', 1)
current_in = float(attr_rv) / 1000
return current_in
def get_power(self):
"""
Retrieves current energy supplied by PSU
@ -190,9 +241,7 @@ class Psu(PsuBase):
A float number, the power in watts, e.g. 302.6
"""
power_out = 0.0
attr_path = HWMON_DIR+self.psu_power_out_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.psu_power_out_attr)
if (attr_rv != 'ERR'):
attr_rv, dummy = attr_rv.split('.', 1)
power_out = float(attr_rv) / 1000
@ -221,3 +270,50 @@ class Psu(PsuBase):
else:
return self.STATUS_LED_COLOR_OFF
def get_type(self):
"""
Gets the type of the PSU
Returns:
A string, the type of PSU (AC/DC)
"""
type = "AC"
attr_rv = self.__get_attr_value(self.psu_type_attr)
if (attr_rv != 'ERR'):
type = attr_rv
return type
def get_capacity(self):
"""
Gets the capacity (maximum output power) of the PSU in watts
Returns:
An integer, the capacity of PSU
"""
capacity = 0
attr_rv = self.__get_attr_value(self.psu_capacity_attr)
if (attr_rv != 'ERR'):
try:
capacity = int(attr_rv)
except ValueError:
capacity = 0
return capacity
def get_temperature(self):
"""
Retrieves current temperature reading from PSU
Returns:
A float number of current temperature in Celsius up to nearest thousandth
of one degree Celsius, e.g. 30.125
"""
tout = 0.0
attr_rv = self.__get_attr_value(self.psu_temp_attr)
if (attr_rv != 'ERR'):
tout = float(attr_rv)
# tout is in milli degree celcius
return float(tout/1000.0)

View File

@ -10,13 +10,10 @@
import os
import time
#import subprocess
#import sonic_device_util
from ctypes import create_string_buffer
try:
from sonic_platform_base.sfp_base import SfpBase
# from sonic_platform_base.sonic_eeprom import eeprom_dts
from sonic_platform_base.sonic_sfp.sff8472 import sff8472InterfaceId
from sonic_platform_base.sonic_sfp.sff8472 import sff8472Dom
from sonic_platform_base.sonic_sfp.sff8436 import sff8436InterfaceId
@ -175,7 +172,6 @@ class Sfp(SfpBase):
# Init index
self.index = sfp_index
self.port_num = self.index
#self.dom_supported = False
self.sfp_type = sfp_type
# Init eeprom path
eeprom_path = '/sys/bus/i2c/devices/i2c-{0}/{0}-0050/eeprom'
@ -284,15 +280,6 @@ class Sfp(SfpBase):
else:
return 'N/A'
def __read_txt_file(self, file_path):
try:
with open(file_path, 'r') as fd:
data = fd.read()
return data.strip()
except IOError:
pass
return ""
def __is_host(self):
return os.system(self.HOST_CHK_CMD) == 0
@ -355,26 +342,6 @@ class Sfp(SfpBase):
return eeprom_raw
def __convert_string_to_num(self, value_str):
if "-inf" in value_str:
return 'N/A'
elif "Unknown" in value_str:
return 'N/A'
elif 'dBm' in value_str:
t_str = value_str.rstrip('dBm')
return float(t_str)
elif 'mA' in value_str:
t_str = value_str.rstrip('mA')
return float(t_str)
elif 'C' in value_str:
t_str = value_str.rstrip('C')
return float(t_str)
elif 'Volts' in value_str:
t_str = value_str.rstrip('Volts')
return float(t_str)
else:
return 'N/A'
def _dom_capability_detect(self):
if not self.get_presence():
self.dom_supported = False
@ -533,9 +500,7 @@ class Sfp(SfpBase):
else:
if not self.get_presence():
return transceiver_info_dict
elif i == max_retry-1:
pass
else:
elif i < max_retry-1:
time.sleep(0.5)
if sfp_interface_bulk_raw is None:
@ -590,7 +555,8 @@ class Sfp(SfpBase):
['data']['Extended Identifier']['value']
transceiver_info_dict['ext_rateselect_compliance'] = sfp_interface_bulk_data \
['data']['RateIdentifier']['value']
transceiver_info_dict['type_abbrv_name'] = 'N/A'
transceiver_info_dict['type_abbrv_name'] = sfp_interface_bulk_data \
['data']['type_abbrv_name']['value']
if self.sfp_type == QSFP_TYPE:
for key in qsfp_cable_length_tup:
if key in sfp_interface_bulk_data['data']:
@ -860,7 +826,7 @@ class Sfp(SfpBase):
transceiver_dom_threshold_dict['txbiaslowwarning'] = channel_threshold_data['TxBiasLowWarning']['value']
for key in transceiver_dom_threshold_dict:
transceiver_dom_threshold_dict[key] = self.__convert_string_to_num(transceiver_dom_threshold_dict[key])
transceiver_dom_threshold_dict[key] = self._convert_string_to_num(transceiver_dom_threshold_dict[key])
return transceiver_dom_threshold_dict
@ -908,7 +874,7 @@ class Sfp(SfpBase):
transceiver_dom_threshold_info_dict['rxpowerlowwarning'] = dom_module_threshold_data['data']['RXPowerLowWarning']['value']
for key in transceiver_dom_threshold_info_dict:
transceiver_dom_threshold_info_dict[key] = self.__convert_string_to_num(transceiver_dom_threshold_info_dict[key])
transceiver_dom_threshold_info_dict[key] = self._convert_string_to_num(transceiver_dom_threshold_info_dict[key])
return transceiver_dom_threshold_info_dict
@ -1453,7 +1419,7 @@ class Sfp(SfpBase):
sysfsfile_eeprom = open(
sysfs_sfp_i2c_client_eeprom_path, mode="r+b", buffering=0)
buffer = create_string_buffer(1)
buffer[0] = chr(tx_disable_ctl)
buffer[0] = tx_disable_ctl
# Write to eeprom
sysfsfile_eeprom.seek(offset + SFP_STATUS_CONTROL_OFFSET)
sysfsfile_eeprom.write(buffer[0])
@ -1506,7 +1472,7 @@ class Sfp(SfpBase):
else:
tx_disable_ctl = channel_state & (~channel)
buffer = create_string_buffer(1)
buffer[0] = chr(tx_disable_ctl)
buffer[0] = tx_disable_ctl
# Write to eeprom
sysfsfile_eeprom = open(
self.port_to_eeprom_mapping[self.port_num], "r+b")
@ -1594,7 +1560,7 @@ class Sfp(SfpBase):
power_set_bit |= 1 << 1
buffer = create_string_buffer(1)
buffer[0] = chr(power_override_bit | power_set_bit)
buffer[0] = power_override_bit | power_set_bit
# Write to eeprom
sysfsfile_eeprom = open(self.port_to_eeprom_mapping[self.port_num], "r+b")
sysfsfile_eeprom.seek(QSFP_POWEROVERRIDE_OFFSET)

View File

@ -1,7 +1,7 @@
#!/usr/bin/env python
#############################################################################
# Inventec d7264
# Quanta IX8C
#
# Module contains an implementation of SONiC Platform Base API and
# provides the Thermal information
@ -10,44 +10,68 @@
import logging
import os
import glob
try:
from sonic_platform_base.thermal_base import ThermalBase
except ImportError as e:
raise ImportError(str(e) + "- required module not found")
HWMON_DIR = "/sys/class/hwmon/hwmon2/"
HWMON_IPMI_DIR = "/sys/devices/platform/quanta_hwmon_ipmi/hwmon/hwmon*/"
thermal_index_mapping = {
1:1,
2:2,
3:42,
4:43,
5:44,
6:52,
7:53,
8:54,
9:75,
10:76,
11:77,
12:78,
13:79,
14:80,
15:81,
16:82,
17:83,
18:84,
1:'PSU1_TEMP1',
2:'PSU1_TEMP2',
3:'PSU1_TEMP3',
4:'PSU2_TEMP1',
5:'PSU2_TEMP2',
6:'PSU2_TEMP3',
7:'Temp_1V05_PCH_VR',
8:'Temp_Ambient_1',
9:'Temp_Ambient_2',
10:'Temp_Ambient_3',
11:'Temp_Ambient_4',
12:'Temp_Ambient_6',
13:'Temp_DDRAB_VR',
14:'Temp_SOC_DIMMA0',
15:'Temp_VCCGBE_VR',
16:'Temp_VCCIN_VR',
17:'Temp_cpu',
18:'Temp_switch'
}
class Thermal(ThermalBase):
"""Platform-specific Thermal class"""
def __init__(self, thermal_index):
self.index = thermal_index
self.temp_attr = "temp{}_input".format(thermal_index_mapping[self.index])
self.high_th_attr = "temp{}_crit".format(thermal_index_mapping[self.index])
self.name_attr = "temp{}_label".format(thermal_index_mapping[self.index])
hwmon_dir=glob.glob(HWMON_IPMI_DIR)[0]
thermal_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, thermal_index_mapping[self.index], 'temp')
self.temp_attr = "{}input".format(thermal_prefix)
self.high_th_attr = "{}ncrit".format(thermal_prefix)
self.high_crit_th_attr = "{}crit".format(thermal_prefix)
self.low_th_attr = "{}lncrit".format(thermal_prefix)
self.low_crit_th_attr = "{}lcrit".format(thermal_prefix)
self.name_attr = "{}label".format(thermal_prefix)
def __get_hwmon_attr_prefix(self, dir, label, type):
retval = 'ERR'
if not os.path.isdir(dir):
return retval
try:
for filename in os.listdir(dir):
if filename[-5:] == 'label' and type in filename:
file_path = os.path.join(dir, filename)
if os.path.isfile(file_path) and label == self.__get_attr_value(file_path):
return file_path[0:-5]
except Exception as error:
logging.error("Error when getting {} label path: {}".format(label, error))
return retval
def __get_attr_value(self, attr_path):
@ -59,7 +83,7 @@ class Thermal(ThermalBase):
with open(attr_path, 'r') as fd:
retval = fd.read()
except Exception as error:
logging.error("Unable to open ", attr_path, " file !")
logging.error("Unable to open {} file: {}".format(attr_path, error))
retval = retval.rstrip(' \t\n\r')
return retval
@ -71,8 +95,7 @@ class Thermal(ThermalBase):
Returns:
string: The name of the device
"""
attr_path = HWMON_DIR + self.name_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.name_attr)
if (attr_rv != 'ERR'):
return attr_rv
@ -86,8 +109,7 @@ class Thermal(ThermalBase):
Returns:
bool: True if device is present, False if not
"""
attr_path = HWMON_DIR + self.name_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.name_attr)
if (attr_rv != 'ERR'):
return True
@ -114,8 +136,37 @@ class Thermal(ThermalBase):
A float number of current temperature in Celsius up to nearest thousandth
of one degree Celsius, e.g. 30.125
"""
attr_path = HWMON_DIR + self.temp_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.temp_attr)
if (attr_rv != 'ERR'):
return float(attr_rv) / 1000
else:
return None
def get_low_threshold(self):
"""
Retrieves the low threshold temperature of thermal
Returns:
A float number, the low threshold temperature of thermal in Celsius
up to nearest thousandth of one degree Celsius, e.g. 30.125
"""
attr_rv = self.__get_attr_value(self.low_th_attr)
if (attr_rv != 'ERR'):
return float(attr_rv) / 1000
else:
return None
def get_low_critical_threshold(self):
"""
Retrieves the low critical threshold temperature of thermal
Returns:
A float number, the low critical threshold temperature of thermal in Celsius
up to nearest thousandth of one degree Celsius, e.g. 30.125
"""
attr_rv = self.__get_attr_value(self.low_crit_th_attr)
if (attr_rv != 'ERR'):
return float(attr_rv) / 1000
@ -130,8 +181,22 @@ class Thermal(ThermalBase):
A float number, the high threshold temperature of thermal in Celsius
up to nearest thousandth of one degree Celsius, e.g. 30.125
"""
attr_path = HWMON_DIR + self.high_th_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.high_th_attr)
if (attr_rv != 'ERR'):
return float(attr_rv) / 1000
else:
return None
def get_high_critical_threshold(self):
"""
Retrieves the high threshold temperature of thermal
Returns:
A float number, the high threshold temperature of thermal in Celsius
up to nearest thousandth of one degree Celsius, e.g. 30.125
"""
attr_rv = self.__get_attr_value(self.high_crit_th_attr)
if (attr_rv != 'ERR'):
return float(attr_rv) / 1000

View File

@ -0,0 +1,241 @@
#!/usr/bin/env python
#############################################################################
#
# Watchdog contains an implementation of SONiC Platform Base Watchdog API
#
#############################################################################
import fcntl
import os
import array
try:
from sonic_platform_base.watchdog_base import WatchdogBase
except ImportError as e:
raise ImportError(str(e) + "- required module not found")
""" ioctl constants """
IO_WRITE = 0x40000000
IO_READ = 0x80000000
IO_READ_WRITE = 0xC0000000
IO_SIZE_INT = 0x00040000
IO_SIZE_40 = 0x00280000
IO_TYPE_WATCHDOG = ord('W') << 8
WDR_INT = IO_READ | IO_SIZE_INT | IO_TYPE_WATCHDOG
WDR_40 = IO_READ | IO_SIZE_40 | IO_TYPE_WATCHDOG
WDWR_INT = IO_READ_WRITE | IO_SIZE_INT | IO_TYPE_WATCHDOG
""" Watchdog ioctl commands """
WDIOC_GETSUPPORT = 0 | WDR_40
WDIOC_GETSTATUS = 1 | WDR_INT
WDIOC_GETBOOTSTATUS = 2 | WDR_INT
WDIOC_GETTEMP = 3 | WDR_INT
WDIOC_SETOPTIONS = 4 | WDR_INT
WDIOC_KEEPALIVE = 5 | WDR_INT
WDIOC_SETTIMEOUT = 6 | WDWR_INT
WDIOC_GETTIMEOUT = 7 | WDR_INT
WDIOC_SETPRETIMEOUT = 8 | WDWR_INT
WDIOC_GETPRETIMEOUT = 9 | WDR_INT
WDIOC_GETTIMELEFT = 10 | WDR_INT
""" Watchdog status constants """
WDIOS_DISABLECARD = 0x0001
WDIOS_ENABLECARD = 0x0002
WDT_COMMON_ERROR = -1
WD_MAIN_IDENTITY = "iTCO_wdt"
WDT_SYSFS_PATH = "/sys/class/watchdog/"
DEFAULT_TIMEOUT=180
watchdog=0
class Watchdog(WatchdogBase):
def __init__(self):
self.watchdog, self.wdt_main_dev_name = self._get_wdt()
if self.wdt_main_dev_name is None:
raise Exception("Watchdog device is not instantiated")
self.status_path = "/sys/class/watchdog/%s/status" % self.wdt_main_dev_name
self.state_path = "/sys/class/watchdog/%s/state" % self.wdt_main_dev_name
self.timeout_path = "/sys/class/watchdog/%s/timeout" % self.wdt_main_dev_name
# Set default value
self._disable()
self.armed = False
self.timeout = DEFAULT_TIMEOUT
def _is_wd_main(self, dev):
"""
Checks watchdog identity
"""
identity = self._read_file(
"{}/{}/identity".format(WDT_SYSFS_PATH, dev))
return identity == WD_MAIN_IDENTITY
def _get_wdt(self):
"""
Retrieves watchdog device
"""
global watchdog
wdt_main_dev_list = [dev for dev in os.listdir(
"/dev/") if dev.startswith("watchdog") and self._is_wd_main(dev)]
if not wdt_main_dev_list:
return (None, None)
wdt_main_dev_name = wdt_main_dev_list[0]
watchdog_device_path = "/dev/{}".format(wdt_main_dev_name)
if not watchdog:
watchdog = os.open(watchdog_device_path, os.O_RDWR)
return watchdog, wdt_main_dev_name
def _read_file(self, file_path):
"""
Read text file
"""
try:
with open(file_path, "r") as fd:
txt = fd.read()
except IOError:
return WDT_COMMON_ERROR
return txt.strip()
def _enable(self):
"""
Turn on the watchdog timer
"""
req = array.array('h', [WDIOS_ENABLECARD])
fcntl.ioctl(self.watchdog, WDIOC_SETOPTIONS, req, False)
def _disable(self):
"""
Turn off the watchdog timer
"""
req = array.array('h', [WDIOS_DISABLECARD])
fcntl.ioctl(self.watchdog, WDIOC_SETOPTIONS, req, False)
def _keepalive(self):
"""
Keep alive watchdog timer
"""
fcntl.ioctl(self.watchdog, WDIOC_KEEPALIVE)
def _settimeout(self, seconds):
"""
Set watchdog timer timeout
@param seconds - timeout in seconds
@return is the actual set timeout
"""
req = array.array('I', [seconds])
fcntl.ioctl(self.watchdog, WDIOC_SETTIMEOUT, req, True)
return int(req[0])
def _gettimeout(self, timeout_path):
"""
Get watchdog timeout
@return watchdog timeout
"""
req = array.array('I', [0])
fcntl.ioctl(self.watchdog, WDIOC_GETTIMEOUT, req, True)
return int(req[0])
def _gettimeleft(self):
"""
Get time left before watchdog timer expires
@return time left in seconds
"""
req = array.array('I', [0])
fcntl.ioctl(self.watchdog, WDIOC_GETTIMELEFT, req, True)
return int(req[0])
#################################################################
def arm(self, seconds):
"""
Arm the hardware watchdog with a timeout of <seconds> seconds.
If the watchdog is currently armed, calling this function will
simply reset the timer to the provided value. If the underlying
hardware does not support the value provided in <seconds>, this
method should arm the watchdog with the *next greater* available
value.
Returns:
An integer specifying the *actual* number of seconds the watchdog
was armed with. On failure returns -1.
"""
ret = WDT_COMMON_ERROR
if seconds < 0:
return ret
try:
if self.timeout != seconds:
self.timeout = self._settimeout(seconds)
if self.armed:
self._keepalive()
else:
self._settimeout(seconds)
self._enable()
self.armed = True
ret = self.timeout
except IOError as e:
pass
return ret
def disarm(self):
"""
Disarm the hardware watchdog
Returns:
A boolean, True if watchdog is disarmed successfully, False if not
"""
disarmed = False
if self.is_armed():
try:
self._disable()
self.armed = False
disarmed = True
except IOError:
pass
return disarmed
def is_armed(self):
"""
Retrieves the armed state of the hardware watchdog.
Returns:
A boolean, True if watchdog is armed, False if not
"""
return self.armed
def get_remaining_time(self):
"""
If the watchdog is armed, retrieve the number of seconds remaining on
the watchdog timer
Returns:
An integer specifying the number of seconds remaining on thei
watchdog timer. If the watchdog is not armed, returns -1.
"""
timeleft = WDT_COMMON_ERROR
if self.armed:
try:
timeleft = self._gettimeleft()
except IOError:
pass
return timeleft
def __del__(self):
"""
Close watchdog
"""
if self.watchdog is not None :
os.close(self.watchdog)

View File

@ -28,7 +28,7 @@ command:
"""
import os
import commands
import subprocess
import sys, getopt
import logging
import time
@ -39,8 +39,8 @@ FORCE = 0
i2c_prefix = '/sys/bus/i2c/devices/'
if DEBUG == True:
print sys.argv[0]
print 'ARGV :', sys.argv[1:]
print(sys.argv[0])
print('ARGV :', sys.argv[1:])
def main():
global DEBUG
@ -55,9 +55,9 @@ def main():
'force',
])
if DEBUG == True:
print options
print args
print len(sys.argv)
print(options)
print(args)
print(len(sys.argv))
for opt, arg in options:
if opt in ('-h', '--help'):
@ -77,29 +77,40 @@ def main():
else:
show_help()
return 0
def show_help():
print __doc__ % {'scriptName' : sys.argv[0].split("/")[-1]}
print(__doc__ % {'scriptName' : sys.argv[0].split("/")[-1]})
sys.exit(0)
def show_log(txt):
if DEBUG == True:
print "[IX8C-56X]"+txt
print("[IX8C-56X]" + txt)
return
def exec_cmd(cmd, show):
logging.info('Run :'+cmd)
status, output = commands.getstatusoutput(cmd)
logging.info('Run :' + cmd)
status, output = subprocess.getstatusoutput(cmd)
show_log (cmd +"with result:" + str(status))
show_log (" output:"+output)
show_log (" output:" + output)
if status:
logging.info('Failed :'+cmd)
logging.info('Failed :' + cmd)
if show:
print('Failed :'+cmd)
print('Failed :' + cmd)
return status, output
pca954x_bus_addr =[
'0-0072',
'0-0077',
'5-0073',
'6-0073',
'7-0073',
'8-0073',
'9-0073',
'10-0073',
'11-0073'
]
instantiate =[
#export pca9698 for qsfp present
'echo 34 > /sys/class/gpio/export',
@ -201,7 +212,7 @@ drivers =[
'lpc_ich',
'i2c-i801',
'i2c-dev',
'i2c-mux-pca954x force_deselect_on_exit=1',
'i2c-mux-pca954x',
'gpio-pca953x',
'optoe',
'qci_cpld_sfp28',
@ -234,8 +245,17 @@ def system_install():
for i in range(0,len(drivers)):
status, output = exec_cmd("modprobe " + drivers[i], 1)
if status:
print output
if FORCE == 0:
print(output)
#retry quanta_hwmon_ipmi in case it init failed due to ipmi_msghandler init uncompleted
if drivers[i] == 'quanta_hwmon_ipmi':
for _ in range(0, 3):
time.sleep(3)
ret, out = exec_cmd("modprobe quanta_hwmon_ipmi ", 1)
if ret == 0:
break
if ret and FORCE == 0:
return ret
elif FORCE == 0:
return status
#reload ethernet drivers in correct order
@ -244,6 +264,10 @@ def system_install():
exec_cmd("modprobe igb ", 1)
exec_cmd("modprobe ixgbe ", 1)
# set pca954x idle_state as -2: MUX_IDLE_DISCONNECT
for i in range(0,len(pca954x_bus_addr)):
exec_cmd("echo -2 > /sys/bus/i2c/drivers/pca954x/{}/idle_state".format(pca954x_bus_addr[i]), 1)
#turn on module power
exec_cmd("echo 21 > /sys/class/gpio/export ", 1)
exec_cmd("echo high > /sys/class/gpio/gpio21/direction ", 1)
@ -263,15 +287,15 @@ def system_install():
exec_cmd("echo 1 >/sys/class/gpio/gpio73/value", 1)
#instantiate devices
for i in range(0,len(instantiate)):
for i in range(0, len(instantiate)):
status, output = exec_cmd(instantiate[i], 1)
if status:
print output
print(output)
if FORCE == 0:
return status
#QSFP for 1~56 port
for port_number in range(1,57):
for port_number in range(1, 57):
bus_number = port_number + 12
os.system("echo %d >/sys/bus/i2c/devices/%d-0050/port_name" % (port_number, bus_number))
@ -285,18 +309,18 @@ def system_ready():
def install():
if not device_found():
print "No device, installing...."
print("No device, installing....")
status = system_install()
if status:
if FORCE == 0:
return status
status, output = exec_cmd("pip3 install /usr/share/sonic/device/x86_64-quanta_ix8c_bwde-r0/sonic_platform-1.0-py3-none-any.whl",1)
if status:
print output
print(output)
if FORCE == 0:
return status
else:
print " ix8c driver already installed...."
print(" ix8c driver already installed....")
return
def uninstall():
@ -305,13 +329,13 @@ def uninstall():
for i in range(len(un_drivers) - 1, -1, -1):
status, output = exec_cmd("rmmod " + un_drivers[i], 1)
if status:
print output
print(output)
if FORCE == 0:
return status
status, output = exec_cmd("pip3 uninstall sonic-platform -y ",1)
if status:
print output
print(output)
if FORCE == 0:
return status

View File

@ -51,7 +51,7 @@ static struct class *cpld_class = NULL;
struct cpld_data {
struct i2c_client *cpld_client;
char name[8];
char name[16];
u8 cpld_id;
};

View File

@ -141,9 +141,9 @@ static int __init ix9_platform_init(void)
}
else
{
g_client[0] = i2c_new_device(adapter, &ix9_i2c_devices[0]); // pca9546_1 - Address: 0x72
g_client[1] = i2c_new_device(adapter, &ix9_i2c_devices[1]); // pca9548_1 - Address: 0x77
g_client[2] = i2c_new_device(adapter, &ix9_i2c_devices[11]); // CPU Linking Board at CPU's I2C Bus - Address: 0x22
g_client[0] = i2c_new_client_device(adapter, &ix9_i2c_devices[0]); // pca9546_1 - Address: 0x72
g_client[1] = i2c_new_client_device(adapter, &ix9_i2c_devices[1]); // pca9548_1 - Address: 0x77
g_client[2] = i2c_new_client_device(adapter, &ix9_i2c_devices[11]); // CPU Linking Board at CPU's I2C Bus - Address: 0x22
i2c_put_adapter(adapter);
}
@ -154,8 +154,8 @@ static int __init ix9_platform_init(void)
}
else
{
g_client[3] = i2c_new_device(adapter, &ix9_i2c_devices[8]); // CPLD-IO #2 - Address: 0x38
g_client[4] = i2c_new_device(adapter, &ix9_i2c_devices[9]); // CPLD-LED #4 - Address: 0x39
g_client[3] = i2c_new_client_device(adapter, &ix9_i2c_devices[8]); // CPLD-IO #2 - Address: 0x38
g_client[4] = i2c_new_client_device(adapter, &ix9_i2c_devices[9]); // CPLD-LED #4 - Address: 0x39
i2c_put_adapter(adapter);
}
@ -166,8 +166,8 @@ static int __init ix9_platform_init(void)
}
else
{
g_client[5] = i2c_new_device(adapter, &ix9_i2c_devices[8]); // CPLD-IO #3 - Address: 0x38
g_client[6] = i2c_new_device(adapter, &ix9_i2c_devices[9]); // CPLD-LED #5 - Address: 0x39
g_client[5] = i2c_new_client_device(adapter, &ix9_i2c_devices[8]); // CPLD-IO #3 - Address: 0x38
g_client[6] = i2c_new_client_device(adapter, &ix9_i2c_devices[9]); // CPLD-LED #5 - Address: 0x39
i2c_put_adapter(adapter);
}
@ -178,7 +178,7 @@ static int __init ix9_platform_init(void)
}
else
{
g_client[7] = i2c_new_device(adapter, &ix9_i2c_devices[3]); // MB_BOARDINFO_EEPROM - Address: 0x54
g_client[7] = i2c_new_client_device(adapter, &ix9_i2c_devices[3]); // MB_BOARDINFO_EEPROM - Address: 0x54
i2c_put_adapter(adapter);
}
@ -189,7 +189,7 @@ static int __init ix9_platform_init(void)
}
else
{
g_client[8] = i2c_new_device(adapter, &ix9_i2c_devices[2]); // tca9539_1 Board ID and QSFP-DD PW EN/PG - Address: 0x74
g_client[8] = i2c_new_client_device(adapter, &ix9_i2c_devices[2]); // tca9539_1 Board ID and QSFP-DD PW EN/PG - Address: 0x74
i2c_put_adapter(adapter);
}
@ -200,7 +200,7 @@ static int __init ix9_platform_init(void)
}
else
{
g_client[9] = i2c_new_device(adapter, &ix9_i2c_devices[4]); // pca9548 #1 QSFPDD - Address: 0x73
g_client[9] = i2c_new_client_device(adapter, &ix9_i2c_devices[4]); // pca9548 #1 QSFPDD - Address: 0x73
i2c_put_adapter(adapter);
}
@ -211,7 +211,7 @@ static int __init ix9_platform_init(void)
}
else
{
g_client[10] = i2c_new_device(adapter, &ix9_i2c_devices[5]); // pca9548 #2 QSFPDD - Address: 0x73
g_client[10] = i2c_new_client_device(adapter, &ix9_i2c_devices[5]); // pca9548 #2 QSFPDD - Address: 0x73
i2c_put_adapter(adapter);
}
@ -222,7 +222,7 @@ static int __init ix9_platform_init(void)
}
else
{
g_client[11] = i2c_new_device(adapter, &ix9_i2c_devices[6]); // pca9548 #3 QSFPDD - Address: 0x73
g_client[11] = i2c_new_client_device(adapter, &ix9_i2c_devices[6]); // pca9548 #3 QSFPDD - Address: 0x73
i2c_put_adapter(adapter);
}
@ -233,7 +233,7 @@ static int __init ix9_platform_init(void)
}
else
{
g_client[12] = i2c_new_device(adapter, &ix9_i2c_devices[7]); // pca9548 #4 QSFPDD - Address: 0x73
g_client[12] = i2c_new_client_device(adapter, &ix9_i2c_devices[7]); // pca9548 #4 QSFPDD - Address: 0x73
i2c_put_adapter(adapter);
}
@ -246,7 +246,7 @@ static int __init ix9_platform_init(void)
}
else
{
g_client_port[i - 13] = i2c_new_device(adapter, &ix9_i2c_devices[10]); // eeprom for loopback module - Address: 0x50
g_client_port[i - 13] = i2c_new_client_device(adapter, &ix9_i2c_devices[10]); // eeprom for loopback module - Address: 0x50
i2c_put_adapter(adapter);
}
}

View File

@ -86,6 +86,8 @@
#define IPMI_TIMEOUT (4 * HZ)
#define IPMI_MAX_WAIT_QUEUE 1
typedef struct ipmi_user *ipmi_user_t;
struct quanta_hwmon_ipmi_data {
struct platform_device *ipmi_platform_dev;
struct device *ipmi_hwmon_dev;
@ -1611,7 +1613,7 @@ static int32_t __init quanta_hwmon_ipmi_init(void)
goto device_reg_err;
}
data->ipmi_hwmon_dev = hwmon_device_register_with_groups(NULL, DRVNAME, NULL, NULL);
data->ipmi_hwmon_dev = hwmon_device_register_with_groups(&data->ipmi_platform_dev->dev, DRVNAME, NULL, NULL);
err = IS_ERR(data->ipmi_hwmon_dev);
if (err) {
printk("hwmon register fail\n");
@ -1656,8 +1658,9 @@ static void __exit quanta_hwmon_ipmi_exit(void)
mutex_unlock(&ipmi_lock);
kfree(g_sensor_data);
g_sensor_data = NULL;
kfree(data);
return;
data = NULL;
}
module_init(quanta_hwmon_ipmi_init);

View File

@ -8,6 +8,7 @@
try:
import sys
import time
import syslog
from sonic_platform_base.chassis_base import ChassisBase
from sonic_platform.eeprom import Eeprom
from sonic_platform.psu import Psu
@ -64,6 +65,12 @@ class Chassis(ChassisBase):
self._sfp_list.append(sfp)
self.__xcvr_presence[index] = self._sfp_list[index-1].get_presence()
# Initialize components
from sonic_platform.component import ComponentBIOS, ComponentBMC, ComponentCPLD, ComponentPCIE
self._component_list.append(ComponentBIOS())
self._component_list.append(ComponentBMC())
self._component_list.extend(ComponentCPLD.get_component_list())
self._component_list.append(ComponentPCIE())
##############################################
# Device methods
@ -72,7 +79,7 @@ class Chassis(ChassisBase):
def get_sfp(self, index):
"""
Retrieves sfp represented by (1-based) index <index>
For Quanta IX8C the index in sfputil.py starts from 1, so override
For Quanta the index in sfputil.py starts from 1, so override
Args:
index: An integer, the index (1-based) of the sfp to retrieve.
@ -182,9 +189,29 @@ class Chassis(ChassisBase):
is "REBOOT_CAUSE_HARDWARE_OTHER", the second string can be used
to pass a description of the reboot cause.
"""
#raise NotImplementedError
return (ChassisBase.REBOOT_CAUSE_HARDWARE_OTHER, "Invalid Reason")
##############################################
# Other methods
##############################################
def get_watchdog(self):
"""
Retreives hardware watchdog device on this chassis
Returns:
An object derived from WatchdogBase representing the hardware
watchdog device
"""
try:
if self._watchdog is None:
from sonic_platform.watchdog import Watchdog
# Create the watchdog Instance
self._watchdog = Watchdog()
except Exception as e:
syslog.syslog(syslog.LOG_ERR, "Fail to load watchdog due to {}".format(e))
return self._watchdog
def get_change_event(self, timeout=0):
"""
Currently only support transceiver change events
@ -200,10 +227,10 @@ class Chassis(ChassisBase):
cur_xcvr_presence = self._sfp_list[index-1].get_presence()
if cur_xcvr_presence != self.__xcvr_presence[index]:
if cur_xcvr_presence is True:
xcvr_change_event_dict[str(index)] = '1'
xcvr_change_event_dict[index] = '1'
self.__xcvr_presence[index] = True
elif cur_xcvr_presence is False:
xcvr_change_event_dict[str(index)] = '0'
xcvr_change_event_dict[index] = '0'
self.__xcvr_presence[index] = False
event = True

View File

@ -0,0 +1,203 @@
#!/usr/bin/env python
########################################################################
# Quanta IX9
#
# Name: component.py, version: 1.3
# Module contains an implementation of SONiC Platform Base API and
# provides the Components' (e.g., BIOS, CPLD, FPGA, etc.) available in
# the platform
#
########################################################################
try:
import subprocess
from sonic_platform_base.component_base import ComponentBase
from collections import namedtuple
except ImportError as e:
raise ImportError(str(e) + "- required module not found")
class Component(ComponentBase):
def __init__(self):
ComponentBase.__init__(self)
self.name = None
self.description = None
def get_name(self):
return self.name
def get_description(self):
return self.description
def install_firmware(self, image_path):
"""
Installs firmware to the component
Args:
image_path: A string, path to firmware image
Returns:
A boolean, True if install was successful, False if not
"""
return False
@staticmethod
def _get_command_result(cmdline):
try:
proc = subprocess.Popen(cmdline,
stdout=subprocess.PIPE,
shell=True, stderr=subprocess.STDOUT,
universal_newlines=True)
stdout = proc.communicate()[0]
rc = proc.wait()
result = stdout.rstrip('\n')
if rc != 0:
raise RuntimeError("Failed to execute command {}, return code {}, {}".format(cmdline, rc, stdout))
except OSError as e:
raise RuntimeError("Failed to execute command {} due to {}".format(cmdline, repr(e)))
return result
class ComponentBIOS(Component):
COMPONENT_NAME = 'BIOS'
COMPONENT_DESCRIPTION = 'BIOS - Basic Input/Output System'
BIOS_QUERY_VERSION_COMMAND = "dmidecode -s bios-version"
def __init__(self):
super(ComponentBIOS, self).__init__()
self.name = self.COMPONENT_NAME
self.description = self.COMPONENT_DESCRIPTION
def get_firmware_version(self):
"""
Retrieves the firmware version of the component
Returns:
A string containing the firmware version of the component
"""
bios_ver = self._get_command_result(self.BIOS_QUERY_VERSION_COMMAND)
if not bios_ver:
return 'ERR'
else:
return bios_ver
class ComponentBMC(Component):
COMPONENT_NAME = 'BMC'
COMPONENT_DESCRIPTION = 'BMC - Board Management Controller'
BMC_QUERY_VERSION_COMMAND = "ipmitool mc info | grep 'Firmware Revision'"
def __init__(self):
super(ComponentBMC, self).__init__()
self.name = self.COMPONENT_NAME
self.description = self.COMPONENT_DESCRIPTION
def get_firmware_version(self):
"""
Retrieves the firmware version of the component
Returns:
A string containing the firmware version of the component
"""
bmc_ver = self._get_command_result(self.BMC_QUERY_VERSION_COMMAND)
if not bmc_ver:
return 'ERR'
else:
bmc_ver = bmc_ver.split(": ")[1]
return bmc_ver.strip()
class ComponentCPLD(Component):
Cpld = namedtuple("Cpld", ['name', 'cmd_index', 'description'])
cplds = {
1: Cpld("BOOT_CPLD", 1, "Power sequence"),
2: Cpld("FAN_CPLD", 2, "Fan"),
3: Cpld("MB_CPLD_IO_1", 3, "Port IO-1"),
4: Cpld("MB_CPLD_IO_2", 6, "Port IO-2"),
5: Cpld("MB_CPLD_LED_1", 4, "Port LED-1"),
6: Cpld("MB_CPLD_LED_2", 5, "Port LED-2"),
}
def __init__(self, component_index):
super(ComponentCPLD, self).__init__()
self.index = component_index
def get_name(self):
"""
Retrieves the name of the component
Returns:
A string containing the name of the component
"""
self.name = self.cplds[self.index].name
return self.name
def get_description(self):
"""
Retrieves the description of the component
Returns:
A string containing the description of the component
"""
self.description = self.cplds[self.index].description
return self.description
def get_firmware_version(self):
"""
Retrieves the firmware version of the component
Returns:
A string containing the firmware version of the component
"""
self._get_command_result("ipmitool raw 0x30 0xe0 0xd0 0x01 0x01")
res = self._get_command_result("ipmitool raw 0x32 0xff 0x02 {}".format(self.cplds[self.index].cmd_index))
self._get_command_result("ipmitool raw 0x30 0xe0 0xd0 0x01 0x00")
if not res:
return 'ERR'
else:
return res.split()[3].upper() + res.split()[2].upper() + res.split()[1].upper() + res.split()[0].upper()
@classmethod
def get_component_list(cls):
component_list = []
cpld_number = len(cls.cplds)
for cpld_idx in range(1, cpld_number + 1):
component_list.append(cls(cpld_idx))
return component_list
class ComponentPCIE(Component):
COMPONENT_NAME = 'PCIe'
COMPONENT_DESCRIPTION = 'ASIC PCIe Firmware'
PCIE_QUERY_VERSION_COMMAND = "bcmcmd 'pciephy fw version' | grep 'FW version'"
def __init__(self):
super(ComponentPCIE, self).__init__()
self.name = self.COMPONENT_NAME
self.description = self.COMPONENT_DESCRIPTION
def get_firmware_version(self):
"""
Retrieves the firmware version of the component
Returns:
A string containing the firmware version of the component
"""
version = self._get_command_result(self.PCIE_QUERY_VERSION_COMMAND)
if not version:
return 'ERR'
else:
version = version.split(": ")[1]
return version.strip()

View File

@ -11,6 +11,7 @@
try:
import logging
import os
import glob
from sonic_platform_base.fan_base import FanBase
except ImportError as e:
raise ImportError(str(e) + "- required module not found")
@ -19,9 +20,7 @@ except ImportError as e:
###############
# Global
###############
HWMON_DIR = "/sys/class/hwmon/hwmon2/"
FAN_INDEX_START = 18
NUM_FANTRAYS = 6
HWMON_IPMI_DIR = "/sys/devices/platform/quanta_hwmon_ipmi/hwmon/hwmon*/"
FANS_PERTRAY = 2
class Fan(FanBase):
@ -30,30 +29,46 @@ class Fan(FanBase):
def __init__(self, index, is_psu_fan=False):
self.is_psu_fan = is_psu_fan
self.fan_index = index
self.psu_fan_index_mapping = {
1:37,
2:47,
}
self.psu_index_mapping = {
1:39,
2:49,
}
hwmon_dir=glob.glob(HWMON_IPMI_DIR)[0]
if self.is_psu_fan:
self.fan_presence_attr = "power{}_present".format(self.psu_index_mapping[index])
self.fan_pwm_attr = "fan{}_pwm".format(self.psu_fan_index_mapping[index])
self.fan_rpm_attr = "fan{}_input".format(self.psu_fan_index_mapping[index])
self.fan_direction_attr = "fan{}_direction".format(self.psu_fan_index_mapping[index])
power_out_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_POWER_OUT".format(self.fan_index), 'power')
fan_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_Fan".format(self.fan_index), 'fan')
self.fan_presence_attr = power_out_prefix + 'present'
self.fan_pwm_attr = fan_prefix + 'pwm'
self.fan_rpm_attr = fan_prefix + 'input'
self.fan_direction_attr = fan_prefix + 'direction'
else:
self.fan_presence_attr = "fan{}_present".format(FAN_INDEX_START+(index-1))
self.fan_pwm_attr = "fan{}_pwm".format(FAN_INDEX_START+(index-1))
self.fan_rpm_attr = "fan{}_input".format(FAN_INDEX_START+(index-1))
self.fan_direction_attr = "fan{}_direction".format(FAN_INDEX_START+(index-1))
fantray_index = (self.fan_index-1)//FANS_PERTRAY+1
fan_index_intray = self.fan_index - ((fantray_index-1)*FANS_PERTRAY)
fan_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "Fan_SYS_{}_{}".format(fantray_index, fan_index_intray), 'fan')
self.fan_presence_attr = fan_prefix + 'present'
self.fan_pwm_attr = fan_prefix + 'pwm'
self.fan_rpm_attr = fan_prefix + 'input'
self.fan_direction_attr = fan_prefix + 'direction'
#######################
# private function
#######################
def __get_hwmon_attr_prefix(self, dir, label, type):
retval = 'ERR'
if not os.path.isdir(dir):
return retval
try:
for filename in os.listdir(dir):
if filename[-5:] == 'label' and type in filename:
file_path = os.path.join(dir, filename)
if os.path.isfile(file_path) and label == self.__get_attr_value(file_path):
return file_path[0:-5]
except Exception as error:
logging.error("Error when getting {} label path: {}".format(label, error))
return retval
def __get_attr_value(self, attr_path):
retval = 'ERR'
@ -64,7 +79,7 @@ class Fan(FanBase):
with open(attr_path, 'r') as fd:
retval = fd.read()
except Exception as error:
logging.error("Unable to open " + attr_path + " file !")
logging.error("Unable to open {} file: {}".format(attr_path, error))
retval = retval.rstrip(' \t\n\r')
return retval
@ -84,7 +99,7 @@ class Fan(FanBase):
if self.is_psu_fan:
return "PSU-{}_FAN".format(self.fan_index)
else:
fantray_index = (self.fan_index-1)/FANS_PERTRAY+1
fantray_index = (self.fan_index-1)//FANS_PERTRAY+1
fan_index_intray = self.fan_index - ((fantray_index-1)*FANS_PERTRAY)
return "Fantray{}_{}".format(fantray_index, fan_index_intray)
@ -95,8 +110,7 @@ class Fan(FanBase):
Returns:
bool: True if device is present, False if not
"""
attr_path = HWMON_DIR + self.fan_presence_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.fan_presence_attr)
if (attr_rv != 'ERR'):
if (attr_rv == '1'):
return True
@ -113,8 +127,7 @@ class Fan(FanBase):
A boolean value, True if device is operating properly, False if not
"""
if self.get_presence():
attr_path = HWMON_DIR + self.fan_rpm_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.fan_rpm_attr)
if (attr_rv != 'ERR' and attr_rv != '0.0'):
return True
@ -135,8 +148,7 @@ class Fan(FanBase):
A string, either FAN_DIRECTION_INTAKE or FAN_DIRECTION_EXHAUST
depending on fan direction
"""
attr_path = HWMON_DIR + self.fan_direction_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.fan_direction_attr)
if attr_rv == '2':
return self.FAN_DIRECTION_INTAKE
@ -152,8 +164,7 @@ class Fan(FanBase):
to 100 (full speed)
"""
if self.get_presence():
attr_path = HWMON_DIR + self.fan_pwm_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.fan_pwm_attr)
if (attr_rv != 'ERR'):
return int(float(attr_rv))
@ -169,8 +180,7 @@ class Fan(FanBase):
Returns:
An integer, speed of the fan in RPM
"""
attr_path = HWMON_DIR + self.fan_rpm_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.fan_rpm_attr)
if (attr_rv != 'ERR'):
return int(float(attr_rv))
@ -185,8 +195,7 @@ class Fan(FanBase):
An integer, the percentage of full fan speed, in the range 0 (off)
to 100 (full speed)
"""
attr_path = HWMON_DIR + self.fan_pwm_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.fan_pwm_attr)
if (attr_rv != 'ERR'):
return int(float(attr_rv))

View File

@ -28,7 +28,7 @@ class FanDrawer(FanDrawerBase):
Returns:
string: The name of the device
"""
return 'Fan {}'.format(self._index)
return 'Fantray{}'.format(self._index)
def get_presence(self):
"""

View File

@ -8,57 +8,61 @@
try:
import logging
import os
import glob
from sonic_platform_base.psu_base import PsuBase
from sonic_platform.fan import Fan
except ImportError as e:
raise ImportError(str(e) + "- required module not found")
HWMON_DIR = "/sys/class/hwmon/hwmon2/"
HWMON_IPMI_DIR = "/sys/devices/platform/quanta_hwmon_ipmi/hwmon/hwmon*/"
class Psu(PsuBase):
def __init__(self, index):
PsuBase.__init__(self)
fan = Fan(index, True)
self._fan_list.append(fan)
self.psu_index_mapping = {
1:39,
2:49,
}
self.psu_powerin_index_mapping = {
1:38,
2:48,
}
self.psu_currentout_index_mapping = {
1:36,
2:46,
}
self.psu_currentin_index_mapping = {
1:35,
2:45,
}
self.psu_voltageout_index_mapping = {
1:44,
2:54,
}
self.psu_voltagein_index_mapping = {
1:43,
2:53,
}
self.index = index
self.psu_presence_attr = "power{}_present".format(self.psu_index_mapping[self.index])
self.psu_status_attr = "curr{}_input".format(self.psu_currentout_index_mapping[self.index])
self.psu_power_in_attr = "power{}_input".format(self.psu_powerin_index_mapping[self.index])
self.psu_power_out_attr = "power{}_input".format(self.psu_index_mapping[self.index])
self.psu_voltage_out_attr = "in{}_input".format(self.psu_voltageout_index_mapping[self.index])
self.psu_current_out_attr = "curr{}_input".format(self.psu_currentout_index_mapping[self.index])
self.psu_voltage_in_attr = "in{}_input".format(self.psu_voltagein_index_mapping[self.index])
self.psu_current_in_attr = "curr{}_input".format(self.psu_currentin_index_mapping[self.index])
self.psu_serial_attr = "power{}_sn".format(self.psu_index_mapping[self.index])
self.psu_model_attr = "power{}_model".format(self.psu_index_mapping[self.index])
self.psu_mfr_id_attr = "power{}_mfrid".format(self.psu_index_mapping[self.index])
self.psu_capacity_attr = "power{}_pout_max".format(self.psu_index_mapping[self.index])
self.psu_type_attr = "power{}_vin_type".format(self.psu_index_mapping[self.index])
hwmon_dir=glob.glob(HWMON_IPMI_DIR)[0]
current_in_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_CURRENT_IN".format(self.index), 'curr')
current_out_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_CURRENT_OUT".format(self.index), 'curr')
power_in_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_POWER_IN".format(self.index), 'power')
power_out_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_POWER_OUT".format(self.index), 'power')
voltage_in_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_VOLTAGE_IN".format(self.index), 'in')
voltage_out_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_VOLTAGE_OUT".format(self.index), 'in')
temp1_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, "PSU{}_TEMP1".format(self.index), 'temp')
self.psu_current_in_attr = current_in_prefix + 'input'
self.psu_current_out_attr = current_out_prefix + 'input'
self.psu_power_in_attr = power_in_prefix + 'input'
self.psu_power_out_attr = power_out_prefix + 'input'
self.psu_voltage_in_attr = voltage_in_prefix + 'input'
self.psu_voltage_out_attr = voltage_out_prefix + 'input'
self.psu_status_attr = current_out_prefix + 'input'
self.psu_presence_attr = power_out_prefix + 'present'
self.psu_serial_attr = power_out_prefix + 'sn'
self.psu_model_attr = power_out_prefix + 'model'
self.psu_mfr_id_attr = power_out_prefix + 'mfrid'
self.psu_capacity_attr = power_out_prefix + 'pout_max'
self.psu_type_attr = power_out_prefix + 'vin_type'
self.psu_temp_attr = temp1_prefix + 'input'
def __get_hwmon_attr_prefix(self, dir, label, type):
retval = 'ERR'
if not os.path.isdir(dir):
return retval
try:
for filename in os.listdir(dir):
if filename[-5:] == 'label' and type in filename:
file_path = os.path.join(dir, filename)
if os.path.isfile(file_path) and label == self.__get_attr_value(file_path):
return file_path[0:-5]
except Exception as error:
logging.error("Error when getting {} label path: {}".format(label, error))
return retval
def __get_attr_value(self, attr_path):
@ -70,10 +74,9 @@ class Psu(PsuBase):
with open(attr_path, 'r') as fd:
retval = fd.read()
except Exception as error:
logging.error("Unable to open " + attr_path + " file !")
logging.error("Unable to open {} file: {}".format(attr_path, error))
retval = retval.rstrip(' \t\n\r')
fd.close()
return retval
##############################################
@ -97,10 +100,9 @@ class Psu(PsuBase):
bool: True if device is present, False if not
"""
presence = False
attr_path = HWMON_DIR+self.psu_presence_attr
attr_normal = '1'
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.psu_presence_attr)
if (attr_rv != 'ERR'):
if (attr_rv == attr_normal):
presence = True
@ -115,8 +117,7 @@ class Psu(PsuBase):
string: Model/part number of device
"""
model = "N/A"
attr_path = HWMON_DIR+self.psu_model_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.psu_model_attr)
if (attr_rv != 'ERR'):
model = attr_rv
@ -130,8 +131,7 @@ class Psu(PsuBase):
string: Manufacturer's id of device
"""
mfr_id = "N/A"
attr_path = HWMON_DIR+self.psu_mfr_id_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.psu_mfr_id_attr)
if (attr_rv != 'ERR'):
mfr_id = attr_rv
@ -145,9 +145,7 @@ class Psu(PsuBase):
string: Serial number of device
"""
serial = "N/A"
attr_path = HWMON_DIR+self.psu_serial_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.psu_serial_attr)
if (attr_rv != 'ERR'):
serial = attr_rv
@ -161,9 +159,7 @@ class Psu(PsuBase):
A boolean value, True if device is operating properly, False if not
"""
status = False
attr_path = HWMON_DIR+self.psu_status_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.psu_status_attr)
if (attr_rv != 'ERR'):
attr_rv, dummy = attr_rv.split('.', 1)
if (int(attr_rv) != 0):
@ -184,9 +180,7 @@ class Psu(PsuBase):
e.g. 12.1
"""
voltage_out = 0.0
attr_path = HWMON_DIR+self.psu_voltage_out_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.psu_voltage_out_attr)
if (attr_rv != 'ERR'):
attr_rv, dummy = attr_rv.split('.', 1)
voltage_out = float(attr_rv) / 1000
@ -201,9 +195,7 @@ class Psu(PsuBase):
A float number, the electric current in amperes, e.g 15.4
"""
current_out = 0.0
attr_path = HWMON_DIR+self.psu_current_out_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.psu_current_out_attr)
if (attr_rv != 'ERR'):
attr_rv, dummy = attr_rv.split('.', 1)
current_out = float(attr_rv) / 1000
@ -212,16 +204,14 @@ class Psu(PsuBase):
def get_input_voltage(self):
"""
Retrieves current PSU voltage output
Retrieves current PSU voltage input
Returns:
A float number, the output voltage in volts,
A float number, the input voltage in volts,
e.g. 12.1
"""
voltage_in = 0.0
attr_path = HWMON_DIR+self.psu_voltage_in_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.psu_voltage_in_attr)
if (attr_rv != 'ERR'):
attr_rv, dummy = attr_rv.split('.', 1)
voltage_in = float(attr_rv) / 1000
@ -236,9 +226,7 @@ class Psu(PsuBase):
A float number, the electric current in amperes, e.g 15.4
"""
current_in = 0.0
attr_path = HWMON_DIR+self.psu_current_in_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.psu_current_in_attr)
if (attr_rv != 'ERR'):
attr_rv, dummy = attr_rv.split('.', 1)
current_in = float(attr_rv) / 1000
@ -253,9 +241,7 @@ class Psu(PsuBase):
A float number, the power in watts, e.g. 302.6
"""
power_out = 0.0
attr_path = HWMON_DIR+self.psu_power_out_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.psu_power_out_attr)
if (attr_rv != 'ERR'):
attr_rv, dummy = attr_rv.split('.', 1)
power_out = float(attr_rv) / 1000
@ -292,8 +278,7 @@ class Psu(PsuBase):
A string, the type of PSU (AC/DC)
"""
type = "AC"
attr_path = HWMON_DIR+self.psu_type_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.psu_type_attr)
if (attr_rv != 'ERR'):
type = attr_rv
@ -307,8 +292,7 @@ class Psu(PsuBase):
An integer, the capacity of PSU
"""
capacity = 0
attr_path = HWMON_DIR+self.psu_capacity_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.psu_capacity_attr)
if (attr_rv != 'ERR'):
try:
capacity = int(attr_rv)
@ -317,3 +301,19 @@ class Psu(PsuBase):
return capacity
def get_temperature(self):
"""
Retrieves current temperature reading from PSU
Returns:
A float number of current temperature in Celsius up to nearest thousandth
of one degree Celsius, e.g. 30.125
"""
tout = 0.0
attr_rv = self.__get_attr_value(self.psu_temp_attr)
if (attr_rv != 'ERR'):
tout = float(attr_rv)
# tout is in milli degree celcius
return float(tout/1000.0)

View File

@ -278,7 +278,6 @@ class Sfp(SfpBase):
# Init index
self.index = sfp_index
self.port_num = self.index
#self.dom_supported = False
self.sfp_type = sfp_type
self.reset_path = "/sys/class/cpld-qsfpdd/port-"+str(self.port_num)+"/reset"
self.lpmode_path = "/sys/class/cpld-qsfpdd/port-"+str(self.port_num)+"/lpmode"
@ -329,7 +328,7 @@ class Sfp(SfpBase):
self.info_dict_keys = ['type', 'vendor_rev', 'serial', 'manufacturer',
'model', 'connector', 'encoding', 'ext_identifier',
'ext_rateselect_compliance', 'cable_type', 'cable_length',
'nominal_bit_rate', 'specification_compliance', 'vendor_date', 'vendor_oui', 'application_advertisement']
'nominal_bit_rate', 'specification_compliance', 'vendor_date', 'vendor_oui', 'application_advertisement', 'type_abbrv_name']
SfpBase.__init__(self)
@ -354,15 +353,6 @@ class Sfp(SfpBase):
else:
return 'N/A'
def __read_txt_file(self, file_path):
try:
with open(file_path, 'r') as fd:
data = fd.read()
return data.strip()
except IOError:
pass
return ""
def __is_host(self):
return os.system(self.HOST_CHK_CMD) == 0
@ -425,7 +415,7 @@ class Sfp(SfpBase):
elif eeprom_raw[0] in QSFP_TYPE_CODE_LIST:
self.sfp_type = QSFP_TYPE
elif eeprom_raw[0] in QSFP_DD_TYPE_CODE_LIST:
self.sfp_type = QSFP_TYPE
self.sfp_type = QSFP_DD_TYPE
else:
# we don't regonize this identifier value, treat the xSFP module as the default type
self.sfp_type = sfp_type
@ -437,26 +427,6 @@ class Sfp(SfpBase):
# in this case we treat it as the default type according to the SKU
self.sfp_type = sfp_type
def __convert_string_to_num(self, value_str):
if "-inf" in value_str:
return 'N/A'
elif "Unknown" in value_str:
return 'N/A'
elif 'dBm' in value_str:
t_str = value_str.rstrip('dBm')
return float(t_str)
elif 'mA' in value_str:
t_str = value_str.rstrip('mA')
return float(t_str)
elif 'C' in value_str:
t_str = value_str.rstrip('C')
return float(t_str)
elif 'Volts' in value_str:
t_str = value_str.rstrip('Volts')
return float(t_str)
else:
return 'N/A'
def _dom_capability_detect(self):
if not self.get_presence():
self.dom_supported = False
@ -544,6 +514,7 @@ class Sfp(SfpBase):
self.dom_rx_tx_power_bias_supported = False
else:
self.dom_supported = False
self.second_application_list = False
self.dom_temp_supported = False
self.dom_volt_supported = False
self.dom_rx_power_supported = False
@ -620,6 +591,7 @@ class Sfp(SfpBase):
return transceiver_info_dict
self._detect_sfp_type(self.sfp_type)
self._dom_capability_detect()
transceiver_info_dict = {}
compliance_code_dict = {}
@ -638,6 +610,7 @@ class Sfp(SfpBase):
sfp_type_raw = self._read_eeprom_specific_bytes((offset + OSFP_TYPE_OFFSET), XCVR_TYPE_WIDTH)
if sfp_type_raw is not None:
sfp_type_data = sfpi_obj.parse_sfp_type(sfp_type_raw, 0)
sfp_type_abbrv_name_data = sfpi_obj.parse_sfp_type_abbrv_name(sfp_type_raw, 0)
else:
return None
@ -666,6 +639,7 @@ class Sfp(SfpBase):
return None
transceiver_info_dict['type'] = sfp_type_data['data']['type']['value']
transceiver_info_dict['type_abbrv_name'] = sfp_type_abbrv_name_data['data']['type_abbrv_name']['value']
transceiver_info_dict['manufacturer'] = sfp_vendor_name_data['data']['Vendor Name']['value']
transceiver_info_dict['model'] = sfp_vendor_pn_data['data']['Vendor PN']['value']
transceiver_info_dict['vendor_rev'] = sfp_vendor_rev_data['data']['Vendor Rev']['value']
@ -703,6 +677,7 @@ class Sfp(SfpBase):
sfp_type_raw = self._read_eeprom_specific_bytes((offset + QSFP_DD_TYPE_OFFSET), XCVR_TYPE_WIDTH)
if sfp_type_raw is not None:
sfp_type_data = sfpi_obj.parse_sfp_type(sfp_type_raw, 0)
sfp_type_abbrv_name_data = sfpi_obj.parse_sfp_type_abbrv_name(sfp_type_raw, 0)
else:
return None
@ -791,6 +766,7 @@ class Sfp(SfpBase):
return None
transceiver_info_dict['type'] = str(sfp_type_data['data']['type']['value'])
transceiver_info_dict['type_abbrv_name'] = sfp_type_abbrv_name_data['data']['type_abbrv_name']['value']
transceiver_info_dict['manufacturer'] = str(sfp_vendor_name_data['data']['Vendor Name']['value'])
transceiver_info_dict['model'] = str(sfp_vendor_pn_data['data']['Vendor PN']['value'])
transceiver_info_dict['vendor_rev'] = str(sfp_vendor_rev_data['data']['Vendor Rev']['value'])
@ -828,9 +804,7 @@ class Sfp(SfpBase):
else:
if not self.get_presence():
return transceiver_info_dict
elif i == max_retry-1:
pass
else:
elif i < max_retry-1:
time.sleep(0.5)
if sfp_interface_bulk_raw is None:
@ -865,6 +839,7 @@ class Sfp(SfpBase):
sfp_vendor_date_data = sfpi_obj.parse_vendor_date(sfp_interface_bulk_raw[start : end], 0)
transceiver_info_dict['type'] = sfp_interface_bulk_data['data']['type']['value']
transceiver_info_dict['type_abbrv_name'] = sfp_interface_bulk_data['data']['type_abbrv_name']['value']
transceiver_info_dict['manufacturer'] = sfp_vendor_name_data['data']['Vendor Name']['value']
transceiver_info_dict['model'] = sfp_vendor_pn_data['data']['Vendor PN']['value']
transceiver_info_dict['vendor_rev'] = sfp_vendor_rev_data['data']['Vendor Rev']['value']
@ -960,8 +935,6 @@ class Sfp(SfpBase):
if not self.get_presence():
return {}
self._dom_capability_detect()
if self.sfp_type == OSFP_TYPE:
pass
@ -1302,7 +1275,7 @@ class Sfp(SfpBase):
return False
elif self.sfp_type == QSFP_TYPE:
return False
elif self.sfp_type == OSFP_TYPE or self.sfp_type == QSFP_DD_TYPE:
elif self.sfp_type == QSFP_DD_TYPE:
try:
reg_file = open(self.reset_path)
except IOError as e:
@ -1509,7 +1482,7 @@ class Sfp(SfpBase):
return False
elif self.sfp_type == QSFP_TYPE:
return False
elif self.sfp_type == OSFP_TYPE:
elif self.sfp_type == QSFP_DD_TYPE:
try:
reg_file = open(self.lpmode_path)
except IOError as e:
@ -1899,7 +1872,7 @@ class Sfp(SfpBase):
return False
elif self.sfp_type == QSFP_TYPE:
return False
elif self.sfp_type == OSFP_TYPE:
elif self.sfp_type == QSFP_DD_TYPE:
try:
reg_file = open(self.reset_path, "r+")
except IOError as e:
@ -1957,7 +1930,7 @@ class Sfp(SfpBase):
sysfsfile_eeprom = open(
sysfs_sfp_i2c_client_eeprom_path, mode="r+b", buffering=0)
buffer = create_string_buffer(1)
buffer[0] = chr(tx_disable_ctl)
buffer[0] = tx_disable_ctl
# Write to eeprom
sysfsfile_eeprom.seek(offset + SFP_STATUS_CONTROL_OFFSET)
sysfsfile_eeprom.write(buffer[0])
@ -2010,7 +1983,7 @@ class Sfp(SfpBase):
else:
tx_disable_ctl = channel_state & (~channel)
buffer = create_string_buffer(1)
buffer[0] = chr(tx_disable_ctl)
buffer[0] = tx_disable_ctl
# Write to eeprom
sysfsfile_eeprom = open(
self.port_to_eeprom_mapping[self.port_num], "r+b")
@ -2045,7 +2018,7 @@ class Sfp(SfpBase):
return False
elif self.sfp_type == QSFP_TYPE:
return False
elif self.sfp_type == OSFP_TYPE:
elif self.sfp_type == QSFP_DD_TYPE:
try:
reg_file = open(self.lpmode_path, "r+")
except IOError as e:
@ -2099,7 +2072,7 @@ class Sfp(SfpBase):
power_set_bit |= 1 << 1
buffer = create_string_buffer(1)
buffer[0] = chr(power_override_bit | power_set_bit)
buffer[0] = power_override_bit | power_set_bit
# Write to eeprom
sysfsfile_eeprom = open(self.port_to_eeprom_mapping[self.port_num], "r+b")
sysfsfile_eeprom.seek(QSFP_POWEROVERRIDE_OFFSET)

View File

@ -1,7 +1,7 @@
#!/usr/bin/env python
#############################################################################
# Quanta
# Quanta IX9
#
# Module contains an implementation of SONiC Platform Base API and
# provides the Thermal information
@ -10,46 +10,69 @@
import logging
import os
import glob
try:
from sonic_platform_base.thermal_base import ThermalBase
except ImportError as e:
raise ImportError(str(e) + "- required module not found")
HWMON_DIR = "/sys/class/hwmon/hwmon2/"
HWMON_IPMI_DIR = "/sys/devices/platform/quanta_hwmon_ipmi/hwmon/hwmon*/"
thermal_index_mapping = {
1:40,
2:41,
3:42,
4:50,
5:51,
6:52,
7:73,
8:74,
9:75,
10:76,
11:77,
12:78,
13:79,
14:80,
15:81,
16:82,
17:83,
18:84,
19:85
1:'PSU1_TEMP1',
2:'PSU1_TEMP2',
3:'PSU1_TEMP3',
4:'PSU2_TEMP1',
5:'PSU2_TEMP2',
6:'PSU2_TEMP3',
7:'Temp_1V05_PCH_VR',
8:'Temp_Ambient_0',
9:'Temp_Ambient_1',
10:'Temp_Ambient_2',
11:'Temp_Ambient_3',
12:'Temp_Ambient_4',
13:'Temp_Ambient_5',
14:'Temp_CPU',
15:'Temp_DDRAB_VR',
16:'Temp_Inlet',
17:'Temp_SOC_DIMMA0',
18:'Temp_VCCGBE_VR',
19:'Temp_VCCIN_VR'
}
class Thermal(ThermalBase):
"""Platform-specific Thermal class"""
def __init__(self, thermal_index):
self.index = thermal_index
self.temp_attr = "temp{}_input".format(thermal_index_mapping[self.index])
self.high_th_attr = "temp{}_ncrit".format(thermal_index_mapping[self.index])
self.high_crit_th_attr = "temp{}_crit".format(thermal_index_mapping[self.index])
self.name_attr = "temp{}_label".format(thermal_index_mapping[self.index])
hwmon_dir=glob.glob(HWMON_IPMI_DIR)[0]
thermal_prefix = self.__get_hwmon_attr_prefix(hwmon_dir, thermal_index_mapping[self.index], 'temp')
self.temp_attr = "{}input".format(thermal_prefix)
self.high_th_attr = "{}ncrit".format(thermal_prefix)
self.high_crit_th_attr = "{}crit".format(thermal_prefix)
self.low_th_attr = "{}lncrit".format(thermal_prefix)
self.low_crit_th_attr = "{}lcrit".format(thermal_prefix)
self.name_attr = "{}label".format(thermal_prefix)
def __get_hwmon_attr_prefix(self, dir, label, type):
retval = 'ERR'
if not os.path.isdir(dir):
return retval
try:
for filename in os.listdir(dir):
if filename[-5:] == 'label' and type in filename:
file_path = os.path.join(dir, filename)
if os.path.isfile(file_path) and label == self.__get_attr_value(file_path):
return file_path[0:-5]
except Exception as error:
logging.error("Error when getting {} label path: {}".format(label, error))
return retval
def __get_attr_value(self, attr_path):
@ -61,7 +84,7 @@ class Thermal(ThermalBase):
with open(attr_path, 'r') as fd:
retval = fd.read()
except Exception as error:
logging.error("Unable to open " + attr_path + " file !")
logging.error("Unable to open {} file: {}".format(attr_path, error))
retval = retval.rstrip(' \t\n\r')
return retval
@ -73,8 +96,7 @@ class Thermal(ThermalBase):
Returns:
string: The name of the device
"""
attr_path = HWMON_DIR + self.name_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.name_attr)
if (attr_rv != 'ERR'):
return attr_rv
@ -88,8 +110,7 @@ class Thermal(ThermalBase):
Returns:
bool: True if device is present, False if not
"""
attr_path = HWMON_DIR + self.name_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.name_attr)
if (attr_rv != 'ERR'):
return True
@ -116,8 +137,37 @@ class Thermal(ThermalBase):
A float number of current temperature in Celsius up to nearest thousandth
of one degree Celsius, e.g. 30.125
"""
attr_path = HWMON_DIR + self.temp_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.temp_attr)
if (attr_rv != 'ERR'):
return float(attr_rv) / 1000
else:
return None
def get_low_threshold(self):
"""
Retrieves the low threshold temperature of thermal
Returns:
A float number, the low threshold temperature of thermal in Celsius
up to nearest thousandth of one degree Celsius, e.g. 30.125
"""
attr_rv = self.__get_attr_value(self.low_th_attr)
if (attr_rv != 'ERR'):
return float(attr_rv) / 1000
else:
return None
def get_low_critical_threshold(self):
"""
Retrieves the low critical threshold temperature of thermal
Returns:
A float number, the low critical threshold temperature of thermal in Celsius
up to nearest thousandth of one degree Celsius, e.g. 30.125
"""
attr_rv = self.__get_attr_value(self.low_crit_th_attr)
if (attr_rv != 'ERR'):
return float(attr_rv) / 1000
@ -132,8 +182,7 @@ class Thermal(ThermalBase):
A float number, the high threshold temperature of thermal in Celsius
up to nearest thousandth of one degree Celsius, e.g. 30.125
"""
attr_path = HWMON_DIR + self.high_th_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.high_th_attr)
if (attr_rv != 'ERR'):
return float(attr_rv) / 1000
@ -148,8 +197,7 @@ class Thermal(ThermalBase):
A float number, the high threshold temperature of thermal in Celsius
up to nearest thousandth of one degree Celsius, e.g. 30.125
"""
attr_path = HWMON_DIR + self.high_crit_th_attr
attr_rv = self.__get_attr_value(attr_path)
attr_rv = self.__get_attr_value(self.high_crit_th_attr)
if (attr_rv != 'ERR'):
return float(attr_rv) / 1000

View File

@ -48,12 +48,16 @@ WD_MAIN_IDENTITY = "iTCO_wdt"
WDT_SYSFS_PATH = "/sys/class/watchdog/"
DEFAULT_TIMEOUT=180
watchdog=0
class Watchdog(WatchdogBase):
def __init__(self):
self.watchdog, self.wdt_main_dev_name = self._get_wdt()
if self.wdt_main_dev_name is None:
raise Exception("Watchdog device is not instantiated")
self.status_path = "/sys/class/watchdog/%s/status" % self.wdt_main_dev_name
self.state_path = "/sys/class/watchdog/%s/state" % self.wdt_main_dev_name
self.timeout_path = "/sys/class/watchdog/%s/timeout" % self.wdt_main_dev_name
@ -74,14 +78,16 @@ class Watchdog(WatchdogBase):
"""
Retrieves watchdog device
"""
global watchdog
wdt_main_dev_list = [dev for dev in os.listdir(
"/dev/") if dev.startswith("watchdog") and self._is_wd_main(dev)]
if not wdt_main_dev_list:
return None
return (None, None)
wdt_main_dev_name = wdt_main_dev_list[0]
watchdog_device_path = "/dev/{}".format(wdt_main_dev_name)
self.watchdog = os.open(watchdog_device_path, os.O_RDWR)
return self.watchdog, wdt_main_dev_name
if not watchdog:
watchdog = os.open(watchdog_device_path, os.O_RDWR)
return watchdog, wdt_main_dev_name
def _read_file(self, file_path):
"""
@ -228,6 +234,7 @@ class Watchdog(WatchdogBase):
Close watchdog
"""
if self.watchdog is not None :
os.close(self.watchdog)

View File

@ -28,27 +28,26 @@ command:
"""
import os
import commands
import subprocess
import sys, getopt
import logging
import time
DEBUG = False
args = []
FORCE = 0
i2c_prefix = '/sys/bus/i2c/devices/'
if DEBUG == True:
print sys.argv[0]
print 'ARGV :', sys.argv[1:]
print(sys.argv[0])
print('ARGV :', sys.argv[1:])
def main():
global DEBUG
global args
global FORCE
if len(sys.argv)<2:
if len(sys.argv) < 2:
show_help()
options, args = getopt.getopt(sys.argv[1:], 'hdf', ['help',
@ -56,9 +55,9 @@ def main():
'force',
])
if DEBUG == True:
print options
print args
print len(sys.argv)
print(options)
print(args)
print(len(sys.argv))
for opt, arg in options:
if opt in ('-h', '--help'):
@ -81,35 +80,35 @@ def main():
return 0
def show_help():
print __doc__ % {'scriptName' : sys.argv[0].split("/")[-1]}
print(__doc__ % {'scriptName' : sys.argv[0].split("/")[-1]})
sys.exit(0)
def show_log(txt):
if DEBUG == True:
print "[IX9-32X]"+txt
print("[IX9-32X]" + txt)
return
def exec_cmd(cmd, show):
logging.info('Run :'+cmd)
status, output = commands.getstatusoutput(cmd)
logging.info('Run :' + cmd)
status, output = subprocess.getstatusoutput(cmd)
show_log (cmd +"with result:" + str(status))
show_log (" output:"+output)
show_log (" output:" + output)
if status:
logging.info('Failed :'+cmd)
logging.info('Failed :' + cmd)
if show:
print('Failed :'+cmd)
print('Failed :' + cmd)
return status, output
pca954x_bus_addr =[
'0-0072',
'0-0077',
'5-0073',
'6-0073',
'7-0073',
'8-0073'
]
instantiate =[
#turn on module power
'echo 21 > /sys/class/gpio/export',
'echo out > /sys/class/gpio/gpio21/direction',
'echo 1 >/sys/class/gpio/gpio21/value',
#Reset fron-ports LED CPLD
'echo 33 > /sys/class/gpio/export',
'echo out > /sys/class/gpio/gpio33/direction',
'echo 0 >/sys/class/gpio/gpio33/value',
'echo 1 >/sys/class/gpio/gpio33/value',
#Enable front-ports LED decoding
'echo 1 > /sys/class/cpld-led/CPLDLED-1/led_decode',
'echo 1 > /sys/class/cpld-led/CPLDLED-2/led_decode',
@ -159,7 +158,7 @@ drivers =[
'lpc_ich',
'i2c-i801',
'i2c-dev',
'i2c-mux-pca954x force_deselect_on_exit=1',
'i2c-mux-pca954x',
'gpio-pca953x',
'optoe',
'qci_cpld_qsfpdd',
@ -192,8 +191,17 @@ def system_install():
for i in range(0,len(drivers)):
status, output = exec_cmd("modprobe " + drivers[i], 1)
if status:
print output
if FORCE == 0:
print(output)
#retry quanta_hwmon_ipmi in case it init failed due to ipmi_msghandler init uncompleted
if drivers[i] == 'quanta_hwmon_ipmi':
for _ in range(0, 3):
time.sleep(3)
ret, out = exec_cmd("modprobe quanta_hwmon_ipmi ", 1)
if ret == 0:
break
if ret and FORCE == 0:
return ret
elif FORCE == 0:
return status
#reload ethernet drivers in correct order
@ -202,16 +210,32 @@ def system_install():
exec_cmd("modprobe igb ", 1)
exec_cmd("modprobe ixgbe ", 1)
# set pca954x idle_state as -2: MUX_IDLE_DISCONNECT
for i in range(0,len(pca954x_bus_addr)):
exec_cmd("echo -2 > /sys/bus/i2c/drivers/pca954x/{}/idle_state".format(pca954x_bus_addr[i]), 1)
#turn on module power
exec_cmd("echo 21 > /sys/class/gpio/export ", 1)
exec_cmd("echo high > /sys/class/gpio/gpio21/direction ", 1)
#Reset fron-ports LED CPLD
exec_cmd("echo 33 > /sys/class/gpio/export ", 1)
status, output = exec_cmd("cat /sys/class/gpio/gpio33/value", 1)
if output != '1':
exec_cmd("echo out > /sys/class/gpio/gpio33/direction ", 1)
exec_cmd("echo 0 >/sys/class/gpio/gpio33/value", 1)
exec_cmd("echo 1 >/sys/class/gpio/gpio33/value", 1)
#instantiate devices
for i in range(0,len(instantiate)):
for i in range(0, len(instantiate)):
status, output = exec_cmd(instantiate[i], 1)
if status:
print output
print(output)
if FORCE == 0:
return status
#QSFPDD for 1~32 port
for port_number in range(1,33):
for port_number in range(1, 33):
bus_number = port_number + 12
os.system("echo %d >/sys/bus/i2c/devices/%d-0050/port_name" % (port_number, bus_number))
@ -224,18 +248,18 @@ def system_ready():
def install():
if not device_found():
print "No device, installing...."
print("No device, installing....")
status = system_install()
if status:
if FORCE == 0:
return status
status, output = exec_cmd("pip3 install /usr/share/sonic/device/x86_64-quanta_ix9_bwde-r0/sonic_platform-1.0-py3-none-any.whl",1)
if status:
print output
print(output)
if FORCE == 0:
return status
else:
print " ix9 driver already installed...."
print(" ix9 driver already installed....")
return
def uninstall():
@ -244,13 +268,13 @@ def uninstall():
for i in range(len(un_drivers) - 1, -1, -1):
status, output = exec_cmd("rmmod " + un_drivers[i], 1)
if status:
print output
print(output)
if FORCE == 0:
return status
status, output = exec_cmd("pip3 uninstall sonic-platform -y ",1)
if status:
print output
print(output)
if FORCE == 0:
return status