diff options
Diffstat (limited to 'drivers/net/can')
| -rw-r--r-- | drivers/net/can/janz-ican3.c | 4 | ||||
| -rw-r--r-- | drivers/net/can/mcp251x.c | 11 | ||||
| -rw-r--r-- | drivers/net/can/sja1000/sja1000_platform.c | 4 | ||||
| -rw-r--r-- | drivers/net/can/softing/softing_fw.c | 7 | ||||
| -rw-r--r-- | drivers/net/can/ti_hecc.c | 2 | 
5 files changed, 19 insertions, 9 deletions
diff --git a/drivers/net/can/janz-ican3.c b/drivers/net/can/janz-ican3.c index 98ee4381991..7edadee487b 100644 --- a/drivers/net/can/janz-ican3.c +++ b/drivers/net/can/janz-ican3.c @@ -1391,7 +1391,6 @@ static irqreturn_t ican3_irq(int irq, void *dev_id)   */  static int ican3_reset_module(struct ican3_dev *mod)  { -	u8 val = 1 << mod->num;  	unsigned long start;  	u8 runold, runnew; @@ -1405,8 +1404,7 @@ static int ican3_reset_module(struct ican3_dev *mod)  	runold = ioread8(mod->dpm + TARGET_RUNNING);  	/* reset the module */ -	iowrite8(val, &mod->ctrl->reset_assert); -	iowrite8(val, &mod->ctrl->reset_deassert); +	iowrite8(0x00, &mod->dpmctrl->hwreset);  	/* wait until the module has finished resetting and is running */  	start = jiffies; diff --git a/drivers/net/can/mcp251x.c b/drivers/net/can/mcp251x.c index a580db29e50..26e7129332a 100644 --- a/drivers/net/can/mcp251x.c +++ b/drivers/net/can/mcp251x.c @@ -83,6 +83,11 @@  #define INSTRUCTION_LOAD_TXB(n)	(0x40 + 2 * (n))  #define INSTRUCTION_READ_RXB(n)	(((n) == 0) ? 0x90 : 0x94)  #define INSTRUCTION_RESET	0xC0 +#define RTS_TXB0		0x01 +#define RTS_TXB1		0x02 +#define RTS_TXB2		0x04 +#define INSTRUCTION_RTS(n)	(0x80 | ((n) & 0x07)) +  /* MPC251x registers */  #define CANSTAT	      0x0e @@ -397,6 +402,7 @@ static void mcp251x_hw_tx_frame(struct spi_device *spi, u8 *buf,  static void mcp251x_hw_tx(struct spi_device *spi, struct can_frame *frame,  			  int tx_buf_idx)  { +	struct mcp251x_priv *priv = dev_get_drvdata(&spi->dev);  	u32 sid, eid, exide, rtr;  	u8 buf[SPI_TRANSFER_BUF_LEN]; @@ -418,7 +424,10 @@ static void mcp251x_hw_tx(struct spi_device *spi, struct can_frame *frame,  	buf[TXBDLC_OFF] = (rtr << DLC_RTR_SHIFT) | frame->can_dlc;  	memcpy(buf + TXBDAT_OFF, frame->data, frame->can_dlc);  	mcp251x_hw_tx_frame(spi, buf, frame->can_dlc, tx_buf_idx); -	mcp251x_write_reg(spi, TXBCTRL(tx_buf_idx), TXBCTRL_TXREQ); + +	/* use INSTRUCTION_RTS, to avoid "repeated frame problem" */ +	priv->spi_tx_buf[0] = INSTRUCTION_RTS(1 << tx_buf_idx); +	mcp251x_spi_trans(priv->spi, 1);  }  static void mcp251x_hw_rx_frame(struct spi_device *spi, u8 *buf, diff --git a/drivers/net/can/sja1000/sja1000_platform.c b/drivers/net/can/sja1000/sja1000_platform.c index 4f50145f648..662c5f7eb0c 100644 --- a/drivers/net/can/sja1000/sja1000_platform.c +++ b/drivers/net/can/sja1000/sja1000_platform.c @@ -109,7 +109,9 @@ static int sp_probe(struct platform_device *pdev)  	priv = netdev_priv(dev);  	dev->irq = res_irq->start; -	priv->irq_flags = res_irq->flags & (IRQF_TRIGGER_MASK | IRQF_SHARED); +	priv->irq_flags = res_irq->flags & IRQF_TRIGGER_MASK; +	if (res_irq->flags & IORESOURCE_IRQ_SHAREABLE) +		priv->irq_flags |= IRQF_SHARED;  	priv->reg_base = addr;  	/* The CAN clock frequency is half the oscillator clock frequency */  	priv->can.clock.freq = pdata->osc_freq / 2; diff --git a/drivers/net/can/softing/softing_fw.c b/drivers/net/can/softing/softing_fw.c index 31059617567..b595d3422b9 100644 --- a/drivers/net/can/softing/softing_fw.c +++ b/drivers/net/can/softing/softing_fw.c @@ -150,7 +150,7 @@ int softing_load_fw(const char *file, struct softing *card,  	const uint8_t *mem, *end, *dat;  	uint16_t type, len;  	uint32_t addr; -	uint8_t *buf = NULL; +	uint8_t *buf = NULL, *new_buf;  	int buflen = 0;  	int8_t type_end = 0; @@ -199,11 +199,12 @@ int softing_load_fw(const char *file, struct softing *card,  		if (len > buflen) {  			/* align buflen */  			buflen = (len + (1024-1)) & ~(1024-1); -			buf = krealloc(buf, buflen, GFP_KERNEL); -			if (!buf) { +			new_buf = krealloc(buf, buflen, GFP_KERNEL); +			if (!new_buf) {  				ret = -ENOMEM;  				goto failed;  			} +			buf = new_buf;  		}  		/* verify record data */  		memcpy_fromio(buf, &dpram[addr + offset], len); diff --git a/drivers/net/can/ti_hecc.c b/drivers/net/can/ti_hecc.c index 527dbcf9533..9ded21e79db 100644 --- a/drivers/net/can/ti_hecc.c +++ b/drivers/net/can/ti_hecc.c @@ -984,12 +984,12 @@ static int __devexit ti_hecc_remove(struct platform_device *pdev)  	struct net_device *ndev = platform_get_drvdata(pdev);  	struct ti_hecc_priv *priv = netdev_priv(ndev); +	unregister_candev(ndev);  	clk_disable(priv->clk);  	clk_put(priv->clk);  	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);  	iounmap(priv->base);  	release_mem_region(res->start, resource_size(res)); -	unregister_candev(ndev);  	free_candev(ndev);  	platform_set_drvdata(pdev, NULL);  |