Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 183860
b: refs/heads/master
c: d713804
h: refs/heads/master
v: v3
  • Loading branch information
Christian Lamparter authored and John W. Linville committed Jan 19, 2010
1 parent 1872783 commit 399fd31
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 31 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: 288c8ce8047695fd8872dd5db3ef21a9679c402f
refs/heads/master: d713804c6032b95cd3035014e16fadebb9655c6f
56 changes: 29 additions & 27 deletions trunk/drivers/net/wireless/p54/p54pci.c
Original file line number Diff line number Diff line change
Expand Up @@ -234,25 +234,26 @@ static void p54p_check_rx_ring(struct ieee80211_hw *dev, u32 *index,
p54p_refill_rx_ring(dev, ring_index, ring, ring_limit, rx_buf);
}

/* caller must hold priv->lock */
static void p54p_check_tx_ring(struct ieee80211_hw *dev, u32 *index,
int ring_index, struct p54p_desc *ring, u32 ring_limit,
void **tx_buf)
struct sk_buff **tx_buf)
{
unsigned long flags;
struct p54p_priv *priv = dev->priv;
struct p54p_ring_control *ring_control = priv->ring_control;
struct p54p_desc *desc;
struct sk_buff *skb;
u32 idx, i;

i = (*index) % ring_limit;
(*index) = idx = le32_to_cpu(ring_control->device_idx[1]);
idx %= ring_limit;

spin_lock_irqsave(&priv->lock, flags);
while (i != idx) {
desc = &ring[i];
if (tx_buf[i])
if (FREE_AFTER_TX((struct sk_buff *) tx_buf[i]))
p54_free_skb(dev, tx_buf[i]);

skb = tx_buf[i];
tx_buf[i] = NULL;

pci_unmap_single(priv->pdev, le32_to_cpu(desc->host_addr),
Expand All @@ -263,17 +264,32 @@ static void p54p_check_tx_ring(struct ieee80211_hw *dev, u32 *index,
desc->len = 0;
desc->flags = 0;

if (skb && FREE_AFTER_TX(skb)) {
spin_unlock_irqrestore(&priv->lock, flags);
p54_free_skb(dev, skb);
spin_lock_irqsave(&priv->lock, flags);
}

i++;
i %= ring_limit;
}
spin_unlock_irqrestore(&priv->lock, flags);
}

static void p54p_rx_tasklet(unsigned long dev_id)
static void p54p_tasklet(unsigned long dev_id)
{
struct ieee80211_hw *dev = (struct ieee80211_hw *)dev_id;
struct p54p_priv *priv = dev->priv;
struct p54p_ring_control *ring_control = priv->ring_control;

p54p_check_tx_ring(dev, &priv->tx_idx_mgmt, 3, ring_control->tx_mgmt,
ARRAY_SIZE(ring_control->tx_mgmt),
priv->tx_buf_mgmt);

p54p_check_tx_ring(dev, &priv->tx_idx_data, 1, ring_control->tx_data,
ARRAY_SIZE(ring_control->tx_data),
priv->tx_buf_data);

p54p_check_rx_ring(dev, &priv->rx_idx_mgmt, 2, ring_control->rx_mgmt,
ARRAY_SIZE(ring_control->rx_mgmt), priv->rx_buf_mgmt);

Expand All @@ -288,38 +304,24 @@ static irqreturn_t p54p_interrupt(int irq, void *dev_id)
{
struct ieee80211_hw *dev = dev_id;
struct p54p_priv *priv = dev->priv;
struct p54p_ring_control *ring_control = priv->ring_control;
__le32 reg;

spin_lock(&priv->lock);
reg = P54P_READ(int_ident);
if (unlikely(reg == cpu_to_le32(0xFFFFFFFF))) {
spin_unlock(&priv->lock);
return IRQ_HANDLED;
goto out;
}

P54P_WRITE(int_ack, reg);

reg &= P54P_READ(int_enable);

if (reg & cpu_to_le32(ISL38XX_INT_IDENT_UPDATE)) {
p54p_check_tx_ring(dev, &priv->tx_idx_mgmt,
3, ring_control->tx_mgmt,
ARRAY_SIZE(ring_control->tx_mgmt),
priv->tx_buf_mgmt);

p54p_check_tx_ring(dev, &priv->tx_idx_data,
1, ring_control->tx_data,
ARRAY_SIZE(ring_control->tx_data),
priv->tx_buf_data);

tasklet_schedule(&priv->rx_tasklet);

} else if (reg & cpu_to_le32(ISL38XX_INT_IDENT_INIT))
if (reg & cpu_to_le32(ISL38XX_INT_IDENT_UPDATE))
tasklet_schedule(&priv->tasklet);
else if (reg & cpu_to_le32(ISL38XX_INT_IDENT_INIT))
complete(&priv->boot_comp);

out:
spin_unlock(&priv->lock);

return reg ? IRQ_HANDLED : IRQ_NONE;
}

Expand Down Expand Up @@ -368,7 +370,7 @@ static void p54p_stop(struct ieee80211_hw *dev)
unsigned int i;
struct p54p_desc *desc;

tasklet_kill(&priv->rx_tasklet);
tasklet_kill(&priv->tasklet);

P54P_WRITE(int_enable, cpu_to_le32(0));
P54P_READ(int_enable);
Expand Down Expand Up @@ -559,7 +561,7 @@ static int __devinit p54p_probe(struct pci_dev *pdev,
priv->common.tx = p54p_tx;

spin_lock_init(&priv->lock);
tasklet_init(&priv->rx_tasklet, p54p_rx_tasklet, (unsigned long)dev);
tasklet_init(&priv->tasklet, p54p_tasklet, (unsigned long)dev);

err = request_firmware(&priv->firmware, "isl3886pci",
&priv->pdev->dev);
Expand Down
6 changes: 3 additions & 3 deletions trunk/drivers/net/wireless/p54/p54pci.h
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ struct p54p_priv {
struct p54_common common;
struct pci_dev *pdev;
struct p54p_csr __iomem *map;
struct tasklet_struct rx_tasklet;
struct tasklet_struct tasklet;
const struct firmware *firmware;
spinlock_t lock;
struct p54p_ring_control *ring_control;
Expand All @@ -101,8 +101,8 @@ struct p54p_priv {
u32 rx_idx_mgmt, tx_idx_mgmt;
struct sk_buff *rx_buf_data[8];
struct sk_buff *rx_buf_mgmt[4];
void *tx_buf_data[32];
void *tx_buf_mgmt[4];
struct sk_buff *tx_buf_data[32];
struct sk_buff *tx_buf_mgmt[4];
struct completion boot_comp;
};

Expand Down

0 comments on commit 399fd31

Please sign in to comment.