[ofa-general] [PATCH 4/11] ib_mthca: add checksum offload support
Eli Cohen
eli at mellanox.co.il
Mon Sep 24 05:46:43 PDT 2007
Add checksum offload support in mthca
Signed-off-by: Eli Cohen <eli at mellnaox.co.il>
---
resending - adding the openfabrics list
Index: ofa_1_3_dev_kernel/drivers/infiniband/hw/mthca/mthca_cmd.c
===================================================================
--- ofa_1_3_dev_kernel.orig/drivers/infiniband/hw/mthca/mthca_cmd.c 2007-09-24 11:19:08.000000000 +0200
+++ ofa_1_3_dev_kernel/drivers/infiniband/hw/mthca/mthca_cmd.c 2007-09-24 12:34:59.000000000 +0200
@@ -1377,6 +1377,9 @@ int mthca_INIT_HCA(struct mthca_dev *dev
MTHCA_PUT(inbox, param->uarc_base, INIT_HCA_UAR_CTX_BASE_OFFSET);
}
+ if (dev->device_cap_flags & IB_DEVICE_IP_CSUM)
+ *(inbox + INIT_HCA_FLAGS2_OFFSET / 4) |= cpu_to_be32(7 << 3);
+
err = mthca_cmd(dev, mailbox->dma, 0, 0, CMD_INIT_HCA, HZ, status);
mthca_free_mailbox(dev, mailbox);
Index: ofa_1_3_dev_kernel/drivers/infiniband/hw/mthca/mthca_cmd.h
===================================================================
--- ofa_1_3_dev_kernel.orig/drivers/infiniband/hw/mthca/mthca_cmd.h 2007-09-24 11:19:08.000000000 +0200
+++ ofa_1_3_dev_kernel/drivers/infiniband/hw/mthca/mthca_cmd.h 2007-09-24 12:34:59.000000000 +0200
@@ -103,6 +103,7 @@ enum {
DEV_LIM_FLAG_RAW_IPV6 = 1 << 4,
DEV_LIM_FLAG_RAW_ETHER = 1 << 5,
DEV_LIM_FLAG_SRQ = 1 << 6,
+ DEV_LIM_FLAG_IPOIB_CSUM = 1 << 7,
DEV_LIM_FLAG_BAD_PKEY_CNTR = 1 << 8,
DEV_LIM_FLAG_BAD_QKEY_CNTR = 1 << 9,
DEV_LIM_FLAG_MW = 1 << 16,
Index: ofa_1_3_dev_kernel/drivers/infiniband/hw/mthca/mthca_cq.c
===================================================================
--- ofa_1_3_dev_kernel.orig/drivers/infiniband/hw/mthca/mthca_cq.c 2007-09-24 11:19:08.000000000 +0200
+++ ofa_1_3_dev_kernel/drivers/infiniband/hw/mthca/mthca_cq.c 2007-09-24 12:36:06.000000000 +0200
@@ -119,7 +119,8 @@ struct mthca_cqe {
__be32 my_qpn;
__be32 my_ee;
__be32 rqpn;
- __be16 sl_g_mlpath;
+ u8 sl_ipok;
+ u8 g_mlpath;
__be16 rlid;
__be32 imm_etype_pkey_eec;
__be32 byte_cnt;
@@ -498,6 +499,7 @@ static inline int mthca_poll_one(struct
int is_send;
int free_cqe = 1;
int err = 0;
+ u16 checksum;
cqe = next_cqe_sw(cq);
if (!cqe)
@@ -639,12 +641,14 @@ static inline int mthca_poll_one(struct
break;
}
entry->slid = be16_to_cpu(cqe->rlid);
- entry->sl = be16_to_cpu(cqe->sl_g_mlpath) >> 12;
+ entry->sl = cqe->sl_ipok >> 4;
entry->src_qp = be32_to_cpu(cqe->rqpn) & 0xffffff;
- entry->dlid_path_bits = be16_to_cpu(cqe->sl_g_mlpath) & 0x7f;
+ entry->dlid_path_bits = cqe->g_mlpath & 0x7f;
entry->pkey_index = be32_to_cpu(cqe->imm_etype_pkey_eec) >> 16;
- entry->wc_flags |= be16_to_cpu(cqe->sl_g_mlpath) & 0x80 ?
- IB_WC_GRH : 0;
+ entry->wc_flags |= cqe->g_mlpath & 0x80 ? IB_WC_GRH : 0;
+ checksum = (be32_to_cpu(cqe->rqpn) >> 24) |
+ ((be32_to_cpu(cqe->my_ee) >> 16) & 0xff00);
+ entry->csum_ok = (cqe->sl_ipok & 1 && checksum == 0xffff);
}
entry->status = IB_WC_SUCCESS;
Index: ofa_1_3_dev_kernel/drivers/infiniband/hw/mthca/mthca_main.c
===================================================================
--- ofa_1_3_dev_kernel.orig/drivers/infiniband/hw/mthca/mthca_main.c 2007-09-24 11:19:08.000000000 +0200
+++ ofa_1_3_dev_kernel/drivers/infiniband/hw/mthca/mthca_main.c 2007-09-24 12:34:59.000000000 +0200
@@ -289,6 +289,10 @@ static int mthca_dev_lim(struct mthca_de
if (dev_lim->flags & DEV_LIM_FLAG_SRQ)
mdev->mthca_flags |= MTHCA_FLAG_SRQ;
+ if (mthca_is_memfree(mdev))
+ if (dev_lim->flags & DEV_LIM_FLAG_IPOIB_CSUM)
+ mdev->device_cap_flags |= IB_DEVICE_IP_CSUM;
+
return 0;
}
@@ -1125,6 +1129,8 @@ static int __mthca_init_one(struct pci_d
if (err)
goto err_cmd;
+ mdev->ib_dev.flags = mdev->device_cap_flags;
+
if (mdev->fw_ver < mthca_hca_table[hca_type].latest_fw) {
mthca_warn(mdev, "HCA FW version %d.%d.%03d is old (%d.%d.%03d is current).\n",
(int) (mdev->fw_ver >> 32), (int) (mdev->fw_ver >> 16) & 0xffff,
Index: ofa_1_3_dev_kernel/drivers/infiniband/hw/mthca/mthca_qp.c
===================================================================
--- ofa_1_3_dev_kernel.orig/drivers/infiniband/hw/mthca/mthca_qp.c 2007-09-24 11:19:08.000000000 +0200
+++ ofa_1_3_dev_kernel/drivers/infiniband/hw/mthca/mthca_qp.c 2007-09-24 12:34:59.000000000 +0200
@@ -2024,6 +2024,10 @@ int mthca_arbel_post_send(struct ib_qp *
cpu_to_be32(MTHCA_NEXT_CQ_UPDATE) : 0) |
((wr->send_flags & IB_SEND_SOLICITED) ?
cpu_to_be32(MTHCA_NEXT_SOLICIT) : 0) |
+ ((wr->send_flags & IB_SEND_IP_CSUM) ?
+ cpu_to_be32(MTHCA_NEXT_IP_CSUM) : 0) |
+ ((wr->send_flags & IB_SEND_UDP_TCP_CSUM) ?
+ cpu_to_be32(MTHCA_NEXT_TCP_UDP_CSUM) : 0) |
cpu_to_be32(1);
if (wr->opcode == IB_WR_SEND_WITH_IMM ||
wr->opcode == IB_WR_RDMA_WRITE_WITH_IMM)
Index: ofa_1_3_dev_kernel/drivers/infiniband/hw/mthca/mthca_wqe.h
===================================================================
--- ofa_1_3_dev_kernel.orig/drivers/infiniband/hw/mthca/mthca_wqe.h 2007-09-24 11:19:08.000000000 +0200
+++ ofa_1_3_dev_kernel/drivers/infiniband/hw/mthca/mthca_wqe.h 2007-09-24 12:34:59.000000000 +0200
@@ -38,14 +38,15 @@
#include <linux/types.h>
enum {
- MTHCA_NEXT_DBD = 1 << 7,
- MTHCA_NEXT_FENCE = 1 << 6,
- MTHCA_NEXT_CQ_UPDATE = 1 << 3,
- MTHCA_NEXT_EVENT_GEN = 1 << 2,
- MTHCA_NEXT_SOLICIT = 1 << 1,
-
- MTHCA_MLX_VL15 = 1 << 17,
- MTHCA_MLX_SLR = 1 << 16
+ MTHCA_NEXT_DBD = 1 << 7,
+ MTHCA_NEXT_FENCE = 1 << 6,
+ MTHCA_NEXT_CQ_UPDATE = 1 << 3,
+ MTHCA_NEXT_EVENT_GEN = 1 << 2,
+ MTHCA_NEXT_SOLICIT = 1 << 1,
+ MTHCA_NEXT_IP_CSUM = 1 << 4,
+ MTHCA_NEXT_TCP_UDP_CSUM = 1 << 5,
+ MTHCA_MLX_VL15 = 1 << 17,
+ MTHCA_MLX_SLR = 1 << 16
};
enum {
More information about the general
mailing list