aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/arm/ks8695net.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/arm/ks8695net.c')
-rw-r--r--drivers/net/arm/ks8695net.c131
1 files changed, 109 insertions, 22 deletions
diff --git a/drivers/net/arm/ks8695net.c b/drivers/net/arm/ks8695net.c
index 2a7b7745cc55..be256b34cea8 100644
--- a/drivers/net/arm/ks8695net.c
+++ b/drivers/net/arm/ks8695net.c
@@ -35,11 +35,13 @@
35 35
36#include <mach/regs-switch.h> 36#include <mach/regs-switch.h>
37#include <mach/regs-misc.h> 37#include <mach/regs-misc.h>
38#include <asm/mach/irq.h>
39#include <mach/regs-irq.h>
38 40
39#include "ks8695net.h" 41#include "ks8695net.h"
40 42
41#define MODULENAME "ks8695_ether" 43#define MODULENAME "ks8695_ether"
42#define MODULEVERSION "1.01" 44#define MODULEVERSION "1.02"
43 45
44/* 46/*
45 * Transmit and device reset timeout, default 5 seconds. 47 * Transmit and device reset timeout, default 5 seconds.
@@ -95,6 +97,9 @@ struct ks8695_skbuff {
95#define MAX_RX_DESC 16 97#define MAX_RX_DESC 16
96#define MAX_RX_DESC_MASK 0xf 98#define MAX_RX_DESC_MASK 0xf
97 99
100/*napi_weight have better more than rx DMA buffers*/
101#define NAPI_WEIGHT 64
102
98#define MAX_RXBUF_SIZE 0x700 103#define MAX_RXBUF_SIZE 0x700
99 104
100#define TX_RING_DMA_SIZE (sizeof(struct tx_ring_desc) * MAX_TX_DESC) 105#define TX_RING_DMA_SIZE (sizeof(struct tx_ring_desc) * MAX_TX_DESC)
@@ -120,6 +125,7 @@ enum ks8695_dtype {
120 * @dev: The platform device object for this interface 125 * @dev: The platform device object for this interface
121 * @dtype: The type of this device 126 * @dtype: The type of this device
122 * @io_regs: The ioremapped registers for this interface 127 * @io_regs: The ioremapped registers for this interface
128 * @napi : Add support NAPI for Rx
123 * @rx_irq_name: The textual name of the RX IRQ from the platform data 129 * @rx_irq_name: The textual name of the RX IRQ from the platform data
124 * @tx_irq_name: The textual name of the TX IRQ from the platform data 130 * @tx_irq_name: The textual name of the TX IRQ from the platform data
125 * @link_irq_name: The textual name of the link IRQ from the 131 * @link_irq_name: The textual name of the link IRQ from the
@@ -143,6 +149,7 @@ enum ks8695_dtype {
143 * @rx_ring_dma: The DMA mapped equivalent of rx_ring 149 * @rx_ring_dma: The DMA mapped equivalent of rx_ring
144 * @rx_buffers: The sk_buff mappings for the RX ring 150 * @rx_buffers: The sk_buff mappings for the RX ring
145 * @next_rx_desc_read: The next RX descriptor to read from on IRQ 151 * @next_rx_desc_read: The next RX descriptor to read from on IRQ
152 * @rx_lock: A lock to protect Rx irq function
146 * @msg_enable: The flags for which messages to emit 153 * @msg_enable: The flags for which messages to emit
147 */ 154 */
148struct ks8695_priv { 155struct ks8695_priv {
@@ -152,6 +159,8 @@ struct ks8695_priv {
152 enum ks8695_dtype dtype; 159 enum ks8695_dtype dtype;
153 void __iomem *io_regs; 160 void __iomem *io_regs;
154 161
162 struct napi_struct napi;
163
155 const char *rx_irq_name, *tx_irq_name, *link_irq_name; 164 const char *rx_irq_name, *tx_irq_name, *link_irq_name;
156 int rx_irq, tx_irq, link_irq; 165 int rx_irq, tx_irq, link_irq;
157 166
@@ -172,6 +181,7 @@ struct ks8695_priv {
172 dma_addr_t rx_ring_dma; 181 dma_addr_t rx_ring_dma;
173 struct ks8695_skbuff rx_buffers[MAX_RX_DESC]; 182 struct ks8695_skbuff rx_buffers[MAX_RX_DESC];
174 int next_rx_desc_read; 183 int next_rx_desc_read;
184 spinlock_t rx_lock;
175 185
176 int msg_enable; 186 int msg_enable;
177}; 187};
@@ -392,29 +402,74 @@ ks8695_tx_irq(int irq, void *dev_id)
392} 402}
393 403
394/** 404/**
405 * ks8695_get_rx_enable_bit - Get rx interrupt enable/status bit
406 * @ksp: Private data for the KS8695 Ethernet
407 *
408 * For KS8695 document:
409 * Interrupt Enable Register (offset 0xE204)
410 * Bit29 : WAN MAC Receive Interrupt Enable
411 * Bit16 : LAN MAC Receive Interrupt Enable
412 * Interrupt Status Register (Offset 0xF208)
413 * Bit29: WAN MAC Receive Status
414 * Bit16: LAN MAC Receive Status
415 * So, this Rx interrrupt enable/status bit number is equal
416 * as Rx IRQ number.
417 */
418static inline u32 ks8695_get_rx_enable_bit(struct ks8695_priv *ksp)
419{
420 return ksp->rx_irq;
421}
422
423/**
395 * ks8695_rx_irq - Receive IRQ handler 424 * ks8695_rx_irq - Receive IRQ handler
396 * @irq: The IRQ which went off (ignored) 425 * @irq: The IRQ which went off (ignored)
397 * @dev_id: The net_device for the interrupt 426 * @dev_id: The net_device for the interrupt
398 * 427 *
399 * Process the RX ring, passing any received packets up to the 428 * Inform NAPI that packet reception needs to be scheduled
400 * host. If we received anything other than errors, we then
401 * refill the ring.
402 */ 429 */
430
403static irqreturn_t 431static irqreturn_t
404ks8695_rx_irq(int irq, void *dev_id) 432ks8695_rx_irq(int irq, void *dev_id)
405{ 433{
406 struct net_device *ndev = (struct net_device *)dev_id; 434 struct net_device *ndev = (struct net_device *)dev_id;
407 struct ks8695_priv *ksp = netdev_priv(ndev); 435 struct ks8695_priv *ksp = netdev_priv(ndev);
436
437 spin_lock(&ksp->rx_lock);
438
439 if (napi_schedule_prep(&ksp->napi)) {
440 unsigned long status = readl(KS8695_IRQ_VA + KS8695_INTEN);
441 unsigned long mask_bit = 1 << ks8695_get_rx_enable_bit(ksp);
442 /*disable rx interrupt*/
443 status &= ~mask_bit;
444 writel(status , KS8695_IRQ_VA + KS8695_INTEN);
445 __napi_schedule(&ksp->napi);
446 }
447
448 spin_unlock(&ksp->rx_lock);
449 return IRQ_HANDLED;
450}
451
452/**
453 * ks8695_rx - Receive packets called by NAPI poll method
454 * @ksp: Private data for the KS8695 Ethernet
455 * @budget: The max packets would be receive
456 */
457
458static int ks8695_rx(struct ks8695_priv *ksp, int budget)
459{
460 struct net_device *ndev = ksp->ndev;
408 struct sk_buff *skb; 461 struct sk_buff *skb;
409 int buff_n; 462 int buff_n;
410 u32 flags; 463 u32 flags;
411 int pktlen; 464 int pktlen;
412 int last_rx_processed = -1; 465 int last_rx_processed = -1;
466 int received = 0;
413 467
414 buff_n = ksp->next_rx_desc_read; 468 buff_n = ksp->next_rx_desc_read;
415 do { 469 while (received < budget
416 if (ksp->rx_buffers[buff_n].skb && 470 && ksp->rx_buffers[buff_n].skb
417 !(ksp->rx_ring[buff_n].status & cpu_to_le32(RDES_OWN))) { 471 && (!(ksp->rx_ring[buff_n].status &
472 cpu_to_le32(RDES_OWN)))) {
418 rmb(); 473 rmb();
419 flags = le32_to_cpu(ksp->rx_ring[buff_n].status); 474 flags = le32_to_cpu(ksp->rx_ring[buff_n].status);
420 /* Found an SKB which we own, this means we 475 /* Found an SKB which we own, this means we
@@ -464,7 +519,7 @@ ks8695_rx_irq(int irq, void *dev_id)
464 /* Relinquish the SKB to the network layer */ 519 /* Relinquish the SKB to the network layer */
465 skb_put(skb, pktlen); 520 skb_put(skb, pktlen);
466 skb->protocol = eth_type_trans(skb, ndev); 521 skb->protocol = eth_type_trans(skb, ndev);
467 netif_rx(skb); 522 netif_receive_skb(skb);
468 523
469 /* Record stats */ 524 /* Record stats */
470 ndev->stats.rx_packets++; 525 ndev->stats.rx_packets++;
@@ -478,29 +533,55 @@ rx_failure:
478 /* Give the ring entry back to the hardware */ 533 /* Give the ring entry back to the hardware */
479 ksp->rx_ring[buff_n].status = cpu_to_le32(RDES_OWN); 534 ksp->rx_ring[buff_n].status = cpu_to_le32(RDES_OWN);
480rx_finished: 535rx_finished:
536 received++;
481 /* And note this as processed so we can start 537 /* And note this as processed so we can start
482 * from here next time 538 * from here next time
483 */ 539 */
484 last_rx_processed = buff_n; 540 last_rx_processed = buff_n;
485 } else { 541 buff_n = (buff_n + 1) & MAX_RX_DESC_MASK;
486 /* Ran out of things to process, stop now */ 542 /*And note which RX descriptor we last did */
487 break; 543 if (likely(last_rx_processed != -1))
488 } 544 ksp->next_rx_desc_read =
489 buff_n = (buff_n + 1) & MAX_RX_DESC_MASK; 545 (last_rx_processed + 1) &
490 } while (buff_n != ksp->next_rx_desc_read); 546 MAX_RX_DESC_MASK;
491 547 }
492 /* And note which RX descriptor we last did anything with */
493 if (likely(last_rx_processed != -1))
494 ksp->next_rx_desc_read =
495 (last_rx_processed + 1) & MAX_RX_DESC_MASK;
496
497 /* And refill the buffers */ 548 /* And refill the buffers */
498 ks8695_refill_rxbuffers(ksp); 549 ks8695_refill_rxbuffers(ksp);
499 550
500 /* Kick the RX DMA engine, in case it became suspended */ 551 /* Kick the RX DMA engine, in case it became
552 * suspended */
501 ks8695_writereg(ksp, KS8695_DRSC, 0); 553 ks8695_writereg(ksp, KS8695_DRSC, 0);
554 return received;
555}
502 556
503 return IRQ_HANDLED; 557
558/**
559 * ks8695_poll - Receive packet by NAPI poll method
560 * @ksp: Private data for the KS8695 Ethernet
561 * @budget: The remaining number packets for network subsystem
562 *
563 * Invoked by the network core when it requests for new
564 * packets from the driver
565 */
566static int ks8695_poll(struct napi_struct *napi, int budget)
567{
568 struct ks8695_priv *ksp = container_of(napi, struct ks8695_priv, napi);
569 unsigned long work_done;
570
571 unsigned long isr = readl(KS8695_IRQ_VA + KS8695_INTEN);
572 unsigned long mask_bit = 1 << ks8695_get_rx_enable_bit(ksp);
573
574 work_done = ks8695_rx(ksp, budget);
575
576 if (work_done < budget) {
577 unsigned long flags;
578 spin_lock_irqsave(&ksp->rx_lock, flags);
579 /*enable rx interrupt*/
580 writel(isr | mask_bit, KS8695_IRQ_VA + KS8695_INTEN);
581 __napi_complete(napi);
582 spin_unlock_irqrestore(&ksp->rx_lock, flags);
583 }
584 return work_done;
504} 585}
505 586
506/** 587/**
@@ -1253,6 +1334,7 @@ ks8695_stop(struct net_device *ndev)
1253 struct ks8695_priv *ksp = netdev_priv(ndev); 1334 struct ks8695_priv *ksp = netdev_priv(ndev);
1254 1335
1255 netif_stop_queue(ndev); 1336 netif_stop_queue(ndev);
1337 napi_disable(&ksp->napi);
1256 netif_carrier_off(ndev); 1338 netif_carrier_off(ndev);
1257 1339
1258 ks8695_shutdown(ksp); 1340 ks8695_shutdown(ksp);
@@ -1287,6 +1369,7 @@ ks8695_open(struct net_device *ndev)
1287 return ret; 1369 return ret;
1288 } 1370 }
1289 1371
1372 napi_enable(&ksp->napi);
1290 netif_start_queue(ndev); 1373 netif_start_queue(ndev);
1291 1374
1292 return 0; 1375 return 0;
@@ -1472,6 +1555,8 @@ ks8695_probe(struct platform_device *pdev)
1472 SET_ETHTOOL_OPS(ndev, &ks8695_ethtool_ops); 1555 SET_ETHTOOL_OPS(ndev, &ks8695_ethtool_ops);
1473 ndev->watchdog_timeo = msecs_to_jiffies(watchdog); 1556 ndev->watchdog_timeo = msecs_to_jiffies(watchdog);
1474 1557
1558 netif_napi_add(ndev, &ksp->napi, ks8695_poll, NAPI_WEIGHT);
1559
1475 /* Retrieve the default MAC addr from the chip. */ 1560 /* Retrieve the default MAC addr from the chip. */
1476 /* The bootloader should have left it in there for us. */ 1561 /* The bootloader should have left it in there for us. */
1477 1562
@@ -1505,6 +1590,7 @@ ks8695_probe(struct platform_device *pdev)
1505 1590
1506 /* And initialise the queue's lock */ 1591 /* And initialise the queue's lock */
1507 spin_lock_init(&ksp->txq_lock); 1592 spin_lock_init(&ksp->txq_lock);
1593 spin_lock_init(&ksp->rx_lock);
1508 1594
1509 /* Specify the RX DMA ring buffer */ 1595 /* Specify the RX DMA ring buffer */
1510 ksp->rx_ring = ksp->ring_base + TX_RING_DMA_SIZE; 1596 ksp->rx_ring = ksp->ring_base + TX_RING_DMA_SIZE;
@@ -1626,6 +1712,7 @@ ks8695_drv_remove(struct platform_device *pdev)
1626 struct ks8695_priv *ksp = netdev_priv(ndev); 1712 struct ks8695_priv *ksp = netdev_priv(ndev);
1627 1713
1628 platform_set_drvdata(pdev, NULL); 1714 platform_set_drvdata(pdev, NULL);
1715 netif_napi_del(&ksp->napi);
1629 1716
1630 unregister_netdev(ndev); 1717 unregister_netdev(ndev);
1631 ks8695_release_device(ksp); 1718 ks8695_release_device(ksp);