diff options
author | Jon Mason <jon.mason@intel.com> | 2013-02-01 17:45:16 -0500 |
---|---|---|
committer | Jon Mason <jon.mason@intel.com> | 2013-05-15 13:57:59 -0400 |
commit | c9d534c8cbaedbb522a1d2cb037c6c394f610317 (patch) | |
tree | eaea8a1c31a0a0a0d850b07590704a3b57fdbca5 | |
parent | 90f9e934647e652a69396e18c779215a493271cf (diff) |
NTB: Correctly handle receive buffers of the minimal size
The ring logic of the NTB receive buffer/transmit memory window requires
there to be at least 2 payload sized allotments. For the minimal size
case, split the buffer into two and set the transport_mtu to the
appropriate size.
Signed-off-by: Jon Mason <jon.mason@intel.com>
-rw-r--r-- | drivers/ntb/ntb_transport.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/drivers/ntb/ntb_transport.c b/drivers/ntb/ntb_transport.c index 73a000ed7a9f..cd9745b062e4 100644 --- a/drivers/ntb/ntb_transport.c +++ b/drivers/ntb/ntb_transport.c | |||
@@ -490,11 +490,12 @@ static void ntb_transport_setup_qp_mw(struct ntb_transport *nt, | |||
490 | rx_size -= sizeof(struct ntb_rx_info); | 490 | rx_size -= sizeof(struct ntb_rx_info); |
491 | 491 | ||
492 | qp->rx_buff = qp->remote_rx_info + 1; | 492 | qp->rx_buff = qp->remote_rx_info + 1; |
493 | qp->rx_max_frame = min(transport_mtu, rx_size); | 493 | /* Due to housekeeping, there must be atleast 2 buffs */ |
494 | qp->rx_max_frame = min(transport_mtu, rx_size / 2); | ||
494 | qp->rx_max_entry = rx_size / qp->rx_max_frame; | 495 | qp->rx_max_entry = rx_size / qp->rx_max_frame; |
495 | qp->rx_index = 0; | 496 | qp->rx_index = 0; |
496 | 497 | ||
497 | qp->remote_rx_info->entry = qp->rx_max_entry; | 498 | qp->remote_rx_info->entry = qp->rx_max_entry - 1; |
498 | 499 | ||
499 | /* setup the hdr offsets with 0's */ | 500 | /* setup the hdr offsets with 0's */ |
500 | for (i = 0; i < qp->rx_max_entry; i++) { | 501 | for (i = 0; i < qp->rx_max_entry; i++) { |
@@ -818,7 +819,8 @@ static void ntb_transport_init_queue(struct ntb_transport *nt, | |||
818 | tx_size -= sizeof(struct ntb_rx_info); | 819 | tx_size -= sizeof(struct ntb_rx_info); |
819 | 820 | ||
820 | qp->tx_mw = qp->rx_info + 1; | 821 | qp->tx_mw = qp->rx_info + 1; |
821 | qp->tx_max_frame = min(transport_mtu, tx_size); | 822 | /* Due to housekeeping, there must be atleast 2 buffs */ |
823 | qp->tx_max_frame = min(transport_mtu, tx_size / 2); | ||
822 | qp->tx_max_entry = tx_size / qp->tx_max_frame; | 824 | qp->tx_max_entry = tx_size / qp->tx_max_frame; |
823 | 825 | ||
824 | if (nt->debugfs_dir) { | 826 | if (nt->debugfs_dir) { |