Import some of Richards changes
This commit is contained in:
parent
1d8e58bfc5
commit
396f7320db
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue