Skip to content

Commit afbe7af

Browse files
committed
Merge tag 'linux-can-fixes-for-3.17-20140918' of git://gitorious.org/linux-can/linux-can
Marc Kleine-Budde says: ==================== pull-request: can 2014-09-18 this is a pull request of 8 patches for current net. A patch by Roger Quadros for the c_can driver fixes the swapped parameters of the c_can_hw_raminit_ti() function. Oliver Hartkopp adds the missing PCI ids to the peak_pci driver to support the single channel PCAN ExpressCard 34 adapter. David Dueck converts the at91_can driver to use proper clock handling functions. Then there are 5 patches by David Jander and me which fix several mailbox related problems in the flexcan driver. ==================== Signed-off-by: David S. Miller <[email protected]>
2 parents 9b67aa4 + e77980e commit afbe7af

File tree

4 files changed

+51
-10
lines changed

4 files changed

+51
-10
lines changed

drivers/net/can/at91_can.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1123,7 +1123,9 @@ static int at91_open(struct net_device *dev)
11231123
struct at91_priv *priv = netdev_priv(dev);
11241124
int err;
11251125

1126-
clk_enable(priv->clk);
1126+
err = clk_prepare_enable(priv->clk);
1127+
if (err)
1128+
return err;
11271129

11281130
/* check or determine and set bittime */
11291131
err = open_candev(dev);
@@ -1149,7 +1151,7 @@ static int at91_open(struct net_device *dev)
11491151
out_close:
11501152
close_candev(dev);
11511153
out:
1152-
clk_disable(priv->clk);
1154+
clk_disable_unprepare(priv->clk);
11531155

11541156
return err;
11551157
}
@@ -1166,7 +1168,7 @@ static int at91_close(struct net_device *dev)
11661168
at91_chip_stop(dev, CAN_STATE_STOPPED);
11671169

11681170
free_irq(dev->irq, dev);
1169-
clk_disable(priv->clk);
1171+
clk_disable_unprepare(priv->clk);
11701172

11711173
close_candev(dev);
11721174

drivers/net/can/c_can/c_can_platform.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,14 +97,14 @@ static void c_can_hw_raminit_ti(const struct c_can_priv *priv, bool enable)
9797
ctrl |= CAN_RAMINIT_DONE_MASK(priv->instance);
9898
writel(ctrl, priv->raminit_ctrlreg);
9999
ctrl &= ~CAN_RAMINIT_DONE_MASK(priv->instance);
100-
c_can_hw_raminit_wait_ti(priv, ctrl, mask);
100+
c_can_hw_raminit_wait_ti(priv, mask, ctrl);
101101

102102
if (enable) {
103103
/* Set start bit and wait for the done bit. */
104104
ctrl |= CAN_RAMINIT_START_MASK(priv->instance);
105105
writel(ctrl, priv->raminit_ctrlreg);
106106
ctrl |= CAN_RAMINIT_DONE_MASK(priv->instance);
107-
c_can_hw_raminit_wait_ti(priv, ctrl, mask);
107+
c_can_hw_raminit_wait_ti(priv, mask, ctrl);
108108
}
109109
spin_unlock(&raminit_lock);
110110
}

drivers/net/can/flexcan.c

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@
6262
#define FLEXCAN_MCR_BCC BIT(16)
6363
#define FLEXCAN_MCR_LPRIO_EN BIT(13)
6464
#define FLEXCAN_MCR_AEN BIT(12)
65-
#define FLEXCAN_MCR_MAXMB(x) ((x) & 0x1f)
65+
#define FLEXCAN_MCR_MAXMB(x) ((x) & 0x7f)
6666
#define FLEXCAN_MCR_IDAM_A (0 << 8)
6767
#define FLEXCAN_MCR_IDAM_B (1 << 8)
6868
#define FLEXCAN_MCR_IDAM_C (2 << 8)
@@ -125,7 +125,9 @@
125125
FLEXCAN_ESR_BOFF_INT | FLEXCAN_ESR_ERR_INT)
126126

127127
/* FLEXCAN interrupt flag register (IFLAG) bits */
128-
#define FLEXCAN_TX_BUF_ID 8
128+
/* Errata ERR005829 step7: Reserve first valid MB */
129+
#define FLEXCAN_TX_BUF_RESERVED 8
130+
#define FLEXCAN_TX_BUF_ID 9
129131
#define FLEXCAN_IFLAG_BUF(x) BIT(x)
130132
#define FLEXCAN_IFLAG_RX_FIFO_OVERFLOW BIT(7)
131133
#define FLEXCAN_IFLAG_RX_FIFO_WARN BIT(6)
@@ -136,6 +138,17 @@
136138

137139
/* FLEXCAN message buffers */
138140
#define FLEXCAN_MB_CNT_CODE(x) (((x) & 0xf) << 24)
141+
#define FLEXCAN_MB_CODE_RX_INACTIVE (0x0 << 24)
142+
#define FLEXCAN_MB_CODE_RX_EMPTY (0x4 << 24)
143+
#define FLEXCAN_MB_CODE_RX_FULL (0x2 << 24)
144+
#define FLEXCAN_MB_CODE_RX_OVERRRUN (0x6 << 24)
145+
#define FLEXCAN_MB_CODE_RX_RANSWER (0xa << 24)
146+
147+
#define FLEXCAN_MB_CODE_TX_INACTIVE (0x8 << 24)
148+
#define FLEXCAN_MB_CODE_TX_ABORT (0x9 << 24)
149+
#define FLEXCAN_MB_CODE_TX_DATA (0xc << 24)
150+
#define FLEXCAN_MB_CODE_TX_TANSWER (0xe << 24)
151+
139152
#define FLEXCAN_MB_CNT_SRR BIT(22)
140153
#define FLEXCAN_MB_CNT_IDE BIT(21)
141154
#define FLEXCAN_MB_CNT_RTR BIT(20)
@@ -428,6 +441,14 @@ static int flexcan_start_xmit(struct sk_buff *skb, struct net_device *dev)
428441
flexcan_write(can_id, &regs->cantxfg[FLEXCAN_TX_BUF_ID].can_id);
429442
flexcan_write(ctrl, &regs->cantxfg[FLEXCAN_TX_BUF_ID].can_ctrl);
430443

