diff options
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 |