1*d08e973aSMaximilian Schneider /* CAN driver for Geschwister Schneider USB/CAN devices. 2*d08e973aSMaximilian Schneider * 3*d08e973aSMaximilian Schneider * Copyright (C) 2013 Geschwister Schneider Technologie-, 4*d08e973aSMaximilian Schneider * Entwicklungs- und Vertriebs UG (Haftungsbeschränkt). 5*d08e973aSMaximilian Schneider * 6*d08e973aSMaximilian Schneider * Many thanks to all socketcan devs! 7*d08e973aSMaximilian Schneider * 8*d08e973aSMaximilian Schneider * This program is free software; you can redistribute it and/or modify it 9*d08e973aSMaximilian Schneider * under the terms of the GNU General Public License as published 10*d08e973aSMaximilian Schneider * by the Free Software Foundation; version 2 of the License. 11*d08e973aSMaximilian Schneider * 12*d08e973aSMaximilian Schneider * This program is distributed in the hope that it will be useful, but 13*d08e973aSMaximilian Schneider * WITHOUT ANY WARRANTY; without even the implied warranty of 14*d08e973aSMaximilian Schneider * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15*d08e973aSMaximilian Schneider * General Public License for more details. 16*d08e973aSMaximilian Schneider */ 17*d08e973aSMaximilian Schneider 18*d08e973aSMaximilian Schneider #include <linux/init.h> 19*d08e973aSMaximilian Schneider #include <linux/signal.h> 20*d08e973aSMaximilian Schneider #include <linux/module.h> 21*d08e973aSMaximilian Schneider #include <linux/netdevice.h> 22*d08e973aSMaximilian Schneider #include <linux/usb.h> 23*d08e973aSMaximilian Schneider 24*d08e973aSMaximilian Schneider #include <linux/can.h> 25*d08e973aSMaximilian Schneider #include <linux/can/dev.h> 26*d08e973aSMaximilian Schneider #include <linux/can/error.h> 27*d08e973aSMaximilian Schneider 28*d08e973aSMaximilian Schneider /* Device specific constants */ 29*d08e973aSMaximilian Schneider #define USB_GSUSB_1_VENDOR_ID 0x1d50 30*d08e973aSMaximilian Schneider #define USB_GSUSB_1_PRODUCT_ID 0x606f 31*d08e973aSMaximilian Schneider 32*d08e973aSMaximilian Schneider #define GSUSB_ENDPOINT_IN 1 33*d08e973aSMaximilian Schneider #define GSUSB_ENDPOINT_OUT 2 34*d08e973aSMaximilian Schneider 35*d08e973aSMaximilian Schneider /* Device specific constants */ 36*d08e973aSMaximilian Schneider enum gs_usb_breq { 37*d08e973aSMaximilian Schneider GS_USB_BREQ_HOST_FORMAT = 0, 38*d08e973aSMaximilian Schneider GS_USB_BREQ_BITTIMING, 39*d08e973aSMaximilian Schneider GS_USB_BREQ_MODE, 40*d08e973aSMaximilian Schneider GS_USB_BREQ_BERR, 41*d08e973aSMaximilian Schneider GS_USB_BREQ_BT_CONST, 42*d08e973aSMaximilian Schneider GS_USB_BREQ_DEVICE_CONFIG 43*d08e973aSMaximilian Schneider }; 44*d08e973aSMaximilian Schneider 45*d08e973aSMaximilian Schneider enum gs_can_mode { 46*d08e973aSMaximilian Schneider /* reset a channel. turns it off */ 47*d08e973aSMaximilian Schneider GS_CAN_MODE_RESET = 0, 48*d08e973aSMaximilian Schneider /* starts a channel */ 49*d08e973aSMaximilian Schneider GS_CAN_MODE_START 50*d08e973aSMaximilian Schneider }; 51*d08e973aSMaximilian Schneider 52*d08e973aSMaximilian Schneider enum gs_can_state { 53*d08e973aSMaximilian Schneider GS_CAN_STATE_ERROR_ACTIVE = 0, 54*d08e973aSMaximilian Schneider GS_CAN_STATE_ERROR_WARNING, 55*d08e973aSMaximilian Schneider GS_CAN_STATE_ERROR_PASSIVE, 56*d08e973aSMaximilian Schneider GS_CAN_STATE_BUS_OFF, 57*d08e973aSMaximilian Schneider GS_CAN_STATE_STOPPED, 58*d08e973aSMaximilian Schneider GS_CAN_STATE_SLEEPING 59*d08e973aSMaximilian Schneider }; 60*d08e973aSMaximilian Schneider 61*d08e973aSMaximilian Schneider /* data types passed between host and device */ 62*d08e973aSMaximilian Schneider struct gs_host_config { 63*d08e973aSMaximilian Schneider u32 byte_order; 64*d08e973aSMaximilian Schneider } __packed; 65*d08e973aSMaximilian Schneider /* All data exchanged between host and device is exchanged in host byte order, 66*d08e973aSMaximilian Schneider * thanks to the struct gs_host_config byte_order member, which is sent first 67*d08e973aSMaximilian Schneider * to indicate the desired byte order. 68*d08e973aSMaximilian Schneider */ 69*d08e973aSMaximilian Schneider 70*d08e973aSMaximilian Schneider struct gs_device_config { 71*d08e973aSMaximilian Schneider u8 reserved1; 72*d08e973aSMaximilian Schneider u8 reserved2; 73*d08e973aSMaximilian Schneider u8 reserved3; 74*d08e973aSMaximilian Schneider u8 icount; 75*d08e973aSMaximilian Schneider u32 sw_version; 76*d08e973aSMaximilian Schneider u32 hw_version; 77*d08e973aSMaximilian Schneider } __packed; 78*d08e973aSMaximilian Schneider 79*d08e973aSMaximilian Schneider #define GS_CAN_MODE_NORMAL 0 80*d08e973aSMaximilian Schneider #define GS_CAN_MODE_LISTEN_ONLY (1<<0) 81*d08e973aSMaximilian Schneider #define GS_CAN_MODE_LOOP_BACK (1<<1) 82*d08e973aSMaximilian Schneider #define GS_CAN_MODE_TRIPLE_SAMPLE (1<<2) 83*d08e973aSMaximilian Schneider #define GS_CAN_MODE_ONE_SHOT (1<<3) 84*d08e973aSMaximilian Schneider 85*d08e973aSMaximilian Schneider struct gs_device_mode { 86*d08e973aSMaximilian Schneider u32 mode; 87*d08e973aSMaximilian Schneider u32 flags; 88*d08e973aSMaximilian Schneider } __packed; 89*d08e973aSMaximilian Schneider 90*d08e973aSMaximilian Schneider struct gs_device_state { 91*d08e973aSMaximilian Schneider u32 state; 92*d08e973aSMaximilian Schneider u32 rxerr; 93*d08e973aSMaximilian Schneider u32 txerr; 94*d08e973aSMaximilian Schneider } __packed; 95*d08e973aSMaximilian Schneider 96*d08e973aSMaximilian Schneider struct gs_device_bittiming { 97*d08e973aSMaximilian Schneider u32 prop_seg; 98*d08e973aSMaximilian Schneider u32 phase_seg1; 99*d08e973aSMaximilian Schneider u32 phase_seg2; 100*d08e973aSMaximilian Schneider u32 sjw; 101*d08e973aSMaximilian Schneider u32 brp; 102*d08e973aSMaximilian Schneider } __packed; 103*d08e973aSMaximilian Schneider 104*d08e973aSMaximilian Schneider #define GS_CAN_FEATURE_LISTEN_ONLY (1<<0) 105*d08e973aSMaximilian Schneider #define GS_CAN_FEATURE_LOOP_BACK (1<<1) 106*d08e973aSMaximilian Schneider #define GS_CAN_FEATURE_TRIPLE_SAMPLE (1<<2) 107*d08e973aSMaximilian Schneider #define GS_CAN_FEATURE_ONE_SHOT (1<<3) 108*d08e973aSMaximilian Schneider 109*d08e973aSMaximilian Schneider struct gs_device_bt_const { 110*d08e973aSMaximilian Schneider u32 feature; 111*d08e973aSMaximilian Schneider u32 fclk_can; 112*d08e973aSMaximilian Schneider u32 tseg1_min; 113*d08e973aSMaximilian Schneider u32 tseg1_max; 114*d08e973aSMaximilian Schneider u32 tseg2_min; 115*d08e973aSMaximilian Schneider u32 tseg2_max; 116*d08e973aSMaximilian Schneider u32 sjw_max; 117*d08e973aSMaximilian Schneider u32 brp_min; 118*d08e973aSMaximilian Schneider u32 brp_max; 119*d08e973aSMaximilian Schneider u32 brp_inc; 120*d08e973aSMaximilian Schneider } __packed; 121*d08e973aSMaximilian Schneider 122*d08e973aSMaximilian Schneider #define GS_CAN_FLAG_OVERFLOW 1 123*d08e973aSMaximilian Schneider 124*d08e973aSMaximilian Schneider struct gs_host_frame { 125*d08e973aSMaximilian Schneider u32 echo_id; 126*d08e973aSMaximilian Schneider u32 can_id; 127*d08e973aSMaximilian Schneider 128*d08e973aSMaximilian Schneider u8 can_dlc; 129*d08e973aSMaximilian Schneider u8 channel; 130*d08e973aSMaximilian Schneider u8 flags; 131*d08e973aSMaximilian Schneider u8 reserved; 132*d08e973aSMaximilian Schneider 133*d08e973aSMaximilian Schneider u8 data[8]; 134*d08e973aSMaximilian Schneider } __packed; 135*d08e973aSMaximilian Schneider /* The GS USB devices make use of the same flags and masks as in 136*d08e973aSMaximilian Schneider * linux/can.h and linux/can/error.h, and no additional mapping is necessary. 137*d08e973aSMaximilian Schneider */ 138*d08e973aSMaximilian Schneider 139*d08e973aSMaximilian Schneider /* Only send a max of GS_MAX_TX_URBS frames per channel at a time. */ 140*d08e973aSMaximilian Schneider #define GS_MAX_TX_URBS 10 141*d08e973aSMaximilian Schneider /* Only launch a max of GS_MAX_RX_URBS usb requests at a time. */ 142*d08e973aSMaximilian Schneider #define GS_MAX_RX_URBS 30 143*d08e973aSMaximilian Schneider /* Maximum number of interfaces the driver supports per device. 144*d08e973aSMaximilian Schneider * Current hardware only supports 2 interfaces. The future may vary. 145*d08e973aSMaximilian Schneider */ 146*d08e973aSMaximilian Schneider #define GS_MAX_INTF 2 147*d08e973aSMaximilian Schneider 148*d08e973aSMaximilian Schneider struct gs_tx_context { 149*d08e973aSMaximilian Schneider struct gs_can *dev; 150*d08e973aSMaximilian Schneider unsigned int echo_id; 151*d08e973aSMaximilian Schneider }; 152*d08e973aSMaximilian Schneider 153*d08e973aSMaximilian Schneider struct gs_can { 154*d08e973aSMaximilian Schneider struct can_priv can; /* must be the first member */ 155*d08e973aSMaximilian Schneider 156*d08e973aSMaximilian Schneider struct gs_usb *parent; 157*d08e973aSMaximilian Schneider 158*d08e973aSMaximilian Schneider struct net_device *netdev; 159*d08e973aSMaximilian Schneider struct usb_device *udev; 160*d08e973aSMaximilian Schneider struct usb_interface *iface; 161*d08e973aSMaximilian Schneider 162*d08e973aSMaximilian Schneider struct can_bittiming_const bt_const; 163*d08e973aSMaximilian Schneider unsigned int channel; /* channel number */ 164*d08e973aSMaximilian Schneider 165*d08e973aSMaximilian Schneider /* This lock prevents a race condition between xmit and recieve. */ 166*d08e973aSMaximilian Schneider spinlock_t tx_ctx_lock; 167*d08e973aSMaximilian Schneider struct gs_tx_context tx_context[GS_MAX_TX_URBS]; 168*d08e973aSMaximilian Schneider 169*d08e973aSMaximilian Schneider struct usb_anchor tx_submitted; 170*d08e973aSMaximilian Schneider atomic_t active_tx_urbs; 171*d08e973aSMaximilian Schneider }; 172*d08e973aSMaximilian Schneider 173*d08e973aSMaximilian Schneider /* usb interface struct */ 174*d08e973aSMaximilian Schneider struct gs_usb { 175*d08e973aSMaximilian Schneider struct gs_can *canch[GS_MAX_INTF]; 176*d08e973aSMaximilian Schneider struct usb_anchor rx_submitted; 177*d08e973aSMaximilian Schneider atomic_t active_channels; 178*d08e973aSMaximilian Schneider struct usb_device *udev; 179*d08e973aSMaximilian Schneider }; 180*d08e973aSMaximilian Schneider 181*d08e973aSMaximilian Schneider /* 'allocate' a tx context. 182*d08e973aSMaximilian Schneider * returns a valid tx context or NULL if there is no space. 183*d08e973aSMaximilian Schneider */ 184*d08e973aSMaximilian Schneider static struct gs_tx_context *gs_alloc_tx_context(struct gs_can *dev) 185*d08e973aSMaximilian Schneider { 186*d08e973aSMaximilian Schneider int i = 0; 187*d08e973aSMaximilian Schneider unsigned long flags; 188*d08e973aSMaximilian Schneider 189*d08e973aSMaximilian Schneider spin_lock_irqsave(&dev->tx_ctx_lock, flags); 190*d08e973aSMaximilian Schneider 191*d08e973aSMaximilian Schneider for (; i < GS_MAX_TX_URBS; i++) { 192*d08e973aSMaximilian Schneider if (dev->tx_context[i].echo_id == GS_MAX_TX_URBS) { 193*d08e973aSMaximilian Schneider dev->tx_context[i].echo_id = i; 194*d08e973aSMaximilian Schneider spin_unlock_irqrestore(&dev->tx_ctx_lock, flags); 195*d08e973aSMaximilian Schneider return &dev->tx_context[i]; 196*d08e973aSMaximilian Schneider } 197*d08e973aSMaximilian Schneider } 198*d08e973aSMaximilian Schneider 199*d08e973aSMaximilian Schneider spin_unlock_irqrestore(&dev->tx_ctx_lock, flags); 200*d08e973aSMaximilian Schneider return NULL; 201*d08e973aSMaximilian Schneider } 202*d08e973aSMaximilian Schneider 203*d08e973aSMaximilian Schneider /* releases a tx context 204*d08e973aSMaximilian Schneider */ 205*d08e973aSMaximilian Schneider static void gs_free_tx_context(struct gs_tx_context *txc) 206*d08e973aSMaximilian Schneider { 207*d08e973aSMaximilian Schneider txc->echo_id = GS_MAX_TX_URBS; 208*d08e973aSMaximilian Schneider } 209*d08e973aSMaximilian Schneider 210*d08e973aSMaximilian Schneider /* Get a tx context by id. 211*d08e973aSMaximilian Schneider */ 212*d08e973aSMaximilian Schneider static struct gs_tx_context *gs_get_tx_context(struct gs_can *dev, unsigned int id) 213*d08e973aSMaximilian Schneider { 214*d08e973aSMaximilian Schneider unsigned long flags; 215*d08e973aSMaximilian Schneider 216*d08e973aSMaximilian Schneider if (id < GS_MAX_TX_URBS) { 217*d08e973aSMaximilian Schneider spin_lock_irqsave(&dev->tx_ctx_lock, flags); 218*d08e973aSMaximilian Schneider if (dev->tx_context[id].echo_id == id) { 219*d08e973aSMaximilian Schneider spin_unlock_irqrestore(&dev->tx_ctx_lock, flags); 220*d08e973aSMaximilian Schneider return &dev->tx_context[id]; 221*d08e973aSMaximilian Schneider } 222*d08e973aSMaximilian Schneider spin_unlock_irqrestore(&dev->tx_ctx_lock, flags); 223*d08e973aSMaximilian Schneider } 224*d08e973aSMaximilian Schneider return NULL; 225*d08e973aSMaximilian Schneider } 226*d08e973aSMaximilian Schneider 227*d08e973aSMaximilian Schneider static int gs_cmd_reset(struct gs_usb *gsusb, struct gs_can *gsdev) 228*d08e973aSMaximilian Schneider { 229*d08e973aSMaximilian Schneider struct gs_device_mode *dm; 230*d08e973aSMaximilian Schneider struct usb_interface *intf = gsdev->iface; 231*d08e973aSMaximilian Schneider int rc; 232*d08e973aSMaximilian Schneider 233*d08e973aSMaximilian Schneider dm = kzalloc(sizeof(*dm), GFP_KERNEL); 234*d08e973aSMaximilian Schneider if (!dm) 235*d08e973aSMaximilian Schneider return -ENOMEM; 236*d08e973aSMaximilian Schneider 237*d08e973aSMaximilian Schneider dm->mode = GS_CAN_MODE_RESET; 238*d08e973aSMaximilian Schneider 239*d08e973aSMaximilian Schneider rc = usb_control_msg(interface_to_usbdev(intf), 240*d08e973aSMaximilian Schneider usb_sndctrlpipe(interface_to_usbdev(intf), 0), 241*d08e973aSMaximilian Schneider GS_USB_BREQ_MODE, 242*d08e973aSMaximilian Schneider USB_DIR_OUT|USB_TYPE_VENDOR|USB_RECIP_INTERFACE, 243*d08e973aSMaximilian Schneider gsdev->channel, 244*d08e973aSMaximilian Schneider 0, 245*d08e973aSMaximilian Schneider dm, 246*d08e973aSMaximilian Schneider sizeof(*dm), 247*d08e973aSMaximilian Schneider 1000); 248*d08e973aSMaximilian Schneider 249*d08e973aSMaximilian Schneider return rc; 250*d08e973aSMaximilian Schneider } 251*d08e973aSMaximilian Schneider 252*d08e973aSMaximilian Schneider static void gs_update_state(struct gs_can *dev, struct can_frame *cf) 253*d08e973aSMaximilian Schneider { 254*d08e973aSMaximilian Schneider struct can_device_stats *can_stats = &dev->can.can_stats; 255*d08e973aSMaximilian Schneider 256*d08e973aSMaximilian Schneider if (cf->can_id & CAN_ERR_RESTARTED) { 257*d08e973aSMaximilian Schneider dev->can.state = CAN_STATE_ERROR_ACTIVE; 258*d08e973aSMaximilian Schneider can_stats->restarts++; 259*d08e973aSMaximilian Schneider } else if (cf->can_id & CAN_ERR_BUSOFF) { 260*d08e973aSMaximilian Schneider dev->can.state = CAN_STATE_BUS_OFF; 261*d08e973aSMaximilian Schneider can_stats->bus_off++; 262*d08e973aSMaximilian Schneider } else if (cf->can_id & CAN_ERR_CRTL) { 263*d08e973aSMaximilian Schneider if ((cf->data[1] & CAN_ERR_CRTL_TX_WARNING) || 264*d08e973aSMaximilian Schneider (cf->data[1] & CAN_ERR_CRTL_RX_WARNING)) { 265*d08e973aSMaximilian Schneider dev->can.state = CAN_STATE_ERROR_WARNING; 266*d08e973aSMaximilian Schneider can_stats->error_warning++; 267*d08e973aSMaximilian Schneider } else if ((cf->data[1] & CAN_ERR_CRTL_TX_PASSIVE) || 268*d08e973aSMaximilian Schneider (cf->data[1] & CAN_ERR_CRTL_RX_PASSIVE)) { 269*d08e973aSMaximilian Schneider dev->can.state = CAN_STATE_ERROR_PASSIVE; 270*d08e973aSMaximilian Schneider can_stats->error_passive++; 271*d08e973aSMaximilian Schneider } else { 272*d08e973aSMaximilian Schneider dev->can.state = CAN_STATE_ERROR_ACTIVE; 273*d08e973aSMaximilian Schneider } 274*d08e973aSMaximilian Schneider } 275*d08e973aSMaximilian Schneider } 276*d08e973aSMaximilian Schneider 277*d08e973aSMaximilian Schneider static void gs_usb_recieve_bulk_callback(struct urb *urb) 278*d08e973aSMaximilian Schneider { 279*d08e973aSMaximilian Schneider struct gs_usb *usbcan = urb->context; 280*d08e973aSMaximilian Schneider struct gs_can *dev; 281*d08e973aSMaximilian Schneider struct net_device *netdev; 282*d08e973aSMaximilian Schneider int rc; 283*d08e973aSMaximilian Schneider struct net_device_stats *stats; 284*d08e973aSMaximilian Schneider struct gs_host_frame *hf = urb->transfer_buffer; 285*d08e973aSMaximilian Schneider struct gs_tx_context *txc; 286*d08e973aSMaximilian Schneider struct can_frame *cf; 287*d08e973aSMaximilian Schneider struct sk_buff *skb; 288*d08e973aSMaximilian Schneider 289*d08e973aSMaximilian Schneider BUG_ON(!usbcan); 290*d08e973aSMaximilian Schneider 291*d08e973aSMaximilian Schneider switch (urb->status) { 292*d08e973aSMaximilian Schneider case 0: /* success */ 293*d08e973aSMaximilian Schneider break; 294*d08e973aSMaximilian Schneider case -ENOENT: 295*d08e973aSMaximilian Schneider case -ESHUTDOWN: 296*d08e973aSMaximilian Schneider return; 297*d08e973aSMaximilian Schneider default: 298*d08e973aSMaximilian Schneider /* do not resubmit aborted urbs. eg: when device goes down */ 299*d08e973aSMaximilian Schneider return; 300*d08e973aSMaximilian Schneider } 301*d08e973aSMaximilian Schneider 302*d08e973aSMaximilian Schneider /* device reports out of range channel id */ 303*d08e973aSMaximilian Schneider if (hf->channel >= GS_MAX_INTF) 304*d08e973aSMaximilian Schneider goto resubmit_urb; 305*d08e973aSMaximilian Schneider 306*d08e973aSMaximilian Schneider dev = usbcan->canch[hf->channel]; 307*d08e973aSMaximilian Schneider 308*d08e973aSMaximilian Schneider netdev = dev->netdev; 309*d08e973aSMaximilian Schneider stats = &netdev->stats; 310*d08e973aSMaximilian Schneider 311*d08e973aSMaximilian Schneider if (!netif_device_present(netdev)) 312*d08e973aSMaximilian Schneider return; 313*d08e973aSMaximilian Schneider 314*d08e973aSMaximilian Schneider if (hf->echo_id == -1) { /* normal rx */ 315*d08e973aSMaximilian Schneider skb = alloc_can_skb(dev->netdev, &cf); 316*d08e973aSMaximilian Schneider if (!skb) 317*d08e973aSMaximilian Schneider return; 318*d08e973aSMaximilian Schneider 319*d08e973aSMaximilian Schneider cf->can_id = hf->can_id; 320*d08e973aSMaximilian Schneider 321*d08e973aSMaximilian Schneider cf->can_dlc = get_can_dlc(hf->can_dlc); 322*d08e973aSMaximilian Schneider memcpy(cf->data, hf->data, 8); 323*d08e973aSMaximilian Schneider 324*d08e973aSMaximilian Schneider /* ERROR frames tell us information about the controller */ 325*d08e973aSMaximilian Schneider if (hf->can_id & CAN_ERR_FLAG) 326*d08e973aSMaximilian Schneider gs_update_state(dev, cf); 327*d08e973aSMaximilian Schneider 328*d08e973aSMaximilian Schneider netdev->stats.rx_packets++; 329*d08e973aSMaximilian Schneider netdev->stats.rx_bytes += hf->can_dlc; 330*d08e973aSMaximilian Schneider 331*d08e973aSMaximilian Schneider netif_rx(skb); 332*d08e973aSMaximilian Schneider } else { /* echo_id == hf->echo_id */ 333*d08e973aSMaximilian Schneider if (hf->echo_id >= GS_MAX_TX_URBS) { 334*d08e973aSMaximilian Schneider netdev_err(netdev, 335*d08e973aSMaximilian Schneider "Unexpected out of range echo id %d\n", 336*d08e973aSMaximilian Schneider hf->echo_id); 337*d08e973aSMaximilian Schneider goto resubmit_urb; 338*d08e973aSMaximilian Schneider } 339*d08e973aSMaximilian Schneider 340*d08e973aSMaximilian Schneider netdev->stats.tx_packets++; 341*d08e973aSMaximilian Schneider netdev->stats.tx_bytes += hf->can_dlc; 342*d08e973aSMaximilian Schneider 343*d08e973aSMaximilian Schneider txc = gs_get_tx_context(dev, hf->echo_id); 344*d08e973aSMaximilian Schneider 345*d08e973aSMaximilian Schneider /* bad devices send bad echo_ids. */ 346*d08e973aSMaximilian Schneider if (!txc) { 347*d08e973aSMaximilian Schneider netdev_err(netdev, 348*d08e973aSMaximilian Schneider "Unexpected unused echo id %d\n", 349*d08e973aSMaximilian Schneider hf->echo_id); 350*d08e973aSMaximilian Schneider goto resubmit_urb; 351*d08e973aSMaximilian Schneider } 352*d08e973aSMaximilian Schneider 353*d08e973aSMaximilian Schneider can_get_echo_skb(netdev, hf->echo_id); 354*d08e973aSMaximilian Schneider 355*d08e973aSMaximilian Schneider gs_free_tx_context(txc); 356*d08e973aSMaximilian Schneider 357*d08e973aSMaximilian Schneider netif_wake_queue(netdev); 358*d08e973aSMaximilian Schneider } 359*d08e973aSMaximilian Schneider 360*d08e973aSMaximilian Schneider if (hf->flags & GS_CAN_FLAG_OVERFLOW) { 361*d08e973aSMaximilian Schneider skb = alloc_can_err_skb(netdev, &cf); 362*d08e973aSMaximilian Schneider if (!skb) 363*d08e973aSMaximilian Schneider goto resubmit_urb; 364*d08e973aSMaximilian Schneider 365*d08e973aSMaximilian Schneider cf->can_id |= CAN_ERR_CRTL; 366*d08e973aSMaximilian Schneider cf->can_dlc = CAN_ERR_DLC; 367*d08e973aSMaximilian Schneider cf->data[1] = CAN_ERR_CRTL_RX_OVERFLOW; 368*d08e973aSMaximilian Schneider stats->rx_over_errors++; 369*d08e973aSMaximilian Schneider stats->rx_errors++; 370*d08e973aSMaximilian Schneider netif_rx(skb); 371*d08e973aSMaximilian Schneider } 372*d08e973aSMaximilian Schneider 373*d08e973aSMaximilian Schneider resubmit_urb: 374*d08e973aSMaximilian Schneider usb_fill_bulk_urb(urb, 375*d08e973aSMaximilian Schneider usbcan->udev, 376*d08e973aSMaximilian Schneider usb_rcvbulkpipe(usbcan->udev, GSUSB_ENDPOINT_IN), 377*d08e973aSMaximilian Schneider hf, 378*d08e973aSMaximilian Schneider sizeof(struct gs_host_frame), 379*d08e973aSMaximilian Schneider gs_usb_recieve_bulk_callback, 380*d08e973aSMaximilian Schneider usbcan 381*d08e973aSMaximilian Schneider ); 382*d08e973aSMaximilian Schneider 383*d08e973aSMaximilian Schneider rc = usb_submit_urb(urb, GFP_ATOMIC); 384*d08e973aSMaximilian Schneider 385*d08e973aSMaximilian Schneider /* USB failure take down all interfaces */ 386*d08e973aSMaximilian Schneider if (rc == -ENODEV) { 387*d08e973aSMaximilian Schneider for (rc = 0; rc < GS_MAX_INTF; rc++) { 388*d08e973aSMaximilian Schneider if (usbcan->canch[rc]) 389*d08e973aSMaximilian Schneider netif_device_detach(usbcan->canch[rc]->netdev); 390*d08e973aSMaximilian Schneider } 391*d08e973aSMaximilian Schneider } 392*d08e973aSMaximilian Schneider } 393*d08e973aSMaximilian Schneider 394*d08e973aSMaximilian Schneider static int gs_usb_set_bittiming(struct net_device *netdev) 395*d08e973aSMaximilian Schneider { 396*d08e973aSMaximilian Schneider struct gs_can *dev = netdev_priv(netdev); 397*d08e973aSMaximilian Schneider struct can_bittiming *bt = &dev->can.bittiming; 398*d08e973aSMaximilian Schneider struct usb_interface *intf = dev->iface; 399*d08e973aSMaximilian Schneider int rc; 400*d08e973aSMaximilian Schneider struct gs_device_bittiming *dbt; 401*d08e973aSMaximilian Schneider 402*d08e973aSMaximilian Schneider dbt = kmalloc(sizeof(*dbt), GFP_KERNEL); 403*d08e973aSMaximilian Schneider if (!dbt) 404*d08e973aSMaximilian Schneider return -ENOMEM; 405*d08e973aSMaximilian Schneider 406*d08e973aSMaximilian Schneider dbt->prop_seg = bt->prop_seg; 407*d08e973aSMaximilian Schneider dbt->phase_seg1 = bt->phase_seg1; 408*d08e973aSMaximilian Schneider dbt->phase_seg2 = bt->phase_seg2; 409*d08e973aSMaximilian Schneider dbt->sjw = bt->sjw; 410*d08e973aSMaximilian Schneider dbt->brp = bt->brp; 411*d08e973aSMaximilian Schneider 412*d08e973aSMaximilian Schneider /* request bit timings */ 413*d08e973aSMaximilian Schneider rc = usb_control_msg(interface_to_usbdev(intf), 414*d08e973aSMaximilian Schneider usb_sndctrlpipe(interface_to_usbdev(intf), 0), 415*d08e973aSMaximilian Schneider GS_USB_BREQ_BITTIMING, 416*d08e973aSMaximilian Schneider USB_DIR_OUT|USB_TYPE_VENDOR|USB_RECIP_INTERFACE, 417*d08e973aSMaximilian Schneider dev->channel, 418*d08e973aSMaximilian Schneider 0, 419*d08e973aSMaximilian Schneider dbt, 420*d08e973aSMaximilian Schneider sizeof(*dbt), 421*d08e973aSMaximilian Schneider 1000); 422*d08e973aSMaximilian Schneider 423*d08e973aSMaximilian Schneider kfree(dbt); 424*d08e973aSMaximilian Schneider 425*d08e973aSMaximilian Schneider if (rc < 0) 426*d08e973aSMaximilian Schneider dev_err(netdev->dev.parent, "Couldn't set bittimings (err=%d)", 427*d08e973aSMaximilian Schneider rc); 428*d08e973aSMaximilian Schneider 429*d08e973aSMaximilian Schneider return rc; 430*d08e973aSMaximilian Schneider } 431*d08e973aSMaximilian Schneider 432*d08e973aSMaximilian Schneider static void gs_usb_xmit_callback(struct urb *urb) 433*d08e973aSMaximilian Schneider { 434*d08e973aSMaximilian Schneider struct gs_tx_context *txc = urb->context; 435*d08e973aSMaximilian Schneider struct gs_can *dev = txc->dev; 436*d08e973aSMaximilian Schneider struct net_device *netdev = dev->netdev; 437*d08e973aSMaximilian Schneider 438*d08e973aSMaximilian Schneider if (urb->status) 439*d08e973aSMaximilian Schneider netdev_info(netdev, "usb xmit fail %d\n", txc->echo_id); 440*d08e973aSMaximilian Schneider 441*d08e973aSMaximilian Schneider usb_free_coherent(urb->dev, 442*d08e973aSMaximilian Schneider urb->transfer_buffer_length, 443*d08e973aSMaximilian Schneider urb->transfer_buffer, 444*d08e973aSMaximilian Schneider urb->transfer_dma); 445*d08e973aSMaximilian Schneider 446*d08e973aSMaximilian Schneider atomic_dec(&dev->active_tx_urbs); 447*d08e973aSMaximilian Schneider 448*d08e973aSMaximilian Schneider if (!netif_device_present(netdev)) 449*d08e973aSMaximilian Schneider return; 450*d08e973aSMaximilian Schneider 451*d08e973aSMaximilian Schneider if (netif_queue_stopped(netdev)) 452*d08e973aSMaximilian Schneider netif_wake_queue(netdev); 453*d08e973aSMaximilian Schneider } 454*d08e973aSMaximilian Schneider 455*d08e973aSMaximilian Schneider static netdev_tx_t gs_can_start_xmit(struct sk_buff *skb, struct net_device *netdev) 456*d08e973aSMaximilian Schneider { 457*d08e973aSMaximilian Schneider struct gs_can *dev = netdev_priv(netdev); 458*d08e973aSMaximilian Schneider struct net_device_stats *stats = &dev->netdev->stats; 459*d08e973aSMaximilian Schneider struct urb *urb; 460*d08e973aSMaximilian Schneider struct gs_host_frame *hf; 461*d08e973aSMaximilian Schneider struct can_frame *cf; 462*d08e973aSMaximilian Schneider int rc; 463*d08e973aSMaximilian Schneider unsigned int idx; 464*d08e973aSMaximilian Schneider struct gs_tx_context *txc; 465*d08e973aSMaximilian Schneider 466*d08e973aSMaximilian Schneider if (can_dropped_invalid_skb(netdev, skb)) 467*d08e973aSMaximilian Schneider return NETDEV_TX_OK; 468*d08e973aSMaximilian Schneider 469*d08e973aSMaximilian Schneider /* find an empty context to keep track of transmission */ 470*d08e973aSMaximilian Schneider txc = gs_alloc_tx_context(dev); 471*d08e973aSMaximilian Schneider if (!txc) 472*d08e973aSMaximilian Schneider return NETDEV_TX_BUSY; 473*d08e973aSMaximilian Schneider 474*d08e973aSMaximilian Schneider /* create a URB, and a buffer for it */ 475*d08e973aSMaximilian Schneider urb = usb_alloc_urb(0, GFP_ATOMIC); 476*d08e973aSMaximilian Schneider if (!urb) { 477*d08e973aSMaximilian Schneider netdev_err(netdev, "No memory left for URB\n"); 478*d08e973aSMaximilian Schneider goto nomem_urb; 479*d08e973aSMaximilian Schneider } 480*d08e973aSMaximilian Schneider 481*d08e973aSMaximilian Schneider hf = usb_alloc_coherent(dev->udev, sizeof(*hf), GFP_ATOMIC, 482*d08e973aSMaximilian Schneider &urb->transfer_dma); 483*d08e973aSMaximilian Schneider if (!hf) { 484*d08e973aSMaximilian Schneider netdev_err(netdev, "No memory left for USB buffer\n"); 485*d08e973aSMaximilian Schneider goto nomem_hf; 486*d08e973aSMaximilian Schneider } 487*d08e973aSMaximilian Schneider 488*d08e973aSMaximilian Schneider idx = txc->echo_id; 489*d08e973aSMaximilian Schneider 490*d08e973aSMaximilian Schneider if (idx >= GS_MAX_TX_URBS) { 491*d08e973aSMaximilian Schneider netdev_err(netdev, "Invalid tx context %d\n", idx); 492*d08e973aSMaximilian Schneider goto badidx; 493*d08e973aSMaximilian Schneider } 494*d08e973aSMaximilian Schneider 495*d08e973aSMaximilian Schneider hf->echo_id = idx; 496*d08e973aSMaximilian Schneider hf->channel = dev->channel; 497*d08e973aSMaximilian Schneider 498*d08e973aSMaximilian Schneider cf = (struct can_frame *)skb->data; 499*d08e973aSMaximilian Schneider 500*d08e973aSMaximilian Schneider hf->can_id = cf->can_id; 501*d08e973aSMaximilian Schneider hf->can_dlc = cf->can_dlc; 502*d08e973aSMaximilian Schneider memcpy(hf->data, cf->data, cf->can_dlc); 503*d08e973aSMaximilian Schneider 504*d08e973aSMaximilian Schneider usb_fill_bulk_urb(urb, dev->udev, 505*d08e973aSMaximilian Schneider usb_sndbulkpipe(dev->udev, GSUSB_ENDPOINT_OUT), 506*d08e973aSMaximilian Schneider hf, 507*d08e973aSMaximilian Schneider sizeof(*hf), 508*d08e973aSMaximilian Schneider gs_usb_xmit_callback, 509*d08e973aSMaximilian Schneider txc); 510*d08e973aSMaximilian Schneider 511*d08e973aSMaximilian Schneider urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; 512*d08e973aSMaximilian Schneider usb_anchor_urb(urb, &dev->tx_submitted); 513*d08e973aSMaximilian Schneider 514*d08e973aSMaximilian Schneider can_put_echo_skb(skb, netdev, idx); 515*d08e973aSMaximilian Schneider 516*d08e973aSMaximilian Schneider atomic_inc(&dev->active_tx_urbs); 517*d08e973aSMaximilian Schneider 518*d08e973aSMaximilian Schneider rc = usb_submit_urb(urb, GFP_ATOMIC); 519*d08e973aSMaximilian Schneider if (unlikely(rc)) { /* usb send failed */ 520*d08e973aSMaximilian Schneider atomic_dec(&dev->active_tx_urbs); 521*d08e973aSMaximilian Schneider 522*d08e973aSMaximilian Schneider can_free_echo_skb(netdev, idx); 523*d08e973aSMaximilian Schneider gs_free_tx_context(txc); 524*d08e973aSMaximilian Schneider 525*d08e973aSMaximilian Schneider usb_unanchor_urb(urb); 526*d08e973aSMaximilian Schneider usb_free_coherent(dev->udev, 527*d08e973aSMaximilian Schneider sizeof(*hf), 528*d08e973aSMaximilian Schneider hf, 529*d08e973aSMaximilian Schneider urb->transfer_dma); 530*d08e973aSMaximilian Schneider 531*d08e973aSMaximilian Schneider 532*d08e973aSMaximilian Schneider if (rc == -ENODEV) { 533*d08e973aSMaximilian Schneider netif_device_detach(netdev); 534*d08e973aSMaximilian Schneider } else { 535*d08e973aSMaximilian Schneider netdev_err(netdev, "usb_submit failed (err=%d)\n", rc); 536*d08e973aSMaximilian Schneider stats->tx_dropped++; 537*d08e973aSMaximilian Schneider } 538*d08e973aSMaximilian Schneider } else { 539*d08e973aSMaximilian Schneider /* Slow down tx path */ 540*d08e973aSMaximilian Schneider if (atomic_read(&dev->active_tx_urbs) >= GS_MAX_TX_URBS) 541*d08e973aSMaximilian Schneider netif_stop_queue(netdev); 542*d08e973aSMaximilian Schneider } 543*d08e973aSMaximilian Schneider 544*d08e973aSMaximilian Schneider /* let usb core take care of this urb */ 545*d08e973aSMaximilian Schneider usb_free_urb(urb); 546*d08e973aSMaximilian Schneider 547*d08e973aSMaximilian Schneider return NETDEV_TX_OK; 548*d08e973aSMaximilian Schneider 549*d08e973aSMaximilian Schneider badidx: 550*d08e973aSMaximilian Schneider usb_free_coherent(dev->udev, 551*d08e973aSMaximilian Schneider sizeof(*hf), 552*d08e973aSMaximilian Schneider hf, 553*d08e973aSMaximilian Schneider urb->transfer_dma); 554*d08e973aSMaximilian Schneider nomem_hf: 555*d08e973aSMaximilian Schneider usb_free_urb(urb); 556*d08e973aSMaximilian Schneider 557*d08e973aSMaximilian Schneider nomem_urb: 558*d08e973aSMaximilian Schneider gs_free_tx_context(txc); 559*d08e973aSMaximilian Schneider dev_kfree_skb(skb); 560*d08e973aSMaximilian Schneider stats->tx_dropped++; 561*d08e973aSMaximilian Schneider return NETDEV_TX_OK; 562*d08e973aSMaximilian Schneider } 563*d08e973aSMaximilian Schneider 564*d08e973aSMaximilian Schneider static int gs_can_open(struct net_device *netdev) 565*d08e973aSMaximilian Schneider { 566*d08e973aSMaximilian Schneider struct gs_can *dev = netdev_priv(netdev); 567*d08e973aSMaximilian Schneider struct gs_usb *parent = dev->parent; 568*d08e973aSMaximilian Schneider int rc, i; 569*d08e973aSMaximilian Schneider struct gs_device_mode *dm; 570*d08e973aSMaximilian Schneider u32 ctrlmode; 571*d08e973aSMaximilian Schneider 572*d08e973aSMaximilian Schneider rc = open_candev(netdev); 573*d08e973aSMaximilian Schneider if (rc) 574*d08e973aSMaximilian Schneider return rc; 575*d08e973aSMaximilian Schneider 576*d08e973aSMaximilian Schneider if (atomic_add_return(1, &parent->active_channels) == 1) { 577*d08e973aSMaximilian Schneider for (i = 0; i < GS_MAX_RX_URBS; i++) { 578*d08e973aSMaximilian Schneider struct urb *urb; 579*d08e973aSMaximilian Schneider u8 *buf; 580*d08e973aSMaximilian Schneider 581*d08e973aSMaximilian Schneider /* alloc rx urb */ 582*d08e973aSMaximilian Schneider urb = usb_alloc_urb(0, GFP_KERNEL); 583*d08e973aSMaximilian Schneider if (!urb) { 584*d08e973aSMaximilian Schneider netdev_err(netdev, 585*d08e973aSMaximilian Schneider "No memory left for URB\n"); 586*d08e973aSMaximilian Schneider return -ENOMEM; 587*d08e973aSMaximilian Schneider } 588*d08e973aSMaximilian Schneider 589*d08e973aSMaximilian Schneider /* alloc rx buffer */ 590*d08e973aSMaximilian Schneider buf = usb_alloc_coherent(dev->udev, 591*d08e973aSMaximilian Schneider sizeof(struct gs_host_frame), 592*d08e973aSMaximilian Schneider GFP_KERNEL, 593*d08e973aSMaximilian Schneider &urb->transfer_dma); 594*d08e973aSMaximilian Schneider if (!buf) { 595*d08e973aSMaximilian Schneider netdev_err(netdev, 596*d08e973aSMaximilian Schneider "No memory left for USB buffer\n"); 597*d08e973aSMaximilian Schneider usb_free_urb(urb); 598*d08e973aSMaximilian Schneider return -ENOMEM; 599*d08e973aSMaximilian Schneider } 600*d08e973aSMaximilian Schneider 601*d08e973aSMaximilian Schneider /* fill, anchor, and submit rx urb */ 602*d08e973aSMaximilian Schneider usb_fill_bulk_urb(urb, 603*d08e973aSMaximilian Schneider dev->udev, 604*d08e973aSMaximilian Schneider usb_rcvbulkpipe(dev->udev, 605*d08e973aSMaximilian Schneider GSUSB_ENDPOINT_IN), 606*d08e973aSMaximilian Schneider buf, 607*d08e973aSMaximilian Schneider sizeof(struct gs_host_frame), 608*d08e973aSMaximilian Schneider gs_usb_recieve_bulk_callback, 609*d08e973aSMaximilian Schneider parent); 610*d08e973aSMaximilian Schneider urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; 611*d08e973aSMaximilian Schneider 612*d08e973aSMaximilian Schneider usb_anchor_urb(urb, &parent->rx_submitted); 613*d08e973aSMaximilian Schneider 614*d08e973aSMaximilian Schneider rc = usb_submit_urb(urb, GFP_KERNEL); 615*d08e973aSMaximilian Schneider if (rc) { 616*d08e973aSMaximilian Schneider if (rc == -ENODEV) 617*d08e973aSMaximilian Schneider netif_device_detach(dev->netdev); 618*d08e973aSMaximilian Schneider 619*d08e973aSMaximilian Schneider netdev_err(netdev, 620*d08e973aSMaximilian Schneider "usb_submit failed (err=%d)\n", 621*d08e973aSMaximilian Schneider rc); 622*d08e973aSMaximilian Schneider 623*d08e973aSMaximilian Schneider usb_unanchor_urb(urb); 624*d08e973aSMaximilian Schneider break; 625*d08e973aSMaximilian Schneider } 626*d08e973aSMaximilian Schneider 627*d08e973aSMaximilian Schneider /* Drop reference, 628*d08e973aSMaximilian Schneider * USB core will take care of freeing it 629*d08e973aSMaximilian Schneider */ 630*d08e973aSMaximilian Schneider usb_free_urb(urb); 631*d08e973aSMaximilian Schneider } 632*d08e973aSMaximilian Schneider } 633*d08e973aSMaximilian Schneider 634*d08e973aSMaximilian Schneider dm = kmalloc(sizeof(*dm), GFP_KERNEL); 635*d08e973aSMaximilian Schneider if (!dm) 636*d08e973aSMaximilian Schneider return -ENOMEM; 637*d08e973aSMaximilian Schneider 638*d08e973aSMaximilian Schneider /* flags */ 639*d08e973aSMaximilian Schneider ctrlmode = dev->can.ctrlmode; 640*d08e973aSMaximilian Schneider dm->flags = 0; 641*d08e973aSMaximilian Schneider 642*d08e973aSMaximilian Schneider if (ctrlmode & CAN_CTRLMODE_LOOPBACK) 643*d08e973aSMaximilian Schneider dm->flags |= GS_CAN_MODE_LOOP_BACK; 644*d08e973aSMaximilian Schneider else if (ctrlmode & CAN_CTRLMODE_LISTENONLY) 645*d08e973aSMaximilian Schneider dm->flags |= GS_CAN_MODE_LISTEN_ONLY; 646*d08e973aSMaximilian Schneider 647*d08e973aSMaximilian Schneider /* Controller is not allowed to retry TX 648*d08e973aSMaximilian Schneider * this mode is unavailable on atmels uc3c hardware 649*d08e973aSMaximilian Schneider */ 650*d08e973aSMaximilian Schneider if (ctrlmode & CAN_CTRLMODE_ONE_SHOT) 651*d08e973aSMaximilian Schneider dm->flags |= GS_CAN_MODE_ONE_SHOT; 652*d08e973aSMaximilian Schneider 653*d08e973aSMaximilian Schneider if (ctrlmode & CAN_CTRLMODE_3_SAMPLES) 654*d08e973aSMaximilian Schneider dm->flags |= GS_CAN_MODE_TRIPLE_SAMPLE; 655*d08e973aSMaximilian Schneider 656*d08e973aSMaximilian Schneider /* finally start device */ 657*d08e973aSMaximilian Schneider dm->mode = GS_CAN_MODE_START; 658*d08e973aSMaximilian Schneider rc = usb_control_msg(interface_to_usbdev(dev->iface), 659*d08e973aSMaximilian Schneider usb_sndctrlpipe(interface_to_usbdev(dev->iface), 0), 660*d08e973aSMaximilian Schneider GS_USB_BREQ_MODE, 661*d08e973aSMaximilian Schneider USB_DIR_OUT|USB_TYPE_VENDOR|USB_RECIP_INTERFACE, 662*d08e973aSMaximilian Schneider dev->channel, 663*d08e973aSMaximilian Schneider 0, 664*d08e973aSMaximilian Schneider dm, 665*d08e973aSMaximilian Schneider sizeof(*dm), 666*d08e973aSMaximilian Schneider 1000); 667*d08e973aSMaximilian Schneider 668*d08e973aSMaximilian Schneider if (rc < 0) { 669*d08e973aSMaximilian Schneider netdev_err(netdev, "Couldn't start device (err=%d)\n", rc); 670*d08e973aSMaximilian Schneider kfree(dm); 671*d08e973aSMaximilian Schneider return rc; 672*d08e973aSMaximilian Schneider } 673*d08e973aSMaximilian Schneider 674*d08e973aSMaximilian Schneider kfree(dm); 675*d08e973aSMaximilian Schneider 676*d08e973aSMaximilian Schneider dev->can.state = CAN_STATE_ERROR_ACTIVE; 677*d08e973aSMaximilian Schneider 678*d08e973aSMaximilian Schneider if (!(dev->can.ctrlmode & CAN_CTRLMODE_LISTENONLY)) 679*d08e973aSMaximilian Schneider netif_start_queue(netdev); 680*d08e973aSMaximilian Schneider 681*d08e973aSMaximilian Schneider return 0; 682*d08e973aSMaximilian Schneider } 683*d08e973aSMaximilian Schneider 684*d08e973aSMaximilian Schneider static int gs_can_close(struct net_device *netdev) 685*d08e973aSMaximilian Schneider { 686*d08e973aSMaximilian Schneider int rc; 687*d08e973aSMaximilian Schneider struct gs_can *dev = netdev_priv(netdev); 688*d08e973aSMaximilian Schneider struct gs_usb *parent = dev->parent; 689*d08e973aSMaximilian Schneider 690*d08e973aSMaximilian Schneider netif_stop_queue(netdev); 691*d08e973aSMaximilian Schneider 692*d08e973aSMaximilian Schneider /* Stop polling */ 693*d08e973aSMaximilian Schneider if (atomic_dec_and_test(&parent->active_channels)) 694*d08e973aSMaximilian Schneider usb_kill_anchored_urbs(&parent->rx_submitted); 695*d08e973aSMaximilian Schneider 696*d08e973aSMaximilian Schneider /* Stop sending URBs */ 697*d08e973aSMaximilian Schneider usb_kill_anchored_urbs(&dev->tx_submitted); 698*d08e973aSMaximilian Schneider atomic_set(&dev->active_tx_urbs, 0); 699*d08e973aSMaximilian Schneider 700*d08e973aSMaximilian Schneider /* reset the device */ 701*d08e973aSMaximilian Schneider rc = gs_cmd_reset(parent, dev); 702*d08e973aSMaximilian Schneider if (rc < 0) 703*d08e973aSMaximilian Schneider netdev_warn(netdev, "Couldn't shutdown device (err=%d)", rc); 704*d08e973aSMaximilian Schneider 705*d08e973aSMaximilian Schneider /* reset tx contexts */ 706*d08e973aSMaximilian Schneider for (rc = 0; rc < GS_MAX_TX_URBS; rc++) { 707*d08e973aSMaximilian Schneider dev->tx_context[rc].dev = dev; 708*d08e973aSMaximilian Schneider dev->tx_context[rc].echo_id = GS_MAX_TX_URBS; 709*d08e973aSMaximilian Schneider } 710*d08e973aSMaximilian Schneider 711*d08e973aSMaximilian Schneider /* close the netdev */ 712*d08e973aSMaximilian Schneider close_candev(netdev); 713*d08e973aSMaximilian Schneider 714*d08e973aSMaximilian Schneider return 0; 715*d08e973aSMaximilian Schneider } 716*d08e973aSMaximilian Schneider 717*d08e973aSMaximilian Schneider static const struct net_device_ops gs_usb_netdev_ops = { 718*d08e973aSMaximilian Schneider .ndo_open = gs_can_open, 719*d08e973aSMaximilian Schneider .ndo_stop = gs_can_close, 720*d08e973aSMaximilian Schneider .ndo_start_xmit = gs_can_start_xmit, 721*d08e973aSMaximilian Schneider }; 722*d08e973aSMaximilian Schneider 723*d08e973aSMaximilian Schneider static struct gs_can *gs_make_candev(unsigned int channel, struct usb_interface *intf) 724*d08e973aSMaximilian Schneider { 725*d08e973aSMaximilian Schneider struct gs_can *dev; 726*d08e973aSMaximilian Schneider struct net_device *netdev; 727*d08e973aSMaximilian Schneider int rc; 728*d08e973aSMaximilian Schneider struct gs_device_bt_const *bt_const; 729*d08e973aSMaximilian Schneider 730*d08e973aSMaximilian Schneider bt_const = kmalloc(sizeof(*bt_const), GFP_KERNEL); 731*d08e973aSMaximilian Schneider if (!bt_const) 732*d08e973aSMaximilian Schneider return ERR_PTR(-ENOMEM); 733*d08e973aSMaximilian Schneider 734*d08e973aSMaximilian Schneider /* fetch bit timing constants */ 735*d08e973aSMaximilian Schneider rc = usb_control_msg(interface_to_usbdev(intf), 736*d08e973aSMaximilian Schneider usb_rcvctrlpipe(interface_to_usbdev(intf), 0), 737*d08e973aSMaximilian Schneider GS_USB_BREQ_BT_CONST, 738*d08e973aSMaximilian Schneider USB_DIR_IN|USB_TYPE_VENDOR|USB_RECIP_INTERFACE, 739*d08e973aSMaximilian Schneider channel, 740*d08e973aSMaximilian Schneider 0, 741*d08e973aSMaximilian Schneider bt_const, 742*d08e973aSMaximilian Schneider sizeof(*bt_const), 743*d08e973aSMaximilian Schneider 1000); 744*d08e973aSMaximilian Schneider 745*d08e973aSMaximilian Schneider if (rc < 0) { 746*d08e973aSMaximilian Schneider dev_err(&intf->dev, 747*d08e973aSMaximilian Schneider "Couldn't get bit timing const for channel (err=%d)\n", 748*d08e973aSMaximilian Schneider rc); 749*d08e973aSMaximilian Schneider kfree(bt_const); 750*d08e973aSMaximilian Schneider return ERR_PTR(rc); 751*d08e973aSMaximilian Schneider } 752*d08e973aSMaximilian Schneider 753*d08e973aSMaximilian Schneider /* create netdev */ 754*d08e973aSMaximilian Schneider netdev = alloc_candev(sizeof(struct gs_can), GS_MAX_TX_URBS); 755*d08e973aSMaximilian Schneider if (!netdev) { 756*d08e973aSMaximilian Schneider dev_err(&intf->dev, "Couldn't allocate candev\n"); 757*d08e973aSMaximilian Schneider kfree(bt_const); 758*d08e973aSMaximilian Schneider return ERR_PTR(-ENOMEM); 759*d08e973aSMaximilian Schneider } 760*d08e973aSMaximilian Schneider 761*d08e973aSMaximilian Schneider dev = netdev_priv(netdev); 762*d08e973aSMaximilian Schneider 763*d08e973aSMaximilian Schneider netdev->netdev_ops = &gs_usb_netdev_ops; 764*d08e973aSMaximilian Schneider 765*d08e973aSMaximilian Schneider netdev->flags |= IFF_ECHO; /* we support full roundtrip echo */ 766*d08e973aSMaximilian Schneider 767*d08e973aSMaximilian Schneider /* dev settup */ 768*d08e973aSMaximilian Schneider strcpy(dev->bt_const.name, "gs_usb"); 769*d08e973aSMaximilian Schneider dev->bt_const.tseg1_min = bt_const->tseg1_min; 770*d08e973aSMaximilian Schneider dev->bt_const.tseg1_max = bt_const->tseg1_max; 771*d08e973aSMaximilian Schneider dev->bt_const.tseg2_min = bt_const->tseg2_min; 772*d08e973aSMaximilian Schneider dev->bt_const.tseg2_max = bt_const->tseg2_max; 773*d08e973aSMaximilian Schneider dev->bt_const.sjw_max = bt_const->sjw_max; 774*d08e973aSMaximilian Schneider dev->bt_const.brp_min = bt_const->brp_min; 775*d08e973aSMaximilian Schneider dev->bt_const.brp_max = bt_const->brp_max; 776*d08e973aSMaximilian Schneider dev->bt_const.brp_inc = bt_const->brp_inc; 777*d08e973aSMaximilian Schneider 778*d08e973aSMaximilian Schneider dev->udev = interface_to_usbdev(intf); 779*d08e973aSMaximilian Schneider dev->iface = intf; 780*d08e973aSMaximilian Schneider dev->netdev = netdev; 781*d08e973aSMaximilian Schneider dev->channel = channel; 782*d08e973aSMaximilian Schneider 783*d08e973aSMaximilian Schneider init_usb_anchor(&dev->tx_submitted); 784*d08e973aSMaximilian Schneider atomic_set(&dev->active_tx_urbs, 0); 785*d08e973aSMaximilian Schneider spin_lock_init(&dev->tx_ctx_lock); 786*d08e973aSMaximilian Schneider for (rc = 0; rc < GS_MAX_TX_URBS; rc++) { 787*d08e973aSMaximilian Schneider dev->tx_context[rc].dev = dev; 788*d08e973aSMaximilian Schneider dev->tx_context[rc].echo_id = GS_MAX_TX_URBS; 789*d08e973aSMaximilian Schneider } 790*d08e973aSMaximilian Schneider 791*d08e973aSMaximilian Schneider /* can settup */ 792*d08e973aSMaximilian Schneider dev->can.state = CAN_STATE_STOPPED; 793*d08e973aSMaximilian Schneider dev->can.clock.freq = bt_const->fclk_can; 794*d08e973aSMaximilian Schneider dev->can.bittiming_const = &dev->bt_const; 795*d08e973aSMaximilian Schneider dev->can.do_set_bittiming = gs_usb_set_bittiming; 796*d08e973aSMaximilian Schneider 797*d08e973aSMaximilian Schneider dev->can.ctrlmode_supported = 0; 798*d08e973aSMaximilian Schneider 799*d08e973aSMaximilian Schneider if (bt_const->feature & GS_CAN_FEATURE_LISTEN_ONLY) 800*d08e973aSMaximilian Schneider dev->can.ctrlmode_supported |= CAN_CTRLMODE_LISTENONLY; 801*d08e973aSMaximilian Schneider 802*d08e973aSMaximilian Schneider if (bt_const->feature & GS_CAN_FEATURE_LOOP_BACK) 803*d08e973aSMaximilian Schneider dev->can.ctrlmode_supported |= CAN_CTRLMODE_LOOPBACK; 804*d08e973aSMaximilian Schneider 805*d08e973aSMaximilian Schneider if (bt_const->feature & GS_CAN_FEATURE_TRIPLE_SAMPLE) 806*d08e973aSMaximilian Schneider dev->can.ctrlmode_supported |= CAN_CTRLMODE_3_SAMPLES; 807*d08e973aSMaximilian Schneider 808*d08e973aSMaximilian Schneider if (bt_const->feature & GS_CAN_FEATURE_ONE_SHOT) 809*d08e973aSMaximilian Schneider dev->can.ctrlmode_supported |= CAN_CTRLMODE_ONE_SHOT; 810*d08e973aSMaximilian Schneider 811*d08e973aSMaximilian Schneider kfree(bt_const); 812*d08e973aSMaximilian Schneider 813*d08e973aSMaximilian Schneider SET_NETDEV_DEV(netdev, &intf->dev); 814*d08e973aSMaximilian Schneider 815*d08e973aSMaximilian Schneider rc = register_candev(dev->netdev); 816*d08e973aSMaximilian Schneider if (rc) { 817*d08e973aSMaximilian Schneider free_candev(dev->netdev); 818*d08e973aSMaximilian Schneider dev_err(&intf->dev, "Couldn't register candev (err=%d)\n", rc); 819*d08e973aSMaximilian Schneider return ERR_PTR(rc); 820*d08e973aSMaximilian Schneider } 821*d08e973aSMaximilian Schneider 822*d08e973aSMaximilian Schneider return dev; 823*d08e973aSMaximilian Schneider } 824*d08e973aSMaximilian Schneider 825*d08e973aSMaximilian Schneider static void gs_destroy_candev(struct gs_can *dev) 826*d08e973aSMaximilian Schneider { 827*d08e973aSMaximilian Schneider unregister_candev(dev->netdev); 828*d08e973aSMaximilian Schneider free_candev(dev->netdev); 829*d08e973aSMaximilian Schneider kfree(dev); 830*d08e973aSMaximilian Schneider usb_kill_anchored_urbs(&dev->tx_submitted); 831*d08e973aSMaximilian Schneider } 832*d08e973aSMaximilian Schneider 833*d08e973aSMaximilian Schneider static int gs_usb_probe(struct usb_interface *intf, const struct usb_device_id *id) 834*d08e973aSMaximilian Schneider { 835*d08e973aSMaximilian Schneider struct gs_usb *dev; 836*d08e973aSMaximilian Schneider int rc = -ENOMEM; 837*d08e973aSMaximilian Schneider unsigned int icount, i; 838*d08e973aSMaximilian Schneider struct gs_host_config *hconf; 839*d08e973aSMaximilian Schneider struct gs_device_config *dconf; 840*d08e973aSMaximilian Schneider 841*d08e973aSMaximilian Schneider hconf = kmalloc(sizeof(*hconf), GFP_KERNEL); 842*d08e973aSMaximilian Schneider if (!hconf) 843*d08e973aSMaximilian Schneider return -ENOMEM; 844*d08e973aSMaximilian Schneider 845*d08e973aSMaximilian Schneider hconf->byte_order = 0x0000beef; 846*d08e973aSMaximilian Schneider 847*d08e973aSMaximilian Schneider /* send host config */ 848*d08e973aSMaximilian Schneider rc = usb_control_msg(interface_to_usbdev(intf), 849*d08e973aSMaximilian Schneider usb_sndctrlpipe(interface_to_usbdev(intf), 0), 850*d08e973aSMaximilian Schneider GS_USB_BREQ_HOST_FORMAT, 851*d08e973aSMaximilian Schneider USB_DIR_OUT|USB_TYPE_VENDOR|USB_RECIP_INTERFACE, 852*d08e973aSMaximilian Schneider 1, 853*d08e973aSMaximilian Schneider intf->altsetting[0].desc.bInterfaceNumber, 854*d08e973aSMaximilian Schneider hconf, 855*d08e973aSMaximilian Schneider sizeof(*hconf), 856*d08e973aSMaximilian Schneider 1000); 857*d08e973aSMaximilian Schneider 858*d08e973aSMaximilian Schneider kfree(hconf); 859*d08e973aSMaximilian Schneider 860*d08e973aSMaximilian Schneider if (rc < 0) { 861*d08e973aSMaximilian Schneider dev_err(&intf->dev, "Couldn't send data format (err=%d)\n", 862*d08e973aSMaximilian Schneider rc); 863*d08e973aSMaximilian Schneider return rc; 864*d08e973aSMaximilian Schneider } 865*d08e973aSMaximilian Schneider 866*d08e973aSMaximilian Schneider dconf = kmalloc(sizeof(*dconf), GFP_KERNEL); 867*d08e973aSMaximilian Schneider if (!dconf) 868*d08e973aSMaximilian Schneider return -ENOMEM; 869*d08e973aSMaximilian Schneider 870*d08e973aSMaximilian Schneider /* read device config */ 871*d08e973aSMaximilian Schneider rc = usb_control_msg(interface_to_usbdev(intf), 872*d08e973aSMaximilian Schneider usb_rcvctrlpipe(interface_to_usbdev(intf), 0), 873*d08e973aSMaximilian Schneider GS_USB_BREQ_DEVICE_CONFIG, 874*d08e973aSMaximilian Schneider USB_DIR_IN|USB_TYPE_VENDOR|USB_RECIP_INTERFACE, 875*d08e973aSMaximilian Schneider 1, 876*d08e973aSMaximilian Schneider intf->altsetting[0].desc.bInterfaceNumber, 877*d08e973aSMaximilian Schneider dconf, 878*d08e973aSMaximilian Schneider sizeof(*dconf), 879*d08e973aSMaximilian Schneider 1000); 880*d08e973aSMaximilian Schneider if (rc < 0) { 881*d08e973aSMaximilian Schneider dev_err(&intf->dev, "Couldn't get device config: (err=%d)\n", 882*d08e973aSMaximilian Schneider rc); 883*d08e973aSMaximilian Schneider 884*d08e973aSMaximilian Schneider kfree(dconf); 885*d08e973aSMaximilian Schneider 886*d08e973aSMaximilian Schneider return rc; 887*d08e973aSMaximilian Schneider } 888*d08e973aSMaximilian Schneider 889*d08e973aSMaximilian Schneider icount = dconf->icount+1; 890*d08e973aSMaximilian Schneider 891*d08e973aSMaximilian Schneider kfree(dconf); 892*d08e973aSMaximilian Schneider 893*d08e973aSMaximilian Schneider dev_info(&intf->dev, "Configuring for %d interfaces\n", icount); 894*d08e973aSMaximilian Schneider 895*d08e973aSMaximilian Schneider if (icount > GS_MAX_INTF) { 896*d08e973aSMaximilian Schneider dev_err(&intf->dev, 897*d08e973aSMaximilian Schneider "Driver cannot handle more that %d CAN interfaces\n", 898*d08e973aSMaximilian Schneider GS_MAX_INTF); 899*d08e973aSMaximilian Schneider return -EINVAL; 900*d08e973aSMaximilian Schneider } 901*d08e973aSMaximilian Schneider 902*d08e973aSMaximilian Schneider dev = kzalloc(sizeof(*dev), GFP_KERNEL); 903*d08e973aSMaximilian Schneider init_usb_anchor(&dev->rx_submitted); 904*d08e973aSMaximilian Schneider 905*d08e973aSMaximilian Schneider atomic_set(&dev->active_channels, 0); 906*d08e973aSMaximilian Schneider 907*d08e973aSMaximilian Schneider usb_set_intfdata(intf, dev); 908*d08e973aSMaximilian Schneider dev->udev = interface_to_usbdev(intf); 909*d08e973aSMaximilian Schneider 910*d08e973aSMaximilian Schneider for (i = 0; i < icount; i++) { 911*d08e973aSMaximilian Schneider dev->canch[i] = gs_make_candev(i, intf); 912*d08e973aSMaximilian Schneider if (IS_ERR_OR_NULL(dev->canch[i])) { 913*d08e973aSMaximilian Schneider /* on failure destroy previously created candevs */ 914*d08e973aSMaximilian Schneider icount = i; 915*d08e973aSMaximilian Schneider for (i = 0; i < icount; i++) { 916*d08e973aSMaximilian Schneider gs_destroy_candev(dev->canch[i]); 917*d08e973aSMaximilian Schneider dev->canch[i] = NULL; 918*d08e973aSMaximilian Schneider } 919*d08e973aSMaximilian Schneider kfree(dev); 920*d08e973aSMaximilian Schneider return rc; 921*d08e973aSMaximilian Schneider } 922*d08e973aSMaximilian Schneider dev->canch[i]->parent = dev; 923*d08e973aSMaximilian Schneider } 924*d08e973aSMaximilian Schneider 925*d08e973aSMaximilian Schneider return 0; 926*d08e973aSMaximilian Schneider } 927*d08e973aSMaximilian Schneider 928*d08e973aSMaximilian Schneider static void gs_usb_disconnect(struct usb_interface *intf) 929*d08e973aSMaximilian Schneider { 930*d08e973aSMaximilian Schneider unsigned i; 931*d08e973aSMaximilian Schneider struct gs_usb *dev = usb_get_intfdata(intf); 932*d08e973aSMaximilian Schneider usb_set_intfdata(intf, NULL); 933*d08e973aSMaximilian Schneider 934*d08e973aSMaximilian Schneider if (!dev) { 935*d08e973aSMaximilian Schneider dev_err(&intf->dev, "Disconnect (nodata)\n"); 936*d08e973aSMaximilian Schneider return; 937*d08e973aSMaximilian Schneider } 938*d08e973aSMaximilian Schneider 939*d08e973aSMaximilian Schneider for (i = 0; i < GS_MAX_INTF; i++) { 940*d08e973aSMaximilian Schneider struct gs_can *can = dev->canch[i]; 941*d08e973aSMaximilian Schneider 942*d08e973aSMaximilian Schneider if (!can) 943*d08e973aSMaximilian Schneider continue; 944*d08e973aSMaximilian Schneider 945*d08e973aSMaximilian Schneider gs_destroy_candev(can); 946*d08e973aSMaximilian Schneider } 947*d08e973aSMaximilian Schneider 948*d08e973aSMaximilian Schneider usb_kill_anchored_urbs(&dev->rx_submitted); 949*d08e973aSMaximilian Schneider } 950*d08e973aSMaximilian Schneider 951*d08e973aSMaximilian Schneider static const struct usb_device_id gs_usb_table[] = { 952*d08e973aSMaximilian Schneider {USB_DEVICE(USB_GSUSB_1_VENDOR_ID, USB_GSUSB_1_PRODUCT_ID)}, 953*d08e973aSMaximilian Schneider {} /* Terminating entry */ 954*d08e973aSMaximilian Schneider }; 955*d08e973aSMaximilian Schneider 956*d08e973aSMaximilian Schneider MODULE_DEVICE_TABLE(usb, gs_usb_table); 957*d08e973aSMaximilian Schneider 958*d08e973aSMaximilian Schneider static struct usb_driver gs_usb_driver = { 959*d08e973aSMaximilian Schneider .name = "gs_usb", 960*d08e973aSMaximilian Schneider .probe = gs_usb_probe, 961*d08e973aSMaximilian Schneider .disconnect = gs_usb_disconnect, 962*d08e973aSMaximilian Schneider .id_table = gs_usb_table, 963*d08e973aSMaximilian Schneider }; 964*d08e973aSMaximilian Schneider 965*d08e973aSMaximilian Schneider module_usb_driver(gs_usb_driver); 966*d08e973aSMaximilian Schneider 967*d08e973aSMaximilian Schneider MODULE_AUTHOR("Maximilian Schneider <mws@schneidersoft.net>"); 968*d08e973aSMaximilian Schneider MODULE_DESCRIPTION( 969*d08e973aSMaximilian Schneider "Socket CAN device driver for Geschwister Schneider Technologie-, " 970*d08e973aSMaximilian Schneider "Entwicklungs- und Vertriebs UG. USB2.0 to CAN interfaces."); 971*d08e973aSMaximilian Schneider MODULE_LICENSE("GPL v2"); 972