444+
/* Errata ERR005829 step8:
445+
* Write twice INACTIVE(0x8) code to first MB.
446+
*/
447+
flexcan_write(FLEXCAN_MB_CODE_TX_INACTIVE,
448+
&regs->cantxfg[FLEXCAN_TX_BUF_RESERVED].can_ctrl);
449+
flexcan_write(FLEXCAN_MB_CODE_TX_INACTIVE,
450+
&regs->cantxfg[FLEXCAN_TX_BUF_RESERVED].can_ctrl);
451+
431452
return NETDEV_TX_OK;
432453
}
433454

@@ -744,6 +765,9 @@ static irqreturn_t flexcan_irq(int irq, void *dev_id)
744765
stats->tx_bytes += can_get_echo_skb(dev, 0);
745766
stats->tx_packets++;
746767
can_led_event(dev, CAN_LED_EVENT_TX);
768+
/* after sending a RTR frame mailbox is in RX mode */
769+
flexcan_write(FLEXCAN_MB_CODE_TX_INACTIVE,
770+
&regs->cantxfg[FLEXCAN_TX_BUF_ID].can_ctrl);
747771
flexcan_write((1 << FLEXCAN_TX_BUF_ID), &regs->iflag1);
748772
netif_wake_queue(dev);
749773
}
@@ -801,6 +825,7 @@ static int flexcan_chip_start(struct net_device *dev)
801825
struct flexcan_regs __iomem *regs = priv->base;
802826
int err;
803827
u32 reg_mcr, reg_ctrl;
828+
int i;
804829

805830
/* enable module */
806831
err = flexcan_chip_enable(priv);
@@ -867,8 +892,18 @@ static int flexcan_chip_start(struct net_device *dev)
867892
netdev_dbg(dev, "%s: writing ctrl=0x%08x", __func__, reg_ctrl);
868893
flexcan_write(reg_ctrl, &regs->ctrl);
869894

870-
/* Abort any pending TX, mark Mailbox as INACTIVE */
871-
flexcan_write(FLEXCAN_MB_CNT_CODE(0x4),
895+
/* clear and invalidate all mailboxes first */
896+
for (i = FLEXCAN_TX_BUF_ID; i < ARRAY_SIZE(regs->cantxfg); i++) {
897+
flexcan_write(FLEXCAN_MB_CODE_RX_INACTIVE,
898+
&regs->cantxfg[i].can_ctrl);
899+
}
900+
901+
/* Errata ERR005829: mark first TX mailbox as INACTIVE */
902+
flexcan_write(FLEXCAN_MB_CODE_TX_INACTIVE,
903+
&regs->cantxfg[FLEXCAN_TX_BUF_RESERVED].can_ctrl);
904+
905+
/* mark TX mailbox as INACTIVE */
906+
flexcan_write(FLEXCAN_MB_CODE_TX_INACTIVE,
872907
&regs->cantxfg[FLEXCAN_TX_BUF_ID].can_ctrl);
873908

874909
/* acceptance mask/acceptance code (accept everything) */

drivers/net/can/sja1000/peak_pci.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,8 @@ struct peak_pci_chan {
7070
#define PEAK_PC_104P_DEVICE_ID 0x0006 /* PCAN-PC/104+ cards */
7171
#define PEAK_PCI_104E_DEVICE_ID 0x0007 /* PCAN-PCI/104 Express cards */
7272
#define PEAK_MPCIE_DEVICE_ID 0x0008 /* The miniPCIe slot cards */
73+
#define PEAK_PCIE_OEM_ID 0x0009 /* PCAN-PCI Express OEM */
74+
#define PEAK_PCIEC34_DEVICE_ID 0x000A /* PCAN-PCI Express 34 (one channel) */
7375

7476
#define PEAK_PCI_CHAN_MAX 4
7577

@@ -87,6 +89,7 @@ static const struct pci_device_id peak_pci_tbl[] = {
8789
{PEAK_PCI_VENDOR_ID, PEAK_CPCI_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,},
8890
#ifdef CONFIG_CAN_PEAK_PCIEC
8991
{PEAK_PCI_VENDOR_ID, PEAK_PCIEC_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,},
92+
{PEAK_PCI_VENDOR_ID, PEAK_PCIEC34_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,},
9093
#endif
9194
{0,}
9295
};
@@ -653,7 +656,8 @@ static int peak_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
653656
* This must be done *before* register_sja1000dev() but
654657
* *after* devices linkage
655658
*/
656-
if (pdev->device == PEAK_PCIEC_DEVICE_ID) {
659+
if (pdev->device == PEAK_PCIEC_DEVICE_ID ||
660+
pdev->device == PEAK_PCIEC34_DEVICE_ID) {
657661
err = peak_pciec_probe(pdev, dev);
658662
if (err) {
659663
dev_err(&pdev->dev,

0 commit comments

Comments
 (0)