• Home
  • Raw
  • Download

Lines Matching full:up

88 	/* wake up can transceiver from low-power sleep mode */
265 struct ucan_priv *up; member
318 static void ucan_release_context_array(struct ucan_priv *up) in ucan_release_context_array() argument
320 if (!up->context_array) in ucan_release_context_array()
324 up->available_tx_urbs = 0; in ucan_release_context_array()
326 kfree(up->context_array); in ucan_release_context_array()
327 up->context_array = NULL; in ucan_release_context_array()
330 static int ucan_alloc_context_array(struct ucan_priv *up) in ucan_alloc_context_array() argument
335 ucan_release_context_array(up); in ucan_alloc_context_array()
337 up->context_array = kcalloc(up->device_info.tx_fifo, in ucan_alloc_context_array()
338 sizeof(*up->context_array), in ucan_alloc_context_array()
340 if (!up->context_array) { in ucan_alloc_context_array()
341 netdev_err(up->netdev, in ucan_alloc_context_array()
346 for (i = 0; i < up->device_info.tx_fifo; i++) { in ucan_alloc_context_array()
347 up->context_array[i].allocated = false; in ucan_alloc_context_array()
348 up->context_array[i].up = up; in ucan_alloc_context_array()
352 up->available_tx_urbs = up->device_info.tx_fifo; in ucan_alloc_context_array()
357 static struct ucan_urb_context *ucan_alloc_context(struct ucan_priv *up) in ucan_alloc_context() argument
363 if (WARN_ON_ONCE(!up->context_array)) in ucan_alloc_context()
367 spin_lock_irqsave(&up->context_lock, flags); in ucan_alloc_context()
369 for (i = 0; i < up->device_info.tx_fifo; i++) { in ucan_alloc_context()
370 if (!up->context_array[i].allocated) { in ucan_alloc_context()
372 ret = &up->context_array[i]; in ucan_alloc_context()
373 up->context_array[i].allocated = true; in ucan_alloc_context()
376 up->available_tx_urbs--; in ucan_alloc_context()
377 if (!up->available_tx_urbs) in ucan_alloc_context()
378 netif_stop_queue(up->netdev); in ucan_alloc_context()
384 spin_unlock_irqrestore(&up->context_lock, flags); in ucan_alloc_context()
388 static bool ucan_release_context(struct ucan_priv *up, in ucan_release_context() argument
394 if (WARN_ON_ONCE(!up->context_array)) in ucan_release_context()
398 spin_lock_irqsave(&up->context_lock, flags); in ucan_release_context()
405 if (!up->available_tx_urbs) in ucan_release_context()
406 netif_wake_queue(up->netdev); in ucan_release_context()
407 up->available_tx_urbs++; in ucan_release_context()
412 spin_unlock_irqrestore(&up->context_lock, flags); in ucan_release_context()
416 static int ucan_ctrl_command_out(struct ucan_priv *up, in ucan_ctrl_command_out() argument
419 return usb_control_msg(up->udev, in ucan_ctrl_command_out()
420 usb_sndctrlpipe(up->udev, 0), in ucan_ctrl_command_out()
425 up->intf_index, in ucan_ctrl_command_out()
426 up->ctl_msg_buffer, in ucan_ctrl_command_out()
431 static int ucan_device_request_in(struct ucan_priv *up, in ucan_device_request_in() argument
434 return usb_control_msg(up->udev, in ucan_device_request_in()
435 usb_rcvctrlpipe(up->udev, 0), in ucan_device_request_in()
440 up->ctl_msg_buffer, in ucan_device_request_in()
448 static void ucan_parse_device_info(struct ucan_priv *up, in ucan_parse_device_info() argument
452 &up->device_info.bittiming_const; in ucan_parse_device_info()
456 up->can.clock.freq = le32_to_cpu(device_info->freq); in ucan_parse_device_info()
457 up->device_info.tx_fifo = device_info->tx_fifo; in ucan_parse_device_info()
470 up->can.ctrlmode_supported = 0; in ucan_parse_device_info()
473 up->can.ctrlmode_supported |= CAN_CTRLMODE_LOOPBACK; in ucan_parse_device_info()
475 up->can.ctrlmode_supported |= CAN_CTRLMODE_LISTENONLY; in ucan_parse_device_info()
477 up->can.ctrlmode_supported |= CAN_CTRLMODE_3_SAMPLES; in ucan_parse_device_info()
479 up->can.ctrlmode_supported |= CAN_CTRLMODE_ONE_SHOT; in ucan_parse_device_info()
481 up->can.ctrlmode_supported |= CAN_CTRLMODE_BERR_REPORTING; in ucan_parse_device_info()
487 static bool ucan_handle_error_frame(struct ucan_priv *up, in ucan_handle_error_frame() argument
491 enum can_state new_state = up->can.state; in ucan_handle_error_frame()
492 struct net_device_stats *net_stats = &up->netdev->stats; in ucan_handle_error_frame()
493 struct can_device_stats *can_stats = &up->can.can_stats; in ucan_handle_error_frame()
536 if (up->can.state == new_state) in ucan_handle_error_frame()
540 if (up->can.state > new_state) { in ucan_handle_error_frame()
541 up->can.state = new_state; in ucan_handle_error_frame()
546 up->can.state = new_state; in ucan_handle_error_frame()
550 can_bus_off(up->netdev); in ucan_handle_error_frame()
569 static void ucan_rx_can_msg(struct ucan_priv *up, struct ucan_message_in *m) in ucan_rx_can_msg() argument
575 struct net_device_stats *stats = &up->netdev->stats; in ucan_rx_can_msg()
582 netdev_warn(up->netdev, "invalid input message len: %d\n", len); in ucan_rx_can_msg()
589 bool busstate_changed = ucan_handle_error_frame(up, m, canid); in ucan_rx_can_msg()
592 if (!(up->can.ctrlmode & CAN_CTRLMODE_BERR_REPORTING) && in ucan_rx_can_msg()
605 netdev_warn(up->netdev, in ucan_rx_can_msg()
613 skb = alloc_can_skb(up->netdev, &cf); in ucan_rx_can_msg()
636 static void ucan_tx_complete_msg(struct ucan_priv *up, in ucan_tx_complete_msg() argument
647 netdev_err(up->netdev, "invalid tx complete length\n"); in ucan_tx_complete_msg()
655 if (echo_index >= up->device_info.tx_fifo) { in ucan_tx_complete_msg()
656 up->netdev->stats.tx_errors++; in ucan_tx_complete_msg()
657 netdev_err(up->netdev, in ucan_tx_complete_msg()
664 context = &up->context_array[echo_index]; in ucan_tx_complete_msg()
670 if (!ucan_release_context(up, context)) in ucan_tx_complete_msg()
673 spin_lock_irqsave(&up->echo_skb_lock, flags); in ucan_tx_complete_msg()
677 up->netdev->stats.tx_packets++; in ucan_tx_complete_msg()
678 up->netdev->stats.tx_bytes += dlc; in ucan_tx_complete_msg()
679 can_get_echo_skb(up->netdev, echo_index); in ucan_tx_complete_msg()
681 up->netdev->stats.tx_dropped++; in ucan_tx_complete_msg()
682 can_free_echo_skb(up->netdev, echo_index); in ucan_tx_complete_msg()
684 spin_unlock_irqrestore(&up->echo_skb_lock, flags); in ucan_tx_complete_msg()
693 struct ucan_priv *up = urb->context; in ucan_read_bulk_callback() local
694 struct net_device *netdev = up->netdev; in ucan_read_bulk_callback()
697 /* the device is not up and the driver should not receive any in ucan_read_bulk_callback()
700 if (WARN_ON(!up->context_array)) { in ucan_read_bulk_callback()
701 usb_free_coherent(up->udev, in ucan_read_bulk_callback()
702 up->in_ep_size, in ucan_read_bulk_callback()
718 usb_free_coherent(up->udev, in ucan_read_bulk_callback()
719 up->in_ep_size, in ucan_read_bulk_callback()
722 netdev_dbg(up->netdev, "not resumbmitting urb; status: %d\n", in ucan_read_bulk_callback()
740 netdev_warn(up->netdev, in ucan_read_bulk_callback()
753 netdev_warn(up->netdev, in ucan_read_bulk_callback()
770 ucan_rx_can_msg(up, m); in ucan_read_bulk_callback()
773 ucan_tx_complete_msg(up, m); in ucan_read_bulk_callback()
776 netdev_warn(up->netdev, in ucan_read_bulk_callback()
790 usb_fill_bulk_urb(urb, up->udev, in ucan_read_bulk_callback()
791 usb_rcvbulkpipe(up->udev, in ucan_read_bulk_callback()
792 up->in_ep_addr), in ucan_read_bulk_callback()
794 up->in_ep_size, in ucan_read_bulk_callback()
796 up); in ucan_read_bulk_callback()
798 usb_anchor_urb(urb, &up->rx_urbs); in ucan_read_bulk_callback()
802 netdev_err(up->netdev, in ucan_read_bulk_callback()
807 usb_free_coherent(up->udev, in ucan_read_bulk_callback()
808 up->in_ep_size, in ucan_read_bulk_callback()
821 struct ucan_priv *up; in ucan_write_bulk_callback() local
828 /* free up our allocated buffer */ in ucan_write_bulk_callback()
834 up = context->up; in ucan_write_bulk_callback()
835 if (WARN_ON_ONCE(!up)) in ucan_write_bulk_callback()
839 if (!netif_device_present(up->netdev)) in ucan_write_bulk_callback()
844 netdev_warn(up->netdev, in ucan_write_bulk_callback()
849 spin_lock_irqsave(&up->echo_skb_lock, flags); in ucan_write_bulk_callback()
850 can_free_echo_skb(up->netdev, context - up->context_array); in ucan_write_bulk_callback()
851 spin_unlock_irqrestore(&up->echo_skb_lock, flags); in ucan_write_bulk_callback()
853 up->netdev->stats.tx_dropped++; in ucan_write_bulk_callback()
856 if (!ucan_release_context(up, context)) in ucan_write_bulk_callback()
857 netdev_err(up->netdev, in ucan_write_bulk_callback()
862 static void ucan_cleanup_rx_urbs(struct ucan_priv *up, struct urb **urbs) in ucan_cleanup_rx_urbs() argument
869 usb_free_coherent(up->udev, in ucan_cleanup_rx_urbs()
870 up->in_ep_size, in ucan_cleanup_rx_urbs()
880 static int ucan_prepare_and_anchor_rx_urbs(struct ucan_priv *up, in ucan_prepare_and_anchor_rx_urbs() argument
894 buf = usb_alloc_coherent(up->udev, in ucan_prepare_and_anchor_rx_urbs()
895 up->in_ep_size, in ucan_prepare_and_anchor_rx_urbs()
904 usb_fill_bulk_urb(urbs[i], up->udev, in ucan_prepare_and_anchor_rx_urbs()
905 usb_rcvbulkpipe(up->udev, in ucan_prepare_and_anchor_rx_urbs()
906 up->in_ep_addr), in ucan_prepare_and_anchor_rx_urbs()
908 up->in_ep_size, in ucan_prepare_and_anchor_rx_urbs()
910 up); in ucan_prepare_and_anchor_rx_urbs()
914 usb_anchor_urb(urbs[i], &up->rx_urbs); in ucan_prepare_and_anchor_rx_urbs()
920 ucan_cleanup_rx_urbs(up, urbs); in ucan_prepare_and_anchor_rx_urbs()
929 static int ucan_submit_rx_urbs(struct ucan_priv *up, struct urb **urbs) in ucan_submit_rx_urbs() argument
939 netdev_err(up->netdev, in ucan_submit_rx_urbs()
955 ucan_cleanup_rx_urbs(up, urbs); in ucan_submit_rx_urbs()
958 usb_kill_anchored_urbs(&up->rx_urbs); in ucan_submit_rx_urbs()
969 struct ucan_priv *up = netdev_priv(netdev); in ucan_open() local
971 ret = ucan_alloc_context_array(up); in ucan_open()
978 ret = ucan_prepare_and_anchor_rx_urbs(up, urbs); in ucan_open()
984 if (up->can.ctrlmode & CAN_CTRLMODE_LOOPBACK) in ucan_open()
986 if (up->can.ctrlmode & CAN_CTRLMODE_LISTENONLY) in ucan_open()
988 if (up->can.ctrlmode & CAN_CTRLMODE_3_SAMPLES) in ucan_open()
990 if (up->can.ctrlmode & CAN_CTRLMODE_ONE_SHOT) in ucan_open()
997 up->ctl_msg_buffer->cmd_start.mode = cpu_to_le16(ctrlmode); in ucan_open()
1000 ret = ucan_ctrl_command_out(up, UCAN_COMMAND_START, 0, 2); in ucan_open()
1002 netdev_err(up->netdev, in ucan_open()
1014 ret = ucan_submit_rx_urbs(up, urbs); in ucan_open()
1018 up->can.state = CAN_STATE_ERROR_ACTIVE; in ucan_open()
1027 ret_cleanup = ucan_ctrl_command_out(up, UCAN_COMMAND_STOP, 0, 0); in ucan_open()
1029 netdev_err(up->netdev, in ucan_open()
1037 ret_cleanup = ucan_ctrl_command_out(up, UCAN_COMMAND_RESET, 0, 0); in ucan_open()
1039 netdev_err(up->netdev, in ucan_open()
1043 /* clean up unsubmitted urbs */ in ucan_open()
1044 ucan_cleanup_rx_urbs(up, urbs); in ucan_open()
1047 ucan_release_context_array(up); in ucan_open()
1051 static struct urb *ucan_prepare_tx_urb(struct ucan_priv *up, in ucan_prepare_tx_urb() argument
1063 netdev_err(up->netdev, "no memory left for URBs\n"); in ucan_prepare_tx_urb()
1067 m = usb_alloc_coherent(up->udev, in ucan_prepare_tx_urb()
1072 netdev_err(up->netdev, "no memory left for USB buffer\n"); in ucan_prepare_tx_urb()
1098 usb_fill_bulk_urb(urb, up->udev, in ucan_prepare_tx_urb()
1099 usb_sndbulkpipe(up->udev, in ucan_prepare_tx_urb()
1100 up->out_ep_addr), in ucan_prepare_tx_urb()
1107 static void ucan_clean_up_tx_urb(struct ucan_priv *up, struct urb *urb) in ucan_clean_up_tx_urb() argument
1109 usb_free_coherent(up->udev, sizeof(struct ucan_message_out), in ucan_clean_up_tx_urb()
1123 struct ucan_priv *up = netdev_priv(netdev); in ucan_start_xmit() local
1131 context = ucan_alloc_context(up); in ucan_start_xmit()
1132 echo_index = context - up->context_array; in ucan_start_xmit()
1138 urb = ucan_prepare_tx_urb(up, context, cf, echo_index); in ucan_start_xmit()
1143 spin_lock_irqsave(&up->echo_skb_lock, flags); in ucan_start_xmit()
1144 can_put_echo_skb(skb, up->netdev, echo_index); in ucan_start_xmit()
1145 spin_unlock_irqrestore(&up->echo_skb_lock, flags); in ucan_start_xmit()
1148 usb_anchor_urb(urb, &up->tx_urbs); in ucan_start_xmit()
1153 /* on error, clean up */ in ucan_start_xmit()
1155 ucan_clean_up_tx_urb(up, urb); in ucan_start_xmit()
1156 if (!ucan_release_context(up, context)) in ucan_start_xmit()
1157 netdev_err(up->netdev, in ucan_start_xmit()
1163 spin_lock_irqsave(&up->echo_skb_lock, flags); in ucan_start_xmit()
1164 can_free_echo_skb(up->netdev, echo_index); in ucan_start_xmit()
1165 spin_unlock_irqrestore(&up->echo_skb_lock, flags); in ucan_start_xmit()
1168 netif_device_detach(up->netdev); in ucan_start_xmit()
1170 netdev_warn(up->netdev, in ucan_start_xmit()
1173 up->netdev->stats.tx_dropped++; in ucan_start_xmit()
1186 if (!ucan_release_context(up, context)) in ucan_start_xmit()
1187 netdev_err(up->netdev, in ucan_start_xmit()
1190 up->netdev->stats.tx_dropped++; in ucan_start_xmit()
1197 * Clean up used resources
1202 struct ucan_priv *up = netdev_priv(netdev); in ucan_close() local
1204 up->can.state = CAN_STATE_STOPPED; in ucan_close()
1207 usb_kill_anchored_urbs(&up->tx_urbs); in ucan_close()
1210 usb_kill_anchored_urbs(&up->rx_urbs); in ucan_close()
1213 ret = ucan_ctrl_command_out(up, UCAN_COMMAND_STOP, 0, 0); in ucan_close()
1215 netdev_err(up->netdev, in ucan_close()
1219 ret = ucan_ctrl_command_out(up, UCAN_COMMAND_RESET, 0, 0); in ucan_close()
1221 netdev_err(up->netdev, in ucan_close()
1227 ucan_release_context_array(up); in ucan_close()
1229 close_candev(up->netdev); in ucan_close()
1249 struct ucan_priv *up = netdev_priv(netdev); in ucan_set_bittiming() local
1252 cmd_set_bittiming = &up->ctl_msg_buffer->cmd_set_bittiming; in ucan_set_bittiming()
1253 cmd_set_bittiming->tq = cpu_to_le32(up->can.bittiming.tq); in ucan_set_bittiming()
1254 cmd_set_bittiming->brp = cpu_to_le16(up->can.bittiming.brp); in ucan_set_bittiming()
1256 cpu_to_le16(up->can.bittiming.sample_point); in ucan_set_bittiming()
1257 cmd_set_bittiming->prop_seg = up->can.bittiming.prop_seg; in ucan_set_bittiming()
1258 cmd_set_bittiming->phase_seg1 = up->can.bittiming.phase_seg1; in ucan_set_bittiming()
1259 cmd_set_bittiming->phase_seg2 = up->can.bittiming.phase_seg2; in ucan_set_bittiming()
1260 cmd_set_bittiming->sjw = up->can.bittiming.sjw; in ucan_set_bittiming()
1262 ret = ucan_ctrl_command_out(up, UCAN_COMMAND_SET_BITTIMING, 0, in ucan_set_bittiming()
1274 struct ucan_priv *up = netdev_priv(netdev); in ucan_set_mode() local
1278 netdev_dbg(up->netdev, "restarting device\n"); in ucan_set_mode()
1280 ret = ucan_ctrl_command_out(up, UCAN_COMMAND_RESTART, 0, 0); in ucan_set_mode()
1281 up->can.state = CAN_STATE_ERROR_ACTIVE; in ucan_set_mode()
1284 * up->available_tx_urbs must be protected by the in ucan_set_mode()
1287 spin_lock_irqsave(&up->context_lock, flags); in ucan_set_mode()
1289 if (up->available_tx_urbs > 0) in ucan_set_mode()
1290 netif_wake_queue(up->netdev); in ucan_set_mode()
1292 spin_unlock_irqrestore(&up->context_lock, flags); in ucan_set_mode()
1310 struct ucan_priv *up; in ucan_probe() local
1414 * because `up` is initialised in Stage 3 in ucan_probe()
1453 * because `up` is initialised in Stage 3 in ucan_probe()
1499 up = netdev_priv(netdev); in ucan_probe()
1502 up->udev = udev; in ucan_probe()
1503 up->intf = intf; in ucan_probe()
1504 up->netdev = netdev; in ucan_probe()
1505 up->intf_index = iface_desc->desc.bInterfaceNumber; in ucan_probe()
1506 up->in_ep_addr = in_ep_addr; in ucan_probe()
1507 up->out_ep_addr = out_ep_addr; in ucan_probe()
1508 up->in_ep_size = in_ep_size; in ucan_probe()
1509 up->ctl_msg_buffer = ctl_msg_buffer; in ucan_probe()
1510 up->context_array = NULL; in ucan_probe()
1511 up->available_tx_urbs = 0; in ucan_probe()
1513 up->can.state = CAN_STATE_STOPPED; in ucan_probe()
1514 up->can.bittiming_const = &up->device_info.bittiming_const; in ucan_probe()
1515 up->can.do_set_bittiming = ucan_set_bittiming; in ucan_probe()
1516 up->can.do_set_mode = &ucan_set_mode; in ucan_probe()
1517 spin_lock_init(&up->context_lock); in ucan_probe()
1518 spin_lock_init(&up->echo_skb_lock); in ucan_probe()
1521 usb_set_intfdata(intf, up); in ucan_probe()
1526 * up->ctl_msg_buffer in ucan_probe()
1528 ucan_parse_device_info(up, &ctl_msg_buffer->cmd_get_device_info); in ucan_probe()
1531 ret = ucan_device_request_in(up, UCAN_DEVICE_GET_FW_STRING, 0, in ucan_probe()
1535 strncpy(firmware_str, up->ctl_msg_buffer->raw, in ucan_probe()
1543 ret = ucan_ctrl_command_out(up, UCAN_COMMAND_RESET, 0, 0); in ucan_probe()
1547 init_usb_anchor(&up->rx_urbs); in ucan_probe()
1548 init_usb_anchor(&up->tx_urbs); in ucan_probe()
1550 up->can.state = CAN_STATE_STOPPED; in ucan_probe()
1558 netdev_info(up->netdev, "registered device\n"); in ucan_probe()
1559 netdev_info(up->netdev, "firmware string: %s\n", firmware_str); in ucan_probe()
1578 struct ucan_priv *up = usb_get_intfdata(intf); in ucan_disconnect() local
1582 if (up) { in ucan_disconnect()
1583 unregister_netdev(up->netdev); in ucan_disconnect()
1584 free_candev(up->netdev); in ucan_disconnect()