Skip to content

Commit a00ebc4

Browse files
committed
Merge tag 'linux-can-next-for-4.11-20170124' of git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can-next
Marc Kleine-Budde says: ==================== pull-request: can-next 2017-01-24 this is a pull request of 4 patches for net-next/master. The first patch by Oliver Hartkopp adds a netlink API to configure the interface termination of a CAN card. The next two patches are by me and add a netlink API to query and configure CAN interfaces that only support fixed bitrates. The last patch by Colin Ian King simplifies the return path in the softing_cs driver's softingcs_probe() function. ==================== Signed-off-by: David S. Miller <[email protected]>
2 parents 45ce0fd + 1e9bbb9 commit a00ebc4

File tree

4 files changed

+142
-11
lines changed

4 files changed

+142
-11
lines changed

drivers/net/can/dev.c

Lines changed: 126 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -279,25 +279,45 @@ static int can_fixup_bittiming(struct net_device *dev, struct can_bittiming *bt,
279279
return 0;
280280
}
281281

282+
/* Checks the validity of predefined bitrate settings */
283+
static int can_validate_bitrate(struct net_device *dev, struct can_bittiming *bt,
284+
const u32 *bitrate_const,
285+
const unsigned int bitrate_const_cnt)
286+
{
287+
struct can_priv *priv = netdev_priv(dev);
288+
unsigned int i;
289+
290+
for (i = 0; i < bitrate_const_cnt; i++) {
291+
if (bt->bitrate == bitrate_const[i])
292+
break;
293+
}
294+
295+
if (i >= priv->bitrate_const_cnt)
296+
return -EINVAL;
297+
298+
return 0;
299+
}
300+
282301
static int can_get_bittiming(struct net_device *dev, struct can_bittiming *bt,
283-
const struct can_bittiming_const *btc)
302+
const struct can_bittiming_const *btc,
303+
const u32 *bitrate_const,
304+
const unsigned int bitrate_const_cnt)
284305
{
285306
int err;
286307

287-
/* Check if the CAN device has bit-timing parameters */
288-
if (!btc)
289-
return -EOPNOTSUPP;
290-
291308
/*
292309
* Depending on the given can_bittiming parameter structure the CAN
293310
* timing parameters are calculated based on the provided bitrate OR
294311
* alternatively the CAN timing parameters (tq, prop_seg, etc.) are
295312
* provided directly which are then checked and fixed up.
296313
*/
297-
if (!bt->tq && bt->bitrate)
314+
if (!bt->tq && bt->bitrate && btc)
298315
err = can_calc_bittiming(dev, bt, btc);
299-
else if (bt->tq && !bt->bitrate)
316+
else if (bt->tq && !bt->bitrate && btc)
300317
err = can_fixup_bittiming(dev, bt, btc);
318+
else if (!bt->tq && bt->bitrate && bitrate_const)
319+
err = can_validate_bitrate(dev, bt, bitrate_const,
320+
bitrate_const_cnt);
301321
else
302322
err = -EINVAL;
303323

@@ -872,8 +892,20 @@ static int can_changelink(struct net_device *dev,
872892
/* Do not allow changing bittiming while running */
873893
if (dev->flags & IFF_UP)
874894
return -EBUSY;
895+
896+
/* Calculate bittiming parameters based on
897+
* bittiming_const if set, otherwise pass bitrate
898+
* directly via do_set_bitrate(). Bail out if neither
899+
* is given.
900+
*/
901+
if (!priv->bittiming_const && !priv->do_set_bittiming)
902+
return -EOPNOTSUPP;
903+
875904
memcpy(&bt, nla_data(data[IFLA_CAN_BITTIMING]), sizeof(bt));
876-
err = can_get_bittiming(dev, &bt, priv->bittiming_const);
905+
err = can_get_bittiming(dev, &bt,
906+
priv->bittiming_const,
907+
priv->bitrate_const,
908+
priv->bitrate_const_cnt);
877909
if (err)
878910
return err;
879911
memcpy(&priv->bittiming, &bt, sizeof(bt));
@@ -943,9 +975,21 @@ static int can_changelink(struct net_device *dev,
943975
/* Do not allow changing bittiming while running */
944976
if (dev->flags & IFF_UP)
945977
return -EBUSY;
978+
979+
/* Calculate bittiming parameters based on
980+
* data_bittiming_const if set, otherwise pass bitrate
981+
* directly via do_set_bitrate(). Bail out if neither
982+
* is given.
983+
*/
984+
if (!priv->data_bittiming_const && !priv->do_set_data_bittiming)
985+
return -EOPNOTSUPP;
986+
946987
memcpy(&dbt, nla_data(data[IFLA_CAN_DATA_BITTIMING]),
947988
sizeof(dbt));
948-
err = can_get_bittiming(dev, &dbt, priv->data_bittiming_const);
989+
err = can_get_bittiming(dev, &dbt,
990+
priv->data_bittiming_const,
991+
priv->data_bitrate_const,
992+
priv->data_bitrate_const_cnt);
949993
if (err)
950994
return err;
951995
memcpy(&priv->data_bittiming, &dbt, sizeof(dbt));
@@ -958,6 +1002,30 @@ static int can_changelink(struct net_device *dev,
9581002
}
9591003
}
9601004

1005+
if (data[IFLA_CAN_TERMINATION]) {
1006+
const u16 termval = nla_get_u16(data[IFLA_CAN_TERMINATION]);
1007+
const unsigned int num_term = priv->termination_const_cnt;
1008+
unsigned int i;
1009+
1010+
if (!priv->do_set_termination)
1011+
return -EOPNOTSUPP;
1012+
1013+
/* check whether given value is supported by the interface */
1014+
for (i = 0; i < num_term; i++) {
1015+
if (termval == priv->termination_const[i])
1016+
break;
1017+
}
1018+
if (i >= num_term)
1019+
return -EINVAL;
1020+
1021+
/* Finally, set the termination value */
1022+
err = priv->do_set_termination(dev, termval);
1023+
if (err)
1024+
return err;
1025+
1026+
priv->termination = termval;
1027+
}
1028+
9611029
return 0;
9621030
}
9631031

@@ -980,6 +1048,17 @@ static size_t can_get_size(const struct net_device *dev)
9801048
size += nla_total_size(sizeof(struct can_bittiming));
9811049
if (priv->data_bittiming_const) /* IFLA_CAN_DATA_BITTIMING_CONST */
9821050
size += nla_total_size(sizeof(struct can_bittiming_const));
1051+
if (priv->termination_const) {
1052+
size += nla_total_size(sizeof(priv->termination)); /* IFLA_CAN_TERMINATION */
1053+
size += nla_total_size(sizeof(*priv->termination_const) * /* IFLA_CAN_TERMINATION_CONST */
1054+
priv->termination_const_cnt);
1055+
}
1056+
if (priv->bitrate_const) /* IFLA_CAN_BITRATE_CONST */
1057+
size += nla_total_size(sizeof(*priv->bitrate_const) *
1058+
priv->bitrate_const_cnt);
1059+
if (priv->data_bitrate_const) /* IFLA_CAN_DATA_BITRATE_CONST */
1060+
size += nla_total_size(sizeof(*priv->data_bitrate_const) *
1061+
priv->data_bitrate_const_cnt);
9831062

9841063
return size;
9851064
}
@@ -1018,7 +1097,28 @@ static int can_fill_info(struct sk_buff *skb, const struct net_device *dev)
10181097
(priv->data_bittiming_const &&
10191098
nla_put(skb, IFLA_CAN_DATA_BITTIMING_CONST,
10201099
sizeof(*priv->data_bittiming_const),
1021-
priv->data_bittiming_const)))
1100+
priv->data_bittiming_const)) ||
1101+
1102+
(priv->termination_const &&
1103+
(nla_put_u16(skb, IFLA_CAN_TERMINATION, priv->termination) ||
1104+
nla_put(skb, IFLA_CAN_TERMINATION_CONST,
1105+
sizeof(*priv->termination_const) *
1106+
priv->termination_const_cnt,
1107+
priv->termination_const))) ||
1108+
1109+
(priv->bitrate_const &&
1110+
nla_put(skb, IFLA_CAN_BITRATE_CONST,
1111+
sizeof(*priv->bitrate_const) *
1112+
priv->bitrate_const_cnt,
1113+
priv->bitrate_const)) ||
1114+
1115+
(priv->data_bitrate_const &&
1116+
nla_put(skb, IFLA_CAN_DATA_BITRATE_CONST,
1117+
sizeof(*priv->data_bitrate_const) *
1118+
priv->data_bitrate_const_cnt,
1119+
priv->data_bitrate_const))
1120+
)
1121+
10221122
return -EMSGSIZE;
10231123

10241124
return 0;
@@ -1073,6 +1173,22 @@ static struct rtnl_link_ops can_link_ops __read_mostly = {
10731173
*/
10741174
int register_candev(struct net_device *dev)
10751175
{
1176+
struct can_priv *priv = netdev_priv(dev);
1177+
1178+
/* Ensure termination_const, termination_const_cnt and
1179+
* do_set_termination consistency. All must be either set or
1180+
* unset.
1181+
*/
1182+
if ((!priv->termination_const != !priv->termination_const_cnt) ||
1183+
(!priv->termination_const != !priv->do_set_termination))
1184+
return -EINVAL;
1185+
1186+
if (!priv->bitrate_const != !priv->bitrate_const_cnt)
1187+
return -EINVAL;
1188+
1189+
if (!priv->data_bitrate_const != !priv->data_bitrate_const_cnt)
1190+
return -EINVAL;
1191+
10761192
dev->rtnl_link_ops = &can_link_ops;
10771193
return register_netdev(dev);
10781194
}

drivers/net/can/softing/softing_cs.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -310,7 +310,7 @@ static int softingcs_probe(struct pcmcia_device *pcmcia)
310310
pcmcia_failed:
311311
pcmcia_disable_device(pcmcia);
312312
pcmcia->priv = NULL;
313-
return ret ?: -ENODEV;
313+
return ret;
314314
}
315315

