| .. | .. |
|---|
| 76 | 76 | int dlc; |
|---|
| 77 | 77 | }; |
|---|
| 78 | 78 | |
|---|
| 79 | +struct kvaser_usb_busparams { |
|---|
| 80 | + __le32 bitrate; |
|---|
| 81 | + u8 tseg1; |
|---|
| 82 | + u8 tseg2; |
|---|
| 83 | + u8 sjw; |
|---|
| 84 | + u8 nsamples; |
|---|
| 85 | +} __packed; |
|---|
| 86 | + |
|---|
| 79 | 87 | struct kvaser_usb { |
|---|
| 80 | 88 | struct usb_device *udev; |
|---|
| 81 | 89 | struct usb_interface *intf; |
|---|
| .. | .. |
|---|
| 104 | 112 | struct can_priv can; |
|---|
| 105 | 113 | struct can_berr_counter bec; |
|---|
| 106 | 114 | |
|---|
| 115 | + /* subdriver-specific data */ |
|---|
| 116 | + void *sub_priv; |
|---|
| 117 | + |
|---|
| 107 | 118 | struct kvaser_usb *dev; |
|---|
| 108 | 119 | struct net_device *netdev; |
|---|
| 109 | 120 | int channel; |
|---|
| 110 | 121 | |
|---|
| 111 | | - struct completion start_comp, stop_comp, flush_comp; |
|---|
| 122 | + struct completion start_comp, stop_comp, flush_comp, |
|---|
| 123 | + get_busparams_comp; |
|---|
| 112 | 124 | struct usb_anchor tx_submitted; |
|---|
| 125 | + |
|---|
| 126 | + struct kvaser_usb_busparams busparams_nominal, busparams_data; |
|---|
| 113 | 127 | |
|---|
| 114 | 128 | spinlock_t tx_contexts_lock; /* lock for active_tx_contexts */ |
|---|
| 115 | 129 | int active_tx_contexts; |
|---|
| .. | .. |
|---|
| 120 | 134 | * struct kvaser_usb_dev_ops - Device specific functions |
|---|
| 121 | 135 | * @dev_set_mode: used for can.do_set_mode |
|---|
| 122 | 136 | * @dev_set_bittiming: used for can.do_set_bittiming |
|---|
| 137 | + * @dev_get_busparams: readback arbitration busparams |
|---|
| 123 | 138 | * @dev_set_data_bittiming: used for can.do_set_data_bittiming |
|---|
| 139 | + * @dev_get_data_busparams: readback data busparams |
|---|
| 124 | 140 | * @dev_get_berr_counter: used for can.do_get_berr_counter |
|---|
| 125 | 141 | * |
|---|
| 126 | 142 | * @dev_setup_endpoints: setup USB in and out endpoints |
|---|
| 127 | 143 | * @dev_init_card: initialize card |
|---|
| 144 | + * @dev_init_channel: initialize channel |
|---|
| 145 | + * @dev_remove_channel: uninitialize channel |
|---|
| 128 | 146 | * @dev_get_software_info: get software info |
|---|
| 129 | 147 | * @dev_get_software_details: get software details |
|---|
| 130 | 148 | * @dev_get_card_info: get card info |
|---|
| .. | .. |
|---|
| 140 | 158 | */ |
|---|
| 141 | 159 | struct kvaser_usb_dev_ops { |
|---|
| 142 | 160 | int (*dev_set_mode)(struct net_device *netdev, enum can_mode mode); |
|---|
| 143 | | - int (*dev_set_bittiming)(struct net_device *netdev); |
|---|
| 144 | | - int (*dev_set_data_bittiming)(struct net_device *netdev); |
|---|
| 161 | + int (*dev_set_bittiming)(const struct net_device *netdev, |
|---|
| 162 | + const struct kvaser_usb_busparams *busparams); |
|---|
| 163 | + int (*dev_get_busparams)(struct kvaser_usb_net_priv *priv); |
|---|
| 164 | + int (*dev_set_data_bittiming)(const struct net_device *netdev, |
|---|
| 165 | + const struct kvaser_usb_busparams *busparams); |
|---|
| 166 | + int (*dev_get_data_busparams)(struct kvaser_usb_net_priv *priv); |
|---|
| 145 | 167 | int (*dev_get_berr_counter)(const struct net_device *netdev, |
|---|
| 146 | 168 | struct can_berr_counter *bec); |
|---|
| 147 | 169 | int (*dev_setup_endpoints)(struct kvaser_usb *dev); |
|---|
| 148 | 170 | int (*dev_init_card)(struct kvaser_usb *dev); |
|---|
| 171 | + int (*dev_init_channel)(struct kvaser_usb_net_priv *priv); |
|---|
| 172 | + void (*dev_remove_channel)(struct kvaser_usb_net_priv *priv); |
|---|
| 149 | 173 | int (*dev_get_software_info)(struct kvaser_usb *dev); |
|---|
| 150 | 174 | int (*dev_get_software_details)(struct kvaser_usb *dev); |
|---|
| 151 | 175 | int (*dev_get_card_info)(struct kvaser_usb *dev); |
|---|