Skip to content

Commit 85ef9df

Browse files
committed
[Accton][as5835-54x][as5835-54t] Add set/get sfp lpmode and tx_disable(QSFP) functionality
1 parent 92d5cde commit 85ef9df

File tree

2 files changed

+164
-16
lines changed
  • packages/platforms/accton/x86-64
    • as5835-54t/onlp/builds/x86_64_accton_as5835_54t/module/src
    • as5835-54x/onlp/builds/x86_64_accton_as5835_54x/module/src

2 files changed

+164
-16
lines changed

packages/platforms/accton/x86-64/as5835-54t/onlp/builds/x86_64_accton_as5835_54t/module/src/sfpi.c

Lines changed: 75 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,11 @@
3131

3232
int sfp_map[] = {28,29,26,30,31,27};
3333

34+
#define QSFP_PORT_MIN 48
35+
#define QSFP_PORT_MAX 53
3436
#define VALIDATE_QSFP(_port) \
3537
do { \
36-
if (_port < 48 || _port > 53 ) \
38+
if (_port < QSFP_PORT_MIN || _port > QSFP_PORT_MAX ) \
3739
return ONLP_STATUS_E_UNSUPPORTED; \
3840
} while(0)
3941

@@ -43,6 +45,11 @@ int sfp_map[] = {28,29,26,30,31,27};
4345
#define MODULE_PRESENT_FORMAT "/sys/bus/i2c/devices/3-0062/module_present_%d"
4446
#define MODULE_PRESENT_ALL_ATTR "/sys/bus/i2c/devices/3-0062/module_present_all"
4547
#define MODULE_RESET_FORMAT "/sys/bus/i2c/devices/3-0062/module_reset_%d"
48+
#define MODULE_LPMODE_FORMAT "/sys/bus/i2c/devices/3-0062/module_lpmode_%d"
49+
50+
/*QSFP tx_disable*/
51+
#define PORT_EEPROM_DEVADDR 0x50
52+
#define QSFP_EEPROM_OFFSET_TXDIS 0x56
4653

4754
/************************************************************
4855
*
@@ -222,9 +229,30 @@ int
222229
onlp_sfpi_control_set(int port, onlp_sfp_control_t control, int value)
223230
{
224231
int rv;
232+
int present = 0;
225233

226234
switch(control)
227235
{
236+
case ONLP_SFP_CONTROL_TX_DISABLE:
237+
case ONLP_SFP_CONTROL_TX_DISABLE_CHANNEL:
238+
{
239+
VALIDATE_QSFP(port);
240+
present = onlp_sfpi_is_present(port);
241+
if(present == 1)
242+
{
243+
/* txdis valid bit(bit0-bit3), xxxx 1111 */
244+
value = value & 0xf;
245+
onlp_sfpi_dev_writeb(port, PORT_EEPROM_DEVADDR, QSFP_EEPROM_OFFSET_TXDIS, value);
246+
247+
rv = ONLP_STATUS_OK;
248+
}
249+
else
250+
{
251+
rv = ONLP_STATUS_E_INTERNAL;
252+
}
253+
break;
254+
}
255+
228256
case ONLP_SFP_CONTROL_RESET:
229257
{
230258
VALIDATE_QSFP(port);
@@ -238,6 +266,19 @@ onlp_sfpi_control_set(int port, onlp_sfp_control_t control, int value)
238266
break;
239267
}
240268

