Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 296323
b: refs/heads/master
c: 374f773
h: refs/heads/master
i:
  296321: 5147fa7
  296319: b09588a
v: v3
  • Loading branch information
Russell King committed Feb 9, 2012
1 parent ef871d0 commit 3016e72
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 27 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 3d26db137ac3169623a132ea310d26af6a48bf88
refs/heads/master: 374f77390ca99b401ee121616524ed32c54d5ad6
50 changes: 24 additions & 26 deletions trunk/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 3016e72

Please sign in to comment.