Microsemi / switchtec-kernel

A kernel module for the Microsemi PCIe switch
GNU General Public License v2.0
45 stars 31 forks source link

Fix crosslink req id issue #101

Closed kelvin-cao closed 3 years ago

kelvin-cao commented 3 years ago

It was observed in a crosslink NT setup with two hosts having different numbers of requester IDs that the traffic can go only in one direction.

In the setup, the switch of host A connects to CPU1, while the switch of host B connects to CPU0. After loading the driver, the two hosts have the following requester IDs. And the traffic only goes from B to A.

Host A Host B
0:0.0 0:0.0
80:3.0

When a TLP gose from host A to host B, it first goes from host A CPU to the local crosslink partition (there are a pair of virtual partitions in between the two switches in the crosslink NTB setup), with the original requester ID be replaced with a proxy ID, then be routed to the peer crosslink partition. If the new requester ID (prxoy ID of the local crosslink partition) hit one entry in the requester ID table of the peer crosslink partition, it will finally be routed to Host B. Otherwise, it will be dropped.

The reason for the above phenomenon is that the driver wrongly registers the requester IDs to the local crosslink partition, instead of to its peer. So when the traffic from host A with requester ID reaches the crosslink partition of host B and hits no entry, it goes nowhere.

This PR fix this by registering the proper requester IDs to the peer crosslink partition. Another internal LUT window is allocated for routing the configuration traffic to the GAS region of the peer crosslink partition.