summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/staging/mttcan/hw/m_ttcan.c22
-rw-r--r--drivers/staging/mttcan/hw/m_ttcan.h2
-rw-r--r--drivers/staging/mttcan/hw/m_ttcan_linux.h3
-rw-r--r--drivers/staging/mttcan/m_ttcan_linux.c108
4 files changed, 81 insertions, 54 deletions
diff --git a/drivers/staging/mttcan/hw/m_ttcan.c b/drivers/staging/mttcan/hw/m_ttcan.c
index 51c3af25b..227d1646f 100644
--- a/drivers/staging/mttcan/hw/m_ttcan.c
+++ b/drivers/staging/mttcan/hw/m_ttcan.c
@@ -403,6 +403,19 @@ int ttcan_tx_buff_req_pending(struct ttcan_controller *ttcan, u8 index)
403 return 0; 403 return 0;
404} 404}
405 405
406int ttcan_tx_buffers_full(struct ttcan_controller *ttcan)
407{
408 u32 txbrp_reg;
409 u32 mask = (1 << ttcan->mram_cfg[MRAM_TXB].num) - 1;
410
411 txbrp_reg = ttcan_read32(ttcan, ADR_MTTCAN_TXBRP);
412
413 if ((txbrp_reg & mask) == mask)
414 return 1;
415 else
416 return 0;
417}
418
406void ttcan_tx_ded_msg_write(struct ttcan_controller *ttcan, 419void ttcan_tx_ded_msg_write(struct ttcan_controller *ttcan,
407 struct ttcanfd_frame *ttcanfd, 420 struct ttcanfd_frame *ttcanfd,
408 u8 index, bool tt_en) 421 u8 index, bool tt_en)
@@ -486,7 +499,7 @@ int ttcan_set_tx_buffer_addr(struct ttcan_controller *ttcan)
486 499
487/* Queue Message in Tx Queue 500/* Queue Message in Tx Queue
488 * Return 501 * Return
489 * -1 in case of error 502 * -ve in case of error
490 * idx written buffer index 503 * idx written buffer index
491 */ 504 */
492int ttcan_tx_fifo_queue_msg(struct ttcan_controller *ttcan, 505int ttcan_tx_fifo_queue_msg(struct ttcan_controller *ttcan,
@@ -500,10 +513,9 @@ int ttcan_tx_fifo_queue_msg(struct ttcan_controller *ttcan,
500 if ((txfqs_reg & MTT_TXFQS_TFQF_MASK) == 0) { 513 if ((txfqs_reg & MTT_TXFQS_TFQF_MASK) == 0) {
501 ttcan_tx_ded_msg_write(ttcan, ttcanfd, put_idx, 0); 514 ttcan_tx_ded_msg_write(ttcan, ttcanfd, put_idx, 0);
502 return put_idx; 515 return put_idx;
503 } else {
504 pr_err("%s: Tx queue/FIFO full\n", __func__);
505 return -ENOMEM;
506 } 516 }
517
518 return -ENOMEM;
507} 519}
508 520
509/* Check tx fifo status 521/* Check tx fifo status
@@ -615,7 +627,6 @@ unsigned int ttcan_read_rx_fifo0(struct ttcan_controller *ttcan)
615 rxf0s_reg = ttcan_read32(ttcan, ADR_MTTCAN_RXF0S); 627 rxf0s_reg = ttcan_read32(ttcan, ADR_MTTCAN_RXF0S);
616 628
617 if (!(rxf0s_reg & MTT_RXF0S_F0FL_MASK)) { 629 if (!(rxf0s_reg & MTT_RXF0S_F0FL_MASK)) {
618 pr_info("%s: Rx fifo0 empty\n", __func__);
619 return msgs_read; 630 return msgs_read;
620 } 631 }
621 632
@@ -663,7 +674,6 @@ unsigned int ttcan_read_rx_fifo1(struct ttcan_controller *ttcan)
663 rxf1s_reg = ttcan_read32(ttcan, ADR_MTTCAN_RXF1S); 674 rxf1s_reg = ttcan_read32(ttcan, ADR_MTTCAN_RXF1S);
664 675
665 if (!(rxf1s_reg & MTT_RXF1S_F1FL_MASK)) { 676 if (!(rxf1s_reg & MTT_RXF1S_F1FL_MASK)) {
666 pr_info("%s: Rx fifo1 empty\n", __func__);
667 return msgs_read; 677 return msgs_read;
668 } 678 }
669 679
diff --git a/drivers/staging/mttcan/hw/m_ttcan.h b/drivers/staging/mttcan/hw/m_ttcan.h
index e1c2ed46d..e8f309675 100644
--- a/drivers/staging/mttcan/hw/m_ttcan.h
+++ b/drivers/staging/mttcan/hw/m_ttcan.h
@@ -423,6 +423,8 @@ void ttcan_set_rx_buffers_elements(struct ttcan_controller *ttcan);
423 423
424int ttcan_set_tx_buffer_addr(struct ttcan_controller *ttcan); 424int ttcan_set_tx_buffer_addr(struct ttcan_controller *ttcan);
425int ttcan_tx_fifo_full(struct ttcan_controller *ttcan); 425int ttcan_tx_fifo_full(struct ttcan_controller *ttcan);
426int ttcan_tx_buffers_full(struct ttcan_controller *ttcan);
427
426int ttcan_tx_fifo_queue_msg(struct ttcan_controller *ttcan, 428int ttcan_tx_fifo_queue_msg(struct ttcan_controller *ttcan,
427 struct ttcanfd_frame *ttcanfd); 429 struct ttcanfd_frame *ttcanfd);
428int ttcan_tx_fifo_get_free_element(struct ttcan_controller *ttcan); 430int ttcan_tx_fifo_get_free_element(struct ttcan_controller *ttcan);
diff --git a/drivers/staging/mttcan/hw/m_ttcan_linux.h b/drivers/staging/mttcan/hw/m_ttcan_linux.h
index 607c88738..5a5c0ef23 100644
--- a/drivers/staging/mttcan/hw/m_ttcan_linux.h
+++ b/drivers/staging/mttcan/hw/m_ttcan_linux.h
@@ -46,9 +46,8 @@
46#define MTTCAN_RX_FIFO_INTR (0xFF) 46#define MTTCAN_RX_FIFO_INTR (0xFF)
47#define MTTCAN_RX_HP_INTR (0x1 << 8) 47#define MTTCAN_RX_HP_INTR (0x1 << 8)
48#define MTTCAN_TX_EV_FIFO_INTR (0xF << 12) 48#define MTTCAN_TX_EV_FIFO_INTR (0xF << 12)
49#define MTTCAN_DRX_INTR (0x1 << 19)
50 49
51#define MTTCAN_ERR_INTR (0x3FF7 << 16) 50#define MTTCAN_ERR_INTR (0x1FF9 << 17)
52#define MTTCAN_BUS_OFF (1 << 25) 51#define MTTCAN_BUS_OFF (1 << 25)
53#define MTTCAN_ERR_WARN (1 << 24) 52#define MTTCAN_ERR_WARN (1 << 24)
54#define MTTCAN_ERR_PASS (1 << 23) 53#define MTTCAN_ERR_PASS (1 << 23)
diff --git a/drivers/staging/mttcan/m_ttcan_linux.c b/drivers/staging/mttcan/m_ttcan_linux.c
index a32624370..43f54c419 100644
--- a/drivers/staging/mttcan/m_ttcan_linux.c
+++ b/drivers/staging/mttcan/m_ttcan_linux.c
@@ -104,9 +104,6 @@ static __init int mttcan_hw_init(struct mttcan_priv *priv)
104 ttcan_prog_trigger_mem(ttcan, priv->tmc_shadow); 104 ttcan_prog_trigger_mem(ttcan, priv->tmc_shadow);
105 } 105 }
106 106
107 ttcan_clear_intr(ttcan);
108 ttcan_clear_tt_intr(ttcan);
109
110 ttcan_print_version(ttcan); 107 ttcan_print_version(ttcan);
111 108
112 return err; 109 return err;
@@ -161,8 +158,6 @@ static __init int mttcan_hw_reinit(const struct mttcan_priv *priv)
161 if (ttcan->mram_cfg[MRAM_TMC].num) 158 if (ttcan->mram_cfg[MRAM_TMC].num)
162 ttcan_prog_trigger_mem(ttcan, priv->tmc_shadow); 159 ttcan_prog_trigger_mem(ttcan, priv->tmc_shadow);
163 160
164 ttcan_clear_intr(ttcan);
165 ttcan_clear_tt_intr(ttcan);
166 return err; 161 return err;
167} 162}
168 163
@@ -538,13 +533,12 @@ static void mttcan_tx_event(struct net_device *dev)
538 533
539static void mttcan_tx_complete(struct net_device *dev) 534static void mttcan_tx_complete(struct net_device *dev)
540{ 535{
541 u32 completed_tx;
542 u32 msg_no; 536 u32 msg_no;
543 537
544 struct mttcan_priv *priv = netdev_priv(dev); 538 struct mttcan_priv *priv = netdev_priv(dev);
545 struct net_device_stats *stats = &dev->stats; 539 struct net_device_stats *stats = &dev->stats;
546 540
547 completed_tx = ttcan_read_tx_complete_reg(priv->ttcan); 541 u32 completed_tx = ttcan_read_tx_complete_reg(priv->ttcan);
548 542
549 /*TODO:- fix how to handle wrap around of tx_next and echo */ 543 /*TODO:- fix how to handle wrap around of tx_next and echo */
550 for (; (priv->tx_next - priv->tx_echo) > 0; priv->tx_echo++) { 544 for (; (priv->tx_next - priv->tx_echo) > 0; priv->tx_echo++) {
@@ -568,9 +562,6 @@ static void mttcan_tx_complete(struct net_device *dev)
568 } 562 }
569 563
570 if (netif_queue_stopped(dev)) 564 if (netif_queue_stopped(dev))
571 netif_start_queue(dev);
572
573 if ((priv->tx_next - priv->tx_echo) > 0)
574 netif_wake_queue(dev); 565 netif_wake_queue(dev);
575} 566}
576 567
@@ -626,6 +617,8 @@ static int mttcan_poll_ir(struct napi_struct *napi, int quota)
626 if (ir & MTTCAN_ERR_INTR) { 617 if (ir & MTTCAN_ERR_INTR) {
627 psr = ttcan_read_psr(priv->ttcan); 618 psr = ttcan_read_psr(priv->ttcan);
628 priv->ttcan->proto_state = psr; 619 priv->ttcan->proto_state = psr;
620 ack = ir & MTTCAN_ERR_INTR;
621 ttcan_ir_write(priv->ttcan, ack);
629 if ((ir & MTT_IR_EW_MASK) && (psr & MTT_PSR_EW_MASK)) { 622 if ((ir & MTT_IR_EW_MASK) && (psr & MTT_PSR_EW_MASK)) {
630 work_done += mttcan_state_change(dev, 623 work_done += mttcan_state_change(dev,
631 CAN_STATE_ERROR_WARNING); 624 CAN_STATE_ERROR_WARNING);
@@ -660,9 +653,14 @@ static int mttcan_poll_ir(struct napi_struct *napi, int quota)
660 if (priv->can.ctrlmode & CAN_CTRLMODE_BERR_REPORTING) { 653 if (priv->can.ctrlmode & CAN_CTRLMODE_BERR_REPORTING) {
661 if ((ir & MTT_IR_PED_MASK) || 654 if ((ir & MTT_IR_PED_MASK) ||
662 (ir & MTT_IR_PEA_MASK)) { 655 (ir & MTT_IR_PEA_MASK)) {
663 enum ttcan_lec_type lec = 656 enum ttcan_lec_type lec;
664 (psr & MTT_PSR_LEC_MASK) 657
665 >> MTT_PSR_LEC_SHIFT; 658 if (ir & MTT_IR_PEA_MASK)
659 lec = (psr & MTT_PSR_LEC_MASK)
660 >> MTT_PSR_LEC_SHIFT;
661 else
662 lec = (psr & MTT_PSR_DLEC_MASK)
663 >> MTT_PSR_DLEC_SHIFT;
666 work_done += 664 work_done +=
667 mttcan_handle_bus_err(dev, lec); 665 mttcan_handle_bus_err(dev, lec);
668 netdev_err(dev, "IR = 0x%x PSR 0x%x\n", 666