else
                        return fits ? IB_OPCODE_RC_SEND_ONLY_WITH_INVALIDATE :
                                IB_OPCODE_RC_SEND_FIRST;
+
+       case IB_WR_ATOMIC_WRITE:
+               return IB_OPCODE_RC_ATOMIC_WRITE;
+
        case IB_WR_REG_MR:
        case IB_WR_LOCAL_INV:
                return opcode;
                }
        }
 
+       if (pkt->mask & RXE_ATOMIC_WRITE_MASK) {
+               memcpy(payload_addr(pkt), wqe->dma.atomic_wr, payload);
+               wqe->dma.resid -= payload;
+       }
+
        return 0;
 }
 
        }
 
        mask = rxe_opcode[opcode].mask;
-       if (unlikely(mask & RXE_READ_OR_ATOMIC_MASK)) {
+       if (unlikely(mask & (RXE_READ_OR_ATOMIC_MASK |
+                       RXE_ATOMIC_WRITE_MASK))) {
                if (check_init_depth(qp, wqe))
                        goto exit;
        }
 
        mtu = get_mtu(qp);
-       payload = (mask & RXE_WRITE_OR_SEND_MASK) ? wqe->dma.resid : 0;
+       payload = (mask & (RXE_WRITE_OR_SEND_MASK | RXE_ATOMIC_WRITE_MASK)) ?
+                       wqe->dma.resid : 0;
        if (payload > mtu) {
                if (qp_type(qp) == IB_QPT_UD) {
                        /* C10-93.1.1: If the total sum of all the buffer lengths specified for a