thunderbolt: Get rid of E2E workaround
The end-to-end (E2E) workaround is needed for Falcon Ridge (TBT 2) controller when E2E is enabled for both ends of the host-to-host connection. However, we never supported full E2E in the first place so this code is not necessary at the moment. Further this allows us to use all available rings for data except ring 0 which is reserved for the control path. The complete E2E flow control is explained in the USB4 spec so we may add it back later if needed but at least the networking driver seems to work fine without, and the higher level stack, like TCP will retransmit lost packets anyway. Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
This commit is contained in:
parent
126764236e
commit
53f13319d1
@ -866,8 +866,8 @@ static int tbnet_open(struct net_device *dev)
|
||||
eof_mask = BIT(TBIP_PDF_FRAME_END);
|
||||
|
||||
ring = tb_ring_alloc_rx(xd->tb->nhi, -1, TBNET_RING_SIZE,
|
||||
RING_FLAG_FRAME | RING_FLAG_E2E, sof_mask,
|
||||
eof_mask, tbnet_start_poll, net);
|
||||
RING_FLAG_FRAME, sof_mask, eof_mask,
|
||||
tbnet_start_poll, net);
|
||||
if (!ring) {
|
||||
netdev_err(dev, "failed to allocate Rx ring\n");
|
||||
tb_ring_free(net->tx_ring.ring);
|
||||
|
@ -24,12 +24,7 @@
|
||||
|
||||
#define RING_TYPE(ring) ((ring)->is_tx ? "TX ring" : "RX ring")
|
||||
|
||||
/*
|
||||
* Used to enable end-to-end workaround for missing RX packets. Do not
|
||||
* use this ring for anything else.
|
||||
*/
|
||||
#define RING_E2E_UNUSED_HOPID 2
|
||||
#define RING_FIRST_USABLE_HOPID TB_PATH_MIN_HOPID
|
||||
#define RING_FIRST_USABLE_HOPID 1
|
||||
|
||||
/*
|
||||
* Minimal number of vectors when we use MSI-X. Two for control channel
|
||||
@ -440,7 +435,7 @@ static int nhi_alloc_hop(struct tb_nhi *nhi, struct tb_ring *ring)
|
||||
|
||||
/*
|
||||
* Automatically allocate HopID from the non-reserved
|
||||
* range 8 .. hop_count - 1.
|
||||
* range 1 .. hop_count - 1.
|
||||
*/
|
||||
for (i = RING_FIRST_USABLE_HOPID; i < nhi->hop_count; i++) {
|
||||
if (ring->is_tx) {
|
||||
@ -496,10 +491,6 @@ static struct tb_ring *tb_ring_alloc(struct tb_nhi *nhi, u32 hop, int size,
|
||||
dev_dbg(&nhi->pdev->dev, "allocating %s ring %d of size %d\n",
|
||||
transmit ? "TX" : "RX", hop, size);
|
||||
|
||||
/* Tx Ring 2 is reserved for E2E workaround */
|
||||
if (transmit && hop == RING_E2E_UNUSED_HOPID)
|
||||
return NULL;
|
||||
|
||||
ring = kzalloc(sizeof(*ring), GFP_KERNEL);
|
||||
if (!ring)
|
||||
return NULL;
|
||||
@ -614,19 +605,6 @@ void tb_ring_start(struct tb_ring *ring)
|
||||
flags = RING_FLAG_ENABLE | RING_FLAG_RAW;
|
||||
}
|
||||
|
||||
if (ring->flags & RING_FLAG_E2E && !ring->is_tx) {
|
||||
u32 hop;
|
||||
|
||||
/*
|
||||
* In order not to lose Rx packets we enable end-to-end
|
||||
* workaround which transfers Rx credits to an unused Tx
|
||||
* HopID.
|
||||
*/
|
||||
hop = RING_E2E_UNUSED_HOPID << REG_RX_OPTIONS_E2E_HOP_SHIFT;
|
||||
hop &= REG_RX_OPTIONS_E2E_HOP_MASK;
|
||||
flags |= hop | RING_FLAG_E2E_FLOW_CONTROL;
|
||||
}
|
||||
|
||||
ring_iowrite64desc(ring, ring->descriptors_dma, 0);
|
||||
if (ring->is_tx) {
|
||||
ring_iowrite32desc(ring, ring->size, 12);
|
||||
|
@ -504,8 +504,6 @@ struct tb_ring {
|
||||
#define RING_FLAG_NO_SUSPEND BIT(0)
|
||||
/* Configure the ring to be in frame mode */
|
||||
#define RING_FLAG_FRAME BIT(1)
|
||||
/* Enable end-to-end flow control */
|
||||
#define RING_FLAG_E2E BIT(2)
|
||||
|
||||
struct ring_frame;
|
||||
typedef void (*ring_cb)(struct tb_ring *, struct ring_frame *, bool canceled);
|
||||
|
Loading…
Reference in New Issue
Block a user