diff options
author | Olof Johansson <olof@lixom.net> | 2007-05-12 19:01:09 -0400 |
---|---|---|
committer | Jeff Garzik <jeff@garzik.org> | 2007-05-15 17:44:39 -0400 |
commit | 52a9435183f961e1bb3c146a62bfbecf93d15d58 (patch) | |
tree | 6e38b92dbf4b2667cbad7b5930b249fd0ed2f94c /drivers/net/pasemi_mac.c | |
parent | a54c545134ea77609ed9eb5df50524c097112327 (diff) |
pasemi_mac: Interrupt ack fixes
Interrupt ack fixes
Fix the packet count resets at interrupt time, using the cacheable
packet count status to set number of processed/received packets, since
the ack count is the cumulative number of packets processed, and not
incremental.
Signed-off-by: Olof Johansson <olof@lixom.net>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
Diffstat (limited to 'drivers/net/pasemi_mac.c')
-rw-r--r-- | drivers/net/pasemi_mac.c | 27 |
1 files changed, 13 insertions, 14 deletions
diff --git a/drivers/net/pasemi_mac.c b/drivers/net/pasemi_mac.c index bc7f3dee6e5b..39e33aeca11a 100644 --- a/drivers/net/pasemi_mac.c +++ b/drivers/net/pasemi_mac.c | |||
@@ -384,17 +384,14 @@ static void pasemi_mac_replenish_rx_ring(struct net_device *dev) | |||
384 | 384 | ||
385 | static void pasemi_mac_restart_rx_intr(struct pasemi_mac *mac) | 385 | static void pasemi_mac_restart_rx_intr(struct pasemi_mac *mac) |
386 | { | 386 | { |
387 | unsigned int reg, stat; | 387 | unsigned int reg, pcnt; |
388 | /* Re-enable packet count interrupts: finally | 388 | /* Re-enable packet count interrupts: finally |
389 | * ack the packet count interrupt we got in rx_intr. | 389 | * ack the packet count interrupt we got in rx_intr. |
390 | */ | 390 | */ |
391 | 391 | ||
392 | pci_read_config_dword(mac->iob_pdev, | 392 | pcnt = *mac->rx_status & PAS_STATUS_PCNT_M; |
393 | PAS_IOB_DMA_RXCH_STAT(mac->dma_rxch), | ||
394 | &stat); | ||
395 | 393 | ||
396 | reg = PAS_IOB_DMA_RXCH_RESET_PCNT(stat & PAS_IOB_DMA_RXCH_STAT_CNTDEL_M) | 394 | reg = PAS_IOB_DMA_RXCH_RESET_PCNT(pcnt) | PAS_IOB_DMA_RXCH_RESET_PINTC; |
397 | | PAS_IOB_DMA_RXCH_RESET_PINTC; | ||
398 | 395 | ||
399 | pci_write_config_dword(mac->iob_pdev, | 396 | pci_write_config_dword(mac->iob_pdev, |
400 | PAS_IOB_DMA_RXCH_RESET(mac->dma_rxch), | 397 | PAS_IOB_DMA_RXCH_RESET(mac->dma_rxch), |
@@ -403,14 +400,12 @@ static void pasemi_mac_restart_rx_intr(struct pasemi_mac *mac) | |||
403 | 400 | ||
404 | static void pasemi_mac_restart_tx_intr(struct pasemi_mac *mac) | 401 | static void pasemi_mac_restart_tx_intr(struct pasemi_mac *mac) |
405 | { | 402 | { |
406 | unsigned int reg, stat; | 403 | unsigned int reg, pcnt; |
407 | 404 | ||
408 | /* Re-enable packet count interrupts */ | 405 | /* Re-enable packet count interrupts */ |
409 | pci_read_config_dword(mac->iob_pdev, | 406 | pcnt = *mac->tx_status & PAS_STATUS_PCNT_M; |
410 | PAS_IOB_DMA_TXCH_STAT(mac->dma_txch), &stat); | ||
411 | 407 | ||
412 | reg = PAS_IOB_DMA_TXCH_RESET_PCNT(stat & PAS_IOB_DMA_TXCH_STAT_CNTDEL_M) | 408 | reg = PAS_IOB_DMA_TXCH_RESET_PCNT(pcnt) | PAS_IOB_DMA_TXCH_RESET_PINTC; |
413 | | PAS_IOB_DMA_TXCH_RESET_PINTC; | ||
414 | 409 | ||
415 | pci_write_config_dword(mac->iob_pdev, | 410 | pci_write_config_dword(mac->iob_pdev, |
416 | PAS_IOB_DMA_TXCH_RESET(mac->dma_txch), reg); | 411 | PAS_IOB_DMA_TXCH_RESET(mac->dma_txch), reg); |
@@ -591,21 +586,24 @@ static irqreturn_t pasemi_mac_tx_intr(int irq, void *data) | |||
591 | { | 586 | { |
592 | struct net_device *dev = data; | 587 | struct net_device *dev = data; |
593 | struct pasemi_mac *mac = netdev_priv(dev); | 588 | struct pasemi_mac *mac = netdev_priv(dev); |
594 | unsigned int reg; | 589 | unsigned int reg, pcnt; |
595 | 590 | ||
596 | if (!(*mac->tx_status & PAS_STATUS_CAUSE_M)) | 591 | if (!(*mac->tx_status & PAS_STATUS_CAUSE_M)) |
597 | return IRQ_NONE; | 592 | return IRQ_NONE; |
598 | 593 | ||
599 | pasemi_mac_clean_tx(mac); | 594 | pasemi_mac_clean_tx(mac); |
600 | 595 | ||
601 | reg = PAS_IOB_DMA_TXCH_RESET_PINTC; | 596 | pcnt = *mac->tx_status & PAS_STATUS_PCNT_M; |
597 | |||
598 | reg = PAS_IOB_DMA_TXCH_RESET_PCNT(pcnt) | PAS_IOB_DMA_TXCH_RESET_PINTC; | ||
602 | 599 | ||
603 | if (*mac->tx_status & PAS_STATUS_SOFT) | 600 | if (*mac->tx_status & PAS_STATUS_SOFT) |
604 | reg |= PAS_IOB_DMA_TXCH_RESET_SINTC; | 601 | reg |= PAS_IOB_DMA_TXCH_RESET_SINTC; |
605 | if (*mac->tx_status & PAS_STATUS_ERROR) | 602 | if (*mac->tx_status & PAS_STATUS_ERROR) |
606 | reg |= PAS_IOB_DMA_TXCH_RESET_DINTC; | 603 | reg |= PAS_IOB_DMA_TXCH_RESET_DINTC; |
607 | 604 | ||
608 | pci_write_config_dword(mac->iob_pdev, PAS_IOB_DMA_TXCH_RESET(mac->dma_txch), | 605 | pci_write_config_dword(mac->iob_pdev, |
606 | PAS_IOB_DMA_TXCH_RESET(mac->dma_txch), | ||
609 | reg); | 607 | reg); |
610 | 608 | ||
611 | return IRQ_HANDLED; | 609 | return IRQ_HANDLED; |
@@ -974,6 +972,7 @@ static int pasemi_mac_start_tx(struct sk_buff *skb, struct net_device *dev) | |||
974 | if (txring->next_to_clean - txring->next_to_use == TX_RING_SIZE) { | 972 | if (txring->next_to_clean - txring->next_to_use == TX_RING_SIZE) { |
975 | spin_unlock_irqrestore(&txring->lock, flags); | 973 | spin_unlock_irqrestore(&txring->lock, flags); |
976 | pasemi_mac_clean_tx(mac); | 974 | pasemi_mac_clean_tx(mac); |
975 | pasemi_mac_restart_tx_intr(mac); | ||
977 | spin_lock_irqsave(&txring->lock, flags); | 976 | spin_lock_irqsave(&txring->lock, flags); |
978 | 977 | ||
979 | if (txring->next_to_clean - txring->next_to_use == | 978 | if (txring->next_to_clean - txring->next_to_use == |