Skip to content

Commit

Permalink
net-next: mediatek: add IRQ locking
Browse files Browse the repository at this point in the history
The code that enables and disables IRQs is missing proper locking. After
adding the IRQ grouping patch and routing the RX and TX IRQs to different
cores we experienced IRQ stalls. Fix this by adding proper locking.
We use a dedicated lock to reduce the latency if the IRQ code.

Signed-off-by: John Crispin <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
blogic authored and davem330 committed Jun 30, 2016
1 parent eece71e commit 7bc9cce
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 0 deletions.
7 changes: 7 additions & 0 deletions drivers/net/ethernet/mediatek/mtk_eth_soc.c
Original file line number Diff line number Diff line change
Expand Up @@ -328,18 +328,24 @@ static void mtk_mdio_cleanup(struct mtk_eth *eth)

static inline void mtk_irq_disable(struct mtk_eth *eth, u32 mask)
{
unsigned long flags;
u32 val;

spin_lock_irqsave(&eth->irq_lock, flags);
val = mtk_r32(eth, MTK_QDMA_INT_MASK);
mtk_w32(eth, val & ~mask, MTK_QDMA_INT_MASK);
spin_unlock_irqrestore(&eth->irq_lock, flags);
}

static inline void mtk_irq_enable(struct mtk_eth *eth, u32 mask)
{
unsigned long flags;
u32 val;

spin_lock_irqsave(&eth->irq_lock, flags);
val = mtk_r32(eth, MTK_QDMA_INT_MASK);
mtk_w32(eth, val | mask, MTK_QDMA_INT_MASK);
spin_unlock_irqrestore(&eth->irq_lock, flags);
}

static int mtk_set_mac_address(struct net_device *dev, void *p)
Expand Down Expand Up @@ -1760,6 +1766,7 @@ static int mtk_probe(struct platform_device *pdev)
return PTR_ERR(eth->base);

spin_lock_init(&eth->page_lock);
spin_lock_init(&eth->irq_lock);

eth->ethsys = syscon_regmap_lookup_by_phandle(pdev->dev.of_node,
"mediatek,ethsys");
Expand Down
1 change: 1 addition & 0 deletions drivers/net/ethernet/mediatek/mtk_eth_soc.h
Original file line number Diff line number Diff line change
Expand Up @@ -373,6 +373,7 @@ struct mtk_eth {
void __iomem *base;
struct reset_control *rstc;
spinlock_t page_lock;
spinlock_t irq_lock;
struct net_device dummy_dev;
struct net_device *netdev[MTK_MAX_DEVS];
struct mtk_mac *mac[MTK_MAX_DEVS];
Expand Down

0 comments on commit 7bc9cce

Please sign in to comment.