Skip to content

Commit

Permalink
iw_cxgb4: pass window scale in flowc work request
Browse files Browse the repository at this point in the history
This will allow FW to not send more data to TP (which would then need to
be buffered). Pass the negotiated TCP window scale to FW in the FLOWC WR.

Also refactor send_flowc() a bit to clean it up.

Signed-off-by: Steve Wise <swise@opengridcomputing.com>
Signed-off-by: Potnuri Bharat Teja <bharat@chelsio.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
  • Loading branch information
Potnuri Bharat Teja authored and Jason Gunthorpe committed Aug 8, 2018
1 parent 0dfe452 commit 2e51e45
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 24 deletions.
46 changes: 23 additions & 23 deletions drivers/infiniband/hw/cxgb4/cm.c
Original file line number Diff line number Diff line change
Expand Up @@ -587,24 +587,29 @@ static int send_flowc(struct c4iw_ep *ep)
{
struct fw_flowc_wr *flowc;
struct sk_buff *skb = skb_dequeue(&ep->com.ep_skb_list);
int i;
u16 vlan = ep->l2t->vlan;
int nparams;
int flowclen, flowclen16;

if (WARN_ON(!skb))
return -ENOMEM;

if (vlan == CPL_L2T_VLAN_NONE)
nparams = 8;
else
nparams = 9;
else
nparams = 10;

flowclen = offsetof(struct fw_flowc_wr, mnemval[nparams]);
flowclen16 = DIV_ROUND_UP(flowclen, 16);
flowclen = flowclen16 * 16;

flowc = __skb_put(skb, FLOWC_LEN);
flowc = __skb_put(skb, flowclen);
memset(flowc, 0, flowclen);

flowc->op_to_nparams = cpu_to_be32(FW_WR_OP_V(FW_FLOWC_WR) |
FW_FLOWC_WR_NPARAMS_V(nparams));
flowc->flowid_len16 = cpu_to_be32(FW_WR_LEN16_V(DIV_ROUND_UP(FLOWC_LEN,
16)) | FW_WR_FLOWID_V(ep->hwtid));
flowc->flowid_len16 = cpu_to_be32(FW_WR_LEN16_V(flowclen16) |
FW_WR_FLOWID_V(ep->hwtid));

flowc->mnemval[0].mnemonic = FW_FLOWC_MNEM_PFNVFN;
flowc->mnemval[0].val = cpu_to_be32(FW_PFVF_CMD_PFN_V
Expand All @@ -623,21 +628,13 @@ static int send_flowc(struct c4iw_ep *ep)
flowc->mnemval[6].val = cpu_to_be32(ep->snd_win);
flowc->mnemval[7].mnemonic = FW_FLOWC_MNEM_MSS;
flowc->mnemval[7].val = cpu_to_be32(ep->emss);
if (nparams == 9) {
flowc->mnemval[8].mnemonic = FW_FLOWC_MNEM_RCV_SCALE;
flowc->mnemval[8].val = cpu_to_be32(ep->snd_wscale);
if (nparams == 10) {
u16 pri;

pri = (vlan & VLAN_PRIO_MASK) >> VLAN_PRIO_SHIFT;
flowc->mnemval[8].mnemonic = FW_FLOWC_MNEM_SCHEDCLASS;
flowc->mnemval[8].val = cpu_to_be32(pri);
} else {
/* Pad WR to 16 byte boundary */
flowc->mnemval[8].mnemonic = 0;
flowc->mnemval[8].val = 0;
}
for (i = 0; i < 9; i++) {
flowc->mnemval[i].r4[0] = 0;
flowc->mnemval[i].r4[1] = 0;
flowc->mnemval[i].r4[2] = 0;
flowc->mnemval[9].mnemonic = FW_FLOWC_MNEM_SCHEDCLASS;
flowc->mnemval[9].val = cpu_to_be32(pri);
}

set_wr_txq(skb, CPL_PRIORITY_DATA, ep->txq_idx);
Expand Down Expand Up @@ -1176,6 +1173,7 @@ static int act_establish(struct c4iw_dev *dev, struct sk_buff *skb)
{
struct c4iw_ep *ep;
struct cpl_act_establish *req = cplhdr(skb);
unsigned short tcp_opt = ntohs(req->tcp_opt);
unsigned int tid = GET_TID(req);
unsigned int atid = TID_TID_G(ntohl(req->tos_atid));
struct tid_info *t = dev->rdev.lldi.tids;
Expand All @@ -1196,8 +1194,9 @@ static int act_establish(struct c4iw_dev *dev, struct sk_buff *skb)

ep->snd_seq = be32_to_cpu(req->snd_isn);
ep->rcv_seq = be32_to_cpu(req->rcv_isn);
ep->snd_wscale = TCPOPT_SND_WSCALE_G(tcp_opt);

set_emss(ep, ntohs(req->tcp_opt));
set_emss(ep, tcp_opt);

/* dealloc the atid */
remove_handle(ep->com.dev, &ep->com.dev->atid_idr, atid);
Expand Down Expand Up @@ -2629,16 +2628,17 @@ static int pass_establish(struct c4iw_dev *dev, struct sk_buff *skb)
struct cpl_pass_establish *req = cplhdr(skb);
unsigned int tid = GET_TID(req);
int ret;
u16 tcp_opt = ntohs(req->tcp_opt);

ep = get_ep_from_tid(dev, tid);
pr_debug("ep %p tid %u\n", ep, ep->hwtid);
ep->snd_seq = be32_to_cpu(req->snd_isn);
ep->rcv_seq = be32_to_cpu(req->rcv_isn);
ep->snd_wscale = TCPOPT_SND_WSCALE_G(tcp_opt);

pr_debug("ep %p hwtid %u tcp_opt 0x%02x\n", ep, tid,
ntohs(req->tcp_opt));
pr_debug("ep %p hwtid %u tcp_opt 0x%02x\n", ep, tid, tcp_opt);

set_emss(ep, ntohs(req->tcp_opt));
set_emss(ep, tcp_opt);

dst_confirm(ep->dst);
mutex_lock(&ep->com.mutex);
Expand Down
6 changes: 5 additions & 1 deletion drivers/infiniband/hw/cxgb4/iw_cxgb4.h
Original file line number Diff line number Diff line change
Expand Up @@ -910,7 +910,10 @@ enum conn_pre_alloc_buffers {
CN_MAX_CON_BUF
};

#define FLOWC_LEN 80
enum {
FLOWC_LEN = offsetof(struct fw_flowc_wr, mnemval[FW_FLOWC_MNEM_MAX])
};

union cpl_wr_size {
struct cpl_abort_req abrt_req;
struct cpl_abort_rpl abrt_rpl;
Expand Down Expand Up @@ -977,6 +980,7 @@ struct c4iw_ep {
unsigned int retry_count;
int snd_win;
int rcv_win;
u32 snd_wscale;
struct c4iw_ep_stats stats;
};

Expand Down

0 comments on commit 2e51e45

Please sign in to comment.