cxgb4i: add support for Chelsio T6 adapters
Subsystems (5)
Varun Prakash
maintainercover cxgb4i: add support for Chelsio T6 adapters
This patch series adds support for Chelsio T6 adapters in iSCSI initiator offload driver(cxgb4i).
Varun Prakash (3):
scsi: cxgb4i: use cxgb4_tp_smt_idx() to get smt_idx
scsi: cxgb4i,libcxgbi: add active open cmd for T6 adapters
scsi: cxgb4i,libcxgbi,cxgb4: add T6 iSCSI completion feature
drivers/net/ethernet/chelsio/cxgb4/t4_msg.h | 13 ++ drivers/scsi/cxgbi/cxgb4i/cxgb4i.c | 309 ++++++++++++++++++++++++---- drivers/scsi/cxgbi/libcxgbi.c | 25 ++- drivers/scsi/cxgbi/libcxgbi.h | 1 + 4 files changed, 305 insertions(+), 43 deletions(-)
Signature · 1 line
2.0.2
Varun Prakash
maintainerPATCH 1/3 scsi: cxgb4i: use cxgb4_tp_smt_idx() to get smt_idx
cxgb4_tp_smt_idx() is defined in cxgb4 driver, it returns smt_idx for T4,T5,T6 adapters.
--- drivers/scsi/cxgbi/cxgb4i/cxgb4i.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/scsi/cxgbi/cxgb4i/cxgb4i.c +2 -2
@@ -1451,8 +1451,8 @@ static int init_act_open(struct cxgbi_sock *csk) csk->mtu =dst_mtu (csk->dst);cxgb4_best_mtu (lldi->mtus, csk->mtu, &csk->mss_idx); csk->tx_chan =cxgb4_port_chan (ndev); -/* SMT two entries per row */ - csk->smac_idx = ((cxgb4_port_viid (ndev) &0x7F )) <<1 ; + csk->smac_idx =cxgb4_tp_smt_idx (lldi->adapter_type, +cxgb4_port_viid (ndev)); step = lldi->ntxq / lldi->nchan; csk->txq_idx =cxgb4_port_idx (ndev) * step; step = lldi->nrxq / lldi->nchan;
Signature · 1 line
2.0.2
Varun Prakash
maintainerPATCH 2/3 scsi: cxgb4i,libcxgbi: add active open cmd for T6 adapters
In reply to Varun PrakashAdd T6 active open cmd to open active connections
on T6 adapters.
--- drivers/scsi/cxgbi/cxgb4i/cxgb4i.c | 86 ++++++++++++++++++++++++++++++++------ drivers/scsi/cxgbi/libcxgbi.c | 6 +-- 2 files changed, 77 insertions(+), 15 deletions(-)
drivers/scsi/cxgbi/cxgb4i/cxgb4i.c +74 -12
@@ -188,7 +188,6 @@ static void send_act_open_req(struct cxgbi_sock *csk, struct sk_buff *skb, struct l2t_entry *e) {struct cxgb4_lld_info *lldi =cxgbi_cdev_priv (csk->cdev); -int t4 =is_t4 (lldi->adapter_type);int wscale =cxgbi_sock_compute_wscale (csk->mss_idx);unsigned long long opt0;unsigned int opt2;
@@ -231,7 +230,7 @@ static void send_act_open_req(struct cxgbi_sock *csk, struct sk_buff *skb, csk, &req->local_ip,ntohs (req->local_port), &req->peer_ip,ntohs (req->peer_port), csk->atid, csk->rss_qid); - }else { + }else if (is_t5 (lldi->adapter_type)) {struct cpl_t5_act_open_req *req = (struct cpl_t5_act_open_req *)skb->head;u32 isn = (prandom_u32 () & ~7UL ) -1 ;
@@ -259,12 +258,45 @@ static void send_act_open_req(struct cxgbi_sock *csk, struct sk_buff *skb, csk, &req->local_ip,ntohs (req->local_port), &req->peer_ip,ntohs (req->peer_port), csk->atid, csk->rss_qid); + }else { +struct cpl_t6_act_open_req *req = + (struct cpl_t6_act_open_req *)skb->head; +u32 isn = (prandom_u32 () & ~7UL ) -1 ; + +INIT_TP_WR (req,0 ); +OPCODE_TID (req) =cpu_to_be32 (MK_OPCODE_TID (CPL_ACT_OPEN_REQ , + qid_atid)); + req->local_port = csk->saddr.sin_port; + req->peer_port = csk->daddr.sin_port; + req->local_ip = csk->saddr.sin_addr.s_addr; + req->peer_ip = csk->daddr.sin_addr.s_addr; + req->opt0 =cpu_to_be64 (opt0); + req->params =cpu_to_be64 (FILTER_TUPLE_V ( +cxgb4_select_ntuple ( + csk->cdev->ports[csk->port_id], + csk->l2t))); + req->rsvd =cpu_to_be32 (isn); + + opt2 |=T5_ISS_VALID ; + opt2 |=RX_FC_DISABLE_F ; + opt2 |=T5_OPT_2_VALID_F ; + + req->opt2 =cpu_to_be32 (opt2); + req->rsvd2 =cpu_to_be32 (0 ); + req->opt3 =cpu_to_be32 (0 ); + +log_debug (1 <<CXGBI_DBG_TOE |1 <<CXGBI_DBG_SOCK , +"csk t6 0x%p, %pI4:%u-%pI4:%u, atid %d, qid %u.\n" , + csk, &req->local_ip,ntohs (req->local_port), + &req->peer_ip,ntohs (req->peer_port), + csk->atid, csk->rss_qid); }set_wr_txq (skb,CPL_PRIORITY_SETUP , csk->port_id);pr_info_ipaddr ("t%d csk 0x%p,%u,0x%lx,%u, rss_qid %u.\n" , - (&csk->saddr), (&csk->daddr), t4 ?4 :5 , csk, + (&csk->saddr), (&csk->daddr), +CHELSIO_CHIP_VERSION (lldi->adapter_type), csk, csk->state, csk->flags, csk->atid, csk->rss_qid);cxgb4_l2t_send (csk->cdev->ports[csk->port_id], skb, csk->l2t);
@@ -275,7 +307,6 @@ static void send_act_open_req6(struct cxgbi_sock *csk, struct sk_buff *skb, struct l2t_entry *e) {struct cxgb4_lld_info *lldi =cxgbi_cdev_priv (csk->cdev); -int t4 =is_t4 (lldi->adapter_type);int wscale =cxgbi_sock_compute_wscale (csk->mss_idx);unsigned long long opt0;unsigned int opt2;
@@ -293,10 +324,9 @@ static void send_act_open_req6(struct cxgbi_sock *csk, struct sk_buff *skb, opt2 =RX_CHANNEL_V (0 ) |RSS_QUEUE_VALID_F | -RX_FC_DISABLE_F |RSS_QUEUE_V (csk->rss_qid); -if (t4) { +if (is_t4 (lldi->adapter_type)) {struct cpl_act_open_req6 *req = (struct cpl_act_open_req6 *)skb->head;
@@ -321,7 +351,7 @@ static void send_act_open_req6(struct cxgbi_sock *csk, struct sk_buff *skb, req->params =cpu_to_be32 (cxgb4_select_ntuple ( csk->cdev->ports[csk->port_id], csk->l2t)); - }else { + }else if (is_t5 (lldi->adapter_type)) {struct cpl_t5_act_open_req6 *req = (struct cpl_t5_act_open_req6 *)skb->head;
@@ -344,12 +374,41 @@ static void send_act_open_req6(struct cxgbi_sock *csk, struct sk_buff *skb, req->params =cpu_to_be64 (FILTER_TUPLE_V (cxgb4_select_ntuple ( csk->cdev->ports[csk->port_id], csk->l2t))); + }else { +struct cpl_t6_act_open_req6 *req = + (struct cpl_t6_act_open_req6 *)skb->head; + +INIT_TP_WR (req,0 ); +OPCODE_TID (req) =cpu_to_be32 (MK_OPCODE_TID (CPL_ACT_OPEN_REQ6 , + qid_atid)); + req->local_port = csk->saddr6.sin6_port; + req->peer_port = csk->daddr6.sin6_port; + req->local_ip_hi = *(__be64 *)(csk->saddr6.sin6_addr.s6_addr); + req->local_ip_lo = *(__be64 *)(csk->saddr6.sin6_addr.s6_addr + +8 ); + req->peer_ip_hi = *(__be64 *)(csk->daddr6.sin6_addr.s6_addr); + req->peer_ip_lo = *(__be64 *)(csk->daddr6.sin6_addr.s6_addr + +8 ); + req->opt0 =cpu_to_be64 (opt0); + + opt2 |=RX_FC_DISABLE_F ; + opt2 |=T5_OPT_2_VALID_F ; + + req->opt2 =cpu_to_be32 (opt2); + + req->params =cpu_to_be64 (FILTER_TUPLE_V (cxgb4_select_ntuple ( + csk->cdev->ports[csk->port_id], + csk->l2t))); + + req->rsvd2 =cpu_to_be32 (0 ); + req->opt3 =cpu_to_be32 (0 ); }set_wr_txq (skb,CPL_PRIORITY_SETUP , csk->port_id);pr_info ("t%d csk 0x%p,%u,0x%lx,%u, [%pI6]:%u-[%pI6]:%u, rss_qid %u.\n" , - t4 ?4 :5 , csk, csk->state, csk->flags, csk->atid, +CHELSIO_CHIP_VERSION (lldi->adapter_type), csk, csk->state, + csk->flags, csk->atid, &csk->saddr6.sin6_addr,ntohs (csk->saddr.sin_port), &csk->daddr6.sin6_addr,ntohs (csk->daddr.sin_port), csk->rss_qid);
@@ -1381,7 +1440,6 @@ static int init_act_open(struct cxgbi_sock *csk)void *daddr;unsigned int step;unsigned int size, size6; -int t4 =is_t4 (lldi->adapter_type);unsigned int linkspeed;unsigned int rcv_winf, snd_winf;
@@ -1427,12 +1485,15 @@ static int init_act_open(struct cxgbi_sock *csk)cxgb4_clip_get (ndev, (const u32 *)&csk->saddr6.sin6_addr,1 );#endif -if (t4) { +if (is_t4 (lldi->adapter_type)) { size =sizeof (struct cpl_act_open_req ); size6 =sizeof (struct cpl_act_open_req6 ); - }else { + }else if (is_t5 (lldi->adapter_type)) { size =sizeof (struct cpl_t5_act_open_req ); size6 =sizeof (struct cpl_t5_act_open_req6 ); + }else { + size =sizeof (struct cpl_t6_act_open_req ); + size6 =sizeof (struct cpl_t6_act_open_req6 ); }if (csk->csk_family ==AF_INET )
@@ -1793,7 +1854,8 @@ static void *t4_uld_add(const struct cxgb4_lld_info *lldi) cdev->nports = lldi->nports; cdev->mtus = lldi->mtus; cdev->nmtus =NMTUS ; - cdev->rx_credit_thres = cxgb4i_rx_credit_thres; + cdev->rx_credit_thres = (CHELSIO_CHIP_VERSION (lldi->adapter_type) <= +CHELSIO_T5 ) ? cxgb4i_rx_credit_thres :0 ; cdev->skb_tx_rsvd =CXGB4I_TX_HEADER_LEN ; cdev->skb_rx_extra =sizeof (struct cpl_iscsi_hdr ); cdev->itp = &cxgb4i_iscsi_transport;
drivers/scsi/cxgbi/libcxgbi.c +3 -3
@@ -1627,15 +1627,15 @@ static void csk_return_rx_credits(struct cxgbi_sock *csk, int copied) csk->rcv_wup, cdev->rx_credit_thres, csk->rcv_win); +if (!cdev->rx_credit_thres) +return ; +if (csk->state !=CTP_ESTABLISHED )return ; credits = csk->copied_seq - csk->rcv_wup;if (unlikely (!credits))return ; -if (unlikely (cdev->rx_credit_thres ==0 )) -return ; - must_send = credits +16384 >= csk->rcv_win;if (must_send || credits >= cdev->rx_credit_thres) csk->rcv_wup += cdev->csk_send_rx_credits (csk, credits);
Signature · 1 line
2.0.2
Varun Prakash
maintainerPATCH 3/3 scsi: cxgb4i,libcxgbi,cxgb4: add T6 iSCSI completion feature
In reply to Varun PrakashT6 adapters reduce number of completions to host by generating single completion for all the directly placed(DDP) iSCSI pdus in a sequence.
This patch adds new structure for completion hw cmd (struct cpl_rx_iscsi_cmp) and implements T6 completion feature.
--- drivers/net/ethernet/chelsio/cxgb4/t4_msg.h | 13 ++ drivers/scsi/cxgbi/cxgb4i/cxgb4i.c | 219 ++++++++++++++++++++++++---- drivers/scsi/cxgbi/libcxgbi.c | 19 +++ drivers/scsi/cxgbi/libcxgbi.h | 1 + 4 files changed, 226 insertions(+), 26 deletions(-)
drivers/net/ethernet/chelsio/cxgb4/t4_msg.h +13 -0
@@ -76,6 +76,7 @@ enum {CPL_PASS_ESTABLISH =0x41 ,CPL_RX_DATA_DDP =0x42 ,CPL_PASS_ACCEPT_REQ =0x44 , +CPL_RX_ISCSI_CMP =0x45 ,CPL_TRACE_PKT_T5 =0x48 , CPL_RX_ISCSI_DDP = 0x49,
@@ -934,6 +935,18 @@ struct cpl_iscsi_data {__u8 status; }; +struct cpl_rx_iscsi_cmp { +union opcode_tid ot; +__be16 pdu_len_ddp; +__be16 len; +__be32 seq; +__be16 urg; +__u8 rsvd; +__u8 status; +__be32 ulp_crc; +__be32 ddpvld; +}; +struct cpl_tx_data_iso {__be32 op_to_scsi;__u8 reserved1;
drivers/scsi/cxgbi/cxgb4i/cxgb4i.c +193 -26
258 lines not on this page · raw message
drivers/scsi/cxgbi/libcxgbi.c +19 -0
@@ -1574,6 +1574,25 @@ static int skb_read_pdu_bhs(struct iscsi_conn *conn, struct sk_buff *skb)return -EIO ; } +if (cxgbi_skcb_test_flag (skb,SKCBF_RX_ISCSI_COMPL ) && +cxgbi_skcb_test_flag (skb,SKCBF_RX_DATA_DDPD )) { +/* If completion flag is set and data is directly +* placed in to the host memory then update +* task->exp_datasn to the datasn in completion +* iSCSI hdr as T6 adapter generates completion only +* for the last pdu of a sequence. +*/ +itt_t itt = ((struct iscsi_data *)skb->data)->itt; +struct iscsi_task *task =iscsi_itt_to_ctask (conn, itt); +u32 data_sn =be32_to_cpu (((struct iscsi_data *) + skb->data)->datasn); +if (task && task->sc) { +struct iscsi_tcp_task *tcp_task = task->dd_data; + + tcp_task->exp_datasn = data_sn; + } + } +return read_pdu_skb (conn, skb,0 ,0 ); }
drivers/scsi/cxgbi/libcxgbi.h +1 -0
@@ -207,6 +207,7 @@ enum cxgbi_skcb_flags {SKCBF_RX_HDR ,/* received pdu header */ SKCBF_RX_DATA ,/* received pdu payload */ SKCBF_RX_STATUS ,/* received ddp status */ +SKCBF_RX_ISCSI_COMPL ,/* received iscsi completion */ SKCBF_RX_DATA_DDPD ,/* pdu payload ddp'd */ SKCBF_RX_HCRC_ERR ,/* header digest error */ SKCBF_RX_DCRC_ERR, /* data digest error */
Signature · 1 line
2.0.2
Martin K. Petersen
AppliedQuoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
"Varun" == Varun Prakash <[email protected]> writes:
Varun> This patch series adds support for Chelsio T6 adapters in iSCSI Varun> initiator offload driver(cxgb4i).
Applied to 4.10/scsi-queue.
Signature · 1 line
Martin K. Petersen Oracle Linux Engineering