Skip to content

Instantly share code, notes, and snippets.

@CommitThis
Last active June 4, 2021 13:45
Show Gist options
  • Save CommitThis/586a564ea56f45c9918d630198008fa0 to your computer and use it in GitHub Desktop.
Save CommitThis/586a564ea56f45c9918d630198008fa0 to your computer and use it in GitHub Desktop.
Device Mapping
#include <cstdio> // for printf debugging
struct port_channel
{
unsigned int muxaddr;
unsigned int muxchannel;
unsigned int port_number;
};
typedef struct port_channel port_channel_t;
#define MUX_ADDR_1 0x74
#define MUX_ADDR_2 0x75
#define MUX_ADDR_3 0x76
#define MUX_ADDR_4 0x77
#define MUX_CHANNEL_0 0 // 0x01
#define MUX_CHANNEL_1 1 // 0x02
#define MUX_CHANNEL_2 2 // 0x04
#define MUX_CHANNEL_3 3 // 0x08
#define MUX_CHANNEL_4 4 // 0x10
#define MUX_CHANNEL_5 5 // 0x20
#define MUX_CHANNEL_6 6 // 0x40
#define MUX_CHANNEL_7 7 // 0x80
#define MAX_FRONT_PORT 64
/* This shouldn't happen unless there is an entry missing */
#define PORT_UNRECOGNISED -2;
#define PORT_OUT_OF_BOUNDS -1;
#define PORT_OK 0;
port_channel_t port_channels[MAX_FRONT_PORT] =
{
//1-8
{ MUX_ADDR_1, MUX_CHANNEL_0, 1 },
{ MUX_ADDR_1, MUX_CHANNEL_1, 2 },
{ MUX_ADDR_1, MUX_CHANNEL_2, 3 },
{ MUX_ADDR_1, MUX_CHANNEL_3, 4 },
{ MUX_ADDR_1, MUX_CHANNEL_4, 5 },
{ MUX_ADDR_1, MUX_CHANNEL_5, 6 },
{ MUX_ADDR_1, MUX_CHANNEL_6, 7 },
{ MUX_ADDR_1, MUX_CHANNEL_7, 8 },
//9-16
{ MUX_ADDR_2, MUX_CHANNEL_0, 14 },
{ MUX_ADDR_2, MUX_CHANNEL_1, 13 },
{ MUX_ADDR_2, MUX_CHANNEL_2, 16 },
{ MUX_ADDR_2, MUX_CHANNEL_3, 15 },
{ MUX_ADDR_2, MUX_CHANNEL_4, 10 },
{ MUX_ADDR_2, MUX_CHANNEL_5, 9 },
{ MUX_ADDR_2, MUX_CHANNEL_6, 12 },
{ MUX_ADDR_2, MUX_CHANNEL_7, 11 },
//17-24
{ MUX_ADDR_3, MUX_CHANNEL_0, 17 },
{ MUX_ADDR_3, MUX_CHANNEL_1, 18 },
{ MUX_ADDR_3, MUX_CHANNEL_2, 26 },
{ MUX_ADDR_3, MUX_CHANNEL_3, 25 },
{ MUX_ADDR_3, MUX_CHANNEL_4, 22 },
{ MUX_ADDR_3, MUX_CHANNEL_5, 21 },
{ MUX_ADDR_3, MUX_CHANNEL_6, 24 },
{ MUX_ADDR_3, MUX_CHANNEL_7, 23 },
//25-32
{ MUX_ADDR_4, MUX_CHANNEL_0, 29 },
{ MUX_ADDR_4, MUX_CHANNEL_1, 30 },
{ MUX_ADDR_4, MUX_CHANNEL_2, 27 },
{ MUX_ADDR_4, MUX_CHANNEL_3, 28 },
{ MUX_ADDR_4, MUX_CHANNEL_4, 32 },
{ MUX_ADDR_4, MUX_CHANNEL_5, 31 },
{ MUX_ADDR_4, MUX_CHANNEL_6, 19 },
{ MUX_ADDR_4, MUX_CHANNEL_7, 20 },
//33-40
{ MUX_ADDR_1, MUX_CHANNEL_0, 33 },
{ MUX_ADDR_1, MUX_CHANNEL_1, 34 },
{ MUX_ADDR_1, MUX_CHANNEL_2, 35 },
{ MUX_ADDR_1, MUX_CHANNEL_3, 36 },
{ MUX_ADDR_1, MUX_CHANNEL_4, 37 },
{ MUX_ADDR_1, MUX_CHANNEL_5, 38 },
{ MUX_ADDR_1, MUX_CHANNEL_6, 39 },
{ MUX_ADDR_1, MUX_CHANNEL_7, 40 },
//41-48
{ MUX_ADDR_2, MUX_CHANNEL_0, 47 },
{ MUX_ADDR_2, MUX_CHANNEL_1, 48 },
{ MUX_ADDR_2, MUX_CHANNEL_2, 41 },
{ MUX_ADDR_2, MUX_CHANNEL_3, 42 },
{ MUX_ADDR_2, MUX_CHANNEL_4, 43 },
{ MUX_ADDR_2, MUX_CHANNEL_5, 44 },
{ MUX_ADDR_2, MUX_CHANNEL_6, 45 },
{ MUX_ADDR_2, MUX_CHANNEL_7, 46 },
//49-56
{ MUX_ADDR_3, MUX_CHANNEL_0, 55 },
{ MUX_ADDR_3, MUX_CHANNEL_1, 56 },
{ MUX_ADDR_3, MUX_CHANNEL_2, 53 },
{ MUX_ADDR_3, MUX_CHANNEL_3, 54 },
{ MUX_ADDR_3, MUX_CHANNEL_4, 58 },
{ MUX_ADDR_3, MUX_CHANNEL_5, 57 },
{ MUX_ADDR_3, MUX_CHANNEL_6, 49 },
{ MUX_ADDR_3, MUX_CHANNEL_7, 50 },
//57-64
{ MUX_ADDR_4, MUX_CHANNEL_0, 59 },
{ MUX_ADDR_4, MUX_CHANNEL_1, 60 },
{ MUX_ADDR_4, MUX_CHANNEL_2, 61 },
{ MUX_ADDR_4, MUX_CHANNEL_3, 62 },
{ MUX_ADDR_4, MUX_CHANNEL_4, 63 },
{ MUX_ADDR_4, MUX_CHANNEL_5, 64 },
{ MUX_ADDR_4, MUX_CHANNEL_6, 52 },
{ MUX_ADDR_4, MUX_CHANNEL_7, 51 }
};
int get_port_channel(unsigned int port, port_channel_t * device)
{
if (port > MAX_FRONT_PORT)
{
return PORT_OUT_OF_BOUNDS;
}
for (int idx = 0ull; idx <= MAX_FRONT_PORT; ++idx)
{
if (port_channels[idx].port_number == port)
{
*device = port_channels[idx];
return PORT_OK;
}
}
return PORT_UNRECOGNISED;
}
int main() {
/* This seems to be a common pattern in C (declaration without
initialisation) and as a C++ dev this irks me. Could add
`= {0, 0, 0};` at the end. */
port_channel_t device;
int res = 0;
for (int port = 0ull; port <= MAX_FRONT_PORT; ++port) {
if ((res = get_port_channel(port, &device)) != 0)
{
printf("Could not find port %u [err: %d]\n", port, res);
/* You may just want to return -1; ONLP may not know how to deal
with different return values -- this I don't really know
although given this would be called within onlp_i2c_mux_mapping
it's entiry up to you. */
return -1; // or res;
}
printf("Port: %u, mux address: 0x%02x, channel: %u\n", device.port_number,
device.muxaddr, device.muxchannel);
}
}
@CommitThis
Copy link
Author

The idea is to replace the switch statement with a separate function. You would call this within onlp_i2c_mux_mapping.

@CommitThis
Copy link
Author

You wouldn't use the loop in the function though, in case that's not clear! -- Just for printing results so you can check.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment