Commit d19a5372 authored by Edward Cree's avatar Edward Cree Committed by David S. Miller

sfc_ef100: TX path for EF100 NICs

Includes checksum offload and TSO, so declare those in our netdev features.
Signed-off-by: default avatarEdward Cree <ecree@solarflare.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent adcfc348
...@@ -263,6 +263,9 @@ static int ef100_ev_process(struct efx_channel *channel, int quota) ...@@ -263,6 +263,9 @@ static int ef100_ev_process(struct efx_channel *channel, int quota)
case ESE_GZ_EF100_EV_MCDI: case ESE_GZ_EF100_EV_MCDI:
efx_mcdi_process_event(channel, p_event); efx_mcdi_process_event(channel, p_event);
break; break;
case ESE_GZ_EF100_EV_TX_COMPLETION:
ef100_ev_tx(channel, p_event);
break;
case ESE_GZ_EF100_EV_DRIVER: case ESE_GZ_EF100_EV_DRIVER:
netif_info(efx, drv, efx->net_dev, netif_info(efx, drv, efx->net_dev,
"Driver initiated event " EFX_QWORD_FMT "\n", "Driver initiated event " EFX_QWORD_FMT "\n",
...@@ -436,10 +439,15 @@ static unsigned int ef100_check_caps(const struct efx_nic *efx, ...@@ -436,10 +439,15 @@ static unsigned int ef100_check_caps(const struct efx_nic *efx,
/* NIC level access functions /* NIC level access functions
*/ */
#define EF100_OFFLOAD_FEATURES (NETIF_F_HW_CSUM | \
NETIF_F_HIGHDMA | NETIF_F_SG | NETIF_F_FRAGLIST | \
NETIF_F_TSO_ECN | NETIF_F_TSO_MANGLEID | NETIF_F_HW_VLAN_CTAG_TX)
const struct efx_nic_type ef100_pf_nic_type = { const struct efx_nic_type ef100_pf_nic_type = {
.revision = EFX_REV_EF100, .revision = EFX_REV_EF100,
.is_vf = false, .is_vf = false,
.probe = ef100_probe_pf, .probe = ef100_probe_pf,
.offload_features = EF100_OFFLOAD_FEATURES,
.mcdi_max_ver = 2, .mcdi_max_ver = 2,
.mcdi_request = ef100_mcdi_request, .mcdi_request = ef100_mcdi_request,
.mcdi_poll_response = ef100_mcdi_poll_response, .mcdi_poll_response = ef100_mcdi_poll_response,
......
This diff is collapsed.
...@@ -17,6 +17,10 @@ ...@@ -17,6 +17,10 @@
int ef100_tx_probe(struct efx_tx_queue *tx_queue); int ef100_tx_probe(struct efx_tx_queue *tx_queue);
void ef100_tx_init(struct efx_tx_queue *tx_queue); void ef100_tx_init(struct efx_tx_queue *tx_queue);
void ef100_tx_write(struct efx_tx_queue *tx_queue); void ef100_tx_write(struct efx_tx_queue *tx_queue);
void ef100_notify_tx_desc(struct efx_tx_queue *tx_queue);
unsigned int ef100_tx_max_skb_descs(struct efx_nic *efx);
void ef100_ev_tx(struct efx_channel *channel, const efx_qword_t *p_event);
netdev_tx_t ef100_enqueue_skb(struct efx_tx_queue *tx_queue, struct sk_buff *skb); netdev_tx_t ef100_enqueue_skb(struct efx_tx_queue *tx_queue, struct sk_buff *skb);
#endif #endif
...@@ -173,6 +173,7 @@ struct efx_tx_buffer { ...@@ -173,6 +173,7 @@ struct efx_tx_buffer {
#define EFX_TX_BUF_MAP_SINGLE 8 /* buffer was mapped with dma_map_single() */ #define EFX_TX_BUF_MAP_SINGLE 8 /* buffer was mapped with dma_map_single() */
#define EFX_TX_BUF_OPTION 0x10 /* empty buffer for option descriptor */ #define EFX_TX_BUF_OPTION 0x10 /* empty buffer for option descriptor */
#define EFX_TX_BUF_XDP 0x20 /* buffer was sent with XDP */ #define EFX_TX_BUF_XDP 0x20 /* buffer was sent with XDP */
#define EFX_TX_BUF_TSO_V3 0x40 /* empty buffer for a TSO_V3 descriptor */
/** /**
* struct efx_tx_queue - An Efx TX queue * struct efx_tx_queue - An Efx TX queue
...@@ -245,6 +246,7 @@ struct efx_tx_buffer { ...@@ -245,6 +246,7 @@ struct efx_tx_buffer {
* @pio_packets: Number of times the TX PIO feature has been used * @pio_packets: Number of times the TX PIO feature has been used
* @xmit_more_available: Are any packets waiting to be pushed to the NIC * @xmit_more_available: Are any packets waiting to be pushed to the NIC
* @cb_packets: Number of times the TX copybreak feature has been used * @cb_packets: Number of times the TX copybreak feature has been used
* @notify_count: Count of notified descriptors to the NIC
* @empty_read_count: If the completion path has seen the queue as empty * @empty_read_count: If the completion path has seen the queue as empty
* and the transmission path has not yet checked this, the value of * and the transmission path has not yet checked this, the value of
* @read_count bitwise-added to %EFX_EMPTY_COUNT_VALID; otherwise 0. * @read_count bitwise-added to %EFX_EMPTY_COUNT_VALID; otherwise 0.
...@@ -292,6 +294,7 @@ struct efx_tx_queue { ...@@ -292,6 +294,7 @@ struct efx_tx_queue {
unsigned int pio_packets; unsigned int pio_packets;
bool xmit_more_available; bool xmit_more_available;
unsigned int cb_packets; unsigned int cb_packets;
unsigned int notify_count;
/* Statistics to supplement MAC stats */ /* Statistics to supplement MAC stats */
unsigned long tx_packets; unsigned long tx_packets;
...@@ -1669,6 +1672,24 @@ static inline void efx_xmit_hwtstamp_pending(struct sk_buff *skb) ...@@ -1669,6 +1672,24 @@ static inline void efx_xmit_hwtstamp_pending(struct sk_buff *skb)
skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS; skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;
} }
/* Get the max fill level of the TX queues on this channel */
static inline unsigned int
efx_channel_tx_fill_level(struct efx_channel *channel)
{
struct efx_tx_queue *tx_queue;
unsigned int fill_level = 0;
/* This function is currently only used by EF100, which maybe
* could do something simpler and just compute the fill level
* of the single TXQ that's really in use.
*/
efx_for_each_channel_tx_queue(tx_queue, channel)
fill_level = max(fill_level,
tx_queue->insert_count - tx_queue->read_count);
return fill_level;
}
/* Get all supported features. /* Get all supported features.
* If a feature is not fixed, it is present in hw_features. * If a feature is not fixed, it is present in hw_features.
* If a feature is fixed, it does not present in hw_features, but * If a feature is fixed, it does not present in hw_features, but
......
...@@ -71,6 +71,7 @@ void efx_init_tx_queue(struct efx_tx_queue *tx_queue) ...@@ -71,6 +71,7 @@ void efx_init_tx_queue(struct efx_tx_queue *tx_queue)
"initialising TX queue %d\n", tx_queue->queue); "initialising TX queue %d\n", tx_queue->queue);
tx_queue->insert_count = 0; tx_queue->insert_count = 0;
tx_queue->notify_count = 0;
tx_queue->write_count = 0; tx_queue->write_count = 0;
tx_queue->packet_write_count = 0; tx_queue->packet_write_count = 0;
tx_queue->old_write_count = 0; tx_queue->old_write_count = 0;
......
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