Import some of Richards changes

This commit is contained in:
Bjarne von Horn 2024-01-10 11:43:16 +01:00
parent 1d8e58bfc5
commit 396f7320db
4 changed files with 45 additions and 33 deletions

View File

@ -3968,7 +3968,7 @@ static void rtl8169_tx_clear_range(struct rtl8169_private *tp, u32 start,
struct sk_buff *skb = tx_skb->skb;
rtl8169_unmap_tx_skb(tp, entry);
if (skb && !tp->ecdev)
if (!tp->ecdev && skb)
dev_consume_skb_any(skb);
}
}
@ -3977,7 +3977,8 @@ static void rtl8169_tx_clear_range(struct rtl8169_private *tp, u32 start,
static void rtl8169_tx_clear(struct rtl8169_private *tp)
{
rtl8169_tx_clear_range(tp, tp->dirty_tx, NUM_TX_DESC);
netdev_reset_queue(tp->dev);
if (!tp->ecdev)
netdev_reset_queue(tp->dev);
}
static void rtl8169_cleanup(struct rtl8169_private *tp, bool going_down)
@ -4284,7 +4285,7 @@ static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb,
struct rtl8169_private *tp = netdev_priv(dev);
unsigned int entry = tp->cur_tx % NUM_TX_DESC;
struct TxDesc *txd_first, *txd_last;
bool stop_queue, door_bell;
bool stop_queue = 0, door_bell = 0;
u32 opts[2];
txd_first = tp->TxDescArray + entry;
@ -4325,7 +4326,7 @@ static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb,
/* Force memory writes to complete before releasing descriptor */
dma_wmb();
door_bell = __netdev_sent_queue(dev, skb->len, !tp->ecdev && netdev_xmit_more());
door_bell = tp->ecdev || __netdev_sent_queue(dev, skb->len, netdev_xmit_more());
txd_first->opts1 |= cpu_to_le32(DescOwn | FirstFrag);
@ -4334,8 +4335,8 @@ static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb,
tp->cur_tx += frags + 1;
stop_queue = !rtl_tx_slots_avail(tp, MAX_SKB_FRAGS);
if (unlikely(stop_queue) && !tp->ecdev) {
stop_queue = !tp->ecdev && !rtl_tx_slots_avail(tp, MAX_SKB_FRAGS);
if (unlikely(stop_queue)) {
/* Avoid wrongly optimistic queue wake-up: rtl_tx thread must
* not miss a ring update when it notices a stopped queue.
*/
@ -4347,7 +4348,7 @@ static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb,
if (door_bell)
rtl8169_doorbell(tp);
if (unlikely(stop_queue) && !tp->ecdev) {
if (unlikely(stop_queue)) {
/* Sync with rtl_tx:
* - publish queue status and cur_tx ring index (write barrier)
* - refresh dirty_tx ring index (read barrier).
@ -4775,7 +4776,8 @@ static void rtl8169_up(struct rtl8169_private *tp)
pci_set_master(tp->pci_dev);
rtl_pll_power_up(tp);
rtl8169_init_phy(tp);
napi_enable(&tp->napi);
if (!tp->ecdev)
napi_enable(&tp->napi);
set_bit(RTL_FLAG_TASK_ENABLED, tp->wk.flags);
rtl_reset_work(tp);
@ -4789,7 +4791,8 @@ static int rtl8169_close(struct net_device *dev)
pm_runtime_get_sync(&pdev->dev);
netif_stop_queue(dev);
if (!tp->ecdev)
netif_stop_queue(dev);
rtl8169_down(tp);
rtl8169_rx_clear(tp);

View File

@ -3971,7 +3971,7 @@ static void rtl8169_tx_clear_range(struct rtl8169_private *tp, u32 start,
struct sk_buff *skb = tx_skb->skb;
rtl8169_unmap_tx_skb(tp, entry);
if (skb && !tp->ecdev)
if (!tp->ecdev && skb)
dev_consume_skb_any(skb);
}
}
@ -3980,7 +3980,8 @@ static void rtl8169_tx_clear_range(struct rtl8169_private *tp, u32 start,
static void rtl8169_tx_clear(struct rtl8169_private *tp)
{
rtl8169_tx_clear_range(tp, tp->dirty_tx, NUM_TX_DESC);
netdev_reset_queue(tp->dev);
if (!tp->ecdev)
netdev_reset_queue(tp->dev);
}
static void rtl8169_cleanup(struct rtl8169_private *tp, bool going_down)
@ -4288,7 +4289,7 @@ static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb,
struct rtl8169_private *tp = netdev_priv(dev);
unsigned int entry = tp->cur_tx % NUM_TX_DESC;
struct TxDesc *txd_first, *txd_last;
bool stop_queue, door_bell;
bool stop_queue = 0, door_bell = 0;
u32 opts[2];
if (unlikely(!rtl_tx_slots_avail(tp))) {
@ -4326,7 +4327,7 @@ static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb,
/* Force memory writes to complete before releasing descriptor */
dma_wmb();
door_bell = __netdev_sent_queue(dev, skb->len, !tp->ecdev && netdev_xmit_more());
door_bell = tp->ecdev || __netdev_sent_queue(dev, skb->len, netdev_xmit_more());
txd_first->opts1 |= cpu_to_le32(DescOwn | FirstFrag);
@ -4335,8 +4336,8 @@ static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb,
WRITE_ONCE(tp->cur_tx, tp->cur_tx + frags + 1);
stop_queue = !rtl_tx_slots_avail(tp);
if (unlikely(stop_queue) && !tp->ecdev) {
stop_queue = !tp->ecdev && !rtl_tx_slots_avail(tp);
if (unlikely(stop_queue)) {
/* Avoid wrongly optimistic queue wake-up: rtl_tx thread must
* not miss a ring update when it notices a stopped queue.
*/
@ -4754,7 +4755,8 @@ static void rtl8169_up(struct rtl8169_private *tp)
phy_init_hw(tp->phydev);
phy_resume(tp->phydev);
rtl8169_init_phy(tp);
napi_enable(&tp->napi);
if (!tp->ecdev)
napi_enable(&tp->napi);
set_bit(RTL_FLAG_TASK_ENABLED, tp->wk.flags);
rtl_reset_work(tp);
@ -4768,7 +4770,8 @@ static int rtl8169_close(struct net_device *dev)
pm_runtime_get_sync(&pdev->dev);
netif_stop_queue(dev);
if (!tp->ecdev)
netif_stop_queue(dev);
rtl8169_down(tp);
rtl8169_rx_clear(tp);

View File

@ -3964,7 +3964,7 @@ static void rtl8169_tx_clear_range(struct rtl8169_private *tp, u32 start,
struct sk_buff *skb = tx_skb->skb;
rtl8169_unmap_tx_skb(tp, entry);
if (skb && !tp->ecdev)
if (!tp->ecdev && skb)
dev_consume_skb_any(skb);
}
}
@ -3973,7 +3973,8 @@ static void rtl8169_tx_clear_range(struct rtl8169_private *tp, u32 start,
static void rtl8169_tx_clear(struct rtl8169_private *tp)
{
rtl8169_tx_clear_range(tp, tp->dirty_tx, NUM_TX_DESC);
netdev_reset_queue(tp->dev);
if (!tp->ecdev)
netdev_reset_queue(tp->dev);
}
static void rtl8169_cleanup(struct rtl8169_private *tp, bool going_down)
@ -4281,7 +4282,7 @@ static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb,
struct rtl8169_private *tp = netdev_priv(dev);
unsigned int entry = tp->cur_tx % NUM_TX_DESC;
struct TxDesc *txd_first, *txd_last;
bool stop_queue, door_bell;
bool stop_queue = 0, door_bell = 0;
u32 opts[2];
if (unlikely(!rtl_tx_slots_avail(tp))) {
@ -4319,7 +4320,7 @@ static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb,
/* Force memory writes to complete before releasing descriptor */
dma_wmb();
door_bell = __netdev_sent_queue(dev, skb->len, !tp->ecdev && netdev_xmit_more());
door_bell = tp->ecdev || __netdev_sent_queue(dev, skb->len, netdev_xmit_more());
txd_first->opts1 |= cpu_to_le32(DescOwn | FirstFrag);
@ -4328,8 +4329,8 @@ static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb,
WRITE_ONCE(tp->cur_tx, tp->cur_tx + frags + 1);
stop_queue = !rtl_tx_slots_avail(tp);
if (unlikely(stop_queue) && !tp->ecdev) {
stop_queue = !tp->ecdev && !rtl_tx_slots_avail(tp);
if (unlikely(stop_queue)) {
/* Avoid wrongly optimistic queue wake-up: rtl_tx thread must
* not miss a ring update when it notices a stopped queue.
*/
@ -4747,7 +4748,8 @@ static void rtl8169_up(struct rtl8169_private *tp)
phy_init_hw(tp->phydev);
phy_resume(tp->phydev);
rtl8169_init_phy(tp);
napi_enable(&tp->napi);
if (!tp->ecdev)
napi_enable(&tp->napi);
set_bit(RTL_FLAG_TASK_ENABLED, tp->wk.flags);
rtl_reset_work(tp);
@ -4761,7 +4763,8 @@ static int rtl8169_close(struct net_device *dev)
pm_runtime_get_sync(&pdev->dev);
netif_stop_queue(dev);
if (!tp->ecdev)
netif_stop_queue(dev);
rtl8169_down(tp);
rtl8169_rx_clear(tp);

View File

@ -3869,7 +3869,7 @@ static void rtl8169_tx_clear_range(struct rtl8169_private *tp, u32 start,
struct sk_buff *skb = tx_skb->skb;
rtl8169_unmap_tx_skb(tp, entry);
if (skb && !tp->ecdev)
if (!tp->ecdev && skb)
dev_consume_skb_any(skb);
}
}
@ -3878,7 +3878,8 @@ static void rtl8169_tx_clear_range(struct rtl8169_private *tp, u32 start,
static void rtl8169_tx_clear(struct rtl8169_private *tp)
{
rtl8169_tx_clear_range(tp, tp->dirty_tx, NUM_TX_DESC);
netdev_reset_queue(tp->dev);
if (!tp->ecdev)
netdev_reset_queue(tp->dev);
}
static void rtl8169_cleanup(struct rtl8169_private *tp)
@ -4180,7 +4181,7 @@ static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb,
struct rtl8169_private *tp = netdev_priv(dev);
unsigned int entry = tp->cur_tx % NUM_TX_DESC;
struct TxDesc *txd_first, *txd_last;
bool stop_queue, door_bell;
bool stop_queue = 0, door_bell = 0;
u32 opts[2];
if (unlikely(!rtl_tx_slots_avail(tp))) {
@ -4218,7 +4219,7 @@ static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb,
/* Force memory writes to complete before releasing descriptor */
dma_wmb();
door_bell = __netdev_sent_queue(dev, skb->len, !tp->ecdev && netdev_xmit_more());
door_bell = tp->ecdev || __netdev_sent_queue(dev, skb->len, netdev_xmit_more());
txd_first->opts1 |= cpu_to_le32(DescOwn | FirstFrag);
@ -4227,8 +4228,8 @@ static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb,
WRITE_ONCE(tp->cur_tx, tp->cur_tx + frags + 1);
stop_queue = !rtl_tx_slots_avail(tp);
if (unlikely(stop_queue) && !tp->ecdev) {
stop_queue = !tp->ecdev && !rtl_tx_slots_avail(tp);
if (unlikely(stop_queue)) {
/* Avoid wrongly optimistic queue wake-up: rtl_tx thread must
* not miss a ring update when it notices a stopped queue.
*/
@ -4644,7 +4645,8 @@ static void rtl8169_up(struct rtl8169_private *tp)
phy_init_hw(tp->phydev);
phy_resume(tp->phydev);
rtl8169_init_phy(tp);
napi_enable(&tp->napi);
if (!tp->ecdev)
napi_enable(&tp->napi);
set_bit(RTL_FLAG_TASK_ENABLED, tp->wk.flags);
rtl_reset_work(tp);
@ -4658,7 +4660,8 @@ static int rtl8169_close(struct net_device *dev)
pm_runtime_get_sync(&pdev->dev);
netif_stop_queue(dev);
if (!tp->ecdev)
netif_stop_queue(dev);
rtl8169_down(tp);
rtl8169_rx_clear(tp);