316316
static const struct pcmcia_device_id softingcs_ids[] = {

include/linux/can/dev.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,13 @@ struct can_priv {
3838
struct can_bittiming bittiming, data_bittiming;
3939
const struct can_bittiming_const *bittiming_const,
4040
*data_bittiming_const;
41+
const u16 *termination_const;
42+
unsigned int termination_const_cnt;
43+
u16 termination;
44+
const u32 *bitrate_const;
45+
unsigned int bitrate_const_cnt;
46+
const u32 *data_bitrate_const;
47+
unsigned int data_bitrate_const_cnt;
4148
struct can_clock clock;
4249

4350
enum can_state state;
@@ -53,6 +60,7 @@ struct can_priv {
5360
int (*do_set_bittiming)(struct net_device *dev);
5461
int (*do_set_data_bittiming)(struct net_device *dev);
5562
int (*do_set_mode)(struct net_device *dev, enum can_mode mode);
63+
int (*do_set_termination)(struct net_device *dev, u16 term);
5664
int (*do_get_state)(const struct net_device *dev,
5765
enum can_state *state);
5866
int (*do_get_berr_counter)(const struct net_device *dev,

include/uapi/linux/can/netlink.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,9 +127,16 @@ enum {
127127
IFLA_CAN_BERR_COUNTER,
128128
IFLA_CAN_DATA_BITTIMING,
129129
IFLA_CAN_DATA_BITTIMING_CONST,
130+
IFLA_CAN_TERMINATION,
131+
IFLA_CAN_TERMINATION_CONST,
132+
IFLA_CAN_BITRATE_CONST,
133+
IFLA_CAN_DATA_BITRATE_CONST,
130134
__IFLA_CAN_MAX
131135
};
132136

133137
#define IFLA_CAN_MAX (__IFLA_CAN_MAX - 1)
134138

139+
/* u16 termination range: 1..65535 Ohms */
140+
#define CAN_TERMINATION_DISABLED 0
141+
135142
#endif /* !_UAPI_CAN_NETLINK_H */

0 commit comments

Comments
 (0)