Skip to content

Commit

Permalink
NET: sa11x0-ir: indirect handling of SIR and FIR interrupts
Browse files Browse the repository at this point in the history
Use the same method for doing this as we do for the tx_start functions.

Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
  • Loading branch information
Russell King committed Feb 9, 2012
1 parent 3d26db1 commit 374f773
Showing 1 changed file with 24 additions and 26 deletions.
50 changes: 24 additions & 26 deletions drivers/net/irda/sa1100_ir.c
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ struct sa1100_irda {
iobuff_t rx_buff;

int (*tx_start)(struct sk_buff *, struct net_device *, struct sa1100_irda *);
irqreturn_t (*irq)(struct net_device *, struct sa1100_irda *);
};

static int sa1100_irda_set_speed(struct sa1100_irda *, int);
Expand Down Expand Up @@ -197,6 +198,8 @@ static int sa1100_irda_fir_tx_start(struct sk_buff *skb, struct net_device *dev,
return NETDEV_TX_OK;
}

static irqreturn_t sa1100_irda_sir_irq(struct net_device *, struct sa1100_irda *);
static irqreturn_t sa1100_irda_fir_irq(struct net_device *, struct sa1100_irda *);

/*
* Set the IrDA communications speed.
Expand Down Expand Up @@ -236,6 +239,7 @@ static int sa1100_irda_set_speed(struct sa1100_irda *si, int speed)

si->speed = speed;
si->tx_start = sa1100_irda_sir_tx_start;
si->irq = sa1100_irda_sir_irq;

local_irq_restore(flags);
ret = 0;
Expand All @@ -252,6 +256,7 @@ static int sa1100_irda_set_speed(struct sa1100_irda *si, int speed)

si->speed = speed;
si->tx_start = sa1100_irda_fir_tx_start;
si->irq = sa1100_irda_fir_irq;

if (si->pdata->set_speed)
si->pdata->set_speed(si->dev, speed);
Expand Down Expand Up @@ -304,9 +309,8 @@ sa1100_set_power(struct sa1100_irda *si, unsigned int state)
/*
* HP-SIR format interrupt service routines.
*/
static void sa1100_irda_hpsir_irq(struct net_device *dev)
static irqreturn_t sa1100_irda_sir_irq(struct net_device *dev, struct sa1100_irda *si)
{
struct sa1100_irda *si = netdev_priv(dev);
int status;

status = Ser2UTSR0;
Expand Down Expand Up @@ -395,6 +399,8 @@ static void sa1100_irda_hpsir_irq(struct net_device *dev)
netif_wake_queue(dev);
}
}

return IRQ_HANDLED;
}

static void sa1100_irda_fir_error(struct sa1100_irda *si, struct net_device *dev)
Expand Down Expand Up @@ -475,10 +481,8 @@ static void sa1100_irda_fir_error(struct sa1100_irda *si, struct net_device *dev
*
* No matter what, we disable RX, process, and the restart RX.
*/
static void sa1100_irda_fir_irq(struct net_device *dev)
static irqreturn_t sa1100_irda_fir_irq(struct net_device *dev, struct sa1100_irda *si)
{
struct sa1100_irda *si = netdev_priv(dev);

/*
* Stop RX DMA
*/
Expand Down Expand Up @@ -520,16 +524,16 @@ static void sa1100_irda_fir_irq(struct net_device *dev)
* No matter what happens, we must restart reception.
*/
sa1100_irda_rx_dma_start(si);

return IRQ_HANDLED;
}

static irqreturn_t sa1100_irda_irq(int irq, void *dev_id)
{
struct net_device *dev = dev_id;
if (IS_FIR(((struct sa1100_irda *)netdev_priv(dev))))
sa1100_irda_fir_irq(dev);
else
sa1100_irda_hpsir_irq(dev);
return IRQ_HANDLED;
struct sa1100_irda *si = netdev_priv(dev);

return si->irq(dev, si);
}

/*
Expand Down Expand Up @@ -728,10 +732,6 @@ static int sa1100_irda_start(struct net_device *dev)

si->speed = 9600;

err = request_irq(dev->irq, sa1100_irda_irq, 0, dev->name, dev);
if (err)
goto err_irq;

err = sa1100_request_dma(DMA_Ser2HSSPRd, "IrDA receive",
NULL, NULL, &si->dma_rx.regs);
if (err)
Expand All @@ -742,11 +742,6 @@ static int sa1100_irda_start(struct net_device *dev)
if (err)
goto err_tx_dma;

/*
* The interrupt must remain disabled for now.
*/
disable_irq(dev->irq);

/*
* Setup the serial port for the specified speed.
*/
Expand All @@ -762,15 +757,21 @@ static int sa1100_irda_start(struct net_device *dev)
if (!si->irlap)
goto err_irlap;

err = request_irq(dev->irq, sa1100_irda_irq, 0, dev->name, dev);
if (err)
goto err_irq;

/*
* Now enable the interrupt and start the queue
*/
si->open = 1;
sa1100_set_power(si, power_level); /* low power mode */
enable_irq(dev->irq);

netif_start_queue(dev);
return 0;

err_irq:
irlap_close(si->irlap);
err_irlap:
si->open = 0;
sa1100_irda_shutdown(si);
Expand All @@ -779,8 +780,6 @@ static int sa1100_irda_start(struct net_device *dev)
err_tx_dma:
sa1100_free_dma(si->dma_rx.regs);
err_rx_dma:
free_irq(dev->irq, dev);
err_irq:
return err;
}

Expand All @@ -789,7 +788,9 @@ static int sa1100_irda_stop(struct net_device *dev)
struct sa1100_irda *si = netdev_priv(dev);
struct sk_buff *skb;

disable_irq(dev->irq);
netif_stop_queue(dev);

si->open = 0;
sa1100_irda_shutdown(si);

/*
Expand Down Expand Up @@ -818,9 +819,6 @@ static int sa1100_irda_stop(struct net_device *dev)
si->irlap = NULL;
}

netif_stop_queue(dev);
si->open = 0;

/*
* Free resources
*/
Expand Down

0 comments on commit 374f773

Please sign in to comment.