[brcm63xx] add preliminary support for 3.6 kernel
[openwrt.git] / target / linux / brcm63xx / patches-3.6 / 420-BCM63XX-allow-enetsw-without-tx-irq.patch
1 From 625894c377ba266c0044675b53f05d65db6355b6 Mon Sep 17 00:00:00 2001
2 From: Jonas Gorski <jonas.gorski@gmail.com>
3 Date: Sun, 8 Jul 2012 13:07:52 +0200
4 Subject: [PATCH 38/84] BCM63XX: allow enetsw without tx irq
5
6 ---
7  arch/mips/bcm63xx/dev-enet.c                 |    2 ++
8  drivers/net/ethernet/broadcom/bcm63xx_enet.c |   18 +++++++++++-------
9  2 files changed, 13 insertions(+), 7 deletions(-)
10
11 --- a/arch/mips/bcm63xx/dev-enet.c
12 +++ b/arch/mips/bcm63xx/dev-enet.c
13 @@ -236,6 +236,8 @@ bcm63xx_enetsw_register(const struct bcm
14         enetsw_res[0].end += RSET_ENETSW_SIZE - 1;
15         enetsw_res[1].start = bcm63xx_get_irq_number(IRQ_ENETSW_RXDMA0);
16         enetsw_res[2].start = bcm63xx_get_irq_number(IRQ_ENETSW_TXDMA0);
17 +       if (!enetsw_res[2].start)
18 +               enetsw_res[2].start = -1;
19  
20         memcpy(bcm63xx_enetsw_device.dev.platform_data, pd, sizeof (*pd));
21  
22 --- a/drivers/net/ethernet/broadcom/bcm63xx_enet.c
23 +++ b/drivers/net/ethernet/broadcom/bcm63xx_enet.c
24 @@ -2151,10 +2151,12 @@ static int bcm_enetsw_open(struct net_de
25         if (ret)
26                 goto out_freeirq;
27  
28 -       ret = request_irq(priv->irq_tx, bcm_enet_isr_dma,
29 -                         IRQF_DISABLED, dev->name, dev);
30 -       if (ret)
31 -               goto out_freeirq_rx;
32 +       if (priv->irq_tx != -1) {
33 +               ret = request_irq(priv->irq_tx, bcm_enet_isr_dma,
34 +                                 IRQF_DISABLED, dev->name, dev);
35 +               if (ret)
36 +                       goto out_freeirq_rx;
37 +       }
38  
39         /* allocate rx dma ring */
40         size = priv->rx_ring_size * sizeof(struct bcm_enet_desc);
41 @@ -2376,7 +2378,8 @@ out_free_rx_ring:
42                           priv->rx_desc_cpu, priv->rx_desc_dma);
43  
44  out_freeirq_tx:
45 -       free_irq(priv->irq_tx, dev);
46 +       if (priv->irq_tx != -1)
47 +               free_irq(priv->irq_tx, dev);
48  
49  out_freeirq_rx:
50         free_irq(priv->irq_rx, dev);
51 @@ -2433,7 +2436,8 @@ static int bcm_enetsw_stop(struct net_de
52                           priv->rx_desc_cpu, priv->rx_desc_dma);
53         dma_free_coherent(kdev, priv->tx_desc_alloc_size,
54                           priv->tx_desc_cpu, priv->tx_desc_dma);
55 -       free_irq(priv->irq_tx, dev);
56 +       if (priv->irq_tx != -1)
57 +               free_irq(priv->irq_tx, dev);
58         free_irq(priv->irq_rx, dev);
59  
60         return 0;
61 @@ -2716,7 +2720,7 @@ static int __devinit bcm_enetsw_probe(st
62         res_mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
63         irq_rx = platform_get_irq(pdev, 0);
64         irq_tx = platform_get_irq(pdev, 1);
65 -       if (!res_mem || irq_rx < 0 || irq_tx < 0)
66 +       if (!res_mem || irq_rx < 0)
67                 return -ENODEV;
68  
69         ret = 0;