Commit 9085cdfa authored by Francois Romieu's avatar Francois Romieu

r8169: irq mask helpers.

Signed-off-by: default avatarFrancois Romieu <romieu@fr.zoreil.com>
Cc: Hayes Wang <hayeswang@realtek.com>
parent 3e990ff5
...@@ -1184,6 +1184,29 @@ static u8 rtl8168d_efuse_read(void __iomem *ioaddr, int reg_addr) ...@@ -1184,6 +1184,29 @@ static u8 rtl8168d_efuse_read(void __iomem *ioaddr, int reg_addr)
return value; return value;
} }
static u16 rtl_get_events(struct rtl8169_private *tp)
{
void __iomem *ioaddr = tp->mmio_addr;
return RTL_R16(IntrStatus);
}
static void rtl_ack_events(struct rtl8169_private *tp, u16 bits)
{
void __iomem *ioaddr = tp->mmio_addr;
RTL_W16(IntrStatus, bits);
mmiowb();
}
static void rtl_irq_disable(struct rtl8169_private *tp)
{
void __iomem *ioaddr = tp->mmio_addr;
RTL_W16(IntrMask, 0);
mmiowb();
}
static void rtl_irq_enable(struct rtl8169_private *tp, u16 bits) static void rtl_irq_enable(struct rtl8169_private *tp, u16 bits)
{ {
void __iomem *ioaddr = tp->mmio_addr; void __iomem *ioaddr = tp->mmio_addr;
...@@ -1195,8 +1218,8 @@ static void rtl8169_irq_mask_and_ack(struct rtl8169_private *tp) ...@@ -1195,8 +1218,8 @@ static void rtl8169_irq_mask_and_ack(struct rtl8169_private *tp)
{ {
void __iomem *ioaddr = tp->mmio_addr; void __iomem *ioaddr = tp->mmio_addr;
RTL_W16(IntrMask, 0x0000); rtl_irq_disable(tp);
RTL_W16(IntrStatus, tp->intr_event); rtl_ack_events(tp, tp->intr_event);
RTL_R8(ChipCmd); RTL_R8(ChipCmd);
} }
...@@ -4057,11 +4080,11 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -4057,11 +4080,11 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
rtl_init_rxcfg(tp); rtl_init_rxcfg(tp);
RTL_W16(IntrMask, 0x0000); rtl_irq_disable(tp);
rtl_hw_reset(tp); rtl_hw_reset(tp);
RTL_W16(IntrStatus, 0xffff); rtl_ack_events(tp, 0xffff);
pci_set_master(pdev); pci_set_master(pdev);
...@@ -5775,12 +5798,12 @@ static irqreturn_t rtl8169_interrupt(int irq, void *dev_instance) ...@@ -5775,12 +5798,12 @@ static irqreturn_t rtl8169_interrupt(int irq, void *dev_instance)
struct rtl8169_private *tp = netdev_priv(dev); struct rtl8169_private *tp = netdev_priv(dev);
void __iomem *ioaddr = tp->mmio_addr; void __iomem *ioaddr = tp->mmio_addr;
int handled = 0; int handled = 0;
int status; u16 status;
/* loop handling interrupts until we have no new ones or /* loop handling interrupts until we have no new ones or
* we hit a invalid/hotplug case. * we hit a invalid/hotplug case.
*/ */
status = RTL_R16(IntrStatus); status = rtl_get_events(tp);
while (status && status != 0xffff) { while (status && status != 0xffff) {
status &= tp->intr_event; status &= tp->intr_event;
if (!status) if (!status)
...@@ -5839,7 +5862,7 @@ static irqreturn_t rtl8169_interrupt(int irq, void *dev_instance) ...@@ -5839,7 +5862,7 @@ static irqreturn_t rtl8169_interrupt(int irq, void *dev_instance)
*/ */
RTL_W16(IntrStatus, RTL_W16(IntrStatus,
(status & RxFIFOOver) ? (status | RxOverflow) : status); (status & RxFIFOOver) ? (status | RxOverflow) : status);
status = RTL_R16(IntrStatus); status = rtl_get_events(tp);
} }
done: done:
return IRQ_RETVAL(handled); return IRQ_RETVAL(handled);
......
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