diff options
author | Byungho An <bh74.an@samsung.com> | 2014-04-29 00:15:17 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-04-30 16:12:22 -0400 |
commit | 325b94f7e63080f3e371e35f063a8be138c1873b (patch) | |
tree | d68462f19f782452eadc8d1ca66d351b1af0a97d /drivers/net/ethernet/samsung | |
parent | 0a0347b1e65d0757024d9db0ffdeafb41a9d14f4 (diff) |
net: sxgbe: Added rxqueue enable function
This patch adds rxqueue enable function according to number of rxqueue
and adds rxqueue disable function for removing.
Signed-off-by: Byungho An <bh74.an@samsung.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/samsung')
-rw-r--r-- | drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h | 2 | ||||
-rw-r--r-- | drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c | 22 | ||||
-rw-r--r-- | drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c | 8 | ||||
-rw-r--r-- | drivers/net/ethernet/samsung/sxgbe/sxgbe_reg.h | 4 |
4 files changed, 36 insertions, 0 deletions
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h index 6203c7d8550f..45019649bbbd 100644 --- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h +++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h | |||
@@ -358,6 +358,8 @@ struct sxgbe_core_ops { | |||
358 | /* Enable disable checksum offload operations */ | 358 | /* Enable disable checksum offload operations */ |
359 | void (*enable_rx_csum)(void __iomem *ioaddr); | 359 | void (*enable_rx_csum)(void __iomem *ioaddr); |
360 | void (*disable_rx_csum)(void __iomem *ioaddr); | 360 | void (*disable_rx_csum)(void __iomem *ioaddr); |
361 | void (*enable_rxqueue)(void __iomem *ioaddr, int queue_num); | ||
362 | void (*disable_rxqueue)(void __iomem *ioaddr, int queue_num); | ||
361 | }; | 363 | }; |
362 | 364 | ||
363 | const struct sxgbe_core_ops *sxgbe_get_core_ops(void); | 365 | const struct sxgbe_core_ops *sxgbe_get_core_ops(void); |
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c b/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c index c4da7a2b002a..58c35692560e 100644 --- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c +++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_core.c | |||
@@ -165,6 +165,26 @@ static void sxgbe_core_set_speed(void __iomem *ioaddr, unsigned char speed) | |||
165 | writel(tx_cfg, ioaddr + SXGBE_CORE_TX_CONFIG_REG); | 165 | writel(tx_cfg, ioaddr + SXGBE_CORE_TX_CONFIG_REG); |
166 | } | 166 | } |
167 | 167 | ||
168 | static void sxgbe_core_enable_rxqueue(void __iomem *ioaddr, int queue_num) | ||
169 | { | ||
170 | u32 reg_val; | ||
171 | |||
172 | reg_val = readl(ioaddr + SXGBE_CORE_RX_CTL0_REG); | ||
173 | reg_val &= ~(SXGBE_CORE_RXQ_ENABLE_MASK << queue_num); | ||
174 | reg_val |= SXGBE_CORE_RXQ_ENABLE; | ||
175 | writel(reg_val, ioaddr + SXGBE_CORE_RX_CTL0_REG); | ||
176 | } | ||
177 | |||
178 | static void sxgbe_core_disable_rxqueue(void __iomem *ioaddr, int queue_num) | ||
179 | { | ||
180 | u32 reg_val; | ||
181 | |||
182 | reg_val = readl(ioaddr + SXGBE_CORE_RX_CTL0_REG); | ||
183 | reg_val &= ~(SXGBE_CORE_RXQ_ENABLE_MASK << queue_num); | ||
184 | reg_val |= SXGBE_CORE_RXQ_DISABLE; | ||
185 | writel(reg_val, ioaddr + SXGBE_CORE_RX_CTL0_REG); | ||
186 | } | ||
187 | |||
168 | static void sxgbe_set_eee_mode(void __iomem *ioaddr) | 188 | static void sxgbe_set_eee_mode(void __iomem *ioaddr) |
169 | { | 189 | { |
170 | u32 ctrl; | 190 | u32 ctrl; |
@@ -254,6 +274,8 @@ static const struct sxgbe_core_ops core_ops = { | |||
254 | .set_eee_pls = sxgbe_set_eee_pls, | 274 | .set_eee_pls = sxgbe_set_eee_pls, |
255 | .enable_rx_csum = sxgbe_enable_rx_csum, | 275 | .enable_rx_csum = sxgbe_enable_rx_csum, |
256 | .disable_rx_csum = sxgbe_disable_rx_csum, | 276 | .disable_rx_csum = sxgbe_disable_rx_csum, |
277 | .enable_rxqueue = sxgbe_core_enable_rxqueue, | ||
278 | .disable_rxqueue = sxgbe_core_disable_rxqueue, | ||
257 | }; | 279 | }; |
258 | 280 | ||
259 | const struct sxgbe_core_ops *sxgbe_get_core_ops(void) | 281 | const struct sxgbe_core_ops *sxgbe_get_core_ops(void) |
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c b/drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c index 6ad7b3aaaada..fd5c428411eb 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, |
@@ -2240,9 +2243,14 @@ error_free_netdev: | |||
2240 | int sxgbe_drv_remove(struct net_device *ndev) | 2243 | int sxgbe_drv_remove(struct net_device *ndev) |
2241 | { | 2244 | { |
2242 | struct sxgbe_priv_data *priv = netdev_priv(ndev); | 2245 | struct sxgbe_priv_data *priv = netdev_priv(ndev); |
2246 | u8 queue_num; | ||
2243 | 2247 | ||
2244 | netdev_info(ndev, "%s: removing driver\n", __func__); | 2248 | netdev_info(ndev, "%s: removing driver\n", __func__); |
2245 | 2249 | ||
2250 | SXGBE_FOR_EACH_QUEUE(SXGBE_RX_QUEUES, queue_num) { | ||
2251 | priv->hw->mac->disable_rxqueue(priv->ioaddr, queue_num); | ||
2252 | } | ||
2253 | |||
2246 | priv->hw->dma->stop_rx(priv->ioaddr, SXGBE_RX_QUEUES); | 2254 | priv->hw->dma->stop_rx(priv->ioaddr, SXGBE_RX_QUEUES); |
2247 | priv->hw->dma->stop_tx(priv->ioaddr, SXGBE_TX_QUEUES); | 2255 | priv->hw->dma->stop_tx(priv->ioaddr, SXGBE_TX_QUEUES); |
2248 | 2256 | ||
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_reg.h b/drivers/net/ethernet/samsung/sxgbe/sxgbe_reg.h index 5a89acb4c505..56f8bf5a3f1b 100644 --- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_reg.h +++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_reg.h | |||
@@ -52,6 +52,10 @@ | |||
52 | #define SXGBE_CORE_RX_CTL2_REG 0x00A8 | 52 | #define SXGBE_CORE_RX_CTL2_REG 0x00A8 |
53 | #define SXGBE_CORE_RX_CTL3_REG 0x00AC | 53 | #define SXGBE_CORE_RX_CTL3_REG 0x00AC |
54 | 54 | ||
55 | #define SXGBE_CORE_RXQ_ENABLE_MASK 0x0003 | ||
56 | #define SXGBE_CORE_RXQ_ENABLE 0x0002 | ||
57 | #define SXGBE_CORE_RXQ_DISABLE 0x0000 | ||
58 | |||
55 | /* Interrupt Registers */ | 59 | /* Interrupt Registers */ |
56 | #define SXGBE_CORE_INT_STATUS_REG 0x00B0 | 60 | #define SXGBE_CORE_INT_STATUS_REG 0x00B0 |
57 | #define SXGBE_CORE_INT_ENABLE_REG 0x00B4 | 61 | #define SXGBE_CORE_INT_ENABLE_REG 0x00B4 |