aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJon Mason <jon.mason@intel.com>2013-02-01 17:45:16 -0500
committerJon Mason <jon.mason@intel.com>2013-05-15 13:57:59 -0400
commitc9d534c8cbaedbb522a1d2cb037c6c394f610317 (patch)
treeeaea8a1c31a0a0a0d850b07590704a3b57fdbca5
parent90f9e934647e652a69396e18c779215a493271cf (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.c8
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) {