christian pellegrin wrote: > Hi, > > I'm attaching the patch that implements the OSM for the mcp2515. > Unfortunately right now I have just a mcp2510 available for testing > which doesn't support OSM, so if someone acknowledges it's OK I'll > send a proper patch. I should have an mcp2515 on a new hardware on mid > January to test it myself, but, you know, never trust the deadlines > that the hardware guy has told you ;-). > > BTW it's a pity that OSM is implemented only on the mcp2515 and not on > the mcp2510. Perhaps it could be a best default mode of operation > because it gives more control to the software to account for the bus > state.
Do you want to make one-shot mode default on the mcp2515? What does the
CAN spec define?
>
> ---8<----- against SVN trunk ------
> --- kernel/2.6/drivers/net/can/mcp251x.c (revision 1095)
> +++ kernel/2.6/drivers/net/can/mcp251x.c (working copy)
> @@ -539,6 +539,7 @@
>
> static void mcp251x_set_normal_mode(struct spi_device *spi)
> {
> + struct mcp251x_platform_data *pdata = spi->dev.platform_data;
> struct mcp251x_priv *priv = dev_get_drvdata(&spi->dev);
> unsigned long timeout;
>
> @@ -553,7 +554,10 @@
> mcp251x_write_reg(spi, CANCTRL, CANCTRL_REQOP_LOOPBACK);
> } else {
> /* Put device into normal mode */
> - mcp251x_write_reg(spi, CANCTRL, CANCTRL_REQOP_NORMAL);
> + mcp251x_write_reg(spi, CANCTRL, CANCTRL_REQOP_NORMAL |
> + ((pdata->model == CAN_MCP251X_MCP2515 &&
> + priv->can.ctrlmode & CAN_CTRLMODE_ONE_SHOT)
> ?
> + CANCTRL_OSM : 0));
>
> /* Wait for the device to enter normal mode */
> timeout = jiffies + HZ;
> ---8<----- against 2.6.33-rc1 ------
> diff --git a/drivers/net/can/mcp251x.c b/drivers/net/can/mcp251x.c
> index 9c5a153..68ec171 100644
> --- a/drivers/net/can/mcp251x.c
> +++ b/drivers/net/can/mcp251x.c
> @@ -531,6 +531,7 @@ static int mcp251x_do_set_mode(struct net_device
> *net, enum can_mode mode)
>
> static void mcp251x_set_normal_mode(struct spi_device *spi)
> {
> + struct mcp251x_platform_data *pdata = spi->dev.platform_data;
> struct mcp251x_priv *priv = dev_get_drvdata(&spi->dev);
> unsigned long timeout;
>
> @@ -545,7 +546,10 @@ static void mcp251x_set_normal_mode(struct spi_device
> *spi)
> mcp251x_write_reg(spi, CANCTRL, CANCTRL_REQOP_LOOPBACK);
> } else {
> /* Put device into normal mode */
> - mcp251x_write_reg(spi, CANCTRL, CANCTRL_REQOP_NORMAL);
> + mcp251x_write_reg(spi, CANCTRL, CANCTRL_REQOP_NORMAL |
> + ((pdata->model == CAN_MCP251X_MCP2515 &&
> + priv->can.ctrlmode & CAN_CTRLMODE_ONE_SHOT)
> ?
> + CANCTRL_OSM : 0));
>
> /* Wait for the device to enter normal mode */
> timeout = jiffies + HZ;
What about returning some error value if the adapter doesn't support the
settings.
cheers, Marc
--
Pengutronix e.K. | Marc Kleine-Budde |
Linux Solutions for Science and Industry | Phone: +49-231-2826-924 |
Vertretung West/Dortmund | Fax: +49-5121-206917-5555 |
Amtsgericht Hildesheim, HRA 2686 | http://www.pengutronix.de |
signature.asc
Description: OpenPGP digital signature
_______________________________________________ Socketcan-core mailing list [email protected] https://lists.berlios.de/mailman/listinfo/socketcan-core
