Commit d5fbda61 authored by Arjun Vynipadath's avatar Arjun Vynipadath Committed by David S. Miller

cxgb4: Add support for FW_ETH_TX_PKT_VM_WR

The present TX workrequest(FW_ETH_TX_PKT_WR) cant be used for
host->vf communication, since it doesn't loopback the outgoing
packets to virtual interfaces on the same port. This can be done
using FW_ETH_TX_PKT_VM_WR.
This fix depends on ethtool_flags to determine what WR to use for
TX path. Support for setting this flags by user is added in next
commit.

Based on the original work by : Casey Leedom <leedom@chelsio.com>
Signed-off-by: default avatarCasey Leedom <leedom@chelsio.com>
Signed-off-by: default avatarArjun Vynipadath <arjun@chelsio.com>
Signed-off-by: default avatarGanesh Goudar <ganeshgr@chelsio.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent b0e9a2fe
...@@ -522,6 +522,15 @@ enum { ...@@ -522,6 +522,15 @@ enum {
MAX_INGQ = MAX_ETH_QSETS + INGQ_EXTRAS, MAX_INGQ = MAX_ETH_QSETS + INGQ_EXTRAS,
}; };
enum {
PRIV_FLAG_PORT_TX_VM_BIT,
};
#define PRIV_FLAG_PORT_TX_VM BIT(PRIV_FLAG_PORT_TX_VM_BIT)
#define PRIV_FLAGS_ADAP 0
#define PRIV_FLAGS_PORT PRIV_FLAG_PORT_TX_VM
struct adapter; struct adapter;
struct sge_rspq; struct sge_rspq;
...@@ -558,6 +567,7 @@ struct port_info { ...@@ -558,6 +567,7 @@ struct port_info {
struct hwtstamp_config tstamp_config; struct hwtstamp_config tstamp_config;
bool ptp_enable; bool ptp_enable;
struct sched_table *sched_tbl; struct sched_table *sched_tbl;
u32 eth_flags;
}; };
struct dentry; struct dentry;
...@@ -868,6 +878,7 @@ struct adapter { ...@@ -868,6 +878,7 @@ struct adapter {
unsigned int flags; unsigned int flags;
unsigned int adap_idx; unsigned int adap_idx;
enum chip_type chip; enum chip_type chip;
u32 eth_flags;
int msg_enable; int msg_enable;
__be16 vxlan_port; __be16 vxlan_port;
...@@ -1335,7 +1346,7 @@ void t4_os_link_changed(struct adapter *adap, int port_id, int link_stat); ...@@ -1335,7 +1346,7 @@ void t4_os_link_changed(struct adapter *adap, int port_id, int link_stat);
void t4_free_sge_resources(struct adapter *adap); void t4_free_sge_resources(struct adapter *adap);
void t4_free_ofld_rxqs(struct adapter *adap, int n, struct sge_ofld_rxq *q); void t4_free_ofld_rxqs(struct adapter *adap, int n, struct sge_ofld_rxq *q);
irq_handler_t t4_intr_handler(struct adapter *adap); irq_handler_t t4_intr_handler(struct adapter *adap);
netdev_tx_t t4_eth_xmit(struct sk_buff *skb, struct net_device *dev); netdev_tx_t t4_start_xmit(struct sk_buff *skb, struct net_device *dev);
int t4_ethrx_handler(struct sge_rspq *q, const __be64 *rsp, int t4_ethrx_handler(struct sge_rspq *q, const __be64 *rsp,
const struct pkt_gl *gl); const struct pkt_gl *gl);
int t4_mgmt_tx(struct adapter *adap, struct sk_buff *skb); int t4_mgmt_tx(struct adapter *adap, struct sk_buff *skb);
......
...@@ -3217,7 +3217,7 @@ static netdev_features_t cxgb_fix_features(struct net_device *dev, ...@@ -3217,7 +3217,7 @@ static netdev_features_t cxgb_fix_features(struct net_device *dev,
static const struct net_device_ops cxgb4_netdev_ops = { static const struct net_device_ops cxgb4_netdev_ops = {
.ndo_open = cxgb_open, .ndo_open = cxgb_open,
.ndo_stop = cxgb_close, .ndo_stop = cxgb_close,
.ndo_start_xmit = t4_eth_xmit, .ndo_start_xmit = t4_start_xmit,
.ndo_select_queue = cxgb_select_queue, .ndo_select_queue = cxgb_select_queue,
.ndo_get_stats64 = cxgb_get_stats, .ndo_get_stats64 = cxgb_get_stats,
.ndo_set_rx_mode = cxgb_set_rxmode, .ndo_set_rx_mode = cxgb_set_rxmode,
......
This diff is collapsed.
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