269+
case ONLP_SFP_CONTROL_LP_MODE:
270+
{
271+
VALIDATE_QSFP(port);
272+
if (onlp_file_write_int(value, MODULE_LPMODE_FORMAT, (port+1)) < 0) {
273+
AIM_LOG_ERROR("Unable to write lpmode status to port(%d)\r\n", port);
274+
rv = ONLP_STATUS_E_INTERNAL;
275+
}
276+
else {
277+
rv = ONLP_STATUS_OK;
278+
}
279+
break;
280+
}
281+
241282
default:
242283
rv = ONLP_STATUS_E_UNSUPPORTED;
243284
break;
@@ -250,9 +291,29 @@ int
250291
onlp_sfpi_control_get(int port, onlp_sfp_control_t control, int* value)
251292
{
252293
int rv;
294+
int tx_dis_val = 0;
295+
int present = 0;
253296

254297
switch(control)
255298
{
299+
case ONLP_SFP_CONTROL_TX_DISABLE:
300+
case ONLP_SFP_CONTROL_TX_DISABLE_CHANNEL:
301+
{
302+
VALIDATE_QSFP(port);
303+
present = onlp_sfpi_is_present(port);
304+
if(present == 1){
305+
/* txdis valid bit(bit0-bit3), xxxx 1111 */
306+
tx_dis_val = onlp_sfpi_dev_readb(port, PORT_EEPROM_DEVADDR, QSFP_EEPROM_OFFSET_TXDIS);
307+
*value = tx_dis_val;
308+
309+
rv = ONLP_STATUS_OK;
310+
}
311+
else{
312+
rv = ONLP_STATUS_E_INTERNAL;
313+
}
314+
break;
315+
}
316+
256317
case ONLP_SFP_CONTROL_RESET:
257318
{
258319
VALIDATE_QSFP(port);
@@ -266,6 +327,19 @@ onlp_sfpi_control_get(int port, onlp_sfp_control_t control, int* value)
266327
break;
267328
}
268329

330+
case ONLP_SFP_CONTROL_LP_MODE:
331+
{
332+
VALIDATE_QSFP(port);
333+
if (onlp_file_read_int(value, MODULE_LPMODE_FORMAT, (port+1)) < 0) {
334+
AIM_LOG_ERROR("Unable to read lpmode status from port(%d)\r\n", port);
335+
rv = ONLP_STATUS_E_INTERNAL;
336+
}
337+
else {
338+
rv = ONLP_STATUS_OK;
339+
}
340+
break;
341+
}
342+
269343
default:
270344
rv = ONLP_STATUS_E_UNSUPPORTED;
271345
}

packages/platforms/accton/x86-64/as5835-54x/onlp/builds/x86_64_accton_as5835_54x/module/src/sfpi.c

Lines changed: 89 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -38,15 +38,19 @@ int sfp_map[] = {
3838
26,30,31,27
3939
};
4040

41+
#define SFP_PORT_MIN 0
42+
#define SFP_PORT_MAX 47
43+
#define QSFP_PORT_MIN 48
44+
#define QSFP_PORT_MAX 53
4145
#define VALIDATE_SFP(_port) \
4246
do { \
43-
if (_port < 0 || _port > 47) \
47+
if (_port < SFP_PORT_MIN || _port > SFP_PORT_MAX) \
4448
return ONLP_STATUS_E_UNSUPPORTED; \
4549
} while(0)
4650

4751
#define VALIDATE_QSFP(_port) \
4852
do { \
49-
if (_port < 48 || _port > 53 ) \
53+
if (_port < QSFP_PORT_MIN || _port > QSFP_PORT_MAX ) \
5054
return ONLP_STATUS_E_UNSUPPORTED; \
5155
} while(0)
5256

@@ -58,10 +62,15 @@ int sfp_map[] = {
5862
#define MODULE_TXFAULT_FORMAT "/sys/bus/i2c/devices/%d-00%d/module_tx_fault_%d"
5963
#define MODULE_TXDISABLE_FORMAT "/sys/bus/i2c/devices/%d-00%d/module_tx_disable_%d"
6064
#define MODULE_RESET_FORMAT "/sys/bus/i2c/devices/%d-00%d/module_reset_%d"
65+
#define MODULE_LPMODE_FORMAT "/sys/bus/i2c/devices/%d-00%d/module_lpmode_%d"
6166
#define MODULE_PRESENT_ALL_ATTR "/sys/bus/i2c/devices/%d-00%d/module_present_all"
6267
#define MODULE_RXLOS_ALL_ATTR_CPLD2 "/sys/bus/i2c/devices/3-0061/module_rx_los_all"
6368
#define MODULE_RXLOS_ALL_ATTR_CPLD3 "/sys/bus/i2c/devices/3-0062/module_rx_los_all"
6469

70+
/*QSFP tx_disable*/
71+
#define PORT_EEPROM_DEVADDR 0x50
72+
#define QSFP_EEPROM_OFFSET_TXDIS 0x56
73+
6574
/************************************************************
6675
*
6776
* SFPI Entry Points
@@ -336,21 +345,41 @@ int
336345
onlp_sfpi_control_set(int port, onlp_sfp_control_t control, int value)
337346
{
338347
int rv;
339-
340-
341348
int addr = (port < 38) ? 61 : 62;
349+
int present = 0;
342350

343351
switch(control)
344352
{
345353
case ONLP_SFP_CONTROL_TX_DISABLE:
354+
case ONLP_SFP_CONTROL_TX_DISABLE_CHANNEL:
346355
{
347-
VALIDATE_SFP(port);
348-
if (onlp_file_write_int(value, MODULE_TXDISABLE_FORMAT, 3, addr, (port+1)) < 0) {
349-
AIM_LOG_ERROR("Unable to set tx_disable status to port(%d)\r\n", port);
350-
rv = ONLP_STATUS_E_INTERNAL;
356+
if (port >= SFP_PORT_MIN && port <= SFP_PORT_MAX) { //SFP
357+
if (onlp_file_write_int(value, MODULE_TXDISABLE_FORMAT, 3, addr, (port+1)) < 0) {
358+
AIM_LOG_ERROR("Unable to set tx_disable status to port(%d)\r\n", port);
359+
rv = ONLP_STATUS_E_INTERNAL;
360+
}
361+
else {
362+
rv = ONLP_STATUS_OK;
363+
}
364+
}
365+
else if(port >= QSFP_PORT_MIN && port <= QSFP_PORT_MAX){ //QSFP
366+
present = onlp_sfpi_is_present(port);
367+
368+
if(present == 1)
369+
{
370+
/* txdis valid bit(bit0-bit3), xxxx 1111 */
371+
value = value & 0xf;
372+
onlp_sfpi_dev_writeb(port, PORT_EEPROM_DEVADDR, QSFP_EEPROM_OFFSET_TXDIS, value);
373+
374+
rv = ONLP_STATUS_OK;
375+
}
376+
else
377+
{
378+
rv = ONLP_STATUS_E_INTERNAL;
379+
}
351380
}
352381
else {
353-
rv = ONLP_STATUS_OK;
382+
rv = ONLP_STATUS_E_UNSUPPORTED;
354383
}
355384
break;
356385
}
@@ -368,6 +397,19 @@ onlp_sfpi_control_set(int port, onlp_sfp_control_t control, int value)
368397
break;
369398
}
370399

400+
case ONLP_SFP_CONTROL_LP_MODE:
401+
{
402+
VALIDATE_QSFP(port);
403+
if (onlp_file_write_int(value, MODULE_LPMODE_FORMAT, 3, addr, (port+1)) < 0) {
404+
AIM_LOG_ERROR("Unable to write lpmode status to port(%d)\r\n", port);
405+
rv = ONLP_STATUS_E_INTERNAL;
406+
}
407+
else {
408+
rv = ONLP_STATUS_OK;
409+
}
410+
break;
411+
}
412+
371413
default:
372414
rv = ONLP_STATUS_E_UNSUPPORTED;
373415
break;
@@ -380,8 +422,9 @@ int
380422
onlp_sfpi_control_get(int port, onlp_sfp_control_t control, int* value)
381423
{
382424
int rv;
383-
384425
int addr = (port < 38) ? 61 : 62;
426+
int tx_dis_val = 0;
427+
int present = 0;
385428

386429
switch(control)
387430
{
@@ -412,14 +455,32 @@ onlp_sfpi_control_get(int port, onlp_sfp_control_t control, int* value)
412455
}
413456

414457
case ONLP_SFP_CONTROL_TX_DISABLE:
458+
case ONLP_SFP_CONTROL_TX_DISABLE_CHANNEL:
415459
{
416-
VALIDATE_SFP(port);
417-
if (onlp_file_read_int(value, MODULE_TXDISABLE_FORMAT, 3, addr, (port+1)) < 0) {
418-
AIM_LOG_ERROR("Unable to read tx_disabled status from port(%d)\r\n", port);
419-
rv = ONLP_STATUS_E_INTERNAL;
460+
if (port >= SFP_PORT_MIN && port <= SFP_PORT_MAX) { //SFP
461+
if (onlp_file_read_int(value, MODULE_TXDISABLE_FORMAT, 3, addr, (port+1)) < 0) {
462+
AIM_LOG_ERROR("Unable to read tx_disabled status from port(%d)\r\n", port);
463+
rv = ONLP_STATUS_E_INTERNAL;
464+
}
465+
else {
466+
rv = ONLP_STATUS_OK;
467+
}
468+
}
469+
else if(port >= QSFP_PORT_MIN && port <= QSFP_PORT_MAX){ //QSFP
470+
present = onlp_sfpi_is_present(port);
471+
if(present == 1){
472+
/* txdis valid bit(bit0-bit3), xxxx 1111 */
473+
tx_dis_val = onlp_sfpi_dev_readb(port, PORT_EEPROM_DEVADDR, QSFP_EEPROM_OFFSET_TXDIS);
474+
*value = tx_dis_val;
475+
476+
rv = ONLP_STATUS_OK;
477+
}
478+
else{
479+
rv = ONLP_STATUS_E_INTERNAL;
480+
}
420481
}
421482
else {
422-
rv = ONLP_STATUS_OK;
483+
rv = ONLP_STATUS_E_UNSUPPORTED;
423484
}
424485
break;
425486
}
@@ -437,6 +498,19 @@ onlp_sfpi_control_get(int port, onlp_sfp_control_t control, int* value)
437498
break;
438499
}
439500

501+
case ONLP_SFP_CONTROL_LP_MODE:
502+
{
503+
VALIDATE_QSFP(port);
504+
if (onlp_file_read_int(value, MODULE_LPMODE_FORMAT, 3, addr, (port+1)) < 0) {
505+
AIM_LOG_ERROR("Unable to read lpmode status from port(%d)\r\n", port);
506+
rv = ONLP_STATUS_E_INTERNAL;
507+
}
508+
else {
509+
rv = ONLP_STATUS_OK;
510+
}
511+
break;
512+
}
513+
440514
default:
441515
rv = ONLP_STATUS_E_UNSUPPORTED;
442516
}

0 commit comments

Comments
 (0)