Commit 84ea2591 authored by Alexander Duyck's avatar Alexander Duyck Committed by Jeff Kirsher

ixgbe: drop ring->head, make ring->tail a pointer instead of offset

This change drops ring->head since it is not used in any hot-path and can
easily be determined using IXGBE_[RT]DH(ring->reg_idx).

It also changes ring->tail into a true pointer so we can avoid unnecessary
pointer math to find the location of the tail.

In addition I also dropped the setting of head and tail in
ixgbe_clean_[rx|tx]_ring. The only location that should be setting the head
and tail values is ixgbe_configure_[rx|tx]_ring and that is only while the
queue is disabled.
Signed-off-by: default avatarAlexander Duyck <alexander.h.duyck@intel.com>
Tested-by: default avatarRoss Brattain <ross.b.brattain@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
parent d5f398ed
...@@ -163,8 +163,7 @@ struct ixgbe_ring { ...@@ -163,8 +163,7 @@ struct ixgbe_ring {
#define IXGBE_RING_RX_PS_ENABLED (u8)(1) #define IXGBE_RING_RX_PS_ENABLED (u8)(1)
u8 flags; /* per ring feature flags */ u8 flags; /* per ring feature flags */
u16 head; u8 __iomem *tail;
u16 tail;
unsigned int total_bytes; unsigned int total_bytes;
unsigned int total_packets; unsigned int total_packets;
......
...@@ -704,8 +704,8 @@ static inline bool ixgbe_check_tx_hang(struct ixgbe_adapter *adapter, ...@@ -704,8 +704,8 @@ static inline bool ixgbe_check_tx_hang(struct ixgbe_adapter *adapter,
" time_stamp <%lx>\n" " time_stamp <%lx>\n"
" jiffies <%lx>\n", " jiffies <%lx>\n",
tx_ring->queue_index, tx_ring->queue_index,
IXGBE_READ_REG(hw, tx_ring->head), IXGBE_READ_REG(hw, IXGBE_TDH(tx_ring->reg_idx)),
IXGBE_READ_REG(hw, tx_ring->tail), IXGBE_READ_REG(hw, IXGBE_TDT(tx_ring->reg_idx)),
tx_ring->next_to_use, eop, tx_ring->next_to_use, eop,
tx_ring->tx_buffer_info[eop].time_stamp, jiffies); tx_ring->tx_buffer_info[eop].time_stamp, jiffies);
return true; return true;
...@@ -991,8 +991,7 @@ static inline void ixgbe_rx_checksum(struct ixgbe_adapter *adapter, ...@@ -991,8 +991,7 @@ static inline void ixgbe_rx_checksum(struct ixgbe_adapter *adapter,
skb->ip_summed = CHECKSUM_UNNECESSARY; skb->ip_summed = CHECKSUM_UNNECESSARY;
} }
static inline void ixgbe_release_rx_desc(struct ixgbe_hw *hw, static inline void ixgbe_release_rx_desc(struct ixgbe_ring *rx_ring, u32 val)
struct ixgbe_ring *rx_ring, u32 val)
{ {
/* /*
* Force memory writes to complete before letting h/w * Force memory writes to complete before letting h/w
...@@ -1001,7 +1000,7 @@ static inline void ixgbe_release_rx_desc(struct ixgbe_hw *hw, ...@@ -1001,7 +1000,7 @@ static inline void ixgbe_release_rx_desc(struct ixgbe_hw *hw,
* such as IA-64). * such as IA-64).
*/ */
wmb(); wmb();
IXGBE_WRITE_REG(hw, IXGBE_RDT(rx_ring->reg_idx), val); writel(val, rx_ring->tail);
} }
/** /**
...@@ -1089,7 +1088,7 @@ void ixgbe_alloc_rx_buffers(struct ixgbe_adapter *adapter, ...@@ -1089,7 +1088,7 @@ void ixgbe_alloc_rx_buffers(struct ixgbe_adapter *adapter,
no_buffers: no_buffers:
if (rx_ring->next_to_use != i) { if (rx_ring->next_to_use != i) {
rx_ring->next_to_use = i; rx_ring->next_to_use = i;
ixgbe_release_rx_desc(&adapter->hw, rx_ring, i); ixgbe_release_rx_desc(rx_ring, i);
} }
} }
...@@ -2465,8 +2464,7 @@ void ixgbe_configure_tx_ring(struct ixgbe_adapter *adapter, ...@@ -2465,8 +2464,7 @@ void ixgbe_configure_tx_ring(struct ixgbe_adapter *adapter,
ring->count * sizeof(union ixgbe_adv_tx_desc)); ring->count * sizeof(union ixgbe_adv_tx_desc));
IXGBE_WRITE_REG(hw, IXGBE_TDH(reg_idx), 0); IXGBE_WRITE_REG(hw, IXGBE_TDH(reg_idx), 0);
IXGBE_WRITE_REG(hw, IXGBE_TDT(reg_idx), 0); IXGBE_WRITE_REG(hw, IXGBE_TDT(reg_idx), 0);
ring->head = IXGBE_TDH(reg_idx); ring->tail = hw->hw_addr + IXGBE_TDT(reg_idx);
ring->tail = IXGBE_TDT(reg_idx);
/* configure fetching thresholds */ /* configure fetching thresholds */
if (adapter->rx_itr_setting == 0) { if (adapter->rx_itr_setting == 0) {
...@@ -2791,8 +2789,7 @@ void ixgbe_configure_rx_ring(struct ixgbe_adapter *adapter, ...@@ -2791,8 +2789,7 @@ void ixgbe_configure_rx_ring(struct ixgbe_adapter *adapter,
ring->count * sizeof(union ixgbe_adv_rx_desc)); ring->count * sizeof(union ixgbe_adv_rx_desc));
IXGBE_WRITE_REG(hw, IXGBE_RDH(reg_idx), 0); IXGBE_WRITE_REG(hw, IXGBE_RDH(reg_idx), 0);
IXGBE_WRITE_REG(hw, IXGBE_RDT(reg_idx), 0); IXGBE_WRITE_REG(hw, IXGBE_RDT(reg_idx), 0);
ring->head = IXGBE_RDH(reg_idx); ring->tail = hw->hw_addr + IXGBE_RDT(reg_idx);
ring->tail = IXGBE_RDT(reg_idx);
ixgbe_configure_srrctl(adapter, ring); ixgbe_configure_srrctl(adapter, ring);
ixgbe_configure_rscctl(adapter, ring); ixgbe_configure_rscctl(adapter, ring);
...@@ -3730,11 +3727,6 @@ static void ixgbe_clean_rx_ring(struct ixgbe_adapter *adapter, ...@@ -3730,11 +3727,6 @@ static void ixgbe_clean_rx_ring(struct ixgbe_adapter *adapter,
rx_ring->next_to_clean = 0; rx_ring->next_to_clean = 0;
rx_ring->next_to_use = 0; rx_ring->next_to_use = 0;
if (rx_ring->head)
writel(0, adapter->hw.hw_addr + rx_ring->head);
if (rx_ring->tail)
writel(0, adapter->hw.hw_addr + rx_ring->tail);
} }
/** /**
...@@ -3767,11 +3759,6 @@ static void ixgbe_clean_tx_ring(struct ixgbe_adapter *adapter, ...@@ -3767,11 +3759,6 @@ static void ixgbe_clean_tx_ring(struct ixgbe_adapter *adapter,
tx_ring->next_to_use = 0; tx_ring->next_to_use = 0;
tx_ring->next_to_clean = 0; tx_ring->next_to_clean = 0;
if (tx_ring->head)
writel(0, adapter->hw.hw_addr + tx_ring->head);
if (tx_ring->tail)
writel(0, adapter->hw.hw_addr + tx_ring->tail);
} }
/** /**
...@@ -6116,8 +6103,7 @@ static int ixgbe_tx_map(struct ixgbe_adapter *adapter, ...@@ -6116,8 +6103,7 @@ static int ixgbe_tx_map(struct ixgbe_adapter *adapter,
return 0; return 0;
} }
static void ixgbe_tx_queue(struct ixgbe_adapter *adapter, static void ixgbe_tx_queue(struct ixgbe_ring *tx_ring,
struct ixgbe_ring *tx_ring,
int tx_flags, int count, u32 paylen, u8 hdr_len) int tx_flags, int count, u32 paylen, u8 hdr_len)
{ {
union ixgbe_adv_tx_desc *tx_desc = NULL; union ixgbe_adv_tx_desc *tx_desc = NULL;
...@@ -6182,7 +6168,7 @@ static void ixgbe_tx_queue(struct ixgbe_adapter *adapter, ...@@ -6182,7 +6168,7 @@ static void ixgbe_tx_queue(struct ixgbe_adapter *adapter,
wmb(); wmb();
tx_ring->next_to_use = i; tx_ring->next_to_use = i;
writel(i, adapter->hw.hw_addr + tx_ring->tail); writel(i, tx_ring->tail);
} }
static void ixgbe_atr(struct ixgbe_adapter *adapter, struct sk_buff *skb, static void ixgbe_atr(struct ixgbe_adapter *adapter, struct sk_buff *skb,
...@@ -6414,8 +6400,7 @@ netdev_tx_t ixgbe_xmit_frame_ring(struct sk_buff *skb, struct net_device *netdev ...@@ -6414,8 +6400,7 @@ netdev_tx_t ixgbe_xmit_frame_ring(struct sk_buff *skb, struct net_device *netdev
txq = netdev_get_tx_queue(netdev, tx_ring->queue_index); txq = netdev_get_tx_queue(netdev, tx_ring->queue_index);
txq->tx_bytes += skb->len; txq->tx_bytes += skb->len;
txq->tx_packets++; txq->tx_packets++;
ixgbe_tx_queue(adapter, tx_ring, tx_flags, count, skb->len, ixgbe_tx_queue(tx_ring, tx_flags, count, skb->len, hdr_len);
hdr_len);
ixgbe_maybe_stop_tx(netdev, tx_ring, DESC_NEEDED); ixgbe_maybe_stop_tx(netdev, tx_ring, DESC_NEEDED);
} else { } else {
......
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