diff options
Diffstat (limited to 'drivers/net/arm/ks8695net.c')
-rw-r--r-- | drivers/net/arm/ks8695net.c | 131 |
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 | */ |
148 | struct ks8695_priv { | 155 | struct 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 | */ | ||
418 | static 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 | |||
403 | static irqreturn_t | 431 | static irqreturn_t |
404 | ks8695_rx_irq(int irq, void *dev_id) | 432 | ks8695_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 | |||
458 | static 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); |
480 | rx_finished: | 535 | rx_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 | */ | ||
566 | static 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); |