diff options
author | Olof Johansson <olof@lixom.net> | 2007-10-02 17:27:39 -0400 |
---|---|---|
committer | David S. Miller <davem@sunset.davemloft.net> | 2007-10-10 19:54:27 -0400 |
commit | 9e81d331f2ec65695e4366ce592e14f9700bae8b (patch) | |
tree | cc193c4fbceed81065ead642b7da009d8ffba746 /drivers/net/pasemi_mac.c | |
parent | 7ddeae2c6ceed7f786344731dda27d4277957780 (diff) |
pasemi_mac: clear out old errors on interface open
pasemi_mac: clear out old errors on interface open
Clear out any pending errors when an interface is brought up. Since the bits
are sticky, they might be from interface shutdown time after firmware has
used it, etc.
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 | 57 |
1 files changed, 44 insertions, 13 deletions
diff --git a/drivers/net/pasemi_mac.c b/drivers/net/pasemi_mac.c index ef1ebb4b8af2..967ff8c96b0f 100644 --- a/drivers/net/pasemi_mac.c +++ b/drivers/net/pasemi_mac.c | |||
@@ -903,16 +903,27 @@ static int pasemi_mac_open(struct net_device *dev) | |||
903 | 903 | ||
904 | /* enable rx if */ | 904 | /* enable rx if */ |
905 | write_dma_reg(mac, PAS_DMA_RXINT_RCMDSTA(mac->dma_if), | 905 | write_dma_reg(mac, PAS_DMA_RXINT_RCMDSTA(mac->dma_if), |
906 | PAS_DMA_RXINT_RCMDSTA_EN); | 906 | PAS_DMA_RXINT_RCMDSTA_EN | |
907 | PAS_DMA_RXINT_RCMDSTA_DROPS_M | | ||
908 | PAS_DMA_RXINT_RCMDSTA_BP | | ||
909 | PAS_DMA_RXINT_RCMDSTA_OO | | ||
910 | PAS_DMA_RXINT_RCMDSTA_BT); | ||
907 | 911 | ||
908 | /* enable rx channel */ | 912 | /* enable rx channel */ |
909 | write_dma_reg(mac, PAS_DMA_RXCHAN_CCMDSTA(mac->dma_rxch), | 913 | write_dma_reg(mac, PAS_DMA_RXCHAN_CCMDSTA(mac->dma_rxch), |
910 | PAS_DMA_RXCHAN_CCMDSTA_EN | | 914 | PAS_DMA_RXCHAN_CCMDSTA_EN | |
911 | PAS_DMA_RXCHAN_CCMDSTA_DU); | 915 | PAS_DMA_RXCHAN_CCMDSTA_DU | |
916 | PAS_DMA_RXCHAN_CCMDSTA_OD | | ||
917 | PAS_DMA_RXCHAN_CCMDSTA_FD | | ||
918 | PAS_DMA_RXCHAN_CCMDSTA_DT); | ||
912 | 919 | ||
913 | /* enable tx channel */ | 920 | /* enable tx channel */ |
914 | write_dma_reg(mac, PAS_DMA_TXCHAN_TCMDSTA(mac->dma_txch), | 921 | write_dma_reg(mac, PAS_DMA_TXCHAN_TCMDSTA(mac->dma_txch), |
915 | PAS_DMA_TXCHAN_TCMDSTA_EN); | 922 | PAS_DMA_TXCHAN_TCMDSTA_EN | |
923 | PAS_DMA_TXCHAN_TCMDSTA_SZ | | ||
924 | PAS_DMA_TXCHAN_TCMDSTA_DB | | ||
925 | PAS_DMA_TXCHAN_TCMDSTA_DE | | ||
926 | PAS_DMA_TXCHAN_TCMDSTA_DA); | ||
916 | 927 | ||
917 | pasemi_mac_replenish_rx_ring(dev, RX_RING_SIZE); | 928 | pasemi_mac_replenish_rx_ring(dev, RX_RING_SIZE); |
918 | 929 | ||
@@ -987,7 +998,7 @@ out_rx_resources: | |||
987 | static int pasemi_mac_close(struct net_device *dev) | 998 | static int pasemi_mac_close(struct net_device *dev) |
988 | { | 999 | { |
989 | struct pasemi_mac *mac = netdev_priv(dev); | 1000 | struct pasemi_mac *mac = netdev_priv(dev); |
990 | unsigned int stat; | 1001 | unsigned int sta; |
991 | int retries; | 1002 | int retries; |
992 | 1003 | ||
993 | if (mac->phydev) { | 1004 | if (mac->phydev) { |
@@ -998,6 +1009,26 @@ static int pasemi_mac_close(struct net_device *dev) | |||
998 | netif_stop_queue(dev); | 1009 | netif_stop_queue(dev); |
999 | napi_disable(&mac->napi); | 1010 | napi_disable(&mac->napi); |
1000 | 1011 | ||
1012 | sta = read_dma_reg(mac, PAS_DMA_RXINT_RCMDSTA(mac->dma_if)); | ||
1013 | if (sta & (PAS_DMA_RXINT_RCMDSTA_BP | | ||
1014 | PAS_DMA_RXINT_RCMDSTA_OO | | ||
1015 | PAS_DMA_RXINT_RCMDSTA_BT)) | ||
1016 | printk(KERN_DEBUG "pasemi_mac: rcmdsta error: 0x%08x\n", sta); | ||
1017 | |||
1018 | sta = read_dma_reg(mac, PAS_DMA_RXCHAN_CCMDSTA(mac->dma_rxch)); | ||
1019 | if (sta & (PAS_DMA_RXCHAN_CCMDSTA_DU | | ||
1020 | PAS_DMA_RXCHAN_CCMDSTA_OD | | ||
1021 | PAS_DMA_RXCHAN_CCMDSTA_FD | | ||
1022 | PAS_DMA_RXCHAN_CCMDSTA_DT)) | ||
1023 | printk(KERN_DEBUG "pasemi_mac: ccmdsta error: 0x%08x\n", sta); | ||
1024 | |||
1025 | sta = read_dma_reg(mac, PAS_DMA_TXCHAN_TCMDSTA(mac->dma_txch)); | ||
1026 | if (sta & (PAS_DMA_TXCHAN_TCMDSTA_SZ | | ||
1027 | PAS_DMA_TXCHAN_TCMDSTA_DB | | ||
1028 | PAS_DMA_TXCHAN_TCMDSTA_DE | | ||
1029 | PAS_DMA_TXCHAN_TCMDSTA_DA)) | ||
1030 | printk(KERN_DEBUG "pasemi_mac: tcmdsta error: 0x%08x\n", sta); | ||
1031 | |||
1001 | /* Clean out any pending buffers */ | 1032 | /* Clean out any pending buffers */ |
1002 | pasemi_mac_clean_tx(mac); | 1033 | pasemi_mac_clean_tx(mac); |
1003 | pasemi_mac_clean_rx(mac, RX_RING_SIZE); | 1034 | pasemi_mac_clean_rx(mac, RX_RING_SIZE); |
@@ -1008,33 +1039,33 @@ static int pasemi_mac_close(struct net_device *dev) | |||
1008 | write_dma_reg(mac, PAS_DMA_RXCHAN_CCMDSTA(mac->dma_rxch), PAS_DMA_RXCHAN_CCMDSTA_ST); | 1039 | write_dma_reg(mac, PAS_DMA_RXCHAN_CCMDSTA(mac->dma_rxch), PAS_DMA_RXCHAN_CCMDSTA_ST); |
1009 | 1040 | ||
1010 | for (retries = 0; retries < MAX_RETRIES; retries++) { | 1041 | for (retries = 0; retries < MAX_RETRIES; retries++) { |
1011 | stat = read_dma_reg(mac, PAS_DMA_TXCHAN_TCMDSTA(mac->dma_txch)); | 1042 | sta = read_dma_reg(mac, PAS_DMA_TXCHAN_TCMDSTA(mac->dma_txch)); |
1012 | if (!(stat & PAS_DMA_TXCHAN_TCMDSTA_ACT)) | 1043 | if (!(sta & PAS_DMA_TXCHAN_TCMDSTA_ACT)) |
1013 | break; | 1044 | break; |
1014 | cond_resched(); | 1045 | cond_resched(); |
1015 | } | 1046 | } |
1016 | 1047 | ||
1017 | if (stat & PAS_DMA_TXCHAN_TCMDSTA_ACT) | 1048 | if (sta & PAS_DMA_TXCHAN_TCMDSTA_ACT) |
1018 | dev_err(&mac->dma_pdev->dev, "Failed to stop tx channel\n"); | 1049 | dev_err(&mac->dma_pdev->dev, "Failed to stop tx channel\n"); |
1019 | 1050 | ||
1020 | for (retries = 0; retries < MAX_RETRIES; retries++) { | 1051 | for (retries = 0; retries < MAX_RETRIES; retries++) { |
1021 | stat = read_dma_reg(mac, PAS_DMA_RXCHAN_CCMDSTA(mac->dma_rxch)); | 1052 | sta = read_dma_reg(mac, PAS_DMA_RXCHAN_CCMDSTA(mac->dma_rxch)); |
1022 | if (!(stat & PAS_DMA_RXCHAN_CCMDSTA_ACT)) | 1053 | if (!(sta & PAS_DMA_RXCHAN_CCMDSTA_ACT)) |
1023 | break; | 1054 | break; |
1024 | cond_resched(); | 1055 | cond_resched(); |
1025 | } | 1056 | } |
1026 | 1057 | ||
1027 | if (stat & PAS_DMA_RXCHAN_CCMDSTA_ACT) | 1058 | if (sta & PAS_DMA_RXCHAN_CCMDSTA_ACT) |
1028 | dev_err(&mac->dma_pdev->dev, "Failed to stop rx channel\n"); | 1059 | dev_err(&mac->dma_pdev->dev, "Failed to stop rx channel\n"); |
1029 | 1060 | ||
1030 | for (retries = 0; retries < MAX_RETRIES; retries++) { | 1061 | for (retries = 0; retries < MAX_RETRIES; retries++) { |
1031 | stat = read_dma_reg(mac, PAS_DMA_RXINT_RCMDSTA(mac->dma_if)); | 1062 | sta = read_dma_reg(mac, PAS_DMA_RXINT_RCMDSTA(mac->dma_if)); |
1032 | if (!(stat & PAS_DMA_RXINT_RCMDSTA_ACT)) | 1063 | if (!(sta & PAS_DMA_RXINT_RCMDSTA_ACT)) |
1033 | break; | 1064 | break; |
1034 | cond_resched(); | 1065 | cond_resched(); |
1035 | } | 1066 | } |
1036 | 1067 | ||
1037 | if (stat & PAS_DMA_RXINT_RCMDSTA_ACT) | 1068 | if (sta & PAS_DMA_RXINT_RCMDSTA_ACT) |
1038 | dev_err(&mac->dma_pdev->dev, "Failed to stop rx interface\n"); | 1069 | dev_err(&mac->dma_pdev->dev, "Failed to stop rx interface\n"); |
1039 | 1070 | ||
1040 | /* Then, disable the channel. This must be done separately from | 1071 | /* Then, disable the channel. This must be done separately from |