aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2014-10-08 16:01:46 -0400
committerDavid S. Miller <davem@davemloft.net>2014-10-08 16:01:46 -0400
commit44783d87512999fe1450ff2cdf26c1ddc3fa5eea (patch)
tree5a49f7bcc87106c58aab068841c7e869db659126
parent935e2218d5a0fade1645982fb034eee37f100f11 (diff)
parentd43a396af0f54740c4f491a066d249b7d7467593 (diff)
Merge branch 'fs_enet_napi'
Christophe Leroy says: ==================== net: fs_enet: Remove non NAPI RX and add NAPI for TX When using a MPC8xx as a router, 'perf' shows a significant time spent in fs_enet_interrupt() and fs_enet_start_xmit(). 'perf annotate' shows that the time spent in fs_enet_start_xmit is indeed spent between spin_unlock_irqrestore() and the following instruction, hence in interrupt handling. This is due to the TX complete interrupt that fires after each transmitted packet. This patchset first remove all non NAPI handling as NAPI has become the only mode for RX, then adds NAPI for handling TX complete. This improves NAT TCP throughput by 21% on MPC885 with FEC. Tested on MPC885 with FEC. [PATCH 1/2] net: fs_enet: Remove non NAPI RX [PATCH 2/2] net: fs_enet: Add NAPI TX Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr> ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/freescale/fs_enet/fs_enet-main.c211
-rw-r--r--drivers/net/ethernet/freescale/fs_enet/fs_enet.h9
-rw-r--r--drivers/net/ethernet/freescale/fs_enet/mac-fcc.c29
-rw-r--r--drivers/net/ethernet/freescale/fs_enet/mac-fec.c29
-rw-r--r--drivers/net/ethernet/freescale/fs_enet/mac-scc.c29
-rw-r--r--include/linux/fs_enet_pd.h1
6 files changed, 147 insertions, 161 deletions
diff --git a/drivers/net/ethernet/freescale/fs_enet/fs_enet-main.c b/drivers/net/ethernet/freescale/fs_enet/fs_enet-main.c
index 748fd24d3d9e..c92c3b7876ca 100644
--- a/drivers/net/ethernet/freescale/fs_enet/fs_enet-main.c
+++ b/drivers/net/ethernet/freescale/fs_enet/fs_enet-main.c
@@ -215,139 +215,23 @@ static int fs_enet_rx_napi(struct napi_struct *napi, int budget)
215 return received; 215 return received;
216} 216}
217 217
218/* non NAPI receive function */ 218static int fs_enet_tx_napi(struct napi_struct *napi, int budget)
219static int fs_enet_rx_non_napi(struct net_device *dev)
220{ 219{
221 struct fs_enet_private *fep = netdev_priv(dev); 220 struct fs_enet_private *fep = container_of(napi, struct fs_enet_private,
222 const struct fs_platform_info *fpi = fep->fpi; 221 napi_tx);
223 cbd_t __iomem *bdp; 222 struct net_device *dev = fep->ndev;
224 struct sk_buff *skb, *skbn, *skbt;
225 int received = 0;
226 u16 pkt_len, sc;
227 int curidx;
228 /*
229 * First, grab all of the stats for the incoming packet.
230 * These get messed up if we get called due to a busy condition.
231 */
232 bdp = fep->cur_rx;
233
234 while (((sc = CBDR_SC(bdp)) & BD_ENET_RX_EMPTY) == 0) {
235
236 curidx = bdp - fep->rx_bd_base;
237
238 /*
239 * Since we have allocated space to hold a complete frame,
240 * the last indicator should be set.
241 */
242 if ((sc & BD_ENET_RX_LAST) == 0)
243 dev_warn(fep->dev, "rcv is not +last\n");
244
245 /*
246 * Check for errors.
247 */
248 if (sc & (BD_ENET_RX_LG | BD_ENET_RX_SH | BD_ENET_RX_CL |
249 BD_ENET_RX_NO | BD_ENET_RX_CR | BD_ENET_RX_OV)) {
250 fep->stats.rx_errors++;
251 /* Frame too long or too short. */
252 if (sc & (BD_ENET_RX_LG | BD_ENET_RX_SH))
253 fep->stats.rx_length_errors++;
254 /* Frame alignment */
255 if (sc & (BD_ENET_RX_NO | BD_ENET_RX_CL))
256 fep->stats.rx_frame_errors++;
257 /* CRC Error */
258 if (sc & BD_ENET_RX_CR)
259 fep->stats.rx_crc_errors++;
260 /* FIFO overrun */
261 if (sc & BD_ENET_RX_OV)
262 fep->stats.rx_crc_errors++;
263
264 skb = fep->rx_skbuff[curidx];
265
266 dma_unmap_single(fep->dev, CBDR_BUFADDR(bdp),
267 L1_CACHE_ALIGN(PKT_MAXBUF_SIZE),
268 DMA_FROM_DEVICE);
269
270 skbn = skb;
271
272 } else {
273
274 skb = fep->rx_skbuff[curidx];
275
276 dma_unmap_single(fep->dev, CBDR_BUFADDR(bdp),
277 L1_CACHE_ALIGN(PKT_MAXBUF_SIZE),
278 DMA_FROM_DEVICE);
279
280 /*
281 * Process the incoming frame.
282 */
283 fep->stats.rx_packets++;
284 pkt_len = CBDR_DATLEN(bdp) - 4; /* remove CRC */
285 fep->stats.rx_bytes += pkt_len + 4;
286
287 if (pkt_len <= fpi->rx_copybreak) {
288 /* +2 to make IP header L1 cache aligned */
289 skbn = netdev_alloc_skb(dev, pkt_len + 2);
290 if (skbn != NULL) {
291 skb_reserve(skbn, 2); /* align IP header */
292 skb_copy_from_linear_data(skb,
293 skbn->data, pkt_len);
294 /* swap */
295 skbt = skb;
296 skb = skbn;
297 skbn = skbt;
298 }
299 } else {
300 skbn = netdev_alloc_skb(dev, ENET_RX_FRSIZE);
301
302 if (skbn)
303 skb_align(skbn, ENET_RX_ALIGN);
304 }
305
306 if (skbn != NULL) {
307 skb_put(skb, pkt_len); /* Make room */
308 skb->protocol = eth_type_trans(skb, dev);
309 received++;
310 netif_rx(skb);
311 } else {
312 fep->stats.rx_dropped++;
313 skbn = skb;
314 }
315 }
316
317 fep->rx_skbuff[curidx] = skbn;
318 CBDW_BUFADDR(bdp, dma_map_single(fep->dev, skbn->data,
319 L1_CACHE_ALIGN(PKT_MAXBUF_SIZE),
320 DMA_FROM_DEVICE));
321 CBDW_DATLEN(bdp, 0);
322 CBDW_SC(bdp, (sc & ~BD_ENET_RX_STATS) | BD_ENET_RX_EMPTY);
323
324 /*
325 * Update BD pointer to next entry.
326 */
327 if ((sc & BD_ENET_RX_WRAP) == 0)
328 bdp++;
329 else
330 bdp = fep->rx_bd_base;
331
332 (*fep->ops->rx_bd_done)(dev);
333 }
334
335 fep->cur_rx = bdp;
336
337 return 0;
338}
339
340static void fs_enet_tx(struct net_device *dev)
341{
342 struct fs_enet_private *fep = netdev_priv(dev);
343 cbd_t __iomem *bdp; 223 cbd_t __iomem *bdp;
344 struct sk_buff *skb; 224 struct sk_buff *skb;
345 int dirtyidx, do_wake, do_restart; 225 int dirtyidx, do_wake, do_restart;
346 u16 sc; 226 u16 sc;
227 int has_tx_work = 0;
347 228
348 spin_lock(&fep->tx_lock); 229 spin_lock(&fep->tx_lock);
349 bdp = fep->dirty_tx; 230 bdp = fep->dirty_tx;
350 231
232 /* clear TX status bits for napi*/
233 (*fep->ops->napi_clear_tx_event)(dev);
234
351 do_wake = do_restart = 0; 235 do_wake = do_restart = 0;
352 while (((sc = CBDR_SC(bdp)) & BD_ENET_TX_READY) == 0) { 236 while (((sc = CBDR_SC(bdp)) & BD_ENET_TX_READY) == 0) {
353 dirtyidx = bdp - fep->tx_bd_base; 237 dirtyidx = bdp - fep->tx_bd_base;
@@ -400,7 +284,7 @@ static void fs_enet_tx(struct net_device *dev)
400 /* 284 /*
401 * Free the sk buffer associated with this last transmit. 285 * Free the sk buffer associated with this last transmit.
402 */ 286 */
403 dev_kfree_skb_irq(skb); 287 dev_kfree_skb(skb);
404 fep->tx_skbuff[dirtyidx] = NULL; 288 fep->tx_skbuff[dirtyidx] = NULL;
405 289
406 /* 290 /*
@@ -417,6 +301,7 @@ static void fs_enet_tx(struct net_device *dev)
417 */ 301 */
418 if (!fep->tx_free++) 302 if (!fep->tx_free++)
419 do_wake = 1; 303 do_wake = 1;
304 has_tx_work = 1;
420 } 305 }
421 306
422 fep->dirty_tx = bdp; 307 fep->dirty_tx = bdp;
@@ -424,10 +309,19 @@ static void fs_enet_tx(struct net_device *dev)
424 if (do_restart) 309 if (do_restart)
425 (*fep->ops->tx_restart)(dev); 310 (*fep->ops->tx_restart)(dev);
426 311
312 if (!has_tx_work) {
313 napi_complete(napi);
314 (*fep->ops->napi_enable_tx)(dev);
315 }
316
427 spin_unlock(&fep->tx_lock); 317 spin_unlock(&fep->tx_lock);
428 318
429 if (do_wake) 319 if (do_wake)
430 netif_wake_queue(dev); 320 netif_wake_queue(dev);
321
322 if (has_tx_work)
323 return budget;
324 return 0;
431} 325}
432 326
433/* 327/*
@@ -453,8 +347,7 @@ fs_enet_interrupt(int irq, void *dev_id)
453 nr++; 347 nr++;
454 348
455 int_clr_events = int_events; 349 int_clr_events = int_events;
456 if (fpi->use_napi) 350 int_clr_events &= ~fep->ev_napi_rx;
457 int_clr_events &= ~fep->ev_napi_rx;
458 351
459 (*fep->ops->clear_int_events)(dev, int_clr_events); 352 (*fep->ops->clear_int_events)(dev, int_clr_events);
460 353
@@ -462,23 +355,28 @@ fs_enet_interrupt(int irq, void *dev_id)
462 (*fep->ops->ev_error)(dev, int_events); 355 (*fep->ops->ev_error)(dev, int_events);
463 356
464 if (int_events & fep->ev_rx) { 357 if (int_events & fep->ev_rx) {
465 if (!fpi->use_napi) 358 napi_ok = napi_schedule_prep(&fep->napi);
466 fs_enet_rx_non_napi(dev); 359
467 else { 360 (*fep->ops->napi_disable_rx)(dev);
468 napi_ok = napi_schedule_prep(&fep->napi); 361 (*fep->ops->clear_int_events)(dev, fep->ev_napi_rx);
469 362
470 (*fep->ops->napi_disable_rx)(dev); 363 /* NOTE: it is possible for FCCs in NAPI mode */
471 (*fep->ops->clear_int_events)(dev, fep->ev_napi_rx); 364 /* to submit a spurious interrupt while in poll */
472 365 if (napi_ok)
473 /* NOTE: it is possible for FCCs in NAPI mode */ 366 __napi_schedule(&fep->napi);
474 /* to submit a spurious interrupt while in poll */
475 if (napi_ok)
476 __napi_schedule(&fep->napi);
477 }
478 } 367 }
479 368
480 if (int_events & fep->ev_tx) 369 if (int_events & fep->ev_tx) {
481 fs_enet_tx(dev); 370 napi_ok = napi_schedule_prep(&fep->napi_tx);
371
372 (*fep->ops->napi_disable_tx)(dev);
373 (*fep->ops->clear_int_events)(dev, fep->ev_napi_tx);
374
375 /* NOTE: it is possible for FCCs in NAPI mode */
376 /* to submit a spurious interrupt while in poll */
377 if (napi_ok)
378 __napi_schedule(&fep->napi_tx);
379 }
482 } 380 }
483 381
484 handled = nr > 0; 382 handled = nr > 0;
@@ -611,7 +509,6 @@ static int fs_enet_start_xmit(struct sk_buff *skb, struct net_device *dev)
611 cbd_t __iomem *bdp; 509 cbd_t __iomem *bdp;
612 int curidx; 510 int curidx;
613 u16 sc; 511 u16 sc;
614 unsigned long flags;
615 512
616#ifdef CONFIG_FS_ENET_MPC5121_FEC 513#ifdef CONFIG_FS_ENET_MPC5121_FEC
617 if (((unsigned long)skb->data) & 0x3) { 514 if (((unsigned long)skb->data) & 0x3) {
@@ -626,7 +523,7 @@ static int fs_enet_start_xmit(struct sk_buff *skb, struct net_device *dev)
626 } 523 }
627 } 524 }
628#endif 525#endif
629 spin_lock_irqsave(&fep->tx_lock, flags); 526 spin_lock(&fep->tx_lock);
630 527
631 /* 528 /*
632 * Fill in a Tx ring entry 529 * Fill in a Tx ring entry
@@ -635,7 +532,7 @@ static int fs_enet_start_xmit(struct sk_buff *skb, struct net_device *dev)
635 532
636 if (!fep->tx_free || (CBDR_SC(bdp) & BD_ENET_TX_READY)) { 533 if (!fep->tx_free || (CBDR_SC(bdp) & BD_ENET_TX_READY)) {
637 netif_stop_queue(dev); 534 netif_stop_queue(dev);
638 spin_unlock_irqrestore(&fep->tx_lock, flags); 535 spin_unlock(&fep->tx_lock);
639 536
640 /* 537 /*
641 * Ooops. All transmit buffers are full. Bail out. 538 * Ooops. All transmit buffers are full. Bail out.
@@ -691,7 +588,7 @@ static int fs_enet_start_xmit(struct sk_buff *skb, struct net_device *dev)
691 588
692 (*fep->ops->tx_kickstart)(dev); 589 (*fep->ops->tx_kickstart)(dev);
693 590
694 spin_unlock_irqrestore(&fep->tx_lock, flags); 591 spin_unlock(&fep->tx_lock);
695 592
696 return NETDEV_TX_OK; 593 return NETDEV_TX_OK;
697} 594}
@@ -811,24 +708,24 @@ static int fs_enet_open(struct net_device *dev)
811 /* not doing this, will cause a crash in fs_enet_rx_napi */ 708 /* not doing this, will cause a crash in fs_enet_rx_napi */
812 fs_init_bds(fep->ndev); 709 fs_init_bds(fep->ndev);
813 710
814 if (fep->fpi->use_napi) 711 napi_enable(&fep->napi);
815 napi_enable(&fep->napi); 712 napi_enable(&fep->napi_tx);
816 713
817 /* Install our interrupt handler. */ 714 /* Install our interrupt handler. */
818 r = request_irq(fep->interrupt, fs_enet_interrupt, IRQF_SHARED, 715 r = request_irq(fep->interrupt, fs_enet_interrupt, IRQF_SHARED,
819 "fs_enet-mac", dev); 716 "fs_enet-mac", dev);
820 if (r != 0) { 717 if (r != 0) {
821 dev_err(fep->dev, "Could not allocate FS_ENET IRQ!"); 718 dev_err(fep->dev, "Could not allocate FS_ENET IRQ!");
822 if (fep->fpi->use_napi) 719 napi_disable(&fep->napi);
823 napi_disable(&fep->napi); 720 napi_disable(&fep->napi_tx);
824 return -EINVAL; 721 return -EINVAL;
825 } 722 }
826 723
827 err = fs_init_phy(dev); 724 err = fs_init_phy(dev);
828 if (err) { 725 if (err) {
829 free_irq(fep->interrupt, dev); 726 free_irq(fep->interrupt, dev);
830 if (fep->fpi->use_napi) 727 napi_disable(&fep->napi);
831 napi_disable(&fep->napi); 728 napi_disable(&fep->napi_tx);
832 return err; 729 return err;
833 } 730 }
834 phy_start(fep->phydev); 731 phy_start(fep->phydev);
@@ -845,8 +742,8 @@ static int fs_enet_close(struct net_device *dev)
845 742
846 netif_stop_queue(dev); 743 netif_stop_queue(dev);
847 netif_carrier_off(dev); 744 netif_carrier_off(dev);
848 if (fep->fpi->use_napi) 745 napi_disable(&fep->napi);
849 napi_disable(&fep->napi); 746 napi_disable(&fep->napi_tx);
850 phy_stop(fep->phydev); 747 phy_stop(fep->phydev);
851 748
852 spin_lock_irqsave(&fep->lock, flags); 749 spin_lock_irqsave(&fep->lock, flags);
@@ -1022,7 +919,6 @@ static int fs_enet_probe(struct platform_device *ofdev)
1022 fpi->rx_ring = 32; 919 fpi->rx_ring = 32;
1023 fpi->tx_ring = 32; 920 fpi->tx_ring = 32;
1024 fpi->rx_copybreak = 240; 921 fpi->rx_copybreak = 240;
1025 fpi->use_napi = 1;
1026 fpi->napi_weight = 17; 922 fpi->napi_weight = 17;
1027 fpi->phy_node = of_parse_phandle(ofdev->dev.of_node, "phy-handle", 0); 923 fpi->phy_node = of_parse_phandle(ofdev->dev.of_node, "phy-handle", 0);
1028 if (!fpi->phy_node && of_phy_is_fixed_link(ofdev->dev.of_node)) { 924 if (!fpi->phy_node && of_phy_is_fixed_link(ofdev->dev.of_node)) {
@@ -1102,9 +998,8 @@ static int fs_enet_probe(struct platform_device *ofdev)
1102 998
1103 ndev->netdev_ops = &fs_enet_netdev_ops; 999 ndev->netdev_ops = &fs_enet_netdev_ops;
1104 ndev->watchdog_timeo = 2 * HZ; 1000 ndev->watchdog_timeo = 2 * HZ;
1105 if (fpi->use_napi) 1001 netif_napi_add(ndev, &fep->napi, fs_enet_rx_napi, fpi->napi_weight);
1106 netif_napi_add(ndev, &fep->napi, fs_enet_rx_napi, 1002 netif_napi_add(ndev, &fep->napi_tx, fs_enet_tx_napi, 2);
1107 fpi->napi_weight);
1108 1003
1109 ndev->ethtool_ops = &fs_ethtool_ops; 1004 ndev->ethtool_ops = &fs_ethtool_ops;
1110 1005
diff --git a/drivers/net/ethernet/freescale/fs_enet/fs_enet.h b/drivers/net/ethernet/freescale/fs_enet/fs_enet.h
index 1ece4b1a689e..3a4b49e0e717 100644
--- a/drivers/net/ethernet/freescale/fs_enet/fs_enet.h
+++ b/drivers/net/ethernet/freescale/fs_enet/fs_enet.h
@@ -84,6 +84,9 @@ struct fs_ops {
84 void (*napi_clear_rx_event)(struct net_device *dev); 84 void (*napi_clear_rx_event)(struct net_device *dev);
85 void (*napi_enable_rx)(struct net_device *dev); 85 void (*napi_enable_rx)(struct net_device *dev);
86 void (*napi_disable_rx)(struct net_device *dev); 86 void (*napi_disable_rx)(struct net_device *dev);
87 void (*napi_clear_tx_event)(struct net_device *dev);
88 void (*napi_enable_tx)(struct net_device *dev);
89 void (*napi_disable_tx)(struct net_device *dev);
87 void (*rx_bd_done)(struct net_device *dev); 90 void (*rx_bd_done)(struct net_device *dev);
88 void (*tx_kickstart)(struct net_device *dev); 91 void (*tx_kickstart)(struct net_device *dev);
89 u32 (*get_int_events)(struct net_device *dev); 92 u32 (*get_int_events)(struct net_device *dev);
@@ -119,6 +122,7 @@ struct phy_info {
119 122
120struct fs_enet_private { 123struct fs_enet_private {
121 struct napi_struct napi; 124 struct napi_struct napi;
125 struct napi_struct napi_tx;
122 struct device *dev; /* pointer back to the device (must be initialized first) */ 126 struct device *dev; /* pointer back to the device (must be initialized first) */
123 struct net_device *ndev; 127 struct net_device *ndev;
124 spinlock_t lock; /* during all ops except TX pckt processing */ 128 spinlock_t lock; /* during all ops except TX pckt processing */
@@ -149,6 +153,7 @@ struct fs_enet_private {
149 153
150 /* event masks */ 154 /* event masks */
151 u32 ev_napi_rx; /* mask of NAPI rx events */ 155 u32 ev_napi_rx; /* mask of NAPI rx events */
156 u32 ev_napi_tx; /* mask of NAPI rx events */
152 u32 ev_rx; /* rx event mask */ 157 u32 ev_rx; /* rx event mask */
153 u32 ev_tx; /* tx event mask */ 158 u32 ev_tx; /* tx event mask */
154 u32 ev_err; /* error event mask */ 159 u32 ev_err; /* error event mask */
@@ -191,8 +196,8 @@ void fs_cleanup_bds(struct net_device *dev);
191 196
192#define DRV_MODULE_NAME "fs_enet" 197#define DRV_MODULE_NAME "fs_enet"
193#define PFX DRV_MODULE_NAME ": " 198#define PFX DRV_MODULE_NAME ": "
194#define DRV_MODULE_VERSION "1.0" 199#define DRV_MODULE_VERSION "1.1"
195#define DRV_MODULE_RELDATE "Aug 8, 2005" 200#define DRV_MODULE_RELDATE "Sep 22, 2014"
196 201
197/***************************************************************************/ 202/***************************************************************************/
198 203
diff --git a/drivers/net/ethernet/freescale/fs_enet/mac-fcc.c b/drivers/net/ethernet/freescale/fs_enet/mac-fcc.c
index f5383abbf399..2c578db401e8 100644
--- a/drivers/net/ethernet/freescale/fs_enet/mac-fcc.c
+++ b/drivers/net/ethernet/freescale/fs_enet/mac-fcc.c
@@ -125,6 +125,7 @@ out:
125} 125}
126 126
127#define FCC_NAPI_RX_EVENT_MSK (FCC_ENET_RXF | FCC_ENET_RXB) 127#define FCC_NAPI_RX_EVENT_MSK (FCC_ENET_RXF | FCC_ENET_RXB)
128#define FCC_NAPI_TX_EVENT_MSK (FCC_ENET_TXF | FCC_ENET_TXB)
128#define FCC_RX_EVENT (FCC_ENET_RXF) 129#define FCC_RX_EVENT (FCC_ENET_RXF)
129#define FCC_TX_EVENT (FCC_ENET_TXB) 130#define FCC_TX_EVENT (FCC_ENET_TXB)
130#define FCC_ERR_EVENT_MSK (FCC_ENET_TXE) 131#define FCC_ERR_EVENT_MSK (FCC_ENET_TXE)
@@ -137,6 +138,7 @@ static int setup_data(struct net_device *dev)
137 return -EINVAL; 138 return -EINVAL;
138 139
139 fep->ev_napi_rx = FCC_NAPI_RX_EVENT_MSK; 140 fep->ev_napi_rx = FCC_NAPI_RX_EVENT_MSK;
141 fep->ev_napi_tx = FCC_NAPI_TX_EVENT_MSK;
140 fep->ev_rx = FCC_RX_EVENT; 142 fep->ev_rx = FCC_RX_EVENT;
141 fep->ev_tx = FCC_TX_EVENT; 143 fep->ev_tx = FCC_TX_EVENT;
142 fep->ev_err = FCC_ERR_EVENT_MSK; 144 fep->ev_err = FCC_ERR_EVENT_MSK;
@@ -446,6 +448,30 @@ static void napi_disable_rx(struct net_device *dev)
446 C16(fccp, fcc_fccm, FCC_NAPI_RX_EVENT_MSK); 448 C16(fccp, fcc_fccm, FCC_NAPI_RX_EVENT_MSK);
447} 449}
448 450
451static void napi_clear_tx_event(struct net_device *dev)
452{
453 struct fs_enet_private *fep = netdev_priv(dev);
454 fcc_t __iomem *fccp = fep->fcc.fccp;
455
456 W16(fccp, fcc_fcce, FCC_NAPI_TX_EVENT_MSK);
457}
458
459static void napi_enable_tx(struct net_device *dev)
460{
461 struct fs_enet_private *fep = netdev_priv(dev);
462 fcc_t __iomem *fccp = fep->fcc.fccp;
463
464 S16(fccp, fcc_fccm, FCC_NAPI_TX_EVENT_MSK);
465}
466
467static void napi_disable_tx(struct net_device *dev)
468{
469 struct fs_enet_private *fep = netdev_priv(dev);
470 fcc_t __iomem *fccp = fep->fcc.fccp;
471
472 C16(fccp, fcc_fccm, FCC_NAPI_TX_EVENT_MSK);
473}
474
449static void rx_bd_done(struct net_device *dev) 475static void rx_bd_done(struct net_device *dev)
450{ 476{
451 /* nothing */ 477 /* nothing */
@@ -572,6 +598,9 @@ const struct fs_ops fs_fcc_ops = {
572 .napi_clear_rx_event = napi_clear_rx_event, 598 .napi_clear_rx_event = napi_clear_rx_event,
573 .napi_enable_rx = napi_enable_rx, 599 .napi_enable_rx = napi_enable_rx,
574 .napi_disable_rx = napi_disable_rx, 600 .napi_disable_rx = napi_disable_rx,
601 .napi_clear_tx_event = napi_clear_tx_event,
602 .napi_enable_tx = napi_enable_tx,
603 .napi_disable_tx = napi_disable_tx,
575 .rx_bd_done = rx_bd_done, 604 .rx_bd_done = rx_bd_done,
576 .tx_kickstart = tx_kickstart, 605 .tx_kickstart = tx_kickstart,
577 .get_int_events = get_int_events, 606 .get_int_events = get_int_events,
diff --git a/drivers/net/ethernet/freescale/fs_enet/mac-fec.c b/drivers/net/ethernet/freescale/fs_enet/mac-fec.c
index 1eedfba2ad3c..3d4e08be1709 100644
--- a/drivers/net/ethernet/freescale/fs_enet/mac-fec.c
+++ b/drivers/net/ethernet/freescale/fs_enet/mac-fec.c
@@ -110,6 +110,7 @@ static int do_pd_setup(struct fs_enet_private *fep)
110} 110}
111 111
112#define FEC_NAPI_RX_EVENT_MSK (FEC_ENET_RXF | FEC_ENET_RXB) 112#define FEC_NAPI_RX_EVENT_MSK (FEC_ENET_RXF | FEC_ENET_RXB)
113#define FEC_NAPI_TX_EVENT_MSK (FEC_ENET_TXF | FEC_ENET_TXB)
113#define FEC_RX_EVENT (FEC_ENET_RXF) 114#define FEC_RX_EVENT (FEC_ENET_RXF)
114#define FEC_TX_EVENT (FEC_ENET_TXF) 115#define FEC_TX_EVENT (FEC_ENET_TXF)
115#define FEC_ERR_EVENT_MSK (FEC_ENET_HBERR | FEC_ENET_BABR | \ 116#define FEC_ERR_EVENT_MSK (FEC_ENET_HBERR | FEC_ENET_BABR | \
@@ -126,6 +127,7 @@ static int setup_data(struct net_device *dev)
126 fep->fec.htlo = 0; 127 fep->fec.htlo = 0;
127 128
128 fep->ev_napi_rx = FEC_NAPI_RX_EVENT_MSK; 129 fep->ev_napi_rx = FEC_NAPI_RX_EVENT_MSK;
130 fep->ev_napi_tx = FEC_NAPI_TX_EVENT_MSK;
129 fep->ev_rx = FEC_RX_EVENT; 131 fep->ev_rx = FEC_RX_EVENT;
130 fep->ev_tx = FEC_TX_EVENT; 132 fep->ev_tx = FEC_TX_EVENT;
131 fep->ev_err = FEC_ERR_EVENT_MSK; 133 fep->ev_err = FEC_ERR_EVENT_MSK;
@@ -415,6 +417,30 @@ static void napi_disable_rx(struct net_device *dev)
415 FC(fecp, imask, FEC_NAPI_RX_EVENT_MSK); 417 FC(fecp, imask, FEC_NAPI_RX_EVENT_MSK);
416} 418}
417 419
420static void napi_clear_tx_event(struct net_device *dev)
421{
422 struct fs_enet_private *fep = netdev_priv(dev);
423 struct fec __iomem *fecp = fep->fec.fecp;
424
425 FW(fecp, ievent, FEC_NAPI_TX_EVENT_MSK);
426}
427
428static void napi_enable_tx(struct net_device *dev)
429{
430 struct fs_enet_private *fep = netdev_priv(dev);
431 struct fec __iomem *fecp = fep->fec.fecp;
432
433 FS(fecp, imask, FEC_NAPI_TX_EVENT_MSK);
434}
435
436static void napi_disable_tx(struct net_device *dev)
437{
438 struct fs_enet_private *fep = netdev_priv(dev);
439 struct fec __iomem *fecp = fep->fec.fecp;
440
441 FC(fecp, imask, FEC_NAPI_TX_EVENT_MSK);
442}
443
418static void rx_bd_done(struct net_device *dev) 444static void rx_bd_done(struct net_device *dev)
419{ 445{
420 struct fs_enet_private *fep = netdev_priv(dev); 446 struct fs_enet_private *fep = netdev_priv(dev);
@@ -487,6 +513,9 @@ const struct fs_ops fs_fec_ops = {
487 .napi_clear_rx_event = napi_clear_rx_event, 513 .napi_clear_rx_event = napi_clear_rx_event,
488 .napi_enable_rx = napi_enable_rx, 514 .napi_enable_rx = napi_enable_rx,
489 .napi_disable_rx = napi_disable_rx, 515 .napi_disable_rx = napi_disable_rx,
516 .napi_clear_tx_event = napi_clear_tx_event,
517 .napi_enable_tx = napi_enable_tx,
518 .napi_disable_tx = napi_disable_tx,
490 .rx_bd_done = rx_bd_done, 519 .rx_bd_done = rx_bd_done,
491 .tx_kickstart = tx_kickstart, 520 .tx_kickstart = tx_kickstart,
492 .get_int_events = get_int_events, 521 .get_int_events = get_int_events,
diff --git a/drivers/net/ethernet/freescale/fs_enet/mac-scc.c b/drivers/net/ethernet/freescale/fs_enet/mac-scc.c
index 90b3b19b7cd3..41aa0b475ca0 100644
--- a/drivers/net/ethernet/freescale/fs_enet/mac-scc.c
+++ b/drivers/net/ethernet/freescale/fs_enet/mac-scc.c
@@ -116,6 +116,7 @@ static int do_pd_setup(struct fs_enet_private *fep)
116} 116}
117 117
118#define SCC_NAPI_RX_EVENT_MSK (SCCE_ENET_RXF | SCCE_ENET_RXB) 118#define SCC_NAPI_RX_EVENT_MSK (SCCE_ENET_RXF | SCCE_ENET_RXB)
119#define SCC_NAPI_TX_EVENT_MSK (SCCE_ENET_TXF | SCCE_ENET_TXB)
119#define SCC_RX_EVENT (SCCE_ENET_RXF) 120#define SCC_RX_EVENT (SCCE_ENET_RXF)
120#define SCC_TX_EVENT (SCCE_ENET_TXB) 121#define SCC_TX_EVENT (SCCE_ENET_TXB)
121#define SCC_ERR_EVENT_MSK (SCCE_ENET_TXE | SCCE_ENET_BSY) 122#define SCC_ERR_EVENT_MSK (SCCE_ENET_TXE | SCCE_ENET_BSY)
@@ -130,6 +131,7 @@ static int setup_data(struct net_device *dev)
130 fep->scc.htlo = 0; 131 fep->scc.htlo = 0;
131 132
132 fep->ev_napi_rx = SCC_NAPI_RX_EVENT_MSK; 133 fep->ev_napi_rx = SCC_NAPI_RX_EVENT_MSK;
134 fep->ev_napi_tx = SCC_NAPI_TX_EVENT_MSK;
133 fep->ev_rx = SCC_RX_EVENT; 135 fep->ev_rx = SCC_RX_EVENT;
134 fep->ev_tx = SCC_TX_EVENT | SCCE_ENET_TXE; 136 fep->ev_tx = SCC_TX_EVENT | SCCE_ENET_TXE;
135 fep->ev_err = SCC_ERR_EVENT_MSK; 137 fep->ev_err = SCC_ERR_EVENT_MSK;
@@ -398,6 +400,30 @@ static void napi_disable_rx(struct net_device *dev)
398 C16(sccp, scc_sccm, SCC_NAPI_RX_EVENT_MSK); 400 C16(sccp, scc_sccm, SCC_NAPI_RX_EVENT_MSK);
399} 401}
400 402
403static void napi_clear_tx_event(struct net_device *dev)
404{
405 struct fs_enet_private *fep = netdev_priv(dev);
406 scc_t __iomem *sccp = fep->scc.sccp;
407
408 W16(sccp, scc_scce, SCC_NAPI_TX_EVENT_MSK);
409}
410
411static void napi_enable_tx(struct net_device *dev)
412{
413 struct fs_enet_private *fep = netdev_priv(dev);
414 scc_t __iomem *sccp = fep->scc.sccp;
415
416 S16(sccp, scc_sccm, SCC_NAPI_TX_EVENT_MSK);
417}
418
419static void napi_disable_tx(struct net_device *dev)
420{
421 struct fs_enet_private *fep = netdev_priv(dev);
422 scc_t __iomem *sccp = fep->scc.sccp;
423
424 C16(sccp, scc_sccm, SCC_NAPI_TX_EVENT_MSK);
425}
426
401static void rx_bd_done(struct net_device *dev) 427static void rx_bd_done(struct net_device *dev)
402{ 428{
403 /* nothing */ 429 /* nothing */
@@ -471,6 +497,9 @@ const struct fs_ops fs_scc_ops = {
471 .napi_clear_rx_event = napi_clear_rx_event, 497 .napi_clear_rx_event = napi_clear_rx_event,
472 .napi_enable_rx = napi_enable_rx, 498 .napi_enable_rx = napi_enable_rx,
473 .napi_disable_rx = napi_disable_rx, 499 .napi_disable_rx = napi_disable_rx,
500 .napi_clear_tx_event = napi_clear_tx_event,
501 .napi_enable_tx = napi_enable_tx,
502 .napi_disable_tx = napi_disable_tx,
474 .rx_bd_done = rx_bd_done, 503 .rx_bd_done = rx_bd_done,
475 .tx_kickstart = tx_kickstart, 504 .tx_kickstart = tx_kickstart,
476 .get_int_events = get_int_events, 505 .get_int_events = get_int_events,
diff --git a/include/linux/fs_enet_pd.h b/include/linux/fs_enet_pd.h
index efb05961bdd8..77d783f71527 100644
--- a/include/linux/fs_enet_pd.h
+++ b/include/linux/fs_enet_pd.h
@@ -139,7 +139,6 @@ struct fs_platform_info {
139 int rx_ring, tx_ring; /* number of buffers on rx */ 139 int rx_ring, tx_ring; /* number of buffers on rx */
140 __u8 macaddr[ETH_ALEN]; /* mac address */ 140 __u8 macaddr[ETH_ALEN]; /* mac address */
141 int rx_copybreak; /* limit we copy small frames */ 141 int rx_copybreak; /* limit we copy small frames */
142 int use_napi; /* use NAPI */
143 int napi_weight; /* NAPI weight */ 142 int napi_weight; /* NAPI weight */
144 143
145 int use_rmii; /* use RMII mode */ 144 int use_rmii; /* use RMII mode */