Commit 4846d533 authored by Rahul Lakkireddy's avatar Rahul Lakkireddy Committed by David S. Miller

cxgb4: add Tx and Rx path for ETHOFLD traffic

Implement Tx path for traffic flowing through software EOSW_TXQ
and EOHW_TXQ. Since multiple EOSW_TXQ can post packets to a single
EOHW_TXQ, protect the hardware queue with necessary spinlock. Also,
move common code used to generate TSO work request to a common
function.

Implement Rx path to handle Tx completions for successfully
transmitted packets.
Signed-off-by: default avatarRahul Lakkireddy <rahul.lakkireddy@chelsio.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 2d0cb84d
...@@ -805,6 +805,7 @@ struct sge_uld_txq_info { ...@@ -805,6 +805,7 @@ struct sge_uld_txq_info {
enum sge_eosw_state { enum sge_eosw_state {
CXGB4_EO_STATE_CLOSED = 0, /* Not ready to accept traffic */ CXGB4_EO_STATE_CLOSED = 0, /* Not ready to accept traffic */
CXGB4_EO_STATE_ACTIVE, /* Ready to accept traffic */
}; };
struct sge_eosw_desc { struct sge_eosw_desc {
...@@ -1951,6 +1952,8 @@ void free_tx_desc(struct adapter *adap, struct sge_txq *q, ...@@ -1951,6 +1952,8 @@ void free_tx_desc(struct adapter *adap, struct sge_txq *q,
void cxgb4_eosw_txq_free_desc(struct adapter *adap, struct sge_eosw_txq *txq, void cxgb4_eosw_txq_free_desc(struct adapter *adap, struct sge_eosw_txq *txq,
u32 ndesc); u32 ndesc);
void cxgb4_ethofld_restart(unsigned long data); void cxgb4_ethofld_restart(unsigned long data);
int cxgb4_ethofld_rx_handler(struct sge_rspq *q, const __be64 *rsp,
const struct pkt_gl *si);
void free_txq(struct adapter *adap, struct sge_txq *q); void free_txq(struct adapter *adap, struct sge_txq *q);
void cxgb4_reclaim_completed_tx(struct adapter *adap, void cxgb4_reclaim_completed_tx(struct adapter *adap,
struct sge_txq *q, bool unmap); struct sge_txq *q, bool unmap);
......
...@@ -174,7 +174,8 @@ static int cxgb4_mqprio_alloc_hw_resources(struct net_device *dev) ...@@ -174,7 +174,8 @@ static int cxgb4_mqprio_alloc_hw_resources(struct net_device *dev)
eorxq->fl.size = CXGB4_EOHW_FLQ_DEFAULT_DESC_NUM; eorxq->fl.size = CXGB4_EOHW_FLQ_DEFAULT_DESC_NUM;
ret = t4_sge_alloc_rxq(adap, &eorxq->rspq, false, ret = t4_sge_alloc_rxq(adap, &eorxq->rspq, false,
dev, msix, &eorxq->fl, NULL, dev, msix, &eorxq->fl,
cxgb4_ethofld_rx_handler,
NULL, 0); NULL, 0);
if (ret) if (ret)
goto out_free_queues; goto out_free_queues;
......
This diff is collapsed.
...@@ -1421,6 +1421,11 @@ enum { ...@@ -1421,6 +1421,11 @@ enum {
CPL_FW4_ACK_FLAGS_FLOWC = 0x4, /* fw_flowc_wr complete */ CPL_FW4_ACK_FLAGS_FLOWC = 0x4, /* fw_flowc_wr complete */
}; };
#define CPL_FW4_ACK_FLOWID_S 0
#define CPL_FW4_ACK_FLOWID_M 0xffffff
#define CPL_FW4_ACK_FLOWID_G(x) \
(((x) >> CPL_FW4_ACK_FLOWID_S) & CPL_FW4_ACK_FLOWID_M)
struct cpl_fw6_msg { struct cpl_fw6_msg {
u8 opcode; u8 opcode;
u8 type; u8 type;
......
...@@ -87,6 +87,7 @@ enum fw_wr_opcodes { ...@@ -87,6 +87,7 @@ enum fw_wr_opcodes {
FW_ULPTX_WR = 0x04, FW_ULPTX_WR = 0x04,
FW_TP_WR = 0x05, FW_TP_WR = 0x05,
FW_ETH_TX_PKT_WR = 0x08, FW_ETH_TX_PKT_WR = 0x08,
FW_ETH_TX_EO_WR = 0x1c,
FW_OFLD_CONNECTION_WR = 0x2f, FW_OFLD_CONNECTION_WR = 0x2f,
FW_FLOWC_WR = 0x0a, FW_FLOWC_WR = 0x0a,
FW_OFLD_TX_DATA_WR = 0x0b, FW_OFLD_TX_DATA_WR = 0x0b,
...@@ -534,6 +535,35 @@ struct fw_eth_tx_pkt_wr { ...@@ -534,6 +535,35 @@ struct fw_eth_tx_pkt_wr {
__be64 r3; __be64 r3;
}; };
enum fw_eth_tx_eo_type {
FW_ETH_TX_EO_TYPE_TCPSEG = 1,
};
struct fw_eth_tx_eo_wr {
__be32 op_immdlen;
__be32 equiq_to_len16;
__be64 r3;
union fw_eth_tx_eo {
struct fw_eth_tx_eo_tcpseg {
__u8 type;
__u8 ethlen;
__be16 iplen;
__u8 tcplen;
__u8 tsclk_tsoff;
__be16 r4;
__be16 mss;
__be16 r5;
__be32 plen;
} tcpseg;
} u;
};
#define FW_ETH_TX_EO_WR_IMMDLEN_S 0
#define FW_ETH_TX_EO_WR_IMMDLEN_M 0x1ff
#define FW_ETH_TX_EO_WR_IMMDLEN_V(x) ((x) << FW_ETH_TX_EO_WR_IMMDLEN_S)
#define FW_ETH_TX_EO_WR_IMMDLEN_G(x) \
(((x) >> FW_ETH_TX_EO_WR_IMMDLEN_S) & FW_ETH_TX_EO_WR_IMMDLEN_M)
struct fw_ofld_connection_wr { struct fw_ofld_connection_wr {
__be32 op_compl; __be32 op_compl;
__be32 len16_pkd; __be32 len16_pkd;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment