aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/pasemi_mac.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/pasemi_mac.c')
-rw-r--r--drivers/net/pasemi_mac.c57
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:
987static int pasemi_mac_close(struct net_device *dev) 998static 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