Skip to content

Commit 38caff5

Browse files
hkallweitdavem330
authored andcommitted
r8169: handle all interrupt events in the hard irq handler
Having a separate "slow event" handler isn't needed because all interrupt events trigger asynchronous activity. And in case of SYSErr we have bigger problems than performance anyway. This patch also allows to get rid of acking interrupt events in the NAPI poll callback. Signed-off-by: Heiner Kallweit <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 342149c commit 38caff5

File tree

1 file changed

+19
-46
lines changed
  • drivers/net/ethernet/realtek

1 file changed

+19
-46
lines changed

drivers/net/ethernet/realtek/r8169.c

Lines changed: 19 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -631,7 +631,6 @@ struct rtl8169_tc_offsets {
631631

632632
enum rtl_flag {
633633
RTL_FLAG_TASK_ENABLED = 0,
634-
RTL_FLAG_TASK_SLOW_PENDING,
635634
RTL_FLAG_TASK_RESET_PENDING,
636635
RTL_FLAG_MAX
637636
};
@@ -6452,42 +6451,29 @@ static irqreturn_t rtl8169_interrupt(int irq, void *dev_instance)
64526451
if (status == 0xffff || !(status & (RTL_EVENT_NAPI | tp->event_slow)))
64536452
return IRQ_NONE;
64546453

6455-
rtl_irq_disable(tp);
6456-
napi_schedule_irqoff(&tp->napi);
6457-
6458-
return IRQ_HANDLED;
6459-
}
6460-
6461-
/*
6462-
* Workqueue context.
6463-
*/
6464-
static void rtl_slow_event_work(struct rtl8169_private *tp)
6465-
{
6466-
struct net_device *dev = tp->dev;
6467-
u16 status;
6454+
if (unlikely(status & SYSErr)) {
6455+
rtl8169_pcierr_interrupt(tp->dev);
6456+
goto out;
6457+
}
64686458

6469-
status = rtl_get_events(tp) & tp->event_slow;
6470-
rtl_ack_events(tp, status);
6459+
if (status & LinkChg)
6460+
phy_mac_interrupt(tp->dev->phydev);
64716461

6472-
if (unlikely(status & RxFIFOOver)) {
6473-
switch (tp->mac_version) {
6474-
/* Work around for rx fifo overflow */
6475-
case RTL_GIGA_MAC_VER_11:
6476-
netif_stop_queue(dev);
6477-
/* XXX - Hack alert. See rtl_task(). */
6478-
set_bit(RTL_FLAG_TASK_RESET_PENDING, tp->wk.flags);
6479-
default:
6480-
break;
6481-
}
6462+
if (unlikely(status & RxFIFOOver &&
6463+
tp->mac_version == RTL_GIGA_MAC_VER_11)) {
6464+
netif_stop_queue(tp->dev);
6465+
/* XXX - Hack alert. See rtl_task(). */
6466+
set_bit(RTL_FLAG_TASK_RESET_PENDING, tp->wk.flags);
64826467
}
64836468

6484-
if (unlikely(status & SYSErr))
6485-
rtl8169_pcierr_interrupt(dev);
6486-
6487-
if (status & LinkChg)
6488-
phy_mac_interrupt(dev->phydev);
6469+
if (status & RTL_EVENT_NAPI) {
6470+
rtl_irq_disable(tp);
6471+
napi_schedule_irqoff(&tp->napi);
6472+
}
6473+
out:
6474+
rtl_ack_events(tp, status);
64896475

6490-
rtl_irq_enable_all(tp);
6476+
return IRQ_HANDLED;
64916477
}
64926478

64936479
static void rtl_task(struct work_struct *work)
@@ -6496,8 +6482,6 @@ static void rtl_task(struct work_struct *work)
64966482
int bitnr;
64976483
void (*action)(struct rtl8169_private *);
64986484
} rtl_work[] = {
6499-
/* XXX - keep rtl_slow_event_work() as first element. */
6500-
{ RTL_FLAG_TASK_SLOW_PENDING, rtl_slow_event_work },
65016485
{ RTL_FLAG_TASK_RESET_PENDING, rtl_reset_work },
65026486
};
65036487
struct rtl8169_private *tp =
@@ -6527,27 +6511,16 @@ static int rtl8169_poll(struct napi_struct *napi, int budget)
65276511
{
65286512
struct rtl8169_private *tp = container_of(napi, struct rtl8169_private, napi);
65296513
struct net_device *dev = tp->dev;
6530-
u16 enable_mask = RTL_EVENT_NAPI | tp->event_slow;
65316514
int work_done;
6532-
u16 status;
6533-
6534-
status = rtl_get_events(tp);
6535-
rtl_ack_events(tp, status & ~tp->event_slow);
65366515

65376516
work_done = rtl_rx(dev, tp, (u32) budget);
65386517

65396518
rtl_tx(dev, tp);
65406519

6541-
if (status & tp->event_slow) {
6542-
enable_mask &= ~tp->event_slow;
6543-
6544-
rtl_schedule_task(tp, RTL_FLAG_TASK_SLOW_PENDING);
6545-
}
6546-
65476520
if (work_done < budget) {
65486521
napi_complete_done(napi, work_done);
65496522

6550-
rtl_irq_enable(tp, enable_mask);
6523+
rtl_irq_enable_all(tp);
65516524
mmiowb();
65526525
}
65536526

0 commit comments

Comments
 (0)