diff options
Diffstat (limited to 'drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c')
-rw-r--r-- | drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c b/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c index 27e8c824b204..82a9a983869f 100644 --- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c +++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c | |||
@@ -1076,6 +1076,9 @@ static int sxgbe_open(struct net_device *dev) | |||
1076 | 1076 | ||
1077 | /* Initialize the MAC Core */ | 1077 | /* Initialize the MAC Core */ |
1078 | priv->hw->mac->core_init(priv->ioaddr); | 1078 | priv->hw->mac->core_init(priv->ioaddr); |
1079 | SXGBE_FOR_EACH_QUEUE(SXGBE_RX_QUEUES, queue_num) { | ||
1080 | priv->hw->mac->enable_rxqueue(priv->ioaddr, queue_num); | ||
1081 | } | ||
1079 | 1082 | ||
1080 | /* Request the IRQ lines */ | 1083 | /* Request the IRQ lines */ |
1081 | ret = devm_request_irq(priv->device, priv->irq, sxgbe_common_interrupt, | 1084 | ret = devm_request_irq(priv->device, priv->irq, sxgbe_common_interrupt, |
@@ -1453,6 +1456,7 @@ static void sxgbe_rx_refill(struct sxgbe_priv_data *priv) | |||
1453 | /* Added memory barrier for RX descriptor modification */ | 1456 | /* Added memory barrier for RX descriptor modification */ |
1454 | wmb(); | 1457 | wmb(); |
1455 | priv->hw->desc->set_rx_owner(p); | 1458 | priv->hw->desc->set_rx_owner(p); |
1459 | priv->hw->desc->set_rx_int_on_com(p); | ||
1456 | /* Added memory barrier for RX descriptor modification */ | 1460 | /* Added memory barrier for RX descriptor modification */ |
1457 | wmb(); | 1461 | wmb(); |
1458 | } | 1462 | } |
@@ -2070,6 +2074,24 @@ static int sxgbe_hw_init(struct sxgbe_priv_data * const priv) | |||
2070 | return 0; | 2074 | return 0; |
2071 | } | 2075 | } |
2072 | 2076 | ||
2077 | static int sxgbe_sw_reset(void __iomem *addr) | ||
2078 | { | ||
2079 | int retry_count = 10; | ||
2080 | |||
2081 | writel(SXGBE_DMA_SOFT_RESET, addr + SXGBE_DMA_MODE_REG); | ||
2082 | while (retry_count--) { | ||
2083 | if (!(readl(addr + SXGBE_DMA_MODE_REG) & | ||
2084 | SXGBE_DMA_SOFT_RESET)) | ||
2085 | break; | ||
2086 | mdelay(10); | ||
2087 | } | ||
2088 | |||
2089 | if (retry_count < 0) | ||
2090 | return -EBUSY; | ||
2091 | |||
2092 | return 0; | ||
2093 | } | ||
2094 | |||
2073 | /** | 2095 | /** |
2074 | * sxgbe_drv_probe | 2096 | * sxgbe_drv_probe |
2075 | * @device: device pointer | 2097 | * @device: device pointer |
@@ -2102,6 +2124,10 @@ struct sxgbe_priv_data *sxgbe_drv_probe(struct device *device, | |||
2102 | priv->plat = plat_dat; | 2124 | priv->plat = plat_dat; |
2103 | priv->ioaddr = addr; | 2125 | priv->ioaddr = addr; |
2104 | 2126 | ||
2127 | ret = sxgbe_sw_reset(priv->ioaddr); | ||
2128 | if (ret) | ||
2129 | goto error_free_netdev; | ||
2130 | |||
2105 | /* Verify driver arguments */ | 2131 | /* Verify driver arguments */ |
2106 | sxgbe_verify_args(); | 2132 | sxgbe_verify_args(); |
2107 | 2133 | ||
@@ -2218,9 +2244,14 @@ error_free_netdev: | |||
2218 | int sxgbe_drv_remove(struct net_device *ndev) | 2244 | int sxgbe_drv_remove(struct net_device *ndev) |
2219 | { | 2245 | { |
2220 | struct sxgbe_priv_data *priv = netdev_priv(ndev); | 2246 | struct sxgbe_priv_data *priv = netdev_priv(ndev); |
2247 | u8 queue_num; | ||
2221 | 2248 | ||
2222 | netdev_info(ndev, "%s: removing driver\n", __func__); | 2249 | netdev_info(ndev, "%s: removing driver\n", __func__); |
2223 | 2250 | ||
2251 | SXGBE_FOR_EACH_QUEUE(SXGBE_RX_QUEUES, queue_num) { | ||
2252 | priv->hw->mac->disable_rxqueue(priv->ioaddr, queue_num); | ||
2253 | } | ||
2254 | |||
2224 | priv->hw->dma->stop_rx(priv->ioaddr, SXGBE_RX_QUEUES); | 2255 | priv->hw->dma->stop_rx(priv->ioaddr, SXGBE_RX_QUEUES); |
2225 | priv->hw->dma->stop_tx(priv->ioaddr, SXGBE_TX_QUEUES); | 2256 | priv->hw->dma->stop_tx(priv->ioaddr, SXGBE_TX_QUEUES); |
2226 | 2257 | ||