* [PATCH] [RFCv3] can: add CAN interface termination API
@ 2017-01-10 17:52 Oliver Hartkopp
2017-01-11 9:50 ` Kołłątaj, Remigiusz
2017-01-11 15:20 ` Marc Kleine-Budde
0 siblings, 2 replies; 4+ messages in thread
From: Oliver Hartkopp @ 2017-01-10 17:52 UTC (permalink / raw)
To: linux-can; +Cc: Oliver Hartkopp
This patch adds a netlink interface to configure the CAN bus termination of
CAN interfaces.
Inside the driver an array of supported termination values is defined:
const u16 drvname_termination[] = { 60, 120, CAN_TERMINATION_DISABLED };
struct drvname_priv *priv;
priv = netdev_priv(dev);
priv->termination_const = &drvname_termination;
priv->termination_const_cnt = ARRAY_SIZE(drvname_termination);
priv->termination = CAN_TERMINATION_DISABLED;
And the funtion to set the value has to be defined:
priv->do_set_termination = drvname_set_termination;
Signed-off-by: Oliver Hartkopp <socketcan@hartkopp.net>
---
drivers/net/can/dev.c | 37 ++++++++++++++++++++++++++++++++++++-
include/linux/can/dev.h | 4 ++++
include/uapi/linux/can/netlink.h | 5 +++++
3 files changed, 45 insertions(+), 1 deletion(-)
diff --git a/drivers/net/can/dev.c b/drivers/net/can/dev.c
index 8d6208c0b400..900feacaf0ac 100644
--- a/drivers/net/can/dev.c
+++ b/drivers/net/can/dev.c
@@ -958,6 +958,30 @@ static int can_changelink(struct net_device *dev,
}
}
+ if (data[IFLA_CAN_TERMINATION]) {
+ u16 termval = nla_get_u16(data[IFLA_CAN_TERMINATION]);
+ int num_term = priv->termination_const_cnt;
+ int i;
+
+ if (!priv->do_set_termination)
+ return -EOPNOTSUPP;
+
+ /* check whether given value is supported by the interface */
+ for (i = 0; i < num_term; i++) {
+ if (termval == priv->termination_const[i])
+ break;
+ }
+ if (i >= num_term)
+ return -EINVAL;
+
+ /* Finally, set the termination value */
+ err = priv->do_set_termination(dev, termval);
+ if (err)
+ return err;
+
+ priv->termination = termval;
+ }
+
return 0;
}
@@ -980,6 +1004,11 @@ static size_t can_get_size(const struct net_device *dev)
size += nla_total_size(sizeof(struct can_bittiming));
if (priv->data_bittiming_const) /* IFLA_CAN_DATA_BITTIMING_CONST */
size += nla_total_size(sizeof(struct can_bittiming_const));
+ if (priv->termination_const &&
+ priv->termination_const_cnt) { /* IFLA_CAN_TERMINATION_CONST */
+ size += nla_total_size(priv->termination_const_cnt * sizeof(u16));
+ size += nla_total_size(sizeof(u16)); /* IFLA_CAN_TERMINATION */
+ }
return size;
}
@@ -1018,7 +1047,13 @@ static int can_fill_info(struct sk_buff *skb, const struct net_device *dev)
(priv->data_bittiming_const &&
nla_put(skb, IFLA_CAN_DATA_BITTIMING_CONST,
sizeof(*priv->data_bittiming_const),
- priv->data_bittiming_const)))
+ priv->data_bittiming_const)) ||
+
+ (priv->termination_const && priv->termination_const_cnt &&
+ nla_put(skb, IFLA_CAN_TERMINATION_CONST,
+ priv->termination_const_cnt * sizeof(u16),
+ priv->termination_const) &&
+ nla_put_u16(skb, IFLA_CAN_TERMINATION, priv->termination)))
return -EMSGSIZE;
return 0;
diff --git a/include/linux/can/dev.h b/include/linux/can/dev.h
index 5f5270941ba0..cba7f4b5a722 100644
--- a/include/linux/can/dev.h
+++ b/include/linux/can/dev.h
@@ -38,6 +38,9 @@ struct can_priv {
struct can_bittiming bittiming, data_bittiming;
const struct can_bittiming_const *bittiming_const,
*data_bittiming_const;
+ const u16 *termination_const;
+ const int termination_const_cnt;
+ u16 termination;
struct can_clock clock;
enum can_state state;
@@ -53,6 +56,7 @@ struct can_priv {
int (*do_set_bittiming)(struct net_device *dev);
int (*do_set_data_bittiming)(struct net_device *dev);
int (*do_set_mode)(struct net_device *dev, enum can_mode mode);
+ int (*do_set_termination)(struct net_device *dev, u16 term);
int (*do_get_state)(const struct net_device *dev,
enum can_state *state);
int (*do_get_berr_counter)(const struct net_device *dev,
diff --git a/include/uapi/linux/can/netlink.h b/include/uapi/linux/can/netlink.h
index 94ffe0c83ce7..7414771926fb 100644
--- a/include/uapi/linux/can/netlink.h
+++ b/include/uapi/linux/can/netlink.h
@@ -127,9 +127,14 @@ enum {
IFLA_CAN_BERR_COUNTER,
IFLA_CAN_DATA_BITTIMING,
IFLA_CAN_DATA_BITTIMING_CONST,
+ IFLA_CAN_TERMINATION,
+ IFLA_CAN_TERMINATION_CONST,
__IFLA_CAN_MAX
};
#define IFLA_CAN_MAX (__IFLA_CAN_MAX - 1)
+/* u16 termination range: 1..65535 Ohms */
+#define CAN_TERMINATION_DISABLED 0
+
#endif /* !_UAPI_CAN_NETLINK_H */
--
2.11.0
^ permalink raw reply related [flat|nested] 4+ messages in thread* Re: [PATCH] [RFCv3] can: add CAN interface termination API
2017-01-10 17:52 [PATCH] [RFCv3] can: add CAN interface termination API Oliver Hartkopp
@ 2017-01-11 9:50 ` Kołłątaj, Remigiusz
2017-01-11 11:03 ` Marc Kleine-Budde
2017-01-11 15:20 ` Marc Kleine-Budde
1 sibling, 1 reply; 4+ messages in thread
From: Kołłątaj, Remigiusz @ 2017-01-11 9:50 UTC (permalink / raw)
To: Oliver Hartkopp; +Cc: linux-can
Hi Oliver,
On 10 January 2017 at 18:52, Oliver Hartkopp <socketcan@hartkopp.net> wrote:
> This patch adds a netlink interface to configure the CAN bus termination of
> CAN interfaces.
>
> Inside the driver an array of supported termination values is defined:
>
> const u16 drvname_termination[] = { 60, 120, CAN_TERMINATION_DISABLED };
>
> struct drvname_priv *priv;
> priv = netdev_priv(dev);
>
> priv->termination_const = &drvname_termination;
> priv->termination_const_cnt = ARRAY_SIZE(drvname_termination);
> priv->termination = CAN_TERMINATION_DISABLED;
>
> And the funtion to set the value has to be defined:
>
> priv->do_set_termination = drvname_set_termination;
>
> Signed-off-by: Oliver Hartkopp <socketcan@hartkopp.net>
> ---
> drivers/net/can/dev.c | 37 ++++++++++++++++++++++++++++++++++++-
> include/linux/can/dev.h | 4 ++++
> include/uapi/linux/can/netlink.h | 5 +++++
> 3 files changed, 45 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/net/can/dev.c b/drivers/net/can/dev.c
> index 8d6208c0b400..900feacaf0ac 100644
> --- a/drivers/net/can/dev.c
> +++ b/drivers/net/can/dev.c
> @@ -958,6 +958,30 @@ static int can_changelink(struct net_device *dev,
> }
> }
>
> + if (data[IFLA_CAN_TERMINATION]) {
> + u16 termval = nla_get_u16(data[IFLA_CAN_TERMINATION]);
const
> + int num_term = priv->termination_const_cnt;
const
> + int i;
> +
> + if (!priv->do_set_termination)
> + return -EOPNOTSUPP;
> +
> + /* check whether given value is supported by the interface */
> + for (i = 0; i < num_term; i++) {
> + if (termval == priv->termination_const[i])
> + break;
> + }
> + if (i >= num_term)
> + return -EINVAL;
> +
> + /* Finally, set the termination value */
> + err = priv->do_set_termination(dev, termval);
> + if (err)
> + return err;
> +
> + priv->termination = termval;
> + }
> +
> return 0;
> }
>
> @@ -980,6 +1004,11 @@ static size_t can_get_size(const struct net_device *dev)
> size += nla_total_size(sizeof(struct can_bittiming));
> if (priv->data_bittiming_const) /* IFLA_CAN_DATA_BITTIMING_CONST */
> size += nla_total_size(sizeof(struct can_bittiming_const));
> + if (priv->termination_const &&
> + priv->termination_const_cnt) { /* IFLA_CAN_TERMINATION_CONST */
> + size += nla_total_size(priv->termination_const_cnt * sizeof(u16));
> + size += nla_total_size(sizeof(u16)); /* IFLA_CAN_TERMINATION */
> + }
>
> return size;
> }
> @@ -1018,7 +1047,13 @@ static int can_fill_info(struct sk_buff *skb, const struct net_device *dev)
> (priv->data_bittiming_const &&
> nla_put(skb, IFLA_CAN_DATA_BITTIMING_CONST,
> sizeof(*priv->data_bittiming_const),
> - priv->data_bittiming_const)))
> + priv->data_bittiming_const)) ||
> +
> + (priv->termination_const && priv->termination_const_cnt &&
> + nla_put(skb, IFLA_CAN_TERMINATION_CONST,
> + priv->termination_const_cnt * sizeof(u16),
> + priv->termination_const) &&
> + nla_put_u16(skb, IFLA_CAN_TERMINATION, priv->termination)))
> return -EMSGSIZE;
>
> return 0;
> diff --git a/include/linux/can/dev.h b/include/linux/can/dev.h
> index 5f5270941ba0..cba7f4b5a722 100644
> --- a/include/linux/can/dev.h
> +++ b/include/linux/can/dev.h
> @@ -38,6 +38,9 @@ struct can_priv {
> struct can_bittiming bittiming, data_bittiming;
> const struct can_bittiming_const *bittiming_const,
> *data_bittiming_const;
> + const u16 *termination_const;
> + const int termination_const_cnt;
> + u16 termination;
> struct can_clock clock;
>
> enum can_state state;
> @@ -53,6 +56,7 @@ struct can_priv {
> int (*do_set_bittiming)(struct net_device *dev);
> int (*do_set_data_bittiming)(struct net_device *dev);
> int (*do_set_mode)(struct net_device *dev, enum can_mode mode);
> + int (*do_set_termination)(struct net_device *dev, u16 term);
> int (*do_get_state)(const struct net_device *dev,
> enum can_state *state);
> int (*do_get_berr_counter)(const struct net_device *dev,
> diff --git a/include/uapi/linux/can/netlink.h b/include/uapi/linux/can/netlink.h
> index 94ffe0c83ce7..7414771926fb 100644
> --- a/include/uapi/linux/can/netlink.h
> +++ b/include/uapi/linux/can/netlink.h
> @@ -127,9 +127,14 @@ enum {
> IFLA_CAN_BERR_COUNTER,
> IFLA_CAN_DATA_BITTIMING,
> IFLA_CAN_DATA_BITTIMING_CONST,
> + IFLA_CAN_TERMINATION,
> + IFLA_CAN_TERMINATION_CONST,
> __IFLA_CAN_MAX
> };
>
> #define IFLA_CAN_MAX (__IFLA_CAN_MAX - 1)
>
> +/* u16 termination range: 1..65535 Ohms */
> +#define CAN_TERMINATION_DISABLED 0
> +
> #endif /* !_UAPI_CAN_NETLINK_H */
> --
> 2.11.0
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-can" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
Cheers,
Remik
--
____________________
Remigiusz Kołłątaj
Mobica Ltd
Technology Consultant
Skype: remigiusz.kollataj
www.mobica.com
^ permalink raw reply [flat|nested] 4+ messages in thread* Re: [PATCH] [RFCv3] can: add CAN interface termination API
2017-01-11 9:50 ` Kołłątaj, Remigiusz
@ 2017-01-11 11:03 ` Marc Kleine-Budde
0 siblings, 0 replies; 4+ messages in thread
From: Marc Kleine-Budde @ 2017-01-11 11:03 UTC (permalink / raw)
To: Kołłątaj, Remigiusz, Oliver Hartkopp; +Cc: linux-can
[-- Attachment #1.1: Type: text/plain, Size: 6247 bytes --]
On 01/11/2017 10:50 AM, Kołłątaj, Remigiusz wrote:
> Hi Oliver,
>
> On 10 January 2017 at 18:52, Oliver Hartkopp <socketcan@hartkopp.net> wrote:
>> This patch adds a netlink interface to configure the CAN bus termination of
>> CAN interfaces.
>>
>> Inside the driver an array of supported termination values is defined:
>>
>> const u16 drvname_termination[] = { 60, 120, CAN_TERMINATION_DISABLED };
>>
>> struct drvname_priv *priv;
>> priv = netdev_priv(dev);
>>
>> priv->termination_const = &drvname_termination;
>> priv->termination_const_cnt = ARRAY_SIZE(drvname_termination);
>> priv->termination = CAN_TERMINATION_DISABLED;
>>
>> And the funtion to set the value has to be defined:
>>
>> priv->do_set_termination = drvname_set_termination;
>>
>> Signed-off-by: Oliver Hartkopp <socketcan@hartkopp.net>
>> ---
>> drivers/net/can/dev.c | 37 ++++++++++++++++++++++++++++++++++++-
>> include/linux/can/dev.h | 4 ++++
>> include/uapi/linux/can/netlink.h | 5 +++++
>> 3 files changed, 45 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/net/can/dev.c b/drivers/net/can/dev.c
>> index 8d6208c0b400..900feacaf0ac 100644
>> --- a/drivers/net/can/dev.c
>> +++ b/drivers/net/can/dev.c
>> @@ -958,6 +958,30 @@ static int can_changelink(struct net_device *dev,
>> }
>> }
>>
>> + if (data[IFLA_CAN_TERMINATION]) {
>> + u16 termval = nla_get_u16(data[IFLA_CAN_TERMINATION]);
> const
>> + int num_term = priv->termination_const_cnt;
> const
Changed while applying.
>> + int i;
>> +
>> + if (!priv->do_set_termination)
>> + return -EOPNOTSUPP;
>> +
>> + /* check whether given value is supported by the interface */
>> + for (i = 0; i < num_term; i++) {
>> + if (termval == priv->termination_const[i])
>> + break;
>> + }
>> + if (i >= num_term)
>> + return -EINVAL;
>> +
>> + /* Finally, set the termination value */
>> + err = priv->do_set_termination(dev, termval);
>> + if (err)
>> + return err;
>> +
>> + priv->termination = termval;
>> + }
>> +
>> return 0;
>> }
>>
>> @@ -980,6 +1004,11 @@ static size_t can_get_size(const struct net_device *dev)
>> size += nla_total_size(sizeof(struct can_bittiming));
>> if (priv->data_bittiming_const) /* IFLA_CAN_DATA_BITTIMING_CONST */
>> size += nla_total_size(sizeof(struct can_bittiming_const));
>> + if (priv->termination_const &&
>> + priv->termination_const_cnt) { /* IFLA_CAN_TERMINATION_CONST */
>> + size += nla_total_size(priv->termination_const_cnt * sizeof(u16));
>> + size += nla_total_size(sizeof(u16)); /* IFLA_CAN_TERMINATION */
Reordered these to match the order in the IFLA_CAN_ enum.
>> + }
>>
>> return size;
>> }
>> @@ -1018,7 +1047,13 @@ static int can_fill_info(struct sk_buff *skb, const struct net_device *dev)
>> (priv->data_bittiming_const &&
>> nla_put(skb, IFLA_CAN_DATA_BITTIMING_CONST,
>> sizeof(*priv->data_bittiming_const),
>> - priv->data_bittiming_const)))
>> + priv->data_bittiming_const)) ||
>> +
>> + (priv->termination_const && priv->termination_const_cnt &&
>> + nla_put(skb, IFLA_CAN_TERMINATION_CONST,
>> + priv->termination_const_cnt * sizeof(u16),
>> + priv->termination_const) &&
>> + nla_put_u16(skb, IFLA_CAN_TERMINATION, priv->termination)))
>> return -EMSGSIZE;
>>
>> return 0;
>> diff --git a/include/linux/can/dev.h b/include/linux/can/dev.h
>> index 5f5270941ba0..cba7f4b5a722 100644
>> --- a/include/linux/can/dev.h
>> +++ b/include/linux/can/dev.h
>> @@ -38,6 +38,9 @@ struct can_priv {
>> struct can_bittiming bittiming, data_bittiming;
>> const struct can_bittiming_const *bittiming_const,
>> *data_bittiming_const;
>> + const u16 *termination_const;
>> + const int termination_const_cnt;
>> + u16 termination;
>> struct can_clock clock;
>>
>> enum can_state state;
>> @@ -53,6 +56,7 @@ struct can_priv {
>> int (*do_set_bittiming)(struct net_device *dev);
>> int (*do_set_data_bittiming)(struct net_device *dev);
>> int (*do_set_mode)(struct net_device *dev, enum can_mode mode);
>> + int (*do_set_termination)(struct net_device *dev, u16 term);
>> int (*do_get_state)(const struct net_device *dev,
>> enum can_state *state);
>> int (*do_get_berr_counter)(const struct net_device *dev,
>> diff --git a/include/uapi/linux/can/netlink.h b/include/uapi/linux/can/netlink.h
>> index 94ffe0c83ce7..7414771926fb 100644
>> --- a/include/uapi/linux/can/netlink.h
>> +++ b/include/uapi/linux/can/netlink.h
>> @@ -127,9 +127,14 @@ enum {
>> IFLA_CAN_BERR_COUNTER,
>> IFLA_CAN_DATA_BITTIMING,
>> IFLA_CAN_DATA_BITTIMING_CONST,
>> + IFLA_CAN_TERMINATION,
>> + IFLA_CAN_TERMINATION_CONST,
>> __IFLA_CAN_MAX
>> };
>>
>> #define IFLA_CAN_MAX (__IFLA_CAN_MAX - 1)
>>
>> +/* u16 termination range: 1..65535 Ohms */
>> +#define CAN_TERMINATION_DISABLED 0
>> +
>> #endif /* !_UAPI_CAN_NETLINK_H */
>> --
>> 2.11.0
>>
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-can" in
>> the body of a message to majordomo@vger.kernel.org
>> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
> Cheers,
> Remik
>
Marc
--
Pengutronix e.K. | Marc Kleine-Budde |
Industrial Linux Solutions | Phone: +49-231-2826-924 |
Vertretung West/Dortmund | Fax: +49-5121-206917-5555 |
Amtsgericht Hildesheim, HRA 2686 | http://www.pengutronix.de |
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] [RFCv3] can: add CAN interface termination API
2017-01-10 17:52 [PATCH] [RFCv3] can: add CAN interface termination API Oliver Hartkopp
2017-01-11 9:50 ` Kołłątaj, Remigiusz
@ 2017-01-11 15:20 ` Marc Kleine-Budde
1 sibling, 0 replies; 4+ messages in thread
From: Marc Kleine-Budde @ 2017-01-11 15:20 UTC (permalink / raw)
To: Oliver Hartkopp, linux-can
[-- Attachment #1.1: Type: text/plain, Size: 6572 bytes --]
On 01/10/2017 06:52 PM, Oliver Hartkopp wrote:
> This patch adds a netlink interface to configure the CAN bus termination of
> CAN interfaces.
>
> Inside the driver an array of supported termination values is defined:
>
> const u16 drvname_termination[] = { 60, 120, CAN_TERMINATION_DISABLED };
>
> struct drvname_priv *priv;
> priv = netdev_priv(dev);
>
> priv->termination_const = &drvname_termination;
> priv->termination_const_cnt = ARRAY_SIZE(drvname_termination);
> priv->termination = CAN_TERMINATION_DISABLED;
>
> And the funtion to set the value has to be defined:
>
> priv->do_set_termination = drvname_set_termination;
>
> Signed-off-by: Oliver Hartkopp <socketcan@hartkopp.net>
> ---
> drivers/net/can/dev.c | 37 ++++++++++++++++++++++++++++++++++++-
> include/linux/can/dev.h | 4 ++++
> include/uapi/linux/can/netlink.h | 5 +++++
> 3 files changed, 45 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/net/can/dev.c b/drivers/net/can/dev.c
> index 8d6208c0b400..900feacaf0ac 100644
> --- a/drivers/net/can/dev.c
> +++ b/drivers/net/can/dev.c
> @@ -958,6 +958,30 @@ static int can_changelink(struct net_device *dev,
> }
> }
>
> + if (data[IFLA_CAN_TERMINATION]) {
> + u16 termval = nla_get_u16(data[IFLA_CAN_TERMINATION]);
> + int num_term = priv->termination_const_cnt;
> + int i;
> +
> + if (!priv->do_set_termination)
> + return -EOPNOTSUPP;
> +
> + /* check whether given value is supported by the interface */
> + for (i = 0; i < num_term; i++) {
> + if (termval == priv->termination_const[i])
> + break;
> + }
> + if (i >= num_term)
> + return -EINVAL;
> +
> + /* Finally, set the termination value */
> + err = priv->do_set_termination(dev, termval);
> + if (err)
> + return err;
> +
> + priv->termination = termval;
> + }
> +
> return 0;
> }
>
> @@ -980,6 +1004,11 @@ static size_t can_get_size(const struct net_device *dev)
> size += nla_total_size(sizeof(struct can_bittiming));
> if (priv->data_bittiming_const) /* IFLA_CAN_DATA_BITTIMING_CONST */
> size += nla_total_size(sizeof(struct can_bittiming_const));
> + if (priv->termination_const &&
> + priv->termination_const_cnt) { /* IFLA_CAN_TERMINATION_CONST */
> + size += nla_total_size(priv->termination_const_cnt * sizeof(u16));
> + size += nla_total_size(sizeof(u16)); /* IFLA_CAN_TERMINATION */
> + }
I've converted the sizeof(u16) to sizeof(priv->termination) and
sizeof(*priv->termination_const). The code looks like this:
> + if (priv->termination_const) {
> + size += nla_total_size(sizeof(priv->termination)); /* IFLA_CAN_TERMINATION */
> + size += nla_total_size(sizeof(*priv->termination_const) * /* IFLA_CAN_TERMINATION_CONST */
> + priv->termination_const_cnt);
> + }
>
> return size;
> }
> @@ -1018,7 +1047,13 @@ static int can_fill_info(struct sk_buff *skb, const struct net_device *dev)
> (priv->data_bittiming_const &&
> nla_put(skb, IFLA_CAN_DATA_BITTIMING_CONST,
> sizeof(*priv->data_bittiming_const),
> - priv->data_bittiming_const)))
> + priv->data_bittiming_const)) ||
> +
> + (priv->termination_const && priv->termination_const_cnt &&
> + nla_put(skb, IFLA_CAN_TERMINATION_CONST,
> + priv->termination_const_cnt * sizeof(u16),
> + priv->termination_const) &&
^^
This must be an ||, as nla_put return 0 on success.
I've converted the sizeof(u16) here, too:
> + (priv->termination_const &&
> + (nla_put_u16(skb, IFLA_CAN_TERMINATION, priv->termination) ||
> + nla_put(skb, IFLA_CAN_TERMINATION_CONST,
> + sizeof(*priv->termination_const) *
> + priv->termination_const_cnt,
> + priv->termination_const))))
> + nla_put_u16(skb, IFLA_CAN_TERMINATION, priv->termination)))
> return -EMSGSIZE;
>
> return 0;
> diff --git a/include/linux/can/dev.h b/include/linux/can/dev.h
> index 5f5270941ba0..cba7f4b5a722 100644
> --- a/include/linux/can/dev.h
> +++ b/include/linux/can/dev.h
> @@ -38,6 +38,9 @@ struct can_priv {
> struct can_bittiming bittiming, data_bittiming;
> const struct can_bittiming_const *bittiming_const,
> *data_bittiming_const;
> + const u16 *termination_const;
> + const int termination_const_cnt;
> + u16 termination;
> struct can_clock clock;
>
> enum can_state state;
> @@ -53,6 +56,7 @@ struct can_priv {
> int (*do_set_bittiming)(struct net_device *dev);
> int (*do_set_data_bittiming)(struct net_device *dev);
> int (*do_set_mode)(struct net_device *dev, enum can_mode mode);
> + int (*do_set_termination)(struct net_device *dev, u16 term);
> int (*do_get_state)(const struct net_device *dev,
> enum can_state *state);
> int (*do_get_berr_counter)(const struct net_device *dev,
> diff --git a/include/uapi/linux/can/netlink.h b/include/uapi/linux/can/netlink.h
> index 94ffe0c83ce7..7414771926fb 100644
> --- a/include/uapi/linux/can/netlink.h
> +++ b/include/uapi/linux/can/netlink.h
> @@ -127,9 +127,14 @@ enum {
> IFLA_CAN_BERR_COUNTER,
> IFLA_CAN_DATA_BITTIMING,
> IFLA_CAN_DATA_BITTIMING_CONST,
> + IFLA_CAN_TERMINATION,
> + IFLA_CAN_TERMINATION_CONST,
> __IFLA_CAN_MAX
> };
>
> #define IFLA_CAN_MAX (__IFLA_CAN_MAX - 1)
>
> +/* u16 termination range: 1..65535 Ohms */
> +#define CAN_TERMINATION_DISABLED 0
> +
> #endif /* !_UAPI_CAN_NETLINK_H */
>
Also, I've added a check for consistency, so a lot of "termination_const
&& termination_const_cnt" can be reduced to just a check for
termination_const.
> int register_candev(struct net_device *dev)
> {
> + struct can_priv *priv = netdev_priv(dev);
> +
> + /* Ensure termination_cost and termination_const_cnt
> + * consistency. Both must be either set or unset.
> + */
> + if ((priv->termination_const && priv->termination_const_cnt <= 0) ||
> + (!priv->termination_const && priv->termination_const_cnt != 0))
> + return -EINVAL;
> +
Marc
--
Pengutronix e.K. | Marc Kleine-Budde |
Industrial Linux Solutions | Phone: +49-231-2826-924 |
Vertretung West/Dortmund | Fax: +49-5121-206917-5555 |
Amtsgericht Hildesheim, HRA 2686 | http://www.pengutronix.de |
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 484 bytes --]
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2017-01-11 15:21 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-01-10 17:52 [PATCH] [RFCv3] can: add CAN interface termination API Oliver Hartkopp
2017-01-11 9:50 ` Kołłątaj, Remigiusz
2017-01-11 11:03 ` Marc Kleine-Budde
2017-01-11 15:20 ` Marc Kleine-Budde
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox