Skip to content

Commit

Permalink
pasemi_mac: A couple of minor bugfixes.
Browse files Browse the repository at this point in the history
Bugfixes:

* Move the wake_queue logic from tx_intr to clean_tx
* Always do wake_queue even if queue wasn't full before clean since
  it's safe to do
* Fix polarity in checks in pasemi_mac_close

Signed-off-by: Olof Johansson <olof@lixom.net>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
  • Loading branch information
Olof Johansson authored and Jeff Garzik committed May 8, 2007
1 parent 5b94f67 commit 0ce68c7
Showing 1 changed file with 8 additions and 15 deletions.
23 changes: 8 additions & 15 deletions drivers/net/pasemi_mac.c
Original file line number Diff line number Diff line change
Expand Up @@ -476,6 +476,8 @@ static int pasemi_mac_clean_tx(struct pasemi_mac *mac)
mac->tx->next_to_clean += count;
spin_unlock_irqrestore(&mac->tx->lock, flags);

netif_wake_queue(mac->netdev);

return count;
}

Expand Down Expand Up @@ -510,9 +512,6 @@ static irqreturn_t pasemi_mac_tx_intr(int irq, void *data)
struct net_device *dev = data;
struct pasemi_mac *mac = netdev_priv(dev);
unsigned int reg;
int was_full;

was_full = mac->tx->next_to_clean - mac->tx->next_to_use == TX_RING_SIZE;

if (!(*mac->tx_status & PAS_STATUS_INT))
return IRQ_NONE;
Expand All @@ -526,9 +525,6 @@ static irqreturn_t pasemi_mac_tx_intr(int irq, void *data)
pci_write_config_dword(mac->iob_pdev, PAS_IOB_DMA_TXCH_RESET(mac->dma_txch),
reg);

if (was_full)
netif_wake_queue(dev);

return IRQ_HANDLED;
}

Expand Down Expand Up @@ -660,40 +656,37 @@ static int pasemi_mac_close(struct net_device *dev)
pci_read_config_dword(mac->dma_pdev,
PAS_DMA_TXCHAN_TCMDSTA(mac->dma_txch),
&stat);
if (stat & PAS_DMA_TXCHAN_TCMDSTA_ACT)
if (!(stat & PAS_DMA_TXCHAN_TCMDSTA_ACT))
break;
cond_resched();
}

if (!(stat & PAS_DMA_TXCHAN_TCMDSTA_ACT)) {
if (stat & PAS_DMA_TXCHAN_TCMDSTA_ACT)
dev_err(&mac->dma_pdev->dev, "Failed to stop tx channel\n");
}

for (retries = 0; retries < MAX_RETRIES; retries++) {
pci_read_config_dword(mac->dma_pdev,
PAS_DMA_RXCHAN_CCMDSTA(mac->dma_rxch),
&stat);
if (stat & PAS_DMA_RXCHAN_CCMDSTA_ACT)
if (!(stat & PAS_DMA_RXCHAN_CCMDSTA_ACT))
break;
cond_resched();
}

if (!(stat & PAS_DMA_RXCHAN_CCMDSTA_ACT)) {
if (stat & PAS_DMA_RXCHAN_CCMDSTA_ACT)
dev_err(&mac->dma_pdev->dev, "Failed to stop rx channel\n");
}

for (retries = 0; retries < MAX_RETRIES; retries++) {
pci_read_config_dword(mac->dma_pdev,
PAS_DMA_RXINT_RCMDSTA(mac->dma_if),
&stat);
if (stat & PAS_DMA_RXINT_RCMDSTA_ACT)
if (!(stat & PAS_DMA_RXINT_RCMDSTA_ACT))
break;
cond_resched();
}

if (!(stat & PAS_DMA_RXINT_RCMDSTA_ACT)) {
if (stat & PAS_DMA_RXINT_RCMDSTA_ACT)
dev_err(&mac->dma_pdev->dev, "Failed to stop rx interface\n");
}

/* Then, disable the channel. This must be done separately from
* stopping, since you can't disable when active.
Expand Down

0 comments on commit 0ce68c7

Please sign in to comment.