Commit 49f274c7 authored by Jimmy Assarsson's avatar Jimmy Assarsson Committed by Marc Kleine-Budde

can: kvaser_usb: replace run-time checks with struct kvaser_usb_driver_info

Unify and move compile-time known information into new struct
kvaser_usb_driver_info, in favor of run-time checks.

All Kvaser USBcanII supports listen-only mode and error counter
reporting.

Link: https://lore.kernel.org/all/20220603083820.800246-2-extja@kvaser.comSuggested-by: default avatarMarc Kleine-Budde <mkl@pengutronix.de>
Cc: stable@vger.kernel.org
Signed-off-by: default avatarJimmy Assarsson <extja@kvaser.com>
[mkl: move struct kvaser_usb_driver_info into kvaser_usb_core.c]
Signed-off-by: default avatarMarc Kleine-Budde <mkl@pengutronix.de>
parent 4c333369
...@@ -35,9 +35,9 @@ ...@@ -35,9 +35,9 @@
#define KVASER_USB_RX_BUFFER_SIZE 3072 #define KVASER_USB_RX_BUFFER_SIZE 3072
#define KVASER_USB_MAX_NET_DEVICES 5 #define KVASER_USB_MAX_NET_DEVICES 5
/* USB devices features */ /* Kvaser USB device quirks */
#define KVASER_USB_HAS_SILENT_MODE BIT(0) #define KVASER_USB_QUIRK_HAS_SILENT_MODE BIT(0)
#define KVASER_USB_HAS_TXRX_ERRORS BIT(1) #define KVASER_USB_QUIRK_HAS_TXRX_ERRORS BIT(1)
/* Device capabilities */ /* Device capabilities */
#define KVASER_USB_CAP_BERR_CAP 0x01 #define KVASER_USB_CAP_BERR_CAP 0x01
...@@ -65,12 +65,7 @@ struct kvaser_usb_dev_card_data_hydra { ...@@ -65,12 +65,7 @@ struct kvaser_usb_dev_card_data_hydra {
struct kvaser_usb_dev_card_data { struct kvaser_usb_dev_card_data {
u32 ctrlmode_supported; u32 ctrlmode_supported;
u32 capabilities; u32 capabilities;
union {
struct {
enum kvaser_usb_leaf_family family;
} leaf;
struct kvaser_usb_dev_card_data_hydra hydra; struct kvaser_usb_dev_card_data_hydra hydra;
};
}; };
/* Context for an outstanding, not yet ACKed, transmission */ /* Context for an outstanding, not yet ACKed, transmission */
...@@ -83,7 +78,7 @@ struct kvaser_usb { ...@@ -83,7 +78,7 @@ struct kvaser_usb {
struct usb_device *udev; struct usb_device *udev;
struct usb_interface *intf; struct usb_interface *intf;
struct kvaser_usb_net_priv *nets[KVASER_USB_MAX_NET_DEVICES]; struct kvaser_usb_net_priv *nets[KVASER_USB_MAX_NET_DEVICES];
const struct kvaser_usb_dev_ops *ops; const struct kvaser_usb_driver_info *driver_info;
const struct kvaser_usb_dev_cfg *cfg; const struct kvaser_usb_dev_cfg *cfg;
struct usb_endpoint_descriptor *bulk_in, *bulk_out; struct usb_endpoint_descriptor *bulk_in, *bulk_out;
...@@ -165,6 +160,12 @@ struct kvaser_usb_dev_ops { ...@@ -165,6 +160,12 @@ struct kvaser_usb_dev_ops {
u16 transid); u16 transid);
}; };
struct kvaser_usb_driver_info {
u32 quirks;
enum kvaser_usb_leaf_family family;
const struct kvaser_usb_dev_ops *ops;
};
struct kvaser_usb_dev_cfg { struct kvaser_usb_dev_cfg {
const struct can_clock clock; const struct can_clock clock;
const unsigned int timestamp_freq; const unsigned int timestamp_freq;
...@@ -184,4 +185,5 @@ int kvaser_usb_send_cmd_async(struct kvaser_usb_net_priv *priv, void *cmd, ...@@ -184,4 +185,5 @@ int kvaser_usb_send_cmd_async(struct kvaser_usb_net_priv *priv, void *cmd,
int len); int len);
int kvaser_usb_can_rx_over_error(struct net_device *netdev); int kvaser_usb_can_rx_over_error(struct net_device *netdev);
#endif /* KVASER_USB_H */ #endif /* KVASER_USB_H */
...@@ -404,7 +404,7 @@ kvaser_usb_leaf_frame_to_cmd(const struct kvaser_usb_net_priv *priv, ...@@ -404,7 +404,7 @@ kvaser_usb_leaf_frame_to_cmd(const struct kvaser_usb_net_priv *priv,
sizeof(struct kvaser_cmd_tx_can); sizeof(struct kvaser_cmd_tx_can);
cmd->u.tx_can.channel = priv->channel; cmd->u.tx_can.channel = priv->channel;
switch (dev->card_data.leaf.family) { switch (dev->driver_info->family) {
case KVASER_LEAF: case KVASER_LEAF:
cmd_tx_can_flags = &cmd->u.tx_can.leaf.flags; cmd_tx_can_flags = &cmd->u.tx_can.leaf.flags;
break; break;
...@@ -550,7 +550,7 @@ static int kvaser_usb_leaf_get_software_info_inner(struct kvaser_usb *dev) ...@@ -550,7 +550,7 @@ static int kvaser_usb_leaf_get_software_info_inner(struct kvaser_usb *dev)
if (err) if (err)
return err; return err;
switch (dev->card_data.leaf.family) { switch (dev->driver_info->family) {
case KVASER_LEAF: case KVASER_LEAF:
kvaser_usb_leaf_get_software_info_leaf(dev, &cmd.u.leaf.softinfo); kvaser_usb_leaf_get_software_info_leaf(dev, &cmd.u.leaf.softinfo);
break; break;
...@@ -597,7 +597,7 @@ static int kvaser_usb_leaf_get_card_info(struct kvaser_usb *dev) ...@@ -597,7 +597,7 @@ static int kvaser_usb_leaf_get_card_info(struct kvaser_usb *dev)
dev->nchannels = cmd.u.cardinfo.nchannels; dev->nchannels = cmd.u.cardinfo.nchannels;
if (dev->nchannels > KVASER_USB_MAX_NET_DEVICES || if (dev->nchannels > KVASER_USB_MAX_NET_DEVICES ||
(dev->card_data.leaf.family == KVASER_USBCAN && (dev->driver_info->family == KVASER_USBCAN &&
dev->nchannels > MAX_USBCAN_NET_DEVICES)) dev->nchannels > MAX_USBCAN_NET_DEVICES))
return -EINVAL; return -EINVAL;
...@@ -730,7 +730,7 @@ kvaser_usb_leaf_rx_error_update_can_state(struct kvaser_usb_net_priv *priv, ...@@ -730,7 +730,7 @@ kvaser_usb_leaf_rx_error_update_can_state(struct kvaser_usb_net_priv *priv,
new_state < CAN_STATE_BUS_OFF) new_state < CAN_STATE_BUS_OFF)
priv->can.can_stats.restarts++; priv->can.can_stats.restarts++;
switch (dev->card_data.leaf.family) { switch (dev->driver_info->family) {
case KVASER_LEAF: case KVASER_LEAF:
if (es->leaf.error_factor) { if (es->leaf.error_factor) {
priv->can.can_stats.bus_error++; priv->can.can_stats.bus_error++;
...@@ -809,7 +809,7 @@ static void kvaser_usb_leaf_rx_error(const struct kvaser_usb *dev, ...@@ -809,7 +809,7 @@ static void kvaser_usb_leaf_rx_error(const struct kvaser_usb *dev,
} }
} }
switch (dev->card_data.leaf.family) { switch (dev->driver_info->family) {
case KVASER_LEAF: case KVASER_LEAF:
if (es->leaf.error_factor) { if (es->leaf.error_factor) {
cf->can_id |= CAN_ERR_BUSERROR | CAN_ERR_PROT; cf->can_id |= CAN_ERR_BUSERROR | CAN_ERR_PROT;
...@@ -999,7 +999,7 @@ static void kvaser_usb_leaf_rx_can_msg(const struct kvaser_usb *dev, ...@@ -999,7 +999,7 @@ static void kvaser_usb_leaf_rx_can_msg(const struct kvaser_usb *dev,
stats = &priv->netdev->stats; stats = &priv->netdev->stats;
if ((cmd->u.rx_can_header.flag & MSG_FLAG_ERROR_FRAME) && if ((cmd->u.rx_can_header.flag & MSG_FLAG_ERROR_FRAME) &&
(dev->card_data.leaf.family == KVASER_LEAF && (dev->driver_info->family == KVASER_LEAF &&
cmd->id == CMD_LEAF_LOG_MESSAGE)) { cmd->id == CMD_LEAF_LOG_MESSAGE)) {
kvaser_usb_leaf_leaf_rx_error(dev, cmd); kvaser_usb_leaf_leaf_rx_error(dev, cmd);
return; return;
...@@ -1015,7 +1015,7 @@ static void kvaser_usb_leaf_rx_can_msg(const struct kvaser_usb *dev, ...@@ -1015,7 +1015,7 @@ static void kvaser_usb_leaf_rx_can_msg(const struct kvaser_usb *dev,
return; return;
} }
switch (dev->card_data.leaf.family) { switch (dev->driver_info->family) {
case KVASER_LEAF: case KVASER_LEAF:
rx_data = cmd->u.leaf.rx_can.data; rx_data = cmd->u.leaf.rx_can.data;
break; break;
...@@ -1030,7 +1030,7 @@ static void kvaser_usb_leaf_rx_can_msg(const struct kvaser_usb *dev, ...@@ -1030,7 +1030,7 @@ static void kvaser_usb_leaf_rx_can_msg(const struct kvaser_usb *dev,
return; return;
} }
if (dev->card_data.leaf.family == KVASER_LEAF && cmd->id == if (dev->driver_info->family == KVASER_LEAF && cmd->id ==
CMD_LEAF_LOG_MESSAGE) { CMD_LEAF_LOG_MESSAGE) {
cf->can_id = le32_to_cpu(cmd->u.leaf.log_message.id); cf->can_id = le32_to_cpu(cmd->u.leaf.log_message.id);
if (cf->can_id & KVASER_EXTENDED_FRAME) if (cf->can_id & KVASER_EXTENDED_FRAME)
...@@ -1128,14 +1128,14 @@ static void kvaser_usb_leaf_handle_command(const struct kvaser_usb *dev, ...@@ -1128,14 +1128,14 @@ static void kvaser_usb_leaf_handle_command(const struct kvaser_usb *dev,
break; break;
case CMD_LEAF_LOG_MESSAGE: case CMD_LEAF_LOG_MESSAGE:
if (dev->card_data.leaf.family != KVASER_LEAF) if (dev->driver_info->family != KVASER_LEAF)
goto warn; goto warn;
kvaser_usb_leaf_rx_can_msg(dev, cmd); kvaser_usb_leaf_rx_can_msg(dev, cmd);
break; break;
case CMD_CHIP_STATE_EVENT: case CMD_CHIP_STATE_EVENT:
case CMD_CAN_ERROR_EVENT: case CMD_CAN_ERROR_EVENT:
if (dev->card_data.leaf.family == KVASER_LEAF) if (dev->driver_info->family == KVASER_LEAF)
kvaser_usb_leaf_leaf_rx_error(dev, cmd); kvaser_usb_leaf_leaf_rx_error(dev, cmd);
else else
kvaser_usb_leaf_usbcan_rx_error(dev, cmd); kvaser_usb_leaf_usbcan_rx_error(dev, cmd);
...@@ -1147,12 +1147,12 @@ static void kvaser_usb_leaf_handle_command(const struct kvaser_usb *dev, ...@@ -1147,12 +1147,12 @@ static void kvaser_usb_leaf_handle_command(const struct kvaser_usb *dev,
/* Ignored commands */ /* Ignored commands */
case CMD_USBCAN_CLOCK_OVERFLOW_EVENT: case CMD_USBCAN_CLOCK_OVERFLOW_EVENT:
if (dev->card_data.leaf.family != KVASER_USBCAN) if (dev->driver_info->family != KVASER_USBCAN)
goto warn; goto warn;
break; break;
case CMD_FLUSH_QUEUE_REPLY: case CMD_FLUSH_QUEUE_REPLY:
if (dev->card_data.leaf.family != KVASER_LEAF) if (dev->driver_info->family != KVASER_LEAF)
goto warn; goto warn;
break; break;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment