Commit daea5b4d authored by David S. Miller's avatar David S. Miller

Merge branch 'sfc-code-refactoring'

Alex Maftei says:

====================
sfc: code refactoring

Splitting some of the driver code into different files, which will
later be used in another driver for a new product.
====================
Reviewed-by: default avatarEdward Cree <ecree@solarflare.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents b9ae5127 17d3b21c
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
sfc-y += efx.o nic.o farch.o siena.o ef10.o tx.o rx.o \ sfc-y += efx.o efx_common.o efx_channels.o nic.o \
farch.o siena.o ef10.o \
tx.o tx_common.o rx.o rx_common.o \
selftest.o ethtool.o ptp.o tx_tso.o \ selftest.o ethtool.o ptp.o tx_tso.o \
mcdi.o mcdi_port.o mcdi_mon.o mcdi.o mcdi_port.o \
mcdi_mon.o
sfc-$(CONFIG_SFC_MTD) += mtd.o sfc-$(CONFIG_SFC_MTD) += mtd.o
sfc-$(CONFIG_SFC_SRIOV) += sriov.o siena_sriov.o ef10_sriov.o sfc-$(CONFIG_SFC_SRIOV) += sriov.o siena_sriov.o ef10_sriov.o
......
...@@ -5,14 +5,17 @@ ...@@ -5,14 +5,17 @@
*/ */
#include "net_driver.h" #include "net_driver.h"
#include "rx_common.h"
#include "ef10_regs.h" #include "ef10_regs.h"
#include "io.h" #include "io.h"
#include "mcdi.h" #include "mcdi.h"
#include "mcdi_pcol.h" #include "mcdi_pcol.h"
#include "mcdi_port_common.h"
#include "nic.h" #include "nic.h"
#include "workarounds.h" #include "workarounds.h"
#include "selftest.h" #include "selftest.h"
#include "ef10_sriov.h" #include "ef10_sriov.h"
#include "rx_common.h"
#include <linux/in.h> #include <linux/in.h>
#include <linux/jhash.h> #include <linux/jhash.h>
#include <linux/wait.h> #include <linux/wait.h>
......
This diff is collapsed.
...@@ -15,31 +15,19 @@ int efx_net_open(struct net_device *net_dev); ...@@ -15,31 +15,19 @@ int efx_net_open(struct net_device *net_dev);
int efx_net_stop(struct net_device *net_dev); int efx_net_stop(struct net_device *net_dev);
/* TX */ /* TX */
int efx_probe_tx_queue(struct efx_tx_queue *tx_queue);
void efx_remove_tx_queue(struct efx_tx_queue *tx_queue);
void efx_init_tx_queue(struct efx_tx_queue *tx_queue);
void efx_init_tx_queue_core_txq(struct efx_tx_queue *tx_queue); void efx_init_tx_queue_core_txq(struct efx_tx_queue *tx_queue);
void efx_fini_tx_queue(struct efx_tx_queue *tx_queue);
netdev_tx_t efx_hard_start_xmit(struct sk_buff *skb, netdev_tx_t efx_hard_start_xmit(struct sk_buff *skb,
struct net_device *net_dev); struct net_device *net_dev);
netdev_tx_t efx_enqueue_skb(struct efx_tx_queue *tx_queue, struct sk_buff *skb); netdev_tx_t efx_enqueue_skb(struct efx_tx_queue *tx_queue, struct sk_buff *skb);
void efx_xmit_done(struct efx_tx_queue *tx_queue, unsigned int index); void efx_xmit_done(struct efx_tx_queue *tx_queue, unsigned int index);
int efx_setup_tc(struct net_device *net_dev, enum tc_setup_type type, int efx_setup_tc(struct net_device *net_dev, enum tc_setup_type type,
void *type_data); void *type_data);
unsigned int efx_tx_max_skb_descs(struct efx_nic *efx);
extern unsigned int efx_piobuf_size; extern unsigned int efx_piobuf_size;
extern bool efx_separate_tx_channels; extern bool efx_separate_tx_channels;
/* RX */ /* RX */
void efx_set_default_rx_indir_table(struct efx_nic *efx, void efx_set_default_rx_indir_table(struct efx_nic *efx,
struct efx_rss_context *ctx); struct efx_rss_context *ctx);
void efx_rx_config_page_split(struct efx_nic *efx);
int efx_probe_rx_queue(struct efx_rx_queue *rx_queue);
void efx_remove_rx_queue(struct efx_rx_queue *rx_queue);
void efx_init_rx_queue(struct efx_rx_queue *rx_queue);
void efx_fini_rx_queue(struct efx_rx_queue *rx_queue);
void efx_fast_push_rx_descriptors(struct efx_rx_queue *rx_queue, bool atomic);
void efx_rx_slow_fill(struct timer_list *t);
void __efx_rx_packet(struct efx_channel *channel); void __efx_rx_packet(struct efx_channel *channel);
void efx_rx_packet(struct efx_rx_queue *rx_queue, unsigned int index, void efx_rx_packet(struct efx_rx_queue *rx_queue, unsigned int index,
unsigned int n_frags, unsigned int len, u16 flags); unsigned int n_frags, unsigned int len, u16 flags);
...@@ -48,7 +36,9 @@ static inline void efx_rx_flush_packet(struct efx_channel *channel) ...@@ -48,7 +36,9 @@ static inline void efx_rx_flush_packet(struct efx_channel *channel)
if (channel->rx_pkt_n_frags) if (channel->rx_pkt_n_frags)
__efx_rx_packet(channel); __efx_rx_packet(channel);
} }
void efx_schedule_slow_fill(struct efx_rx_queue *rx_queue);
void efx_init_rx_recycle_ring(struct efx_rx_queue *rx_queue);
struct page *efx_reuse_page(struct efx_rx_queue *rx_queue);
#define EFX_MAX_DMAQ_SIZE 4096UL #define EFX_MAX_DMAQ_SIZE 4096UL
#define EFX_DEFAULT_DMAQ_SIZE 1024UL #define EFX_DEFAULT_DMAQ_SIZE 1024UL
...@@ -80,8 +70,6 @@ static inline bool efx_rss_enabled(struct efx_nic *efx) ...@@ -80,8 +70,6 @@ static inline bool efx_rss_enabled(struct efx_nic *efx)
/* Filters */ /* Filters */
void efx_mac_reconfigure(struct efx_nic *efx);
/** /**
* efx_filter_insert_filter - add or replace a filter * efx_filter_insert_filter - add or replace a filter
* @efx: NIC in which to insert the filter * @efx: NIC in which to insert the filter
...@@ -218,26 +206,10 @@ static inline bool efx_rss_active(struct efx_rss_context *ctx) ...@@ -218,26 +206,10 @@ static inline bool efx_rss_active(struct efx_rss_context *ctx)
return ctx->context_id != EFX_EF10_RSS_CONTEXT_INVALID; return ctx->context_id != EFX_EF10_RSS_CONTEXT_INVALID;
} }
/* Channels */
int efx_channel_dummy_op_int(struct efx_channel *channel);
void efx_channel_dummy_op_void(struct efx_channel *channel);
int efx_realloc_channels(struct efx_nic *efx, u32 rxq_entries, u32 txq_entries);
/* Ports */
int efx_reconfigure_port(struct efx_nic *efx);
int __efx_reconfigure_port(struct efx_nic *efx);
/* Ethtool support */ /* Ethtool support */
extern const struct ethtool_ops efx_ethtool_ops; extern const struct ethtool_ops efx_ethtool_ops;
/* Reset handling */
int efx_reset(struct efx_nic *efx, enum reset_type method);
void efx_reset_down(struct efx_nic *efx, enum reset_type method);
int efx_reset_up(struct efx_nic *efx, enum reset_type method, bool ok);
int efx_try_recovery(struct efx_nic *efx);
/* Global */ /* Global */
void efx_schedule_reset(struct efx_nic *efx, enum reset_type type);
unsigned int efx_usecs_to_ticks(struct efx_nic *efx, unsigned int usecs); unsigned int efx_usecs_to_ticks(struct efx_nic *efx, unsigned int usecs);
unsigned int efx_ticks_to_usecs(struct efx_nic *efx, unsigned int ticks); unsigned int efx_ticks_to_usecs(struct efx_nic *efx, unsigned int ticks);
int efx_init_irq_moderation(struct efx_nic *efx, unsigned int tx_usecs, int efx_init_irq_moderation(struct efx_nic *efx, unsigned int tx_usecs,
...@@ -245,8 +217,6 @@ int efx_init_irq_moderation(struct efx_nic *efx, unsigned int tx_usecs, ...@@ -245,8 +217,6 @@ int efx_init_irq_moderation(struct efx_nic *efx, unsigned int tx_usecs,
bool rx_may_override_tx); bool rx_may_override_tx);
void efx_get_irq_moderation(struct efx_nic *efx, unsigned int *tx_usecs, void efx_get_irq_moderation(struct efx_nic *efx, unsigned int *tx_usecs,
unsigned int *rx_usecs, bool *rx_adaptive); unsigned int *rx_usecs, bool *rx_adaptive);
void efx_stop_eventq(struct efx_channel *channel);
void efx_start_eventq(struct efx_channel *channel);
/* Dummy PHY ops for PHY drivers */ /* Dummy PHY ops for PHY drivers */
int efx_port_dummy_op_int(struct efx_nic *efx); int efx_port_dummy_op_int(struct efx_nic *efx);
...@@ -293,9 +263,6 @@ static inline void efx_schedule_channel_irq(struct efx_channel *channel) ...@@ -293,9 +263,6 @@ static inline void efx_schedule_channel_irq(struct efx_channel *channel)
efx_schedule_channel(channel); efx_schedule_channel(channel);
} }
void efx_link_status_changed(struct efx_nic *efx);
void efx_link_set_advertising(struct efx_nic *efx,
const unsigned long *advertising);
void efx_link_clear_advertising(struct efx_nic *efx); void efx_link_clear_advertising(struct efx_nic *efx);
void efx_link_set_wanted_fc(struct efx_nic *efx, u8); void efx_link_set_wanted_fc(struct efx_nic *efx, u8);
......
This diff is collapsed.
/* SPDX-License-Identifier: GPL-2.0-only */
/****************************************************************************
* Driver for Solarflare network controllers and boards
* Copyright 2018 Solarflare Communications Inc.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 as published
* by the Free Software Foundation, incorporated herein by reference.
*/
#ifndef EFX_CHANNELS_H
#define EFX_CHANNELS_H
int efx_probe_interrupts(struct efx_nic *efx);
void efx_remove_interrupts(struct efx_nic *efx);
int efx_soft_enable_interrupts(struct efx_nic *efx);
void efx_soft_disable_interrupts(struct efx_nic *efx);
int efx_enable_interrupts(struct efx_nic *efx);
void efx_disable_interrupts(struct efx_nic *efx);
void efx_set_interrupt_affinity(struct efx_nic *efx);
void efx_clear_interrupt_affinity(struct efx_nic *efx);
int efx_probe_eventq(struct efx_channel *channel);
int efx_init_eventq(struct efx_channel *channel);
void efx_start_eventq(struct efx_channel *channel);
void efx_stop_eventq(struct efx_channel *channel);
void efx_fini_eventq(struct efx_channel *channel);
void efx_remove_eventq(struct efx_channel *channel);
struct efx_channel *
efx_alloc_channel(struct efx_nic *efx, int i, struct efx_channel *old_channel);
int efx_realloc_channels(struct efx_nic *efx, u32 rxq_entries, u32 txq_entries);
void efx_get_channel_name(struct efx_channel *channel, char *buf, size_t len);
void efx_set_channel_names(struct efx_nic *efx);
int efx_init_channels(struct efx_nic *efx);
int efx_probe_channels(struct efx_nic *efx);
int efx_set_channels(struct efx_nic *efx);
bool efx_default_channel_want_txqs(struct efx_channel *channel);
void efx_remove_channel(struct efx_channel *channel);
void efx_remove_channels(struct efx_nic *efx);
void efx_fini_channels(struct efx_nic *efx);
struct efx_channel *efx_copy_channel(const struct efx_channel *old_channel);
void efx_start_channels(struct efx_nic *efx);
void efx_stop_channels(struct efx_nic *efx);
void efx_init_napi_channel(struct efx_channel *channel);
void efx_init_napi(struct efx_nic *efx);
void efx_fini_napi_channel(struct efx_channel *channel);
void efx_fini_napi(struct efx_nic *efx);
int efx_channel_dummy_op_int(struct efx_channel *channel);
void efx_channel_dummy_op_void(struct efx_channel *channel);
#endif
This diff is collapsed.
/* SPDX-License-Identifier: GPL-2.0-only */
/****************************************************************************
* Driver for Solarflare network controllers and boards
* Copyright 2018 Solarflare Communications Inc.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 as published
* by the Free Software Foundation, incorporated herein by reference.
*/
#ifndef EFX_COMMON_H
#define EFX_COMMON_H
int efx_init_io(struct efx_nic *efx, int bar, dma_addr_t dma_mask,
unsigned int mem_map_size);
void efx_fini_io(struct efx_nic *efx, int bar);
int efx_init_struct(struct efx_nic *efx, struct pci_dev *pci_dev,
struct net_device *net_dev);
void efx_fini_struct(struct efx_nic *efx);
void efx_start_all(struct efx_nic *efx);
void efx_stop_all(struct efx_nic *efx);
int efx_create_reset_workqueue(void);
void efx_queue_reset_work(struct efx_nic *efx);
void efx_flush_reset_workqueue(struct efx_nic *efx);
void efx_destroy_reset_workqueue(void);
void efx_start_monitor(struct efx_nic *efx);
int __efx_reconfigure_port(struct efx_nic *efx);
int efx_reconfigure_port(struct efx_nic *efx);
#define EFX_ASSERT_RESET_SERIALISED(efx) \
do { \
if ((efx->state == STATE_READY) || \
(efx->state == STATE_RECOVERY) || \
(efx->state == STATE_DISABLED)) \
ASSERT_RTNL(); \
} while (0)
int efx_try_recovery(struct efx_nic *efx);
void efx_reset_down(struct efx_nic *efx, enum reset_type method);
int efx_reset_up(struct efx_nic *efx, enum reset_type method, bool ok);
int efx_reset(struct efx_nic *efx, enum reset_type method);
void efx_schedule_reset(struct efx_nic *efx, enum reset_type type);
static inline int efx_check_disabled(struct efx_nic *efx)
{
if (efx->state == STATE_DISABLED || efx->state == STATE_RECOVERY) {
netif_err(efx, drv, efx->net_dev,
"device is disabled due to earlier errors\n");
return -EIO;
}
return 0;
}
void efx_mac_reconfigure(struct efx_nic *efx);
void efx_link_status_changed(struct efx_nic *efx);
#endif
...@@ -13,6 +13,9 @@ ...@@ -13,6 +13,9 @@
#include "workarounds.h" #include "workarounds.h"
#include "selftest.h" #include "selftest.h"
#include "efx.h" #include "efx.h"
#include "efx_channels.h"
#include "rx_common.h"
#include "tx_common.h"
#include "filter.h" #include "filter.h"
#include "nic.h" #include "nic.h"
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include "net_driver.h" #include "net_driver.h"
#include "bitfield.h" #include "bitfield.h"
#include "efx.h" #include "efx.h"
#include "rx_common.h"
#include "nic.h" #include "nic.h"
#include "farch_regs.h" #include "farch_regs.h"
#include "sriov.h" #include "sriov.h"
......
...@@ -346,7 +346,6 @@ int efx_mcdi_flush_rxqs(struct efx_nic *efx); ...@@ -346,7 +346,6 @@ int efx_mcdi_flush_rxqs(struct efx_nic *efx);
int efx_mcdi_port_probe(struct efx_nic *efx); int efx_mcdi_port_probe(struct efx_nic *efx);
void efx_mcdi_port_remove(struct efx_nic *efx); void efx_mcdi_port_remove(struct efx_nic *efx);
int efx_mcdi_port_reconfigure(struct efx_nic *efx); int efx_mcdi_port_reconfigure(struct efx_nic *efx);
int efx_mcdi_port_get_number(struct efx_nic *efx);
u32 efx_mcdi_phy_get_caps(struct efx_nic *efx); u32 efx_mcdi_phy_get_caps(struct efx_nic *efx);
void efx_mcdi_process_link_change(struct efx_nic *efx, efx_qword_t *ev); void efx_mcdi_process_link_change(struct efx_nic *efx, efx_qword_t *ev);
int efx_mcdi_set_mac(struct efx_nic *efx); int efx_mcdi_set_mac(struct efx_nic *efx);
......
/* SPDX-License-Identifier: GPL-2.0-only */
/****************************************************************************
* Driver for Solarflare network controllers and boards
* Copyright 2018 Solarflare Communications Inc.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 as published
* by the Free Software Foundation, incorporated herein by reference.
*/
#ifndef EFX_MCDI_FUNCTIONS_H
#define EFX_MCDI_FUNCTIONS_H
int efx_mcdi_alloc_vis(struct efx_nic *efx, unsigned int min_vis,
unsigned int max_vis, unsigned int *vi_base,
unsigned int *allocated_vis);
int efx_mcdi_free_vis(struct efx_nic *efx);
int efx_mcdi_ev_probe(struct efx_channel *channel);
int efx_mcdi_ev_init(struct efx_channel *channel, bool v1_cut_thru, bool v2);
void efx_mcdi_ev_remove(struct efx_channel *channel);
void efx_mcdi_ev_fini(struct efx_channel *channel);
int efx_mcdi_tx_init(struct efx_tx_queue *tx_queue, bool tso_v2);
void efx_mcdi_tx_remove(struct efx_tx_queue *tx_queue);
void efx_mcdi_tx_fini(struct efx_tx_queue *tx_queue);
int efx_mcdi_rx_probe(struct efx_rx_queue *rx_queue);
int efx_mcdi_rx_init(struct efx_rx_queue *rx_queue, bool want_outer_classes);
void efx_mcdi_rx_remove(struct efx_rx_queue *rx_queue);
void efx_mcdi_rx_fini(struct efx_rx_queue *rx_queue);
#endif
...@@ -14,23 +14,9 @@ ...@@ -14,23 +14,9 @@
#include "mcdi_pcol.h" #include "mcdi_pcol.h"
#include "nic.h" #include "nic.h"
#include "selftest.h" #include "selftest.h"
#include "mcdi_port_common.h"
struct efx_mcdi_phy_data { int efx_mcdi_get_phy_cfg(struct efx_nic *efx, struct efx_mcdi_phy_data *cfg)
u32 flags;
u32 type;
u32 supported_cap;
u32 channel;
u32 port;
u32 stats_mask;
u8 name[20];
u32 media;
u32 mmd_mask;
u8 revision[20];
u32 forced_cap;
};
static int
efx_mcdi_get_phy_cfg(struct efx_nic *efx, struct efx_mcdi_phy_data *cfg)
{ {
MCDI_DECLARE_BUF(outbuf, MC_CMD_GET_PHY_CFG_OUT_LEN); MCDI_DECLARE_BUF(outbuf, MC_CMD_GET_PHY_CFG_OUT_LEN);
size_t outlen; size_t outlen;
...@@ -70,7 +56,7 @@ efx_mcdi_get_phy_cfg(struct efx_nic *efx, struct efx_mcdi_phy_data *cfg) ...@@ -70,7 +56,7 @@ efx_mcdi_get_phy_cfg(struct efx_nic *efx, struct efx_mcdi_phy_data *cfg)
return rc; return rc;
} }
static int efx_mcdi_set_link(struct efx_nic *efx, u32 capabilities, int efx_mcdi_set_link(struct efx_nic *efx, u32 capabilities,
u32 flags, u32 loopback_mode, u32 flags, u32 loopback_mode,
u32 loopback_speed) u32 loopback_speed)
{ {
...@@ -89,7 +75,7 @@ static int efx_mcdi_set_link(struct efx_nic *efx, u32 capabilities, ...@@ -89,7 +75,7 @@ static int efx_mcdi_set_link(struct efx_nic *efx, u32 capabilities,
return rc; return rc;
} }
static int efx_mcdi_loopback_modes(struct efx_nic *efx, u64 *loopback_modes) int efx_mcdi_loopback_modes(struct efx_nic *efx, u64 *loopback_modes)
{ {
MCDI_DECLARE_BUF(outbuf, MC_CMD_GET_LOOPBACK_MODES_OUT_LEN); MCDI_DECLARE_BUF(outbuf, MC_CMD_GET_LOOPBACK_MODES_OUT_LEN);
size_t outlen; size_t outlen;
...@@ -168,7 +154,7 @@ static int efx_mcdi_mdio_write(struct net_device *net_dev, ...@@ -168,7 +154,7 @@ static int efx_mcdi_mdio_write(struct net_device *net_dev,
return 0; return 0;
} }
static void mcdi_to_ethtool_linkset(u32 media, u32 cap, unsigned long *linkset) void mcdi_to_ethtool_linkset(u32 media, u32 cap, unsigned long *linkset)
{ {
#define SET_BIT(name) __set_bit(ETHTOOL_LINK_MODE_ ## name ## _BIT, \ #define SET_BIT(name) __set_bit(ETHTOOL_LINK_MODE_ ## name ## _BIT, \
linkset) linkset)
...@@ -232,7 +218,7 @@ static void mcdi_to_ethtool_linkset(u32 media, u32 cap, unsigned long *linkset) ...@@ -232,7 +218,7 @@ static void mcdi_to_ethtool_linkset(u32 media, u32 cap, unsigned long *linkset)
#undef SET_BIT #undef SET_BIT
} }
static u32 ethtool_linkset_to_mcdi_cap(const unsigned long *linkset) u32 ethtool_linkset_to_mcdi_cap(const unsigned long *linkset)
{ {
u32 result = 0; u32 result = 0;
...@@ -273,7 +259,7 @@ static u32 ethtool_linkset_to_mcdi_cap(const unsigned long *linkset) ...@@ -273,7 +259,7 @@ static u32 ethtool_linkset_to_mcdi_cap(const unsigned long *linkset)
return result; return result;
} }
static u32 efx_get_mcdi_phy_flags(struct efx_nic *efx) u32 efx_get_mcdi_phy_flags(struct efx_nic *efx)
{ {
struct efx_mcdi_phy_data *phy_cfg = efx->phy_data; struct efx_mcdi_phy_data *phy_cfg = efx->phy_data;
enum efx_phy_mode mode, supported; enum efx_phy_mode mode, supported;
...@@ -301,7 +287,7 @@ static u32 efx_get_mcdi_phy_flags(struct efx_nic *efx) ...@@ -301,7 +287,7 @@ static u32 efx_get_mcdi_phy_flags(struct efx_nic *efx)
return flags; return flags;
} }
static u8 mcdi_to_ethtool_media(u32 media) u8 mcdi_to_ethtool_media(u32 media)
{ {
switch (media) { switch (media) {
case MC_CMD_MEDIA_XAUI: case MC_CMD_MEDIA_XAUI:
...@@ -322,7 +308,7 @@ static u8 mcdi_to_ethtool_media(u32 media) ...@@ -322,7 +308,7 @@ static u8 mcdi_to_ethtool_media(u32 media)
} }
} }
static void efx_mcdi_phy_decode_link(struct efx_nic *efx, void efx_mcdi_phy_decode_link(struct efx_nic *efx,
struct efx_link_state *link_state, struct efx_link_state *link_state,
u32 speed, u32 flags, u32 fcntl) u32 speed, u32 flags, u32 fcntl)
{ {
...@@ -365,7 +351,7 @@ static void efx_mcdi_phy_decode_link(struct efx_nic *efx, ...@@ -365,7 +351,7 @@ static void efx_mcdi_phy_decode_link(struct efx_nic *efx,
* Both RS and BASER (whether AUTO or not) means use FEC if cable and link * Both RS and BASER (whether AUTO or not) means use FEC if cable and link
* partner support it, preferring RS to BASER. * partner support it, preferring RS to BASER.
*/ */
static u32 ethtool_fec_caps_to_mcdi(u32 ethtool_cap) u32 ethtool_fec_caps_to_mcdi(u32 ethtool_cap)
{ {
u32 ret = 0; u32 ret = 0;
...@@ -392,7 +378,7 @@ static u32 ethtool_fec_caps_to_mcdi(u32 ethtool_cap) ...@@ -392,7 +378,7 @@ static u32 ethtool_fec_caps_to_mcdi(u32 ethtool_cap)
* maps both of those to AUTO. This should never matter, and it's not clear * maps both of those to AUTO. This should never matter, and it's not clear
* what a better mapping would be anyway. * what a better mapping would be anyway.
*/ */
static u32 mcdi_fec_caps_to_ethtool(u32 caps, bool is_25g) u32 mcdi_fec_caps_to_ethtool(u32 caps, bool is_25g)
{ {
bool rs = caps & (1 << MC_CMD_PHY_CAP_RS_FEC_LBN), bool rs = caps & (1 << MC_CMD_PHY_CAP_RS_FEC_LBN),
rs_req = caps & (1 << MC_CMD_PHY_CAP_RS_FEC_REQUESTED_LBN), rs_req = caps & (1 << MC_CMD_PHY_CAP_RS_FEC_REQUESTED_LBN),
...@@ -530,7 +516,7 @@ int efx_mcdi_port_reconfigure(struct efx_nic *efx) ...@@ -530,7 +516,7 @@ int efx_mcdi_port_reconfigure(struct efx_nic *efx)
/* Verify that the forced flow control settings (!EFX_FC_AUTO) are /* Verify that the forced flow control settings (!EFX_FC_AUTO) are
* supported by the link partner. Warn the user if this isn't the case * supported by the link partner. Warn the user if this isn't the case
*/ */
static void efx_mcdi_phy_check_fcntl(struct efx_nic *efx, u32 lpa) void efx_mcdi_phy_check_fcntl(struct efx_nic *efx, u32 lpa)
{ {
struct efx_mcdi_phy_data *phy_cfg = efx->phy_data; struct efx_mcdi_phy_data *phy_cfg = efx->phy_data;
u32 rmtadv; u32 rmtadv;
...@@ -555,7 +541,7 @@ static void efx_mcdi_phy_check_fcntl(struct efx_nic *efx, u32 lpa) ...@@ -555,7 +541,7 @@ static void efx_mcdi_phy_check_fcntl(struct efx_nic *efx, u32 lpa)
"warning: link partner doesn't support pause frames"); "warning: link partner doesn't support pause frames");
} }
static bool efx_mcdi_phy_poll(struct efx_nic *efx) bool efx_mcdi_phy_poll(struct efx_nic *efx)
{ {
struct efx_link_state old_state = efx->link_state; struct efx_link_state old_state = efx->link_state;
MCDI_DECLARE_BUF(outbuf, MC_CMD_GET_LINK_OUT_LEN); MCDI_DECLARE_BUF(outbuf, MC_CMD_GET_LINK_OUT_LEN);
...@@ -666,7 +652,7 @@ efx_mcdi_phy_set_link_ksettings(struct efx_nic *efx, ...@@ -666,7 +652,7 @@ efx_mcdi_phy_set_link_ksettings(struct efx_nic *efx,
return 0; return 0;
} }
static int efx_mcdi_phy_get_fecparam(struct efx_nic *efx, int efx_mcdi_phy_get_fecparam(struct efx_nic *efx,
struct ethtool_fecparam *fec) struct ethtool_fecparam *fec)
{ {
MCDI_DECLARE_BUF(outbuf, MC_CMD_GET_LINK_OUT_V2_LEN); MCDI_DECLARE_BUF(outbuf, MC_CMD_GET_LINK_OUT_V2_LEN);
...@@ -745,7 +731,7 @@ static int efx_mcdi_phy_set_fecparam(struct efx_nic *efx, ...@@ -745,7 +731,7 @@ static int efx_mcdi_phy_set_fecparam(struct efx_nic *efx,
return 0; return 0;
} }
static int efx_mcdi_phy_test_alive(struct efx_nic *efx) int efx_mcdi_phy_test_alive(struct efx_nic *efx)
{ {
MCDI_DECLARE_BUF(outbuf, MC_CMD_GET_PHY_STATE_OUT_LEN); MCDI_DECLARE_BUF(outbuf, MC_CMD_GET_PHY_STATE_OUT_LEN);
size_t outlen; size_t outlen;
......
/* SPDX-License-Identifier: GPL-2.0-only */
/****************************************************************************
* Driver for Solarflare network controllers and boards
* Copyright 2018 Solarflare Communications Inc.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 as published
* by the Free Software Foundation, incorporated herein by reference.
*/
#ifndef EFX_MCDI_PORT_COMMON_H
#define EFX_MCDI_PORT_COMMON_H
#include "net_driver.h"
#include "mcdi.h"
#include "mcdi_pcol.h"
struct efx_mcdi_phy_data {
u32 flags;
u32 type;
u32 supported_cap;
u32 channel;
u32 port;
u32 stats_mask;
u8 name[20];
u32 media;
u32 mmd_mask;
u8 revision[20];
u32 forced_cap;
};
int efx_mcdi_get_phy_cfg(struct efx_nic *efx, struct efx_mcdi_phy_data *cfg);
void efx_link_set_advertising(struct efx_nic *efx,
const unsigned long *advertising);
int efx_mcdi_set_link(struct efx_nic *efx, u32 capabilities,
u32 flags, u32 loopback_mode, u32 loopback_speed);
int efx_mcdi_loopback_modes(struct efx_nic *efx, u64 *loopback_modes);
void mcdi_to_ethtool_linkset(u32 media, u32 cap, unsigned long *linkset);
u32 ethtool_linkset_to_mcdi_cap(const unsigned long *linkset);
u32 efx_get_mcdi_phy_flags(struct efx_nic *efx);
u8 mcdi_to_ethtool_media(u32 media);
void efx_mcdi_phy_decode_link(struct efx_nic *efx,
struct efx_link_state *link_state,
u32 speed, u32 flags, u32 fcntl);
u32 ethtool_fec_caps_to_mcdi(u32 ethtool_cap);
u32 mcdi_fec_caps_to_ethtool(u32 caps, bool is_25g);
void efx_mcdi_phy_check_fcntl(struct efx_nic *efx, u32 lpa);
bool efx_mcdi_phy_poll(struct efx_nic *efx);
int efx_mcdi_phy_get_fecparam(struct efx_nic *efx,
struct ethtool_fecparam *fec);
int efx_mcdi_phy_test_alive(struct efx_nic *efx);
int efx_mcdi_port_get_number(struct efx_nic *efx);
#endif
...@@ -138,6 +138,8 @@ struct efx_special_buffer { ...@@ -138,6 +138,8 @@ struct efx_special_buffer {
* freed when descriptor completes * freed when descriptor completes
* @xdpf: When @flags & %EFX_TX_BUF_XDP, the XDP frame information; its @data * @xdpf: When @flags & %EFX_TX_BUF_XDP, the XDP frame information; its @data
* member is the associated buffer to drop a page reference on. * member is the associated buffer to drop a page reference on.
* @option: When @flags & %EFX_TX_BUF_OPTION, an EF10-specific option
* descriptor.
* @dma_addr: DMA address of the fragment. * @dma_addr: DMA address of the fragment.
* @flags: Flags for allocation and DMA mapping type * @flags: Flags for allocation and DMA mapping type
* @len: Length of this fragment. * @len: Length of this fragment.
...@@ -152,7 +154,7 @@ struct efx_tx_buffer { ...@@ -152,7 +154,7 @@ struct efx_tx_buffer {
struct xdp_frame *xdpf; struct xdp_frame *xdpf;
}; };
union { union {
efx_qword_t option; efx_qword_t option; /* EF10 */
dma_addr_t dma_addr; dma_addr_t dma_addr;
}; };
unsigned short flags; unsigned short flags;
...@@ -1610,6 +1612,15 @@ static inline struct efx_rx_buffer *efx_rx_buffer(struct efx_rx_queue *rx_queue, ...@@ -1610,6 +1612,15 @@ static inline struct efx_rx_buffer *efx_rx_buffer(struct efx_rx_queue *rx_queue,
return &rx_queue->buffer[index]; return &rx_queue->buffer[index];
} }
static inline struct efx_rx_buffer *
efx_rx_buf_next(struct efx_rx_queue *rx_queue, struct efx_rx_buffer *rx_buf)
{
if (unlikely(rx_buf == efx_rx_buffer(rx_queue, rx_queue->ptr_mask)))
return efx_rx_buffer(rx_queue, 0);
else
return rx_buf + 1;
}
/** /**
* EFX_MAX_FRAME_LEN - calculate maximum frame length * EFX_MAX_FRAME_LEN - calculate maximum frame length
* *
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include <linux/net_tstamp.h> #include <linux/net_tstamp.h>
#include "net_driver.h" #include "net_driver.h"
#include "efx.h" #include "efx.h"
#include "efx_common.h"
#include "mcdi.h" #include "mcdi.h"
enum { enum {
...@@ -505,6 +506,9 @@ static inline void efx_nic_push_buffers(struct efx_tx_queue *tx_queue) ...@@ -505,6 +506,9 @@ static inline void efx_nic_push_buffers(struct efx_tx_queue *tx_queue)
tx_queue->efx->type->tx_write(tx_queue); tx_queue->efx->type->tx_write(tx_queue);
} }
int efx_enqueue_skb_tso(struct efx_tx_queue *tx_queue, struct sk_buff *skb,
bool *data_mapped);
/* RX data path */ /* RX data path */
static inline int efx_nic_probe_rx(struct efx_rx_queue *rx_queue) static inline int efx_nic_probe_rx(struct efx_rx_queue *rx_queue)
{ {
...@@ -553,6 +557,7 @@ static inline void efx_nic_eventq_read_ack(struct efx_channel *channel) ...@@ -553,6 +557,7 @@ static inline void efx_nic_eventq_read_ack(struct efx_channel *channel)
{ {
channel->efx->type->ev_read_ack(channel); channel->efx->type->ev_read_ack(channel);
} }
void efx_nic_event_test_start(struct efx_channel *channel); void efx_nic_event_test_start(struct efx_channel *channel);
/* Falcon/Siena queue operations */ /* Falcon/Siena queue operations */
...@@ -670,6 +675,7 @@ struct efx_farch_register_test { ...@@ -670,6 +675,7 @@ struct efx_farch_register_test {
unsigned address; unsigned address;
efx_oword_t mask; efx_oword_t mask;
}; };
int efx_farch_test_registers(struct efx_nic *efx, int efx_farch_test_registers(struct efx_nic *efx,
const struct efx_farch_register_test *regs, const struct efx_farch_register_test *regs,
size_t n_regs); size_t n_regs);
......
This diff is collapsed.
This diff is collapsed.
/* SPDX-License-Identifier: GPL-2.0-only */
/****************************************************************************
* Driver for Solarflare network controllers and boards
* Copyright 2018 Solarflare Communications Inc.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 as published
* by the Free Software Foundation, incorporated herein by reference.
*/
#ifndef EFX_RX_COMMON_H
#define EFX_RX_COMMON_H
/* Preferred number of descriptors to fill at once */
#define EFX_RX_PREFERRED_BATCH 8U
/* Each packet can consume up to ceil(max_frame_len / buffer_size) buffers */
#define EFX_RX_MAX_FRAGS DIV_ROUND_UP(EFX_MAX_FRAME_LEN(EFX_MAX_MTU), \
EFX_RX_USR_BUF_SIZE)
void efx_rx_slow_fill(struct timer_list *t);
int efx_probe_rx_queue(struct efx_rx_queue *rx_queue);
void efx_init_rx_queue(struct efx_rx_queue *rx_queue);
void efx_fini_rx_queue(struct efx_rx_queue *rx_queue);
void efx_remove_rx_queue(struct efx_rx_queue *rx_queue);
void efx_destroy_rx_queue(struct efx_rx_queue *rx_queue);
void efx_init_rx_buffer(struct efx_rx_queue *rx_queue,
struct page *page,
unsigned int page_offset,
u16 flags);
void efx_unmap_rx_buffer(struct efx_nic *efx, struct efx_rx_buffer *rx_buf);
void efx_free_rx_buffers(struct efx_rx_queue *rx_queue,
struct efx_rx_buffer *rx_buf,
unsigned int num_bufs);
void efx_schedule_slow_fill(struct efx_rx_queue *rx_queue);
void efx_rx_config_page_split(struct efx_nic *efx);
void efx_fast_push_rx_descriptors(struct efx_rx_queue *rx_queue, bool atomic);
#endif
...@@ -18,6 +18,8 @@ ...@@ -18,6 +18,8 @@
#include <linux/slab.h> #include <linux/slab.h>
#include "net_driver.h" #include "net_driver.h"
#include "efx.h" #include "efx.h"
#include "efx_common.h"
#include "efx_channels.h"
#include "nic.h" #include "nic.h"
#include "selftest.h" #include "selftest.h"
#include "workarounds.h" #include "workarounds.h"
......
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
#include "net_driver.h" #include "net_driver.h"
#include "bitfield.h" #include "bitfield.h"
#include "efx.h" #include "efx.h"
#include "efx_common.h"
#include "nic.h" #include "nic.h"
#include "farch_regs.h" #include "farch_regs.h"
#include "io.h" #include "io.h"
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include <linux/module.h> #include <linux/module.h>
#include "net_driver.h" #include "net_driver.h"
#include "efx.h" #include "efx.h"
#include "efx_channels.h"
#include "nic.h" #include "nic.h"
#include "io.h" #include "io.h"
#include "mcdi.h" #include "mcdi.h"
......
This diff is collapsed.
This diff is collapsed.
/* SPDX-License-Identifier: GPL-2.0-only */
/****************************************************************************
* Driver for Solarflare network controllers and boards
* Copyright 2018 Solarflare Communications Inc.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 as published
* by the Free Software Foundation, incorporated herein by reference.
*/
#ifndef EFX_TX_COMMON_H
#define EFX_TX_COMMON_H
int efx_probe_tx_queue(struct efx_tx_queue *tx_queue);
void efx_init_tx_queue(struct efx_tx_queue *tx_queue);
void efx_fini_tx_queue(struct efx_tx_queue *tx_queue);
void efx_remove_tx_queue(struct efx_tx_queue *tx_queue);
void efx_dequeue_buffer(struct efx_tx_queue *tx_queue,
struct efx_tx_buffer *buffer,
unsigned int *pkts_compl,
unsigned int *bytes_compl);
struct efx_tx_buffer *efx_tx_map_chunk(struct efx_tx_queue *tx_queue,
dma_addr_t dma_addr, size_t len);
int efx_tx_map_data(struct efx_tx_queue *tx_queue, struct sk_buff *skb,
unsigned int segment_count);
unsigned int efx_tx_max_skb_descs(struct efx_nic *efx);
#endif
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