Commit 04c85bfb authored by David S. Miller's avatar David S. Miller

Merge branch '100GbE' of git://git.kernel.org/pub/scm/linux/kernel/git/jkirsher/next-queue

Jeff Kirsher says:

====================
100GbE Intel Wired LAN Driver Updates 2016-04-05

This series contains updates to fm10k only.

Bruce provides nearly half of the patches in the series, most of which do
general cleanup of the driver.  These include semantic cleanups,
checkpatch.pl fixes, update driver to use BIT() kernel macro, use
BUILD_BUG_ON() where appropriate and use ether_addr_copy() instead of
memcpy().

Jake provides the remaining patches in the series, starting with a fix
for a possible NULL pointer deference.  Next delays initialization of the
service timer and service task until late in probe().  If we do not wait,
failures in probe do not properly cleanup the service timer or service
task items which result in a kernel panic.  Added better reporting during
error conditions.  Fixed another possible kernel panic where we were
clearing the interrupt scheme before we freed the mailbox IRQ.  Added
helper functions for setting strings and data for ethtool stats.  Fixed
comment mis-spelled words.

v2: Dropped patch 3 from the original submission, until a better solution
    can be worked up based on feedback from Joe Perches and David Miller.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 265bee72 0ea7fae4
...@@ -262,12 +262,12 @@ struct fm10k_intfc { ...@@ -262,12 +262,12 @@ struct fm10k_intfc {
unsigned long state; unsigned long state;
u32 flags; u32 flags;
#define FM10K_FLAG_RESET_REQUESTED (u32)(1 << 0) #define FM10K_FLAG_RESET_REQUESTED (u32)(BIT(0))
#define FM10K_FLAG_RSS_FIELD_IPV4_UDP (u32)(1 << 1) #define FM10K_FLAG_RSS_FIELD_IPV4_UDP (u32)(BIT(1))
#define FM10K_FLAG_RSS_FIELD_IPV6_UDP (u32)(1 << 2) #define FM10K_FLAG_RSS_FIELD_IPV6_UDP (u32)(BIT(2))
#define FM10K_FLAG_RX_TS_ENABLED (u32)(1 << 3) #define FM10K_FLAG_RX_TS_ENABLED (u32)(BIT(3))
#define FM10K_FLAG_SWPRI_CONFIG (u32)(1 << 4) #define FM10K_FLAG_SWPRI_CONFIG (u32)(BIT(4))
#define FM10K_FLAG_DEBUG_STATS (u32)(1 << 5) #define FM10K_FLAG_DEBUG_STATS (u32)(BIT(5))
int xcast_mode; int xcast_mode;
/* Tx fast path data */ /* Tx fast path data */
...@@ -510,6 +510,8 @@ int fm10k_close(struct net_device *netdev); ...@@ -510,6 +510,8 @@ int fm10k_close(struct net_device *netdev);
/* Ethtool */ /* Ethtool */
void fm10k_set_ethtool_ops(struct net_device *dev); void fm10k_set_ethtool_ops(struct net_device *dev);
u32 fm10k_get_reta_size(struct net_device *netdev);
void fm10k_write_reta(struct fm10k_intfc *interface, const u32 *indir);
/* IOV */ /* IOV */
s32 fm10k_iov_event(struct fm10k_intfc *interface); s32 fm10k_iov_event(struct fm10k_intfc *interface);
......
...@@ -50,7 +50,7 @@ s32 fm10k_iov_event(struct fm10k_intfc *interface) ...@@ -50,7 +50,7 @@ s32 fm10k_iov_event(struct fm10k_intfc *interface)
s64 vflre; s64 vflre;
int i; int i;
/* if there is no iov_data then there is no mailboxes to process */ /* if there is no iov_data then there is no mailbox to process */
if (!ACCESS_ONCE(interface->iov_data)) if (!ACCESS_ONCE(interface->iov_data))
return 0; return 0;
...@@ -98,7 +98,7 @@ s32 fm10k_iov_mbx(struct fm10k_intfc *interface) ...@@ -98,7 +98,7 @@ s32 fm10k_iov_mbx(struct fm10k_intfc *interface)
struct fm10k_iov_data *iov_data; struct fm10k_iov_data *iov_data;
int i; int i;
/* if there is no iov_data then there is no mailboxes to process */ /* if there is no iov_data then there is no mailbox to process */
if (!ACCESS_ONCE(interface->iov_data)) if (!ACCESS_ONCE(interface->iov_data))
return 0; return 0;
......
...@@ -401,10 +401,10 @@ static inline void fm10k_rx_checksum(struct fm10k_ring *ring, ...@@ -401,10 +401,10 @@ static inline void fm10k_rx_checksum(struct fm10k_ring *ring,
} }
#define FM10K_RSS_L4_TYPES_MASK \ #define FM10K_RSS_L4_TYPES_MASK \
((1ul << FM10K_RSSTYPE_IPV4_TCP) | \ (BIT(FM10K_RSSTYPE_IPV4_TCP) | \
(1ul << FM10K_RSSTYPE_IPV4_UDP) | \ BIT(FM10K_RSSTYPE_IPV4_UDP) | \
(1ul << FM10K_RSSTYPE_IPV6_TCP) | \ BIT(FM10K_RSSTYPE_IPV6_TCP) | \
(1ul << FM10K_RSSTYPE_IPV6_UDP)) BIT(FM10K_RSSTYPE_IPV6_UDP))
static inline void fm10k_rx_hash(struct fm10k_ring *ring, static inline void fm10k_rx_hash(struct fm10k_ring *ring,
union fm10k_rx_desc *rx_desc, union fm10k_rx_desc *rx_desc,
...@@ -420,7 +420,7 @@ static inline void fm10k_rx_hash(struct fm10k_ring *ring, ...@@ -420,7 +420,7 @@ static inline void fm10k_rx_hash(struct fm10k_ring *ring,
return; return;
skb_set_hash(skb, le32_to_cpu(rx_desc->d.rss), skb_set_hash(skb, le32_to_cpu(rx_desc->d.rss),
(FM10K_RSS_L4_TYPES_MASK & (1ul << rss_type)) ? (BIT(rss_type) & FM10K_RSS_L4_TYPES_MASK) ?
PKT_HASH_TYPE_L4 : PKT_HASH_TYPE_L3); PKT_HASH_TYPE_L4 : PKT_HASH_TYPE_L3);
} }
...@@ -1409,7 +1409,7 @@ static void fm10k_update_itr(struct fm10k_ring_container *ring_container) ...@@ -1409,7 +1409,7 @@ static void fm10k_update_itr(struct fm10k_ring_container *ring_container)
* accounts for changes in the ITR due to PCIe link speed. * accounts for changes in the ITR due to PCIe link speed.
*/ */
itr_round = ACCESS_ONCE(ring_container->itr_scale) + 8; itr_round = ACCESS_ONCE(ring_container->itr_scale) + 8;
avg_wire_size += (1 << itr_round) - 1; avg_wire_size += BIT(itr_round) - 1;
avg_wire_size >>= itr_round; avg_wire_size >>= itr_round;
/* write back value and retain adaptive flag */ /* write back value and retain adaptive flag */
...@@ -1511,17 +1511,17 @@ static bool fm10k_set_qos_queues(struct fm10k_intfc *interface) ...@@ -1511,17 +1511,17 @@ static bool fm10k_set_qos_queues(struct fm10k_intfc *interface)
/* set QoS mask and indices */ /* set QoS mask and indices */
f = &interface->ring_feature[RING_F_QOS]; f = &interface->ring_feature[RING_F_QOS];
f->indices = pcs; f->indices = pcs;
f->mask = (1 << fls(pcs - 1)) - 1; f->mask = BIT(fls(pcs - 1)) - 1;
/* determine the upper limit for our current DCB mode */ /* determine the upper limit for our current DCB mode */
rss_i = interface->hw.mac.max_queues / pcs; rss_i = interface->hw.mac.max_queues / pcs;
rss_i = 1 << (fls(rss_i) - 1); rss_i = BIT(fls(rss_i) - 1);
/* set RSS mask and indices */ /* set RSS mask and indices */
f = &interface->ring_feature[RING_F_RSS]; f = &interface->ring_feature[RING_F_RSS];
rss_i = min_t(u16, rss_i, f->limit); rss_i = min_t(u16, rss_i, f->limit);
f->indices = rss_i; f->indices = rss_i;
f->mask = (1 << fls(rss_i - 1)) - 1; f->mask = BIT(fls(rss_i - 1)) - 1;
/* configure pause class to queue mapping */ /* configure pause class to queue mapping */
for (i = 0; i < pcs; i++) for (i = 0; i < pcs; i++)
...@@ -1551,7 +1551,7 @@ static bool fm10k_set_rss_queues(struct fm10k_intfc *interface) ...@@ -1551,7 +1551,7 @@ static bool fm10k_set_rss_queues(struct fm10k_intfc *interface)
/* record indices and power of 2 mask for RSS */ /* record indices and power of 2 mask for RSS */
f->indices = rss_i; f->indices = rss_i;
f->mask = (1 << fls(rss_i - 1)) - 1; f->mask = BIT(fls(rss_i - 1)) - 1;
interface->num_rx_queues = rss_i; interface->num_rx_queues = rss_i;
interface->num_tx_queues = rss_i; interface->num_tx_queues = rss_i;
...@@ -1572,16 +1572,28 @@ static bool fm10k_set_rss_queues(struct fm10k_intfc *interface) ...@@ -1572,16 +1572,28 @@ static bool fm10k_set_rss_queues(struct fm10k_intfc *interface)
**/ **/
static void fm10k_set_num_queues(struct fm10k_intfc *interface) static void fm10k_set_num_queues(struct fm10k_intfc *interface)
{ {
/* Start with base case */ /* Attempt to setup QoS and RSS first */
interface->num_rx_queues = 1;
interface->num_tx_queues = 1;
if (fm10k_set_qos_queues(interface)) if (fm10k_set_qos_queues(interface))
return; return;
/* If we don't have QoS, just fallback to only RSS. */
fm10k_set_rss_queues(interface); fm10k_set_rss_queues(interface);
} }
/**
* fm10k_reset_num_queues - Reset the number of queues to zero
* @interface: board private structure
*
* This function should be called whenever we need to reset the number of
* queues after an error condition.
*/
static void fm10k_reset_num_queues(struct fm10k_intfc *interface)
{
interface->num_tx_queues = 0;
interface->num_rx_queues = 0;
interface->num_q_vectors = 0;
}
/** /**
* fm10k_alloc_q_vector - Allocate memory for a single interrupt vector * fm10k_alloc_q_vector - Allocate memory for a single interrupt vector
* @interface: board private structure to initialize * @interface: board private structure to initialize
...@@ -1765,9 +1777,7 @@ static int fm10k_alloc_q_vectors(struct fm10k_intfc *interface) ...@@ -1765,9 +1777,7 @@ static int fm10k_alloc_q_vectors(struct fm10k_intfc *interface)
return 0; return 0;
err_out: err_out:
interface->num_tx_queues = 0; fm10k_reset_num_queues(interface);
interface->num_rx_queues = 0;
interface->num_q_vectors = 0;
while (v_idx--) while (v_idx--)
fm10k_free_q_vector(interface, v_idx); fm10k_free_q_vector(interface, v_idx);
...@@ -1787,9 +1797,7 @@ static void fm10k_free_q_vectors(struct fm10k_intfc *interface) ...@@ -1787,9 +1797,7 @@ static void fm10k_free_q_vectors(struct fm10k_intfc *interface)
{ {
int v_idx = interface->num_q_vectors; int v_idx = interface->num_q_vectors;
interface->num_tx_queues = 0; fm10k_reset_num_queues(interface);
interface->num_rx_queues = 0;
interface->num_q_vectors = 0;
while (v_idx--) while (v_idx--)
fm10k_free_q_vector(interface, v_idx); fm10k_free_q_vector(interface, v_idx);
...@@ -1935,7 +1943,8 @@ static void fm10k_assign_rings(struct fm10k_intfc *interface) ...@@ -1935,7 +1943,8 @@ static void fm10k_assign_rings(struct fm10k_intfc *interface)
static void fm10k_init_reta(struct fm10k_intfc *interface) static void fm10k_init_reta(struct fm10k_intfc *interface)
{ {
u16 i, rss_i = interface->ring_feature[RING_F_RSS].indices; u16 i, rss_i = interface->ring_feature[RING_F_RSS].indices;
u32 reta, base; struct net_device *netdev = interface->netdev;
u32 reta, *indir;
/* If the Rx flow indirection table has been configured manually, we /* If the Rx flow indirection table has been configured manually, we
* need to maintain it when possible. * need to maintain it when possible.
...@@ -1960,21 +1969,16 @@ static void fm10k_init_reta(struct fm10k_intfc *interface) ...@@ -1960,21 +1969,16 @@ static void fm10k_init_reta(struct fm10k_intfc *interface)
} }
repopulate_reta: repopulate_reta:
/* Populate the redirection table 4 entries at a time. To do this indir = kcalloc(fm10k_get_reta_size(netdev),
* we are generating the results for n and n+2 and then interleaving sizeof(indir[0]), GFP_KERNEL);
* those with the results with n+1 and n+3.
*/
for (i = FM10K_RETA_SIZE; i--;) {
/* first pass generates n and n+2 */
base = ((i * 0x00040004) + 0x00020000) * rss_i;
reta = (base & 0x3F803F80) >> 7;
/* second pass generates n+1 and n+3 */ /* generate redirection table using the default kernel policy */
base += 0x00010001 * rss_i; for (i = 0; i < fm10k_get_reta_size(netdev); i++)
reta |= (base & 0x3F803F80) << 1; indir[i] = ethtool_rxfh_indir_default(i, rss_i);
interface->reta[i] = reta; fm10k_write_reta(interface, indir);
}
kfree(indir);
} }
/** /**
...@@ -1997,14 +2001,15 @@ int fm10k_init_queueing_scheme(struct fm10k_intfc *interface) ...@@ -1997,14 +2001,15 @@ int fm10k_init_queueing_scheme(struct fm10k_intfc *interface)
if (err) { if (err) {
dev_err(&interface->pdev->dev, dev_err(&interface->pdev->dev,
"Unable to initialize MSI-X capability\n"); "Unable to initialize MSI-X capability\n");
return err; goto err_init_msix;
} }
/* Allocate memory for queues */ /* Allocate memory for queues */
err = fm10k_alloc_q_vectors(interface); err = fm10k_alloc_q_vectors(interface);
if (err) { if (err) {
fm10k_reset_msix_capability(interface); dev_err(&interface->pdev->dev,
return err; "Unable to allocate queue vectors\n");
goto err_alloc_q_vectors;
} }
/* Map rings to devices, and map devices to physical queues */ /* Map rings to devices, and map devices to physical queues */
...@@ -2014,6 +2019,12 @@ int fm10k_init_queueing_scheme(struct fm10k_intfc *interface) ...@@ -2014,6 +2019,12 @@ int fm10k_init_queueing_scheme(struct fm10k_intfc *interface)
fm10k_init_reta(interface); fm10k_init_reta(interface);
return 0; return 0;
err_alloc_q_vectors:
fm10k_reset_msix_capability(interface);
err_init_msix:
fm10k_reset_num_queues(interface);
return err;
} }
/** /**
......
...@@ -440,7 +440,7 @@ static void fm10k_restore_vxlan_port(struct fm10k_intfc *interface) ...@@ -440,7 +440,7 @@ static void fm10k_restore_vxlan_port(struct fm10k_intfc *interface)
* @sa_family: Address family of new port * @sa_family: Address family of new port
* @port: port number used for VXLAN * @port: port number used for VXLAN
* *
* This funciton is called when a new VXLAN interface has added a new port * This function is called when a new VXLAN interface has added a new port
* number to the range that is currently in use for VXLAN. The new port * number to the range that is currently in use for VXLAN. The new port
* number is always added to the tail so that the port number list should * number is always added to the tail so that the port number list should
* match the order in which the ports were allocated. The head of the list * match the order in which the ports were allocated. The head of the list
...@@ -484,7 +484,7 @@ static void fm10k_add_vxlan_port(struct net_device *dev, ...@@ -484,7 +484,7 @@ static void fm10k_add_vxlan_port(struct net_device *dev,
* @sa_family: Address family of freed port * @sa_family: Address family of freed port
* @port: port number used for VXLAN * @port: port number used for VXLAN
* *
* This funciton is called when a new VXLAN interface has freed a port * This function is called when a new VXLAN interface has freed a port
* number from the range that is currently in use for VXLAN. The freed * number from the range that is currently in use for VXLAN. The freed
* port is removed from the list and the new head is used to determine * port is removed from the list and the new head is used to determine
* the port number for offloads. * the port number for offloads.
...@@ -1429,7 +1429,7 @@ struct net_device *fm10k_alloc_netdev(const struct fm10k_info *info) ...@@ -1429,7 +1429,7 @@ struct net_device *fm10k_alloc_netdev(const struct fm10k_info *info)
/* configure default debug level */ /* configure default debug level */
interface = netdev_priv(dev); interface = netdev_priv(dev);
interface->msg_enable = (1 << DEFAULT_DEBUG_LEVEL_SHIFT) - 1; interface->msg_enable = BIT(DEFAULT_DEBUG_LEVEL_SHIFT) - 1;
/* configure default features */ /* configure default features */
dev->features |= NETIF_F_IP_CSUM | dev->features |= NETIF_F_IP_CSUM |
......
...@@ -99,7 +99,7 @@ void fm10k_service_event_schedule(struct fm10k_intfc *interface) ...@@ -99,7 +99,7 @@ void fm10k_service_event_schedule(struct fm10k_intfc *interface)
static void fm10k_service_event_complete(struct fm10k_intfc *interface) static void fm10k_service_event_complete(struct fm10k_intfc *interface)
{ {
BUG_ON(!test_bit(__FM10K_SERVICE_SCHED, &interface->state)); WARN_ON(!test_bit(__FM10K_SERVICE_SCHED, &interface->state));
/* flush memory to make sure state is correct before next watchog */ /* flush memory to make sure state is correct before next watchog */
smp_mb__before_atomic(); smp_mb__before_atomic();
...@@ -579,7 +579,7 @@ static void fm10k_configure_tx_ring(struct fm10k_intfc *interface, ...@@ -579,7 +579,7 @@ static void fm10k_configure_tx_ring(struct fm10k_intfc *interface,
u64 tdba = ring->dma; u64 tdba = ring->dma;
u32 size = ring->count * sizeof(struct fm10k_tx_desc); u32 size = ring->count * sizeof(struct fm10k_tx_desc);
u32 txint = FM10K_INT_MAP_DISABLE; u32 txint = FM10K_INT_MAP_DISABLE;
u32 txdctl = FM10K_TXDCTL_ENABLE | (1 << FM10K_TXDCTL_MAX_TIME_SHIFT); u32 txdctl = BIT(FM10K_TXDCTL_MAX_TIME_SHIFT) | FM10K_TXDCTL_ENABLE;
u8 reg_idx = ring->reg_idx; u8 reg_idx = ring->reg_idx;
/* disable queue to avoid issues while updating state */ /* disable queue to avoid issues while updating state */
...@@ -730,7 +730,7 @@ static void fm10k_configure_rx_ring(struct fm10k_intfc *interface, ...@@ -730,7 +730,7 @@ static void fm10k_configure_rx_ring(struct fm10k_intfc *interface,
if (interface->pfc_en) if (interface->pfc_en)
rx_pause = interface->pfc_en; rx_pause = interface->pfc_en;
#endif #endif
if (!(rx_pause & (1 << ring->qos_pc))) if (!(rx_pause & BIT(ring->qos_pc)))
rxdctl |= FM10K_RXDCTL_DROP_ON_EMPTY; rxdctl |= FM10K_RXDCTL_DROP_ON_EMPTY;
fm10k_write_reg(hw, FM10K_RXDCTL(reg_idx), rxdctl); fm10k_write_reg(hw, FM10K_RXDCTL(reg_idx), rxdctl);
...@@ -779,7 +779,7 @@ void fm10k_update_rx_drop_en(struct fm10k_intfc *interface) ...@@ -779,7 +779,7 @@ void fm10k_update_rx_drop_en(struct fm10k_intfc *interface)
u32 rxdctl = FM10K_RXDCTL_WRITE_BACK_MIN_DELAY; u32 rxdctl = FM10K_RXDCTL_WRITE_BACK_MIN_DELAY;
u8 reg_idx = ring->reg_idx; u8 reg_idx = ring->reg_idx;
if (!(rx_pause & (1 << ring->qos_pc))) if (!(rx_pause & BIT(ring->qos_pc)))
rxdctl |= FM10K_RXDCTL_DROP_ON_EMPTY; rxdctl |= FM10K_RXDCTL_DROP_ON_EMPTY;
fm10k_write_reg(hw, FM10K_RXDCTL(reg_idx), rxdctl); fm10k_write_reg(hw, FM10K_RXDCTL(reg_idx), rxdctl);
...@@ -903,8 +903,8 @@ static irqreturn_t fm10k_msix_mbx_vf(int __always_unused irq, void *data) ...@@ -903,8 +903,8 @@ static irqreturn_t fm10k_msix_mbx_vf(int __always_unused irq, void *data)
/* re-enable mailbox interrupt and indicate 20us delay */ /* re-enable mailbox interrupt and indicate 20us delay */
fm10k_write_reg(hw, FM10K_VFITR(FM10K_MBX_VECTOR), fm10k_write_reg(hw, FM10K_VFITR(FM10K_MBX_VECTOR),
FM10K_ITR_ENABLE | (FM10K_MBX_INT_DELAY >> (FM10K_MBX_INT_DELAY >> hw->mac.itr_scale) |
hw->mac.itr_scale)); FM10K_ITR_ENABLE);
/* service upstream mailbox */ /* service upstream mailbox */
if (fm10k_mbx_trylock(interface)) { if (fm10k_mbx_trylock(interface)) {
...@@ -1065,7 +1065,7 @@ static void fm10k_reset_drop_on_empty(struct fm10k_intfc *interface, u32 eicr) ...@@ -1065,7 +1065,7 @@ static void fm10k_reset_drop_on_empty(struct fm10k_intfc *interface, u32 eicr)
if (maxholdq) if (maxholdq)
fm10k_write_reg(hw, FM10K_MAXHOLDQ(7), maxholdq); fm10k_write_reg(hw, FM10K_MAXHOLDQ(7), maxholdq);
for (q = 255;;) { for (q = 255;;) {
if (maxholdq & (1 << 31)) { if (maxholdq & BIT(31)) {
if (q < FM10K_MAX_QUEUES_PF) { if (q < FM10K_MAX_QUEUES_PF) {
interface->rx_overrun_pf++; interface->rx_overrun_pf++;
fm10k_write_reg(hw, FM10K_RXDCTL(q), rxdctl); fm10k_write_reg(hw, FM10K_RXDCTL(q), rxdctl);
...@@ -1135,22 +1135,24 @@ static irqreturn_t fm10k_msix_mbx_pf(int __always_unused irq, void *data) ...@@ -1135,22 +1135,24 @@ static irqreturn_t fm10k_msix_mbx_pf(int __always_unused irq, void *data)
/* re-enable mailbox interrupt and indicate 20us delay */ /* re-enable mailbox interrupt and indicate 20us delay */
fm10k_write_reg(hw, FM10K_ITR(FM10K_MBX_VECTOR), fm10k_write_reg(hw, FM10K_ITR(FM10K_MBX_VECTOR),
FM10K_ITR_ENABLE | (FM10K_MBX_INT_DELAY >> (FM10K_MBX_INT_DELAY >> hw->mac.itr_scale) |
hw->mac.itr_scale)); FM10K_ITR_ENABLE);
return IRQ_HANDLED; return IRQ_HANDLED;
} }
void fm10k_mbx_free_irq(struct fm10k_intfc *interface) void fm10k_mbx_free_irq(struct fm10k_intfc *interface)
{ {
struct msix_entry *entry = &interface->msix_entries[FM10K_MBX_VECTOR];
struct fm10k_hw *hw = &interface->hw; struct fm10k_hw *hw = &interface->hw;
struct msix_entry *entry;
int itr_reg; int itr_reg;
/* no mailbox IRQ to free if MSI-X is not enabled */ /* no mailbox IRQ to free if MSI-X is not enabled */
if (!interface->msix_entries) if (!interface->msix_entries)
return; return;
entry = &interface->msix_entries[FM10K_MBX_VECTOR];
/* disconnect the mailbox */ /* disconnect the mailbox */
hw->mbx.ops.disconnect(hw, &hw->mbx); hw->mbx.ops.disconnect(hw, &hw->mbx);
...@@ -1253,7 +1255,7 @@ static int fm10k_mbx_request_irq_vf(struct fm10k_intfc *interface) ...@@ -1253,7 +1255,7 @@ static int fm10k_mbx_request_irq_vf(struct fm10k_intfc *interface)
int err; int err;
/* Use timer0 for interrupt moderation on the mailbox */ /* Use timer0 for interrupt moderation on the mailbox */
u32 itr = FM10K_INT_MAP_TIMER0 | entry->entry; u32 itr = entry->entry | FM10K_INT_MAP_TIMER0;
/* register mailbox handlers */ /* register mailbox handlers */
err = hw->mbx.ops.register_handlers(&hw->mbx, vf_mbx_data); err = hw->mbx.ops.register_handlers(&hw->mbx, vf_mbx_data);
...@@ -1377,7 +1379,7 @@ static s32 fm10k_1588_msg_pf(struct fm10k_hw *hw, u32 **results, ...@@ -1377,7 +1379,7 @@ static s32 fm10k_1588_msg_pf(struct fm10k_hw *hw, u32 **results,
return 0; return 0;
} }
/* if there is no iov_data then there is no mailboxes to process */ /* if there is no iov_data then there is no mailbox to process */
if (!ACCESS_ONCE(interface->iov_data)) if (!ACCESS_ONCE(interface->iov_data))
return FM10K_ERR_PARAM; return FM10K_ERR_PARAM;
...@@ -1420,8 +1422,8 @@ static int fm10k_mbx_request_irq_pf(struct fm10k_intfc *interface) ...@@ -1420,8 +1422,8 @@ static int fm10k_mbx_request_irq_pf(struct fm10k_intfc *interface)
int err; int err;
/* Use timer0 for interrupt moderation on the mailbox */ /* Use timer0 for interrupt moderation on the mailbox */
u32 mbx_itr = FM10K_INT_MAP_TIMER0 | entry->entry; u32 mbx_itr = entry->entry | FM10K_INT_MAP_TIMER0;
u32 other_itr = FM10K_INT_MAP_IMMEDIATE | entry->entry; u32 other_itr = entry->entry | FM10K_INT_MAP_IMMEDIATE;
/* register mailbox handlers */ /* register mailbox handlers */
err = hw->mbx.ops.register_handlers(&hw->mbx, pf_mbx_data); err = hw->mbx.ops.register_handlers(&hw->mbx, pf_mbx_data);
...@@ -1654,6 +1656,7 @@ void fm10k_down(struct fm10k_intfc *interface) ...@@ -1654,6 +1656,7 @@ void fm10k_down(struct fm10k_intfc *interface)
{ {
struct net_device *netdev = interface->netdev; struct net_device *netdev = interface->netdev;
struct fm10k_hw *hw = &interface->hw; struct fm10k_hw *hw = &interface->hw;
int err;
/* signal that we are down to the interrupt handler and service task */ /* signal that we are down to the interrupt handler and service task */
set_bit(__FM10K_DOWN, &interface->state); set_bit(__FM10K_DOWN, &interface->state);
...@@ -1678,7 +1681,9 @@ void fm10k_down(struct fm10k_intfc *interface) ...@@ -1678,7 +1681,9 @@ void fm10k_down(struct fm10k_intfc *interface)
fm10k_update_stats(interface); fm10k_update_stats(interface);
/* Disable DMA engine for Tx/Rx */ /* Disable DMA engine for Tx/Rx */
hw->mac.ops.stop_hw(hw); err = hw->mac.ops.stop_hw(hw);
if (err)
dev_err(&interface->pdev->dev, "stop_hw failed: %d\n", err);
/* free any buffers still on the rings */ /* free any buffers still on the rings */
fm10k_clean_all_tx_rings(interface); fm10k_clean_all_tx_rings(interface);
...@@ -1776,8 +1781,8 @@ static int fm10k_sw_init(struct fm10k_intfc *interface, ...@@ -1776,8 +1781,8 @@ static int fm10k_sw_init(struct fm10k_intfc *interface,
netdev->addr_assign_type |= NET_ADDR_RANDOM; netdev->addr_assign_type |= NET_ADDR_RANDOM;
} }
memcpy(netdev->dev_addr, hw->mac.addr, netdev->addr_len); ether_addr_copy(netdev->dev_addr, hw->mac.addr);
memcpy(netdev->perm_addr, hw->mac.addr, netdev->addr_len); ether_addr_copy(netdev->perm_addr, hw->mac.addr);
if (!is_valid_ether_addr(netdev->perm_addr)) { if (!is_valid_ether_addr(netdev->perm_addr)) {
dev_err(&pdev->dev, "Invalid MAC Address\n"); dev_err(&pdev->dev, "Invalid MAC Address\n");
...@@ -1793,15 +1798,6 @@ static int fm10k_sw_init(struct fm10k_intfc *interface, ...@@ -1793,15 +1798,6 @@ static int fm10k_sw_init(struct fm10k_intfc *interface,
/* initialize DCBNL interface */ /* initialize DCBNL interface */
fm10k_dcbnl_set_ops(netdev); fm10k_dcbnl_set_ops(netdev);
/* Initialize service timer and service task */
set_bit(__FM10K_SERVICE_DISABLE, &interface->state);
setup_timer(&interface->service_timer, &fm10k_service_timer,
(unsigned long)interface);
INIT_WORK(&interface->service_task, fm10k_service_task);
/* kick off service timer now, even when interface is down */
mod_timer(&interface->service_timer, (HZ * 2) + jiffies);
/* Intitialize timestamp data */ /* Intitialize timestamp data */
fm10k_ts_init(interface); fm10k_ts_init(interface);
...@@ -1987,6 +1983,12 @@ static int fm10k_probe(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -1987,6 +1983,12 @@ static int fm10k_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
if (err) if (err)
goto err_sw_init; goto err_sw_init;
/* the mbx interrupt might attempt to schedule the service task, so we
* must ensure it is disabled since we haven't yet requested the timer
* or work item.
*/
set_bit(__FM10K_SERVICE_DISABLE, &interface->state);
err = fm10k_mbx_request_irq(interface); err = fm10k_mbx_request_irq(interface);
if (err) if (err)
goto err_mbx_interrupt; goto err_mbx_interrupt;
...@@ -2006,6 +2008,16 @@ static int fm10k_probe(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -2006,6 +2008,16 @@ static int fm10k_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
/* stop all the transmit queues from transmitting until link is up */ /* stop all the transmit queues from transmitting until link is up */
netif_tx_stop_all_queues(netdev); netif_tx_stop_all_queues(netdev);
/* Initialize service timer and service task late in order to avoid
* cleanup issues.
*/
setup_timer(&interface->service_timer, &fm10k_service_timer,
(unsigned long)interface);
INIT_WORK(&interface->service_task, fm10k_service_task);
/* kick off service timer now, even when interface is down */
mod_timer(&interface->service_timer, (HZ * 2) + jiffies);
/* Register PTP interface */ /* Register PTP interface */
fm10k_ptp_register(interface); fm10k_ptp_register(interface);
...@@ -2262,11 +2274,11 @@ static pci_ers_result_t fm10k_io_error_detected(struct pci_dev *pdev, ...@@ -2262,11 +2274,11 @@ static pci_ers_result_t fm10k_io_error_detected(struct pci_dev *pdev,
if (netif_running(netdev)) if (netif_running(netdev))
fm10k_close(netdev); fm10k_close(netdev);
fm10k_mbx_free_irq(interface);
/* free interrupts */ /* free interrupts */
fm10k_clear_queueing_scheme(interface); fm10k_clear_queueing_scheme(interface);
fm10k_mbx_free_irq(interface);
pci_disable_device(pdev); pci_disable_device(pdev);
/* Request a slot reset. */ /* Request a slot reset. */
...@@ -2382,7 +2394,7 @@ static struct pci_driver fm10k_driver = { ...@@ -2382,7 +2394,7 @@ static struct pci_driver fm10k_driver = {
/** /**
* fm10k_register_pci_driver - register driver interface * fm10k_register_pci_driver - register driver interface
* *
* This funciton is called on module load in order to register the driver. * This function is called on module load in order to register the driver.
**/ **/
int fm10k_register_pci_driver(void) int fm10k_register_pci_driver(void)
{ {
...@@ -2392,7 +2404,7 @@ int fm10k_register_pci_driver(void) ...@@ -2392,7 +2404,7 @@ int fm10k_register_pci_driver(void)
/** /**
* fm10k_unregister_pci_driver - unregister driver interface * fm10k_unregister_pci_driver - unregister driver interface
* *
* This funciton is called on module unload in order to remove the driver. * This function is called on module unload in order to remove the driver.
**/ **/
void fm10k_unregister_pci_driver(void) void fm10k_unregister_pci_driver(void)
{ {
......
...@@ -527,8 +527,8 @@ static s32 fm10k_configure_dglort_map_pf(struct fm10k_hw *hw, ...@@ -527,8 +527,8 @@ static s32 fm10k_configure_dglort_map_pf(struct fm10k_hw *hw,
return FM10K_ERR_PARAM; return FM10K_ERR_PARAM;
/* determine count of VSIs and queues */ /* determine count of VSIs and queues */
queue_count = 1 << (dglort->rss_l + dglort->pc_l); queue_count = BIT(dglort->rss_l + dglort->pc_l);
vsi_count = 1 << (dglort->vsi_l + dglort->queue_l); vsi_count = BIT(dglort->vsi_l + dglort->queue_l);
glort = dglort->glort; glort = dglort->glort;
q_idx = dglort->queue_b; q_idx = dglort->queue_b;
...@@ -544,8 +544,8 @@ static s32 fm10k_configure_dglort_map_pf(struct fm10k_hw *hw, ...@@ -544,8 +544,8 @@ static s32 fm10k_configure_dglort_map_pf(struct fm10k_hw *hw,
} }
/* determine count of PCs and queues */ /* determine count of PCs and queues */
queue_count = 1 << (dglort->queue_l + dglort->rss_l + dglort->vsi_l); queue_count = BIT(dglort->queue_l + dglort->rss_l + dglort->vsi_l);
pc_count = 1 << dglort->pc_l; pc_count = BIT(dglort->pc_l);
/* configure PC for Tx queues */ /* configure PC for Tx queues */
for (pc = 0; pc < pc_count; pc++) { for (pc = 0; pc < pc_count; pc++) {
...@@ -711,8 +711,8 @@ static s32 fm10k_iov_assign_resources_pf(struct fm10k_hw *hw, u16 num_vfs, ...@@ -711,8 +711,8 @@ static s32 fm10k_iov_assign_resources_pf(struct fm10k_hw *hw, u16 num_vfs,
FM10K_RXDCTL_WRITE_BACK_MIN_DELAY | FM10K_RXDCTL_WRITE_BACK_MIN_DELAY |
FM10K_RXDCTL_DROP_ON_EMPTY); FM10K_RXDCTL_DROP_ON_EMPTY);
fm10k_write_reg(hw, FM10K_RXQCTL(vf_q_idx), fm10k_write_reg(hw, FM10K_RXQCTL(vf_q_idx),
FM10K_RXQCTL_VF | (i << FM10K_RXQCTL_VF_SHIFT) |
(i << FM10K_RXQCTL_VF_SHIFT)); FM10K_RXQCTL_VF);
/* map queue pair to VF */ /* map queue pair to VF */
fm10k_write_reg(hw, FM10K_TQMAP(qmap_idx), vf_q_idx); fm10k_write_reg(hw, FM10K_TQMAP(qmap_idx), vf_q_idx);
...@@ -952,7 +952,7 @@ static s32 fm10k_iov_reset_resources_pf(struct fm10k_hw *hw, ...@@ -952,7 +952,7 @@ static s32 fm10k_iov_reset_resources_pf(struct fm10k_hw *hw,
return FM10K_ERR_PARAM; return FM10K_ERR_PARAM;
/* clear event notification of VF FLR */ /* clear event notification of VF FLR */
fm10k_write_reg(hw, FM10K_PFVFLREC(vf_idx / 32), 1 << (vf_idx % 32)); fm10k_write_reg(hw, FM10K_PFVFLREC(vf_idx / 32), BIT(vf_idx % 32));
/* force timeout and then disconnect the mailbox */ /* force timeout and then disconnect the mailbox */
vf_info->mbx.timeout = 0; vf_info->mbx.timeout = 0;
...@@ -987,7 +987,7 @@ static s32 fm10k_iov_reset_resources_pf(struct fm10k_hw *hw, ...@@ -987,7 +987,7 @@ static s32 fm10k_iov_reset_resources_pf(struct fm10k_hw *hw,
txqctl = ((u32)vf_vid << FM10K_TXQCTL_VID_SHIFT) | txqctl = ((u32)vf_vid << FM10K_TXQCTL_VID_SHIFT) |
(vf_idx << FM10K_TXQCTL_TC_SHIFT) | (vf_idx << FM10K_TXQCTL_TC_SHIFT) |
FM10K_TXQCTL_VF | vf_idx; FM10K_TXQCTL_VF | vf_idx;
rxqctl = FM10K_RXQCTL_VF | (vf_idx << FM10K_RXQCTL_VF_SHIFT); rxqctl = (vf_idx << FM10K_RXQCTL_VF_SHIFT) | FM10K_RXQCTL_VF;
/* stop further DMA and reset queue ownership back to VF */ /* stop further DMA and reset queue ownership back to VF */
for (i = vf_q_idx; i < (queues_per_pool + vf_q_idx); i++) { for (i = vf_q_idx; i < (queues_per_pool + vf_q_idx); i++) {
...@@ -1370,7 +1370,7 @@ s32 fm10k_iov_msg_lport_state_pf(struct fm10k_hw *hw, u32 **results, ...@@ -1370,7 +1370,7 @@ s32 fm10k_iov_msg_lport_state_pf(struct fm10k_hw *hw, u32 **results,
mode = fm10k_iov_supported_xcast_mode_pf(vf_info, mode); mode = fm10k_iov_supported_xcast_mode_pf(vf_info, mode);
/* if mode is not currently enabled, enable it */ /* if mode is not currently enabled, enable it */
if (!(FM10K_VF_FLAG_ENABLED(vf_info) & (1 << mode))) if (!(FM10K_VF_FLAG_ENABLED(vf_info) & BIT(mode)))
fm10k_update_xcast_mode_pf(hw, vf_info->glort, mode); fm10k_update_xcast_mode_pf(hw, vf_info->glort, mode);
/* swap mode back to a bit flag */ /* swap mode back to a bit flag */
...@@ -1604,7 +1604,7 @@ static s32 fm10k_request_lport_map_pf(struct fm10k_hw *hw) ...@@ -1604,7 +1604,7 @@ static s32 fm10k_request_lport_map_pf(struct fm10k_hw *hw)
* @hw: pointer to hardware structure * @hw: pointer to hardware structure
* @switch_ready: pointer to boolean value that will record switch state * @switch_ready: pointer to boolean value that will record switch state
* *
* This funciton will check the DMA_CTRL2 register and mailbox in order * This function will check the DMA_CTRL2 register and mailbox in order
* to determine if the switch is ready for the PF to begin requesting * to determine if the switch is ready for the PF to begin requesting
* addresses and mapping traffic to the local interface. * addresses and mapping traffic to the local interface.
**/ **/
......
...@@ -222,7 +222,7 @@ s32 fm10k_tlv_attr_put_value(u32 *msg, u16 attr_id, s64 value, u32 len) ...@@ -222,7 +222,7 @@ s32 fm10k_tlv_attr_put_value(u32 *msg, u16 attr_id, s64 value, u32 len)
attr = &msg[FM10K_TLV_DWORD_LEN(*msg)]; attr = &msg[FM10K_TLV_DWORD_LEN(*msg)];
if (len < 4) { if (len < 4) {
attr[1] = (u32)value & ((0x1ul << (8 * len)) - 1); attr[1] = (u32)value & (BIT(8 * len) - 1);
} else { } else {
attr[1] = (u32)value; attr[1] = (u32)value;
if (len > 4) if (len > 4)
...@@ -652,29 +652,29 @@ const struct fm10k_tlv_attr fm10k_tlv_msg_test_attr[] = { ...@@ -652,29 +652,29 @@ const struct fm10k_tlv_attr fm10k_tlv_msg_test_attr[] = {
**/ **/
static void fm10k_tlv_msg_test_generate_data(u32 *msg, u32 attr_flags) static void fm10k_tlv_msg_test_generate_data(u32 *msg, u32 attr_flags)
{ {
if (attr_flags & (1 << FM10K_TEST_MSG_STRING)) if (attr_flags & BIT(FM10K_TEST_MSG_STRING))
fm10k_tlv_attr_put_null_string(msg, FM10K_TEST_MSG_STRING, fm10k_tlv_attr_put_null_string(msg, FM10K_TEST_MSG_STRING,
test_str); test_str);
if (attr_flags & (1 << FM10K_TEST_MSG_MAC_ADDR)) if (attr_flags & BIT(FM10K_TEST_MSG_MAC_ADDR))
fm10k_tlv_attr_put_mac_vlan(msg, FM10K_TEST_MSG_MAC_ADDR, fm10k_tlv_attr_put_mac_vlan(msg, FM10K_TEST_MSG_MAC_ADDR,
test_mac, test_vlan); test_mac, test_vlan);
if (attr_flags & (1 << FM10K_TEST_MSG_U8)) if (attr_flags & BIT(FM10K_TEST_MSG_U8))
fm10k_tlv_attr_put_u8(msg, FM10K_TEST_MSG_U8, test_u8); fm10k_tlv_attr_put_u8(msg, FM10K_TEST_MSG_U8, test_u8);
if (attr_flags & (1 << FM10K_TEST_MSG_U16)) if (attr_flags & BIT(FM10K_TEST_MSG_U16))
fm10k_tlv_attr_put_u16(msg, FM10K_TEST_MSG_U16, test_u16); fm10k_tlv_attr_put_u16(msg, FM10K_TEST_MSG_U16, test_u16);
if (attr_flags & (1 << FM10K_TEST_MSG_U32)) if (attr_flags & BIT(FM10K_TEST_MSG_U32))
fm10k_tlv_attr_put_u32(msg, FM10K_TEST_MSG_U32, test_u32); fm10k_tlv_attr_put_u32(msg, FM10K_TEST_MSG_U32, test_u32);
if (attr_flags & (1 << FM10K_TEST_MSG_U64)) if (attr_flags & BIT(FM10K_TEST_MSG_U64))
fm10k_tlv_attr_put_u64(msg, FM10K_TEST_MSG_U64, test_u64); fm10k_tlv_attr_put_u64(msg, FM10K_TEST_MSG_U64, test_u64);
if (attr_flags & (1 << FM10K_TEST_MSG_S8)) if (attr_flags & BIT(FM10K_TEST_MSG_S8))
fm10k_tlv_attr_put_s8(msg, FM10K_TEST_MSG_S8, test_s8); fm10k_tlv_attr_put_s8(msg, FM10K_TEST_MSG_S8, test_s8);
if (attr_flags & (1 << FM10K_TEST_MSG_S16)) if (attr_flags & BIT(FM10K_TEST_MSG_S16))
fm10k_tlv_attr_put_s16(msg, FM10K_TEST_MSG_S16, test_s16); fm10k_tlv_attr_put_s16(msg, FM10K_TEST_MSG_S16, test_s16);
if (attr_flags & (1 << FM10K_TEST_MSG_S32)) if (attr_flags & BIT(FM10K_TEST_MSG_S32))
fm10k_tlv_attr_put_s32(msg, FM10K_TEST_MSG_S32, test_s32); fm10k_tlv_attr_put_s32(msg, FM10K_TEST_MSG_S32, test_s32);
if (attr_flags & (1 << FM10K_TEST_MSG_S64)) if (attr_flags & BIT(FM10K_TEST_MSG_S64))
fm10k_tlv_attr_put_s64(msg, FM10K_TEST_MSG_S64, test_s64); fm10k_tlv_attr_put_s64(msg, FM10K_TEST_MSG_S64, test_s64);
if (attr_flags & (1 << FM10K_TEST_MSG_LE_STRUCT)) if (attr_flags & BIT(FM10K_TEST_MSG_LE_STRUCT))
fm10k_tlv_attr_put_le_struct(msg, FM10K_TEST_MSG_LE_STRUCT, fm10k_tlv_attr_put_le_struct(msg, FM10K_TEST_MSG_LE_STRUCT,
test_le, 8); test_le, 8);
} }
......
...@@ -617,10 +617,10 @@ struct fm10k_vf_info { ...@@ -617,10 +617,10 @@ struct fm10k_vf_info {
*/ */
}; };
#define FM10K_VF_FLAG_ALLMULTI_CAPABLE ((u8)1 << FM10K_XCAST_MODE_ALLMULTI) #define FM10K_VF_FLAG_ALLMULTI_CAPABLE (u8)(BIT(FM10K_XCAST_MODE_ALLMULTI))
#define FM10K_VF_FLAG_MULTI_CAPABLE ((u8)1 << FM10K_XCAST_MODE_MULTI) #define FM10K_VF_FLAG_MULTI_CAPABLE (u8)(BIT(FM10K_XCAST_MODE_MULTI))
#define FM10K_VF_FLAG_PROMISC_CAPABLE ((u8)1 << FM10K_XCAST_MODE_PROMISC) #define FM10K_VF_FLAG_PROMISC_CAPABLE (u8)(BIT(FM10K_XCAST_MODE_PROMISC))
#define FM10K_VF_FLAG_NONE_CAPABLE ((u8)1 << FM10K_XCAST_MODE_NONE) #define FM10K_VF_FLAG_NONE_CAPABLE (u8)(BIT(FM10K_XCAST_MODE_NONE))
#define FM10K_VF_FLAG_CAPABLE(vf_info) ((vf_info)->vf_flags & (u8)0xF) #define FM10K_VF_FLAG_CAPABLE(vf_info) ((vf_info)->vf_flags & (u8)0xF)
#define FM10K_VF_FLAG_ENABLED(vf_info) ((vf_info)->vf_flags >> 4) #define FM10K_VF_FLAG_ENABLED(vf_info) ((vf_info)->vf_flags >> 4)
#define FM10K_VF_FLAG_SET_MODE(mode) ((u8)0x10 << (mode)) #define FM10K_VF_FLAG_SET_MODE(mode) ((u8)0x10 << (mode))
......
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