^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Edgeport USB Serial Converter driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright (C) 2000-2002 Inside Out Networks, All rights reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * Copyright (C) 2001-2002 Greg Kroah-Hartman <greg@kroah.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) * Supports the following devices:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) * EP/1 EP/2 EP/4 EP/21 EP/22 EP/221 EP/42 EP/421 WATCHPORT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) * For questions or problems with this driver, contact Inside Out
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) * Networks technical support, or Peter Berger <pberger@brimson.com>,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) * or Al Borchers <alborchers@steinerpoint.com>.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <linux/jiffies.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include <linux/errno.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #include <linux/tty.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #include <linux/tty_driver.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #include <linux/tty_flip.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #include <linux/spinlock.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #include <linux/mutex.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #include <linux/serial.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #include <linux/swab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #include <linux/kfifo.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #include <linux/ioctl.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #include <linux/firmware.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #include <linux/uaccess.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #include <linux/usb.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #include <linux/usb/serial.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #include "io_16654.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #include "io_usbvend.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #include "io_ti.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) #define DRIVER_AUTHOR "Greg Kroah-Hartman <greg@kroah.com> and David Iacovelli"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #define DRIVER_DESC "Edgeport USB Serial Driver"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #define EPROM_PAGE_SIZE 64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) /* different hardware types */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) #define HARDWARE_TYPE_930 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) #define HARDWARE_TYPE_TIUMP 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) /* IOCTL_PRIVATE_TI_GET_MODE Definitions */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) #define TI_MODE_CONFIGURING 0 /* Device has not entered start device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) #define TI_MODE_BOOT 1 /* Staying in boot mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) #define TI_MODE_DOWNLOAD 2 /* Made it to download mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) #define TI_MODE_TRANSITIONING 3 /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) * Currently in boot mode but
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) * transitioning to download mode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) /* read urb state */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) #define EDGE_READ_URB_RUNNING 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) #define EDGE_READ_URB_STOPPING 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) #define EDGE_READ_URB_STOPPED 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) #define EDGE_CLOSING_WAIT 4000 /* in .01 sec */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) /* Product information read from the Edgeport */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) struct product_info {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) int TiMode; /* Current TI Mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) __u8 hardware_type; /* Type of hardware */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) } __attribute__((packed));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) * Edgeport firmware header
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) * "build_number" has been set to 0 in all three of the images I have
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) * seen, and Digi Tech Support suggests that it is safe to ignore it.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) * "length" is the number of bytes of actual data following the header.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) * "checksum" is the low order byte resulting from adding the values of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) * all the data bytes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) struct edgeport_fw_hdr {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) u8 major_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) u8 minor_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) __le16 build_number;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) __le16 length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) u8 checksum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) struct edgeport_port {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) __u16 uart_base;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) __u16 dma_address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) __u8 shadow_msr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) __u8 shadow_mcr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) __u8 shadow_lsr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) __u8 lsr_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) __u32 ump_read_timeout; /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) * Number of milliseconds the UMP will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) * wait without data before completing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) * a read short
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) int baud_rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) int close_pending;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) int lsr_event;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) struct edgeport_serial *edge_serial;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) struct usb_serial_port *port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) __u8 bUartMode; /* Port type, 0: RS232, etc. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) spinlock_t ep_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) int ep_read_urb_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) int ep_write_urb_in_use;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) struct edgeport_serial {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) struct product_info product_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) u8 TI_I2C_Type; /* Type of I2C in UMP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) u8 TiReadI2C; /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) * Set to TRUE if we have read the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) * I2c in Boot Mode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) struct mutex es_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) int num_ports_open;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) struct usb_serial *serial;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) struct delayed_work heartbeat_work;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) int fw_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) bool use_heartbeat;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) /* Devices that this driver supports */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) static const struct usb_device_id edgeport_1port_id_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_1) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_TI3410_EDGEPORT_1) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_TI3410_EDGEPORT_1I) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_PROXIMITY) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_MOTION) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_MOISTURE) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_TEMPERATURE) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_HUMIDITY) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_POWER) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_LIGHT) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_RADIATION) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_DISTANCE) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_ACCELERATION) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_PROX_DIST) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_PLUS_PWR_HP4CD) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_PLUS_PWR_PCI) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) static const struct usb_device_id edgeport_2port_id_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_2) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_2C) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_2I) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_421) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_21) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_42) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_4) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_4I) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_22I) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_221C) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_22C) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_21C) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) /* The 4, 8 and 16 port devices show up as multiple 2 port devices */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_4S) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_8) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_8S) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_416) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_416B) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) /* Devices that this driver supports */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) static const struct usb_device_id id_table_combined[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_1) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_TI3410_EDGEPORT_1) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_TI3410_EDGEPORT_1I) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_PROXIMITY) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_MOTION) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_MOISTURE) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_TEMPERATURE) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_HUMIDITY) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_POWER) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_LIGHT) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_RADIATION) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_DISTANCE) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_ACCELERATION) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_PROX_DIST) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_PLUS_PWR_HP4CD) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_PLUS_PWR_PCI) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_2) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_2C) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_2I) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_421) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_21) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_42) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_4) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_4I) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_22I) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_221C) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_22C) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_21C) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_4S) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_8) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_8S) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_416) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_416B) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) MODULE_DEVICE_TABLE(usb, id_table_combined);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) static int closing_wait = EDGE_CLOSING_WAIT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) static bool ignore_cpu_rev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) static int default_uart_mode; /* RS232 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) static void edge_tty_recv(struct usb_serial_port *port, unsigned char *data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) int length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) static void stop_read(struct edgeport_port *edge_port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) static int restart_read(struct edgeport_port *edge_port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) static void edge_set_termios(struct tty_struct *tty,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) struct usb_serial_port *port, struct ktermios *old_termios);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) static void edge_send(struct usb_serial_port *port, struct tty_struct *tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) static int do_download_mode(struct edgeport_serial *serial,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) const struct firmware *fw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) static int do_boot_mode(struct edgeport_serial *serial,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) const struct firmware *fw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) /* sysfs attributes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) static int edge_create_sysfs_attrs(struct usb_serial_port *port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) static int edge_remove_sysfs_attrs(struct usb_serial_port *port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) * Some release of Edgeport firmware "down3.bin" after version 4.80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) * introduced code to automatically disconnect idle devices on some
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) * Edgeport models after periods of inactivity, typically ~60 seconds.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) * This occurs without regard to whether ports on the device are open
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) * or not. Digi International Tech Support suggested:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) * 1. Adding driver "heartbeat" code to reset the firmware timer by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) * requesting a descriptor record every 15 seconds, which should be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) * effective with newer firmware versions that require it, and benign
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) * with older versions that do not. In practice 40 seconds seems often
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) * enough.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) * 2. The heartbeat code is currently required only on Edgeport/416 models.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) #define FW_HEARTBEAT_VERSION_CUTOFF ((4 << 8) + 80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) #define FW_HEARTBEAT_SECS 40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) /* Timeouts in msecs: firmware downloads take longer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) #define TI_VSEND_TIMEOUT_DEFAULT 1000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) #define TI_VSEND_TIMEOUT_FW_DOWNLOAD 10000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) static int ti_vread_sync(struct usb_device *dev, __u8 request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) __u16 value, __u16 index, u8 *data, int size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) int status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) status = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) (USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) value, index, data, size, 1000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) if (status < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) if (status != size) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) dev_dbg(&dev->dev, "%s - wanted to write %d, but only wrote %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) __func__, size, status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) return -ECOMM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) static int ti_vsend_sync(struct usb_device *dev, u8 request, u16 value,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) u16 index, u8 *data, int size, int timeout)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) int status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) status = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) (USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) value, index, data, size, timeout);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) if (status < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) if (status != size) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) dev_dbg(&dev->dev, "%s - wanted to write %d, but only wrote %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) __func__, size, status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) return -ECOMM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) static int send_cmd(struct usb_device *dev, __u8 command,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) __u8 moduleid, __u16 value, u8 *data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) int size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) return ti_vsend_sync(dev, command, value, moduleid, data, size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) TI_VSEND_TIMEOUT_DEFAULT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) /* clear tx/rx buffers and fifo in TI UMP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) static int purge_port(struct usb_serial_port *port, __u16 mask)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) int port_number = port->port_number;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) dev_dbg(&port->dev, "%s - port %d, mask %x\n", __func__, port_number, mask);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) return send_cmd(port->serial->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) UMPC_PURGE_PORT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) (__u8)(UMPM_UART1_PORT + port_number),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) mask,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) * read_download_mem - Read edgeport memory from TI chip
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) * @dev: usb device pointer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) * @start_address: Device CPU address at which to read
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) * @length: Length of above data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) * @address_type: Can read both XDATA and I2C
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) * @buffer: pointer to input data buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) static int read_download_mem(struct usb_device *dev, int start_address,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) int length, __u8 address_type, __u8 *buffer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) int status = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) __u8 read_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) u16 be_start_address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) dev_dbg(&dev->dev, "%s - @ %x for %d\n", __func__, start_address, length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) * Read in blocks of 64 bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) * (TI firmware can't handle more than 64 byte reads)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) while (length) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) if (length > 64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) read_length = 64;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) read_length = (__u8)length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) if (read_length > 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) dev_dbg(&dev->dev, "%s - @ %x for %d\n", __func__, start_address, read_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) * NOTE: Must use swab as wIndex is sent in little-endian
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) * byte order regardless of host byte order.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) be_start_address = swab16((u16)start_address);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) status = ti_vread_sync(dev, UMPC_MEMORY_READ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) (__u16)address_type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) be_start_address,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) buffer, read_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) if (status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) dev_dbg(&dev->dev, "%s - ERROR %x\n", __func__, status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) if (read_length > 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) usb_serial_debug_data(&dev->dev, __func__, read_length, buffer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) /* Update pointers/length */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) start_address += read_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) buffer += read_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) length -= read_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) static int read_ram(struct usb_device *dev, int start_address,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) int length, __u8 *buffer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) return read_download_mem(dev, start_address, length,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) DTK_ADDR_SPACE_XDATA, buffer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) /* Read edgeport memory to a given block */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) static int read_boot_mem(struct edgeport_serial *serial,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) int start_address, int length, __u8 *buffer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) int status = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) for (i = 0; i < length; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) status = ti_vread_sync(serial->serial->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) UMPC_MEMORY_READ, serial->TI_I2C_Type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) (__u16)(start_address+i), &buffer[i], 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) if (status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) dev_dbg(&serial->serial->dev->dev, "%s - ERROR %x\n", __func__, status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) dev_dbg(&serial->serial->dev->dev, "%s - start_address = %x, length = %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) __func__, start_address, length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) usb_serial_debug_data(&serial->serial->dev->dev, __func__, length, buffer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) serial->TiReadI2C = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) /* Write given block to TI EPROM memory */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) static int write_boot_mem(struct edgeport_serial *serial,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) int start_address, int length, __u8 *buffer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) int status = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) u8 *temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) /* Must do a read before write */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) if (!serial->TiReadI2C) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) temp = kmalloc(1, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) if (!temp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) status = read_boot_mem(serial, 0, 1, temp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) kfree(temp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) if (status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) for (i = 0; i < length; ++i) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) status = ti_vsend_sync(serial->serial->dev, UMPC_MEMORY_WRITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) buffer[i], (u16)(i + start_address), NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) 0, TI_VSEND_TIMEOUT_DEFAULT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) if (status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) dev_dbg(&serial->serial->dev->dev, "%s - start_sddr = %x, length = %d\n", __func__, start_address, length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) usb_serial_debug_data(&serial->serial->dev->dev, __func__, length, buffer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) /* Write edgeport I2C memory to TI chip */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) static int write_i2c_mem(struct edgeport_serial *serial,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) int start_address, int length, __u8 address_type, __u8 *buffer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) struct device *dev = &serial->serial->dev->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) int status = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) int write_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) u16 be_start_address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) /* We can only send a maximum of 1 aligned byte page at a time */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) /* calculate the number of bytes left in the first page */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) write_length = EPROM_PAGE_SIZE -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) (start_address & (EPROM_PAGE_SIZE - 1));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) if (write_length > length)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) write_length = length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) dev_dbg(dev, "%s - BytesInFirstPage Addr = %x, length = %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) __func__, start_address, write_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) usb_serial_debug_data(dev, __func__, write_length, buffer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) * Write first page.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) * NOTE: Must use swab as wIndex is sent in little-endian byte order
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) * regardless of host byte order.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) be_start_address = swab16((u16)start_address);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) status = ti_vsend_sync(serial->serial->dev, UMPC_MEMORY_WRITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) (u16)address_type, be_start_address,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) buffer, write_length, TI_VSEND_TIMEOUT_DEFAULT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) if (status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) dev_dbg(dev, "%s - ERROR %d\n", __func__, status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) length -= write_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) start_address += write_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) buffer += write_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) * We should be aligned now -- can write max page size bytes at a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) * time.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) while (length) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) if (length > EPROM_PAGE_SIZE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) write_length = EPROM_PAGE_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) write_length = length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) dev_dbg(dev, "%s - Page Write Addr = %x, length = %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) __func__, start_address, write_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) usb_serial_debug_data(dev, __func__, write_length, buffer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) * Write next page.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) * NOTE: Must use swab as wIndex is sent in little-endian byte
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) * order regardless of host byte order.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) be_start_address = swab16((u16)start_address);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) status = ti_vsend_sync(serial->serial->dev, UMPC_MEMORY_WRITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) (u16)address_type, be_start_address, buffer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) write_length, TI_VSEND_TIMEOUT_DEFAULT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) if (status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) dev_err(dev, "%s - ERROR %d\n", __func__, status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) length -= write_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) start_address += write_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) buffer += write_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) * Examine the UMP DMA registers and LSR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) * Check the MSBit of the X and Y DMA byte count registers.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) * A zero in this bit indicates that the TX DMA buffers are empty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) * then check the TX Empty bit in the UART.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) static int tx_active(struct edgeport_port *port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) int status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) struct out_endpoint_desc_block *oedb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) __u8 *lsr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) int bytes_left = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) oedb = kmalloc(sizeof(*oedb), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) if (!oedb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) * Sigh, that's right, just one byte, as not all platforms can
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) * do DMA from stack
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) lsr = kmalloc(1, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) if (!lsr) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) kfree(oedb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) /* Read the DMA Count Registers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) status = read_ram(port->port->serial->dev, port->dma_address,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) sizeof(*oedb), (void *)oedb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) if (status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) goto exit_is_tx_active;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) dev_dbg(&port->port->dev, "%s - XByteCount 0x%X\n", __func__, oedb->XByteCount);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) /* and the LSR */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) status = read_ram(port->port->serial->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) port->uart_base + UMPMEM_OFFS_UART_LSR, 1, lsr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) if (status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) goto exit_is_tx_active;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) dev_dbg(&port->port->dev, "%s - LSR = 0x%X\n", __func__, *lsr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) /* If either buffer has data or we are transmitting then return TRUE */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) if ((oedb->XByteCount & 0x80) != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) bytes_left += 64;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) if ((*lsr & UMP_UART_LSR_TX_MASK) == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) bytes_left += 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) /* We return Not Active if we get any kind of error */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) exit_is_tx_active:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) dev_dbg(&port->port->dev, "%s - return %d\n", __func__, bytes_left);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) kfree(lsr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) kfree(oedb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) return bytes_left;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) static int choose_config(struct usb_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) * There may be multiple configurations on this device, in which case
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) * we would need to read and parse all of them to find out which one
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) * we want. However, we just support one config at this point,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) * configuration # 1, which is Config Descriptor 0.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) dev_dbg(&dev->dev, "%s - Number of Interfaces = %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) __func__, dev->config->desc.bNumInterfaces);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) dev_dbg(&dev->dev, "%s - MAX Power = %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) __func__, dev->config->desc.bMaxPower * 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) if (dev->config->desc.bNumInterfaces != 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) dev_err(&dev->dev, "%s - bNumInterfaces is not 1, ERROR!\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) static int read_rom(struct edgeport_serial *serial,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) int start_address, int length, __u8 *buffer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) int status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) if (serial->product_info.TiMode == TI_MODE_DOWNLOAD) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) status = read_download_mem(serial->serial->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) start_address,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) length,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) serial->TI_I2C_Type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) buffer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) status = read_boot_mem(serial, start_address, length,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) buffer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) static int write_rom(struct edgeport_serial *serial, int start_address,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) int length, __u8 *buffer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) if (serial->product_info.TiMode == TI_MODE_BOOT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) return write_boot_mem(serial, start_address, length,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) buffer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) if (serial->product_info.TiMode == TI_MODE_DOWNLOAD)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) return write_i2c_mem(serial, start_address, length,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) serial->TI_I2C_Type, buffer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) /* Read a descriptor header from I2C based on type */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) static int get_descriptor_addr(struct edgeport_serial *serial,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) int desc_type, struct ti_i2c_desc *rom_desc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) int start_address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) int status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) /* Search for requested descriptor in I2C */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) start_address = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) status = read_rom(serial,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) start_address,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) sizeof(struct ti_i2c_desc),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) (__u8 *)rom_desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) if (status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) if (rom_desc->Type == desc_type)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) return start_address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) start_address = start_address + sizeof(struct ti_i2c_desc) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) le16_to_cpu(rom_desc->Size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) } while ((start_address < TI_MAX_I2C_SIZE) && rom_desc->Type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) /* Validate descriptor checksum */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) static int valid_csum(struct ti_i2c_desc *rom_desc, __u8 *buffer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) __u16 i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) __u8 cs = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) for (i = 0; i < le16_to_cpu(rom_desc->Size); i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) cs = (__u8)(cs + buffer[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) if (cs != rom_desc->CheckSum) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) pr_debug("%s - Mismatch %x - %x", __func__, rom_desc->CheckSum, cs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) /* Make sure that the I2C image is good */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) static int check_i2c_image(struct edgeport_serial *serial)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) struct device *dev = &serial->serial->dev->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) int status = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) struct ti_i2c_desc *rom_desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) int start_address = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) __u8 *buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) __u16 ttype;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) rom_desc = kmalloc(sizeof(*rom_desc), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) if (!rom_desc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) buffer = kmalloc(TI_MAX_I2C_SIZE, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) if (!buffer) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) kfree(rom_desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) /* Read the first byte (Signature0) must be 0x52 or 0x10 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) status = read_rom(serial, 0, 1, buffer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) if (status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) if (*buffer != UMP5152 && *buffer != UMP3410) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) dev_err(dev, "%s - invalid buffer signature\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) status = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) /* Validate the I2C */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) status = read_rom(serial,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) start_address,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) sizeof(struct ti_i2c_desc),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) (__u8 *)rom_desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) if (status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) if ((start_address + sizeof(struct ti_i2c_desc) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) le16_to_cpu(rom_desc->Size)) > TI_MAX_I2C_SIZE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) status = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) dev_dbg(dev, "%s - structure too big, erroring out.\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) dev_dbg(dev, "%s Type = 0x%x\n", __func__, rom_desc->Type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) /* Skip type 2 record */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) ttype = rom_desc->Type & 0x0f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) if (ttype != I2C_DESC_TYPE_FIRMWARE_BASIC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) && ttype != I2C_DESC_TYPE_FIRMWARE_AUTO) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) /* Read the descriptor data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) status = read_rom(serial, start_address +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) sizeof(struct ti_i2c_desc),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) le16_to_cpu(rom_desc->Size),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) buffer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) if (status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) status = valid_csum(rom_desc, buffer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) if (status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) start_address = start_address + sizeof(struct ti_i2c_desc) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) le16_to_cpu(rom_desc->Size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) } while ((rom_desc->Type != I2C_DESC_TYPE_ION) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) (start_address < TI_MAX_I2C_SIZE));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) if ((rom_desc->Type != I2C_DESC_TYPE_ION) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) (start_address > TI_MAX_I2C_SIZE))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) status = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) kfree(buffer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) kfree(rom_desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) static int get_manuf_info(struct edgeport_serial *serial, __u8 *buffer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) int status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) int start_address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) struct ti_i2c_desc *rom_desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) struct edge_ti_manuf_descriptor *desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) struct device *dev = &serial->serial->dev->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) rom_desc = kmalloc(sizeof(*rom_desc), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) if (!rom_desc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) start_address = get_descriptor_addr(serial, I2C_DESC_TYPE_ION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) rom_desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) if (!start_address) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) dev_dbg(dev, "%s - Edge Descriptor not found in I2C\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) status = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) /* Read the descriptor data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) status = read_rom(serial, start_address+sizeof(struct ti_i2c_desc),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) le16_to_cpu(rom_desc->Size), buffer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) if (status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) status = valid_csum(rom_desc, buffer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) desc = (struct edge_ti_manuf_descriptor *)buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) dev_dbg(dev, "%s - IonConfig 0x%x\n", __func__, desc->IonConfig);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) dev_dbg(dev, "%s - Version %d\n", __func__, desc->Version);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) dev_dbg(dev, "%s - Cpu/Board 0x%x\n", __func__, desc->CpuRev_BoardRev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) dev_dbg(dev, "%s - NumPorts %d\n", __func__, desc->NumPorts);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) dev_dbg(dev, "%s - NumVirtualPorts %d\n", __func__, desc->NumVirtualPorts);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) dev_dbg(dev, "%s - TotalPorts %d\n", __func__, desc->TotalPorts);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) exit:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) kfree(rom_desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) /* Build firmware header used for firmware update */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) static int build_i2c_fw_hdr(u8 *header, const struct firmware *fw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) __u8 *buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) int buffer_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) __u8 cs = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) struct ti_i2c_desc *i2c_header;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) struct ti_i2c_image_header *img_header;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) struct ti_i2c_firmware_rec *firmware_rec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) struct edgeport_fw_hdr *fw_hdr = (struct edgeport_fw_hdr *)fw->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) * In order to update the I2C firmware we must change the type 2 record
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) * to type 0xF2. This will force the UMP to come up in Boot Mode.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) * Then while in boot mode, the driver will download the latest
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) * firmware (padded to 15.5k) into the UMP ram. And finally when the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) * device comes back up in download mode the driver will cause the new
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) * firmware to be copied from the UMP Ram to I2C and the firmware will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) * update the record type from 0xf2 to 0x02.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) * Allocate a 15.5k buffer + 2 bytes for version number (Firmware
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) * Record)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) buffer_size = (((1024 * 16) - 512 ) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) sizeof(struct ti_i2c_firmware_rec));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) buffer = kmalloc(buffer_size, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) if (!buffer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) /* Set entire image of 0xffs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) memset(buffer, 0xff, buffer_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) /* Copy version number into firmware record */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) firmware_rec = (struct ti_i2c_firmware_rec *)buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) firmware_rec->Ver_Major = fw_hdr->major_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) firmware_rec->Ver_Minor = fw_hdr->minor_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) /* Pointer to fw_down memory image */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) img_header = (struct ti_i2c_image_header *)&fw->data[4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) memcpy(buffer + sizeof(struct ti_i2c_firmware_rec),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) &fw->data[4 + sizeof(struct ti_i2c_image_header)],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) le16_to_cpu(img_header->Length));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) for (i=0; i < buffer_size; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) cs = (__u8)(cs + buffer[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) kfree(buffer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) /* Build new header */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) i2c_header = (struct ti_i2c_desc *)header;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) firmware_rec = (struct ti_i2c_firmware_rec*)i2c_header->Data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) i2c_header->Type = I2C_DESC_TYPE_FIRMWARE_BLANK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) i2c_header->Size = cpu_to_le16(buffer_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) i2c_header->CheckSum = cs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) firmware_rec->Ver_Major = fw_hdr->major_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) firmware_rec->Ver_Minor = fw_hdr->minor_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) /* Try to figure out what type of I2c we have */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) static int i2c_type_bootmode(struct edgeport_serial *serial)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) struct device *dev = &serial->serial->dev->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) int status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) u8 *data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) data = kmalloc(1, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) if (!data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) /* Try to read type 2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) status = ti_vread_sync(serial->serial->dev, UMPC_MEMORY_READ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) DTK_ADDR_SPACE_I2C_TYPE_II, 0, data, 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) if (status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) dev_dbg(dev, "%s - read 2 status error = %d\n", __func__, status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) dev_dbg(dev, "%s - read 2 data = 0x%x\n", __func__, *data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) if ((!status) && (*data == UMP5152 || *data == UMP3410)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) dev_dbg(dev, "%s - ROM_TYPE_II\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) serial->TI_I2C_Type = DTK_ADDR_SPACE_I2C_TYPE_II;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) /* Try to read type 3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) status = ti_vread_sync(serial->serial->dev, UMPC_MEMORY_READ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) DTK_ADDR_SPACE_I2C_TYPE_III, 0, data, 0x01);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) if (status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) dev_dbg(dev, "%s - read 3 status error = %d\n", __func__, status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) dev_dbg(dev, "%s - read 2 data = 0x%x\n", __func__, *data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896) if ((!status) && (*data == UMP5152 || *data == UMP3410)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) dev_dbg(dev, "%s - ROM_TYPE_III\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) serial->TI_I2C_Type = DTK_ADDR_SPACE_I2C_TYPE_III;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) dev_dbg(dev, "%s - Unknown\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) serial->TI_I2C_Type = DTK_ADDR_SPACE_I2C_TYPE_II;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) status = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) kfree(data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) static int bulk_xfer(struct usb_serial *serial, void *buffer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) int length, int *num_sent)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) int status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) status = usb_bulk_msg(serial->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) usb_sndbulkpipe(serial->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) serial->port[0]->bulk_out_endpointAddress),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) buffer, length, num_sent, 1000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922) /* Download given firmware image to the device (IN BOOT MODE) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) static int download_code(struct edgeport_serial *serial, __u8 *image,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924) int image_length)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926) int status = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) int pos;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) int transfer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) int done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) /* Transfer firmware image */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932) for (pos = 0; pos < image_length; ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) /* Read the next buffer from file */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) transfer = image_length - pos;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935) if (transfer > EDGE_FW_BULK_MAX_PACKET_SIZE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936) transfer = EDGE_FW_BULK_MAX_PACKET_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938) /* Transfer data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) status = bulk_xfer(serial->serial, &image[pos],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940) transfer, &done);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941) if (status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) /* Advance buffer pointer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) pos += done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950) /* FIXME!!! */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951) static int config_boot_dev(struct usb_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956) static int ti_cpu_rev(struct edge_ti_manuf_descriptor *desc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958) return TI_GET_CPU_REVISION(desc->CpuRev_BoardRev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961) static int check_fw_sanity(struct edgeport_serial *serial,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962) const struct firmware *fw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) u16 length_total;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965) u8 checksum = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966) int pos;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967) struct device *dev = &serial->serial->interface->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968) struct edgeport_fw_hdr *fw_hdr = (struct edgeport_fw_hdr *)fw->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) if (fw->size < sizeof(struct edgeport_fw_hdr)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971) dev_err(dev, "incomplete fw header\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975) length_total = le16_to_cpu(fw_hdr->length) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976) sizeof(struct edgeport_fw_hdr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978) if (fw->size != length_total) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979) dev_err(dev, "bad fw size (expected: %u, got: %zu)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980) length_total, fw->size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984) for (pos = sizeof(struct edgeport_fw_hdr); pos < fw->size; ++pos)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985) checksum += fw->data[pos];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987) if (checksum != fw_hdr->checksum) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988) dev_err(dev, "bad fw checksum (expected: 0x%x, got: 0x%x)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989) fw_hdr->checksum, checksum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997) * DownloadTIFirmware - Download run-time operating firmware to the TI5052
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999) * This routine downloads the main operating code into the TI5052, using the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) * boot code already burned into E2PROM or ROM.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) static int download_fw(struct edgeport_serial *serial)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) struct device *dev = &serial->serial->interface->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) int status = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) struct usb_interface_descriptor *interface;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) const struct firmware *fw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) const char *fw_name = "edgeport/down3.bin";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) struct edgeport_fw_hdr *fw_hdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) status = request_firmware(&fw, fw_name, dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) if (status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) dev_err(dev, "Failed to load image \"%s\" err %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) fw_name, status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) if (check_fw_sanity(serial, fw)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) status = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) fw_hdr = (struct edgeport_fw_hdr *)fw->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) /* If on-board version is newer, "fw_version" will be updated later. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) serial->fw_version = (fw_hdr->major_version << 8) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) fw_hdr->minor_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) * This routine is entered by both the BOOT mode and the Download mode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) * We can determine which code is running by the reading the config
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) * descriptor and if we have only one bulk pipe it is in boot mode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) serial->product_info.hardware_type = HARDWARE_TYPE_TIUMP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) /* Default to type 2 i2c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) serial->TI_I2C_Type = DTK_ADDR_SPACE_I2C_TYPE_II;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) status = choose_config(serial->serial->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) if (status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) interface = &serial->serial->interface->cur_altsetting->desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) if (!interface) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) dev_err(dev, "%s - no interface set, error!\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) status = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) * Setup initial mode -- the default mode 0 is TI_MODE_CONFIGURING
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) * if we have more than one endpoint we are definitely in download
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) * mode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) if (interface->bNumEndpoints > 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) serial->product_info.TiMode = TI_MODE_DOWNLOAD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) status = do_download_mode(serial, fw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) /* Otherwise we will remain in configuring mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) serial->product_info.TiMode = TI_MODE_CONFIGURING;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) status = do_boot_mode(serial, fw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) release_firmware(fw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) static int do_download_mode(struct edgeport_serial *serial,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) const struct firmware *fw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) struct device *dev = &serial->serial->interface->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) int status = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) int start_address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) struct edge_ti_manuf_descriptor *ti_manuf_desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) int download_cur_ver;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) int download_new_ver;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) struct edgeport_fw_hdr *fw_hdr = (struct edgeport_fw_hdr *)fw->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) struct ti_i2c_desc *rom_desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) dev_dbg(dev, "%s - RUNNING IN DOWNLOAD MODE\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) status = check_i2c_image(serial);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) if (status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) dev_dbg(dev, "%s - DOWNLOAD MODE -- BAD I2C\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) * Validate Hardware version number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) * Read Manufacturing Descriptor from TI Based Edgeport
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) ti_manuf_desc = kmalloc(sizeof(*ti_manuf_desc), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) if (!ti_manuf_desc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) status = get_manuf_info(serial, (__u8 *)ti_manuf_desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) if (status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) kfree(ti_manuf_desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) /* Check version number of ION descriptor */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) if (!ignore_cpu_rev && ti_cpu_rev(ti_manuf_desc) < 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) dev_dbg(dev, "%s - Wrong CPU Rev %d (Must be 2)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) __func__, ti_cpu_rev(ti_manuf_desc));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) kfree(ti_manuf_desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) rom_desc = kmalloc(sizeof(*rom_desc), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) if (!rom_desc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) kfree(ti_manuf_desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) /* Search for type 2 record (firmware record) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) start_address = get_descriptor_addr(serial,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) I2C_DESC_TYPE_FIRMWARE_BASIC, rom_desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) if (start_address != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) struct ti_i2c_firmware_rec *firmware_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) u8 *record;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) dev_dbg(dev, "%s - Found Type FIRMWARE (Type 2) record\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) firmware_version = kmalloc(sizeof(*firmware_version),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) if (!firmware_version) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) kfree(rom_desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) kfree(ti_manuf_desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) * Validate version number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) * Read the descriptor data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) status = read_rom(serial, start_address +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140) sizeof(struct ti_i2c_desc),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) sizeof(struct ti_i2c_firmware_rec),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) (__u8 *)firmware_version);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) if (status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) kfree(firmware_version);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) kfree(rom_desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) kfree(ti_manuf_desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) * Check version number of download with current
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) * version in I2c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) download_cur_ver = (firmware_version->Ver_Major << 8) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) (firmware_version->Ver_Minor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) download_new_ver = (fw_hdr->major_version << 8) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) (fw_hdr->minor_version);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) dev_dbg(dev, "%s - >> FW Versions Device %d.%d Driver %d.%d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) __func__, firmware_version->Ver_Major,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) firmware_version->Ver_Minor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) fw_hdr->major_version, fw_hdr->minor_version);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) * Check if we have an old version in the I2C and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) * update if necessary
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) if (download_cur_ver < download_new_ver) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) dev_dbg(dev, "%s - Update I2C dld from %d.%d to %d.%d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) __func__,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) firmware_version->Ver_Major,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) firmware_version->Ver_Minor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) fw_hdr->major_version,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) fw_hdr->minor_version);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) record = kmalloc(1, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) if (!record) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) kfree(firmware_version);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) kfree(rom_desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) kfree(ti_manuf_desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) * In order to update the I2C firmware we must
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) * change the type 2 record to type 0xF2. This
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) * will force the UMP to come up in Boot Mode.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) * Then while in boot mode, the driver will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) * download the latest firmware (padded to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) * 15.5k) into the UMP ram. Finally when the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) * device comes back up in download mode the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) * driver will cause the new firmware to be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) * copied from the UMP Ram to I2C and the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) * firmware will update the record type from
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) * 0xf2 to 0x02.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) *record = I2C_DESC_TYPE_FIRMWARE_BLANK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199) * Change the I2C Firmware record type to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) * 0xf2 to trigger an update
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) status = write_rom(serial, start_address,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) sizeof(*record), record);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) if (status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205) kfree(record);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) kfree(firmware_version);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) kfree(rom_desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) kfree(ti_manuf_desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) * verify the write -- must do this in order
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) * for write to complete before we do the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) * hardware reset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) status = read_rom(serial,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) start_address,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) sizeof(*record),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) record);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) if (status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) kfree(record);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) kfree(firmware_version);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) kfree(rom_desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) kfree(ti_manuf_desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229) if (*record != I2C_DESC_TYPE_FIRMWARE_BLANK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) dev_err(dev, "%s - error resetting device\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) kfree(record);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) kfree(firmware_version);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) kfree(rom_desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235) kfree(ti_manuf_desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) dev_dbg(dev, "%s - HARDWARE RESET\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) /* Reset UMP -- Back to BOOT MODE */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) status = ti_vsend_sync(serial->serial->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) UMPC_HARDWARE_RESET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) 0, 0, NULL, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) TI_VSEND_TIMEOUT_DEFAULT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) dev_dbg(dev, "%s - HARDWARE RESET return %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) __func__, status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) /* return an error on purpose. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251) kfree(record);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) kfree(firmware_version);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) kfree(rom_desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) kfree(ti_manuf_desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) /* Same or newer fw version is already loaded */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258) serial->fw_version = download_cur_ver;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) kfree(firmware_version);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) /* Search for type 0xF2 record (firmware blank record) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) start_address = get_descriptor_addr(serial,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) I2C_DESC_TYPE_FIRMWARE_BLANK, rom_desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) if (start_address != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266) #define HEADER_SIZE (sizeof(struct ti_i2c_desc) + \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) sizeof(struct ti_i2c_firmware_rec))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) __u8 *header;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) __u8 *vheader;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271) header = kmalloc(HEADER_SIZE, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) if (!header) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) kfree(rom_desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) kfree(ti_manuf_desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278) vheader = kmalloc(HEADER_SIZE, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) if (!vheader) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) kfree(header);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) kfree(rom_desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) kfree(ti_manuf_desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286) dev_dbg(dev, "%s - Found Type BLANK FIRMWARE (Type F2) record\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) * In order to update the I2C firmware we must change
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) * the type 2 record to type 0xF2. This will force the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292) * UMP to come up in Boot Mode. Then while in boot
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293) * mode, the driver will download the latest firmware
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294) * (padded to 15.5k) into the UMP ram. Finally when the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) * device comes back up in download mode the driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296) * will cause the new firmware to be copied from the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) * UMP Ram to I2C and the firmware will update the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298) * record type from 0xf2 to 0x02.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) status = build_i2c_fw_hdr(header, fw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) if (status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302) kfree(vheader);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303) kfree(header);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304) kfree(rom_desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) kfree(ti_manuf_desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) * Update I2C with type 0xf2 record with correct
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311) * size and checksum
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) status = write_rom(serial,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) start_address,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315) HEADER_SIZE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) header);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) if (status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) kfree(vheader);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319) kfree(header);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320) kfree(rom_desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) kfree(ti_manuf_desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) * verify the write -- must do this in order for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327) * write to complete before we do the hardware reset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329) status = read_rom(serial, start_address,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) HEADER_SIZE, vheader);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) if (status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) dev_dbg(dev, "%s - can't read header back\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) kfree(vheader);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336) kfree(header);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337) kfree(rom_desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338) kfree(ti_manuf_desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) if (memcmp(vheader, header, HEADER_SIZE)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342) dev_dbg(dev, "%s - write download record failed\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344) kfree(vheader);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) kfree(header);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) kfree(rom_desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) kfree(ti_manuf_desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) kfree(vheader);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352) kfree(header);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354) dev_dbg(dev, "%s - Start firmware update\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) /* Tell firmware to copy download image into I2C */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357) status = ti_vsend_sync(serial->serial->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358) UMPC_COPY_DNLD_TO_I2C,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359) 0, 0, NULL, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360) TI_VSEND_TIMEOUT_FW_DOWNLOAD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362) dev_dbg(dev, "%s - Update complete 0x%x\n", __func__,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363) status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364) if (status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) dev_err(dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) "%s - UMPC_COPY_DNLD_TO_I2C failed\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367) __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368) kfree(rom_desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369) kfree(ti_manuf_desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375) /* The device is running the download code */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376) kfree(rom_desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377) kfree(ti_manuf_desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381) static int do_boot_mode(struct edgeport_serial *serial,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) const struct firmware *fw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384) struct device *dev = &serial->serial->interface->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385) int status = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386) struct edge_ti_manuf_descriptor *ti_manuf_desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387) struct edgeport_fw_hdr *fw_hdr = (struct edgeport_fw_hdr *)fw->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389) dev_dbg(dev, "%s - RUNNING IN BOOT MODE\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391) /* Configure the TI device so we can use the BULK pipes for download */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) status = config_boot_dev(serial->serial->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393) if (status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396) if (le16_to_cpu(serial->serial->dev->descriptor.idVendor)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397) != USB_VENDOR_ID_ION) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398) dev_dbg(dev, "%s - VID = 0x%x\n", __func__,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399) le16_to_cpu(serial->serial->dev->descriptor.idVendor));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400) serial->TI_I2C_Type = DTK_ADDR_SPACE_I2C_TYPE_II;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401) goto stayinbootmode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405) * We have an ION device (I2c Must be programmed)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406) * Determine I2C image type
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408) if (i2c_type_bootmode(serial))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) goto stayinbootmode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411) /* Check for ION Vendor ID and that the I2C is valid */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412) if (!check_i2c_image(serial)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413) struct ti_i2c_image_header *header;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415) __u8 cs = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416) __u8 *buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417) int buffer_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420) * Validate Hardware version number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421) * Read Manufacturing Descriptor from TI Based Edgeport
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423) ti_manuf_desc = kmalloc(sizeof(*ti_manuf_desc), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) if (!ti_manuf_desc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427) status = get_manuf_info(serial, (__u8 *)ti_manuf_desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428) if (status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) kfree(ti_manuf_desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) goto stayinbootmode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433) /* Check for version 2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) if (!ignore_cpu_rev && ti_cpu_rev(ti_manuf_desc) < 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435) dev_dbg(dev, "%s - Wrong CPU Rev %d (Must be 2)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436) __func__, ti_cpu_rev(ti_manuf_desc));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437) kfree(ti_manuf_desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) goto stayinbootmode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441) kfree(ti_manuf_desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444) * In order to update the I2C firmware we must change the type
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445) * 2 record to type 0xF2. This will force the UMP to come up
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446) * in Boot Mode. Then while in boot mode, the driver will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447) * download the latest firmware (padded to 15.5k) into the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448) * UMP ram. Finally when the device comes back up in download
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449) * mode the driver will cause the new firmware to be copied
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450) * from the UMP Ram to I2C and the firmware will update the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451) * record type from 0xf2 to 0x02.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453) * Do we really have to copy the whole firmware image,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454) * or could we do this in place!
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457) /* Allocate a 15.5k buffer + 3 byte header */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458) buffer_size = (((1024 * 16) - 512) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459) sizeof(struct ti_i2c_image_header));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460) buffer = kmalloc(buffer_size, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461) if (!buffer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) /* Initialize the buffer to 0xff (pad the buffer) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465) memset(buffer, 0xff, buffer_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466) memcpy(buffer, &fw->data[4], fw->size - 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468) for (i = sizeof(struct ti_i2c_image_header);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469) i < buffer_size; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470) cs = (__u8)(cs + buffer[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473) header = (struct ti_i2c_image_header *)buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475) /* update length and checksum after padding */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476) header->Length = cpu_to_le16((__u16)(buffer_size -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477) sizeof(struct ti_i2c_image_header)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478) header->CheckSum = cs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480) /* Download the operational code */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481) dev_dbg(dev, "%s - Downloading operational code image version %d.%d (TI UMP)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482) __func__,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483) fw_hdr->major_version, fw_hdr->minor_version);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484) status = download_code(serial, buffer, buffer_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486) kfree(buffer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488) if (status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489) dev_dbg(dev, "%s - Error downloading operational code image\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493) /* Device will reboot */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494) serial->product_info.TiMode = TI_MODE_TRANSITIONING;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496) dev_dbg(dev, "%s - Download successful -- Device rebooting...\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501) stayinbootmode:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502) /* Eprom is invalid or blank stay in boot mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503) dev_dbg(dev, "%s - STAYING IN BOOT MODE\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504) serial->product_info.TiMode = TI_MODE_BOOT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509) static int ti_do_config(struct edgeport_port *port, int feature, int on)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511) int port_number = port->port->port_number;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513) on = !!on; /* 1 or 0 not bitmask */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514) return send_cmd(port->port->serial->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515) feature, (__u8)(UMPM_UART1_PORT + port_number),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516) on, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519) static int restore_mcr(struct edgeport_port *port, __u8 mcr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521) int status = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523) dev_dbg(&port->port->dev, "%s - %x\n", __func__, mcr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525) status = ti_do_config(port, UMPC_SET_CLR_DTR, mcr & MCR_DTR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526) if (status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528) status = ti_do_config(port, UMPC_SET_CLR_RTS, mcr & MCR_RTS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529) if (status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531) return ti_do_config(port, UMPC_SET_CLR_LOOPBACK, mcr & MCR_LOOPBACK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534) /* Convert TI LSR to standard UART flags */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535) static __u8 map_line_status(__u8 ti_lsr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537) __u8 lsr = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539) #define MAP_FLAG(flagUmp, flagUart) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540) if (ti_lsr & flagUmp) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541) lsr |= flagUart;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543) MAP_FLAG(UMP_UART_LSR_OV_MASK, LSR_OVER_ERR) /* overrun */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544) MAP_FLAG(UMP_UART_LSR_PE_MASK, LSR_PAR_ERR) /* parity error */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545) MAP_FLAG(UMP_UART_LSR_FE_MASK, LSR_FRM_ERR) /* framing error */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546) MAP_FLAG(UMP_UART_LSR_BR_MASK, LSR_BREAK) /* break detected */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547) MAP_FLAG(UMP_UART_LSR_RX_MASK, LSR_RX_AVAIL) /* rx data available */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548) MAP_FLAG(UMP_UART_LSR_TX_MASK, LSR_TX_EMPTY) /* tx hold reg empty */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1549)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1550) #undef MAP_FLAG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1551)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1552) return lsr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1553) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1554)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1555) static void handle_new_msr(struct edgeport_port *edge_port, __u8 msr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1556) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1557) struct async_icount *icount;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1558) struct tty_struct *tty;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1559)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1560) dev_dbg(&edge_port->port->dev, "%s - %02x\n", __func__, msr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1561)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1562) if (msr & (EDGEPORT_MSR_DELTA_CTS | EDGEPORT_MSR_DELTA_DSR |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1563) EDGEPORT_MSR_DELTA_RI | EDGEPORT_MSR_DELTA_CD)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1564) icount = &edge_port->port->icount;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1565)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1566) /* update input line counters */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1567) if (msr & EDGEPORT_MSR_DELTA_CTS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1568) icount->cts++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1569) if (msr & EDGEPORT_MSR_DELTA_DSR)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1570) icount->dsr++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1571) if (msr & EDGEPORT_MSR_DELTA_CD)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1572) icount->dcd++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1573) if (msr & EDGEPORT_MSR_DELTA_RI)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1574) icount->rng++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1575) wake_up_interruptible(&edge_port->port->port.delta_msr_wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1576) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1577)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1578) /* Save the new modem status */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1579) edge_port->shadow_msr = msr & 0xf0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1580)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1581) tty = tty_port_tty_get(&edge_port->port->port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1582) /* handle CTS flow control */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1583) if (tty && C_CRTSCTS(tty)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1584) if (msr & EDGEPORT_MSR_CTS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1585) tty_wakeup(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1586) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1587) tty_kref_put(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1588) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1589)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1590) static void handle_new_lsr(struct edgeport_port *edge_port, int lsr_data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1591) __u8 lsr, __u8 data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1592) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1593) struct async_icount *icount;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1594) __u8 new_lsr = (__u8)(lsr & (__u8)(LSR_OVER_ERR | LSR_PAR_ERR |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1595) LSR_FRM_ERR | LSR_BREAK));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1596)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1597) dev_dbg(&edge_port->port->dev, "%s - %02x\n", __func__, new_lsr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1598)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1599) edge_port->shadow_lsr = lsr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1600)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1601) if (new_lsr & LSR_BREAK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1602) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1603) * Parity and Framing errors only count if they
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1604) * occur exclusive of a break being received.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1605) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1606) new_lsr &= (__u8)(LSR_OVER_ERR | LSR_BREAK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1607)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1608) /* Place LSR data byte into Rx buffer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1609) if (lsr_data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1610) edge_tty_recv(edge_port->port, &data, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1611)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1612) /* update input line counters */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1613) icount = &edge_port->port->icount;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1614) if (new_lsr & LSR_BREAK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1615) icount->brk++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1616) if (new_lsr & LSR_OVER_ERR)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1617) icount->overrun++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1618) if (new_lsr & LSR_PAR_ERR)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1619) icount->parity++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1620) if (new_lsr & LSR_FRM_ERR)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1621) icount->frame++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1622) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1623)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1624) static void edge_interrupt_callback(struct urb *urb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1625) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1626) struct edgeport_serial *edge_serial = urb->context;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1627) struct usb_serial_port *port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1628) struct edgeport_port *edge_port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1629) struct device *dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1630) unsigned char *data = urb->transfer_buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1631) int length = urb->actual_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1632) int port_number;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1633) int function;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1634) int retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1635) __u8 lsr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1636) __u8 msr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1637) int status = urb->status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1638)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1639) switch (status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1640) case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1641) /* success */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1642) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1643) case -ECONNRESET:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1644) case -ENOENT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1645) case -ESHUTDOWN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1646) /* this urb is terminated, clean up */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1647) dev_dbg(&urb->dev->dev, "%s - urb shutting down with status: %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1648) __func__, status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1649) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1650) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1651) dev_err(&urb->dev->dev, "%s - nonzero urb status received: "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1652) "%d\n", __func__, status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1653) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1654) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1655)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1656) if (!length) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1657) dev_dbg(&urb->dev->dev, "%s - no data in urb\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1658) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1659) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1660)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1661) dev = &edge_serial->serial->dev->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1662) usb_serial_debug_data(dev, __func__, length, data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1663)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1664) if (length != 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1665) dev_dbg(dev, "%s - expecting packet of size 2, got %d\n", __func__, length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1666) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1667) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1668)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1669) port_number = TIUMP_GET_PORT_FROM_CODE(data[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1670) function = TIUMP_GET_FUNC_FROM_CODE(data[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1671) dev_dbg(dev, "%s - port_number %d, function %d, info 0x%x\n", __func__,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1672) port_number, function, data[1]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1673)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1674) if (port_number >= edge_serial->serial->num_ports) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1675) dev_err(dev, "bad port number %d\n", port_number);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1676) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1677) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1678)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1679) port = edge_serial->serial->port[port_number];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1680) edge_port = usb_get_serial_port_data(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1681) if (!edge_port) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1682) dev_dbg(dev, "%s - edge_port not found\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1683) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1684) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1685) switch (function) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1686) case TIUMP_INTERRUPT_CODE_LSR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1687) lsr = map_line_status(data[1]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1688) if (lsr & UMP_UART_LSR_DATA_MASK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1689) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1690) * Save the LSR event for bulk read completion routine
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1691) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1692) dev_dbg(dev, "%s - LSR Event Port %u LSR Status = %02x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1693) __func__, port_number, lsr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1694) edge_port->lsr_event = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1695) edge_port->lsr_mask = lsr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1696) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1697) dev_dbg(dev, "%s - ===== Port %d LSR Status = %02x ======\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1698) __func__, port_number, lsr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1699) handle_new_lsr(edge_port, 0, lsr, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1700) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1701) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1702)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1703) case TIUMP_INTERRUPT_CODE_MSR: /* MSR */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1704) /* Copy MSR from UMP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1705) msr = data[1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1706) dev_dbg(dev, "%s - ===== Port %u MSR Status = %02x ======\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1707) __func__, port_number, msr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1708) handle_new_msr(edge_port, msr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1709) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1710)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1711) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1712) dev_err(&urb->dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1713) "%s - Unknown Interrupt code from UMP %x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1714) __func__, data[1]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1715) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1716)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1717) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1718)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1719) exit:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1720) retval = usb_submit_urb(urb, GFP_ATOMIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1721) if (retval)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1722) dev_err(&urb->dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1723) "%s - usb_submit_urb failed with result %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1724) __func__, retval);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1725) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1726)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1727) static void edge_bulk_in_callback(struct urb *urb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1728) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1729) struct edgeport_port *edge_port = urb->context;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1730) struct device *dev = &edge_port->port->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1731) unsigned char *data = urb->transfer_buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1732) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1733) int retval = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1734) int port_number;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1735) int status = urb->status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1736)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1737) switch (status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1738) case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1739) /* success */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1740) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1741) case -ECONNRESET:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1742) case -ENOENT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1743) case -ESHUTDOWN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1744) /* this urb is terminated, clean up */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1745) dev_dbg(&urb->dev->dev, "%s - urb shutting down with status: %d\n", __func__, status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1746) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1747) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1748) dev_err(&urb->dev->dev, "%s - nonzero read bulk status received: %d\n", __func__, status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1749) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1750)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1751) if (status == -EPIPE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1752) goto exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1753)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1754) if (status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1755) dev_err(&urb->dev->dev, "%s - stopping read!\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1756) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1757) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1758)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1759) port_number = edge_port->port->port_number;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1760)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1761) if (urb->actual_length > 0 && edge_port->lsr_event) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1762) edge_port->lsr_event = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1763) dev_dbg(dev, "%s ===== Port %u LSR Status = %02x, Data = %02x ======\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1764) __func__, port_number, edge_port->lsr_mask, *data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1765) handle_new_lsr(edge_port, 1, edge_port->lsr_mask, *data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1766) /* Adjust buffer length/pointer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1767) --urb->actual_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1768) ++data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1769) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1770)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1771) if (urb->actual_length) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1772) usb_serial_debug_data(dev, __func__, urb->actual_length, data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1773) if (edge_port->close_pending)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1774) dev_dbg(dev, "%s - close pending, dropping data on the floor\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1775) __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1776) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1777) edge_tty_recv(edge_port->port, data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1778) urb->actual_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1779) edge_port->port->icount.rx += urb->actual_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1780) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1781)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1782) exit:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1783) /* continue read unless stopped */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1784) spin_lock_irqsave(&edge_port->ep_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1785) if (edge_port->ep_read_urb_state == EDGE_READ_URB_RUNNING)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1786) retval = usb_submit_urb(urb, GFP_ATOMIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1787) else if (edge_port->ep_read_urb_state == EDGE_READ_URB_STOPPING)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1788) edge_port->ep_read_urb_state = EDGE_READ_URB_STOPPED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1789)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1790) spin_unlock_irqrestore(&edge_port->ep_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1791) if (retval)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1792) dev_err(dev, "%s - usb_submit_urb failed with result %d\n", __func__, retval);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1793) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1794)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1795) static void edge_tty_recv(struct usb_serial_port *port, unsigned char *data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1796) int length)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1797) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1798) int queued;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1799)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1800) queued = tty_insert_flip_string(&port->port, data, length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1801) if (queued < length)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1802) dev_err(&port->dev, "%s - dropping data, %d bytes lost\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1803) __func__, length - queued);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1804) tty_flip_buffer_push(&port->port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1805) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1806)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1807) static void edge_bulk_out_callback(struct urb *urb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1808) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1809) struct usb_serial_port *port = urb->context;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1810) struct edgeport_port *edge_port = usb_get_serial_port_data(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1811) int status = urb->status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1812) struct tty_struct *tty;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1813)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1814) edge_port->ep_write_urb_in_use = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1815)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1816) switch (status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1817) case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1818) /* success */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1819) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1820) case -ECONNRESET:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1821) case -ENOENT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1822) case -ESHUTDOWN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1823) /* this urb is terminated, clean up */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1824) dev_dbg(&urb->dev->dev, "%s - urb shutting down with status: %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1825) __func__, status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1826) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1827) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1828) dev_err_console(port, "%s - nonzero write bulk status "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1829) "received: %d\n", __func__, status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1830) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1831)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1832) /* send any buffered data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1833) tty = tty_port_tty_get(&port->port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1834) edge_send(port, tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1835) tty_kref_put(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1836) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1837)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1838) static int edge_open(struct tty_struct *tty, struct usb_serial_port *port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1839) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1840) struct edgeport_port *edge_port = usb_get_serial_port_data(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1841) struct edgeport_serial *edge_serial;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1842) struct usb_device *dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1843) struct urb *urb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1844) int port_number;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1845) int status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1846) u16 open_settings;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1847) u8 transaction_timeout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1848)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1849) if (edge_port == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1850) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1851)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1852) port_number = port->port_number;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1853)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1854) dev = port->serial->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1855)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1856) /* turn off loopback */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1857) status = ti_do_config(edge_port, UMPC_SET_CLR_LOOPBACK, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1858) if (status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1859) dev_err(&port->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1860) "%s - cannot send clear loopback command, %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1861) __func__, status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1862) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1863) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1864)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1865) /* set up the port settings */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1866) if (tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1867) edge_set_termios(tty, port, &tty->termios);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1868)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1869) /* open up the port */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1870)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1871) /* milliseconds to timeout for DMA transfer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1872) transaction_timeout = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1873)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1874) edge_port->ump_read_timeout =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1875) max(20, ((transaction_timeout * 3) / 2));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1876)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1877) /* milliseconds to timeout for DMA transfer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1878) open_settings = (u8)(UMP_DMA_MODE_CONTINOUS |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1879) UMP_PIPE_TRANS_TIMEOUT_ENA |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1880) (transaction_timeout << 2));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1881)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1882) dev_dbg(&port->dev, "%s - Sending UMPC_OPEN_PORT\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1883)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1884) /* Tell TI to open and start the port */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1885) status = send_cmd(dev, UMPC_OPEN_PORT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1886) (u8)(UMPM_UART1_PORT + port_number), open_settings, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1887) if (status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1888) dev_err(&port->dev, "%s - cannot send open command, %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1889) __func__, status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1890) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1891) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1892)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1893) /* Start the DMA? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1894) status = send_cmd(dev, UMPC_START_PORT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1895) (u8)(UMPM_UART1_PORT + port_number), 0, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1896) if (status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1897) dev_err(&port->dev, "%s - cannot send start DMA command, %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1898) __func__, status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1899) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1900) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1901)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1902) /* Clear TX and RX buffers in UMP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1903) status = purge_port(port, UMP_PORT_DIR_OUT | UMP_PORT_DIR_IN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1904) if (status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1905) dev_err(&port->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1906) "%s - cannot send clear buffers command, %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1907) __func__, status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1908) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1909) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1910)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1911) /* Read Initial MSR */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1912) status = ti_vread_sync(dev, UMPC_READ_MSR, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1913) (__u16)(UMPM_UART1_PORT + port_number),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1914) &edge_port->shadow_msr, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1915) if (status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1916) dev_err(&port->dev, "%s - cannot send read MSR command, %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1917) __func__, status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1918) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1919) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1920)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1921) dev_dbg(&port->dev, "ShadowMSR 0x%X\n", edge_port->shadow_msr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1922)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1923) /* Set Initial MCR */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1924) edge_port->shadow_mcr = MCR_RTS | MCR_DTR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1925) dev_dbg(&port->dev, "ShadowMCR 0x%X\n", edge_port->shadow_mcr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1926)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1927) edge_serial = edge_port->edge_serial;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1928) if (mutex_lock_interruptible(&edge_serial->es_lock))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1929) return -ERESTARTSYS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1930) if (edge_serial->num_ports_open == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1931) /* we are the first port to open, post the interrupt urb */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1932) urb = edge_serial->serial->port[0]->interrupt_in_urb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1933) urb->context = edge_serial;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1934) status = usb_submit_urb(urb, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1935) if (status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1936) dev_err(&port->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1937) "%s - usb_submit_urb failed with value %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1938) __func__, status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1939) goto release_es_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1940) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1941) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1942)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1943) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1944) * reset the data toggle on the bulk endpoints to work around bug in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1945) * host controllers where things get out of sync some times
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1946) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1947) usb_clear_halt(dev, port->write_urb->pipe);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1948) usb_clear_halt(dev, port->read_urb->pipe);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1949)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1950) /* start up our bulk read urb */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1951) urb = port->read_urb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1952) edge_port->ep_read_urb_state = EDGE_READ_URB_RUNNING;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1953) urb->context = edge_port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1954) status = usb_submit_urb(urb, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1955) if (status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1956) dev_err(&port->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1957) "%s - read bulk usb_submit_urb failed with value %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1958) __func__, status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1959) goto unlink_int_urb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1960) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1961)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1962) ++edge_serial->num_ports_open;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1963)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1964) goto release_es_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1965)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1966) unlink_int_urb:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1967) if (edge_port->edge_serial->num_ports_open == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1968) usb_kill_urb(port->serial->port[0]->interrupt_in_urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1969) release_es_lock:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1970) mutex_unlock(&edge_serial->es_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1971) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1972) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1973)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1974) static void edge_close(struct usb_serial_port *port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1975) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1976) struct edgeport_serial *edge_serial;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1977) struct edgeport_port *edge_port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1978) struct usb_serial *serial = port->serial;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1979) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1980) int port_number;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1981)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1982) edge_serial = usb_get_serial_data(port->serial);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1983) edge_port = usb_get_serial_port_data(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1984) if (edge_serial == NULL || edge_port == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1985) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1986)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1987) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1988) * The bulkreadcompletion routine will check
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1989) * this flag and dump add read data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1990) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1991) edge_port->close_pending = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1992)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1993) usb_kill_urb(port->read_urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1994) usb_kill_urb(port->write_urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1995) edge_port->ep_write_urb_in_use = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1996) spin_lock_irqsave(&edge_port->ep_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1997) kfifo_reset_out(&port->write_fifo);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1998) spin_unlock_irqrestore(&edge_port->ep_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1999)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2000) dev_dbg(&port->dev, "%s - send umpc_close_port\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2001) port_number = port->port_number;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2002) send_cmd(serial->dev, UMPC_CLOSE_PORT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2003) (__u8)(UMPM_UART1_PORT + port_number), 0, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2004)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2005) mutex_lock(&edge_serial->es_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2006) --edge_port->edge_serial->num_ports_open;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2007) if (edge_port->edge_serial->num_ports_open <= 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2008) /* last port is now closed, let's shut down our interrupt urb */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2009) usb_kill_urb(port->serial->port[0]->interrupt_in_urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2010) edge_port->edge_serial->num_ports_open = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2011) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2012) mutex_unlock(&edge_serial->es_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2013) edge_port->close_pending = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2014) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2015)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2016) static int edge_write(struct tty_struct *tty, struct usb_serial_port *port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2017) const unsigned char *data, int count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2018) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2019) struct edgeport_port *edge_port = usb_get_serial_port_data(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2020)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2021) if (count == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2022) dev_dbg(&port->dev, "%s - write request of 0 bytes\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2023) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2024) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2025)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2026) if (edge_port == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2027) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2028) if (edge_port->close_pending == 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2029) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2030)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2031) count = kfifo_in_locked(&port->write_fifo, data, count,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2032) &edge_port->ep_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2033) edge_send(port, tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2034)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2035) return count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2036) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2037)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2038) static void edge_send(struct usb_serial_port *port, struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2039) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2040) int count, result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2041) struct edgeport_port *edge_port = usb_get_serial_port_data(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2042) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2043)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2044) spin_lock_irqsave(&edge_port->ep_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2045)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2046) if (edge_port->ep_write_urb_in_use) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2047) spin_unlock_irqrestore(&edge_port->ep_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2048) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2049) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2050)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2051) count = kfifo_out(&port->write_fifo,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2052) port->write_urb->transfer_buffer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2053) port->bulk_out_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2054)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2055) if (count == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2056) spin_unlock_irqrestore(&edge_port->ep_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2057) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2058) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2059)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2060) edge_port->ep_write_urb_in_use = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2061)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2062) spin_unlock_irqrestore(&edge_port->ep_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2063)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2064) usb_serial_debug_data(&port->dev, __func__, count, port->write_urb->transfer_buffer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2065)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2066) /* set up our urb */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2067) port->write_urb->transfer_buffer_length = count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2068)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2069) /* send the data out the bulk port */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2070) result = usb_submit_urb(port->write_urb, GFP_ATOMIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2071) if (result) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2072) dev_err_console(port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2073) "%s - failed submitting write urb, error %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2074) __func__, result);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2075) edge_port->ep_write_urb_in_use = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2076) /* TODO: reschedule edge_send */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2077) } else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2078) edge_port->port->icount.tx += count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2079)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2080) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2081) * wakeup any process waiting for writes to complete
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2082) * there is now more room in the buffer for new writes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2083) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2084) if (tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2085) tty_wakeup(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2086) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2087)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2088) static int edge_write_room(struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2089) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2090) struct usb_serial_port *port = tty->driver_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2091) struct edgeport_port *edge_port = usb_get_serial_port_data(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2092) int room = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2093) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2094)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2095) if (edge_port == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2096) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2097) if (edge_port->close_pending == 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2098) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2099)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2100) spin_lock_irqsave(&edge_port->ep_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2101) room = kfifo_avail(&port->write_fifo);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2102) spin_unlock_irqrestore(&edge_port->ep_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2103)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2104) dev_dbg(&port->dev, "%s - returns %d\n", __func__, room);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2105) return room;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2106) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2107)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2108) static int edge_chars_in_buffer(struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2109) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2110) struct usb_serial_port *port = tty->driver_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2111) struct edgeport_port *edge_port = usb_get_serial_port_data(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2112) int chars = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2113) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2114) if (edge_port == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2115) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2116)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2117) spin_lock_irqsave(&edge_port->ep_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2118) chars = kfifo_len(&port->write_fifo);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2119) spin_unlock_irqrestore(&edge_port->ep_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2120)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2121) dev_dbg(&port->dev, "%s - returns %d\n", __func__, chars);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2122) return chars;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2123) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2124)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2125) static bool edge_tx_empty(struct usb_serial_port *port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2126) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2127) struct edgeport_port *edge_port = usb_get_serial_port_data(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2128) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2129)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2130) ret = tx_active(edge_port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2131) if (ret > 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2132) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2133)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2134) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2135) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2136)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2137) static void edge_throttle(struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2138) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2139) struct usb_serial_port *port = tty->driver_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2140) struct edgeport_port *edge_port = usb_get_serial_port_data(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2141) int status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2142)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2143) if (edge_port == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2144) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2145)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2146) /* if we are implementing XON/XOFF, send the stop character */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2147) if (I_IXOFF(tty)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2148) unsigned char stop_char = STOP_CHAR(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2149) status = edge_write(tty, port, &stop_char, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2150) if (status <= 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2151) dev_err(&port->dev, "%s - failed to write stop character, %d\n", __func__, status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2152) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2153) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2154)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2155) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2156) * if we are implementing RTS/CTS, stop reads
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2157) * and the Edgeport will clear the RTS line
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2158) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2159) if (C_CRTSCTS(tty))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2160) stop_read(edge_port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2162) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2163)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2164) static void edge_unthrottle(struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2165) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2166) struct usb_serial_port *port = tty->driver_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2167) struct edgeport_port *edge_port = usb_get_serial_port_data(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2168) int status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2169)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2170) if (edge_port == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2171) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2172)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2173) /* if we are implementing XON/XOFF, send the start character */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2174) if (I_IXOFF(tty)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2175) unsigned char start_char = START_CHAR(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2176) status = edge_write(tty, port, &start_char, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2177) if (status <= 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2178) dev_err(&port->dev, "%s - failed to write start character, %d\n", __func__, status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2179) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2180) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2181) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2182) * if we are implementing RTS/CTS, restart reads
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2183) * are the Edgeport will assert the RTS line
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2184) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2185) if (C_CRTSCTS(tty)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2186) status = restart_read(edge_port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2187) if (status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2188) dev_err(&port->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2189) "%s - read bulk usb_submit_urb failed: %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2190) __func__, status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2191) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2192)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2193) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2194)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2195) static void stop_read(struct edgeport_port *edge_port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2196) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2197) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2198)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2199) spin_lock_irqsave(&edge_port->ep_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2200)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2201) if (edge_port->ep_read_urb_state == EDGE_READ_URB_RUNNING)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2202) edge_port->ep_read_urb_state = EDGE_READ_URB_STOPPING;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2203) edge_port->shadow_mcr &= ~MCR_RTS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2204)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2205) spin_unlock_irqrestore(&edge_port->ep_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2206) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2207)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2208) static int restart_read(struct edgeport_port *edge_port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2209) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2210) struct urb *urb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2211) int status = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2212) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2213)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2214) spin_lock_irqsave(&edge_port->ep_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2215)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2216) if (edge_port->ep_read_urb_state == EDGE_READ_URB_STOPPED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2217) urb = edge_port->port->read_urb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2218) status = usb_submit_urb(urb, GFP_ATOMIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2219) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2220) edge_port->ep_read_urb_state = EDGE_READ_URB_RUNNING;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2221) edge_port->shadow_mcr |= MCR_RTS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2222)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2223) spin_unlock_irqrestore(&edge_port->ep_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2224)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2225) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2226) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2227)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2228) static void change_port_settings(struct tty_struct *tty,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2229) struct edgeport_port *edge_port, struct ktermios *old_termios)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2230) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2231) struct device *dev = &edge_port->port->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2232) struct ump_uart_config *config;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2233) int baud;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2234) unsigned cflag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2235) int status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2236) int port_number = edge_port->port->port_number;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2237)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2238) config = kmalloc (sizeof (*config), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2239) if (!config) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2240) tty->termios = *old_termios;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2241) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2242) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2243)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2244) cflag = tty->termios.c_cflag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2245)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2246) config->wFlags = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2247)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2248) /* These flags must be set */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2249) config->wFlags |= UMP_MASK_UART_FLAGS_RECEIVE_MS_INT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2250) config->wFlags |= UMP_MASK_UART_FLAGS_AUTO_START_ON_ERR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2251) config->bUartMode = (__u8)(edge_port->bUartMode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2252)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2253) switch (cflag & CSIZE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2254) case CS5:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2255) config->bDataBits = UMP_UART_CHAR5BITS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2256) dev_dbg(dev, "%s - data bits = 5\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2257) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2258) case CS6:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2259) config->bDataBits = UMP_UART_CHAR6BITS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2260) dev_dbg(dev, "%s - data bits = 6\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2261) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2262) case CS7:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2263) config->bDataBits = UMP_UART_CHAR7BITS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2264) dev_dbg(dev, "%s - data bits = 7\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2265) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2266) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2267) case CS8:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2268) config->bDataBits = UMP_UART_CHAR8BITS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2269) dev_dbg(dev, "%s - data bits = 8\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2270) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2271) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2272)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2273) if (cflag & PARENB) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2274) if (cflag & PARODD) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2275) config->wFlags |= UMP_MASK_UART_FLAGS_PARITY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2276) config->bParity = UMP_UART_ODDPARITY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2277) dev_dbg(dev, "%s - parity = odd\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2278) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2279) config->wFlags |= UMP_MASK_UART_FLAGS_PARITY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2280) config->bParity = UMP_UART_EVENPARITY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2281) dev_dbg(dev, "%s - parity = even\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2282) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2283) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2284) config->bParity = UMP_UART_NOPARITY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2285) dev_dbg(dev, "%s - parity = none\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2286) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2287)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2288) if (cflag & CSTOPB) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2289) config->bStopBits = UMP_UART_STOPBIT2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2290) dev_dbg(dev, "%s - stop bits = 2\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2291) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2292) config->bStopBits = UMP_UART_STOPBIT1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2293) dev_dbg(dev, "%s - stop bits = 1\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2294) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2295)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2296) /* figure out the flow control settings */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2297) if (cflag & CRTSCTS) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2298) config->wFlags |= UMP_MASK_UART_FLAGS_OUT_X_CTS_FLOW;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2299) config->wFlags |= UMP_MASK_UART_FLAGS_RTS_FLOW;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2300) dev_dbg(dev, "%s - RTS/CTS is enabled\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2301) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2302) dev_dbg(dev, "%s - RTS/CTS is disabled\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2303) restart_read(edge_port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2304) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2305)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2306) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2307) * if we are implementing XON/XOFF, set the start and stop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2308) * character in the device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2309) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2310) config->cXon = START_CHAR(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2311) config->cXoff = STOP_CHAR(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2312)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2313) /* if we are implementing INBOUND XON/XOFF */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2314) if (I_IXOFF(tty)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2315) config->wFlags |= UMP_MASK_UART_FLAGS_IN_X;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2316) dev_dbg(dev, "%s - INBOUND XON/XOFF is enabled, XON = %2x, XOFF = %2x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2317) __func__, config->cXon, config->cXoff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2318) } else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2319) dev_dbg(dev, "%s - INBOUND XON/XOFF is disabled\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2320)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2321) /* if we are implementing OUTBOUND XON/XOFF */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2322) if (I_IXON(tty)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2323) config->wFlags |= UMP_MASK_UART_FLAGS_OUT_X;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2324) dev_dbg(dev, "%s - OUTBOUND XON/XOFF is enabled, XON = %2x, XOFF = %2x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2325) __func__, config->cXon, config->cXoff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2326) } else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2327) dev_dbg(dev, "%s - OUTBOUND XON/XOFF is disabled\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2328)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2329) tty->termios.c_cflag &= ~CMSPAR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2330)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2331) /* Round the baud rate */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2332) baud = tty_get_baud_rate(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2333) if (!baud) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2334) /* pick a default, any default... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2335) baud = 9600;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2336) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2337) /* Avoid a zero divisor. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2338) baud = min(baud, 461550);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2339) tty_encode_baud_rate(tty, baud, baud);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2340) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2341)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2342) edge_port->baud_rate = baud;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2343) config->wBaudRate = (__u16)((461550L + baud/2) / baud);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2344)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2345) /* FIXME: Recompute actual baud from divisor here */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2346)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2347) dev_dbg(dev, "%s - baud rate = %d, wBaudRate = %d\n", __func__, baud, config->wBaudRate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2348)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2349) dev_dbg(dev, "wBaudRate: %d\n", (int)(461550L / config->wBaudRate));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2350) dev_dbg(dev, "wFlags: 0x%x\n", config->wFlags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2351) dev_dbg(dev, "bDataBits: %d\n", config->bDataBits);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2352) dev_dbg(dev, "bParity: %d\n", config->bParity);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2353) dev_dbg(dev, "bStopBits: %d\n", config->bStopBits);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2354) dev_dbg(dev, "cXon: %d\n", config->cXon);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2355) dev_dbg(dev, "cXoff: %d\n", config->cXoff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2356) dev_dbg(dev, "bUartMode: %d\n", config->bUartMode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2357)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2358) /* move the word values into big endian mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2359) cpu_to_be16s(&config->wFlags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2360) cpu_to_be16s(&config->wBaudRate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2361)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2362) status = send_cmd(edge_port->port->serial->dev, UMPC_SET_CONFIG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2363) (__u8)(UMPM_UART1_PORT + port_number),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2364) 0, (__u8 *)config, sizeof(*config));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2365) if (status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2366) dev_dbg(dev, "%s - error %d when trying to write config to device\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2367) __func__, status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2368) kfree(config);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2369) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2370)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2371) static void edge_set_termios(struct tty_struct *tty,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2372) struct usb_serial_port *port, struct ktermios *old_termios)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2373) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2374) struct edgeport_port *edge_port = usb_get_serial_port_data(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2375)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2376) if (edge_port == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2377) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2378) /* change the port settings to the new ones specified */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2379) change_port_settings(tty, edge_port, old_termios);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2380) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2381)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2382) static int edge_tiocmset(struct tty_struct *tty,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2383) unsigned int set, unsigned int clear)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2384) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2385) struct usb_serial_port *port = tty->driver_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2386) struct edgeport_port *edge_port = usb_get_serial_port_data(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2387) unsigned int mcr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2388) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2389)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2390) spin_lock_irqsave(&edge_port->ep_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2391) mcr = edge_port->shadow_mcr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2392) if (set & TIOCM_RTS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2393) mcr |= MCR_RTS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2394) if (set & TIOCM_DTR)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2395) mcr |= MCR_DTR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2396) if (set & TIOCM_LOOP)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2397) mcr |= MCR_LOOPBACK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2398)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2399) if (clear & TIOCM_RTS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2400) mcr &= ~MCR_RTS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2401) if (clear & TIOCM_DTR)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2402) mcr &= ~MCR_DTR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2403) if (clear & TIOCM_LOOP)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2404) mcr &= ~MCR_LOOPBACK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2405)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2406) edge_port->shadow_mcr = mcr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2407) spin_unlock_irqrestore(&edge_port->ep_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2408)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2409) restore_mcr(edge_port, mcr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2410) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2411) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2412)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2413) static int edge_tiocmget(struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2414) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2415) struct usb_serial_port *port = tty->driver_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2416) struct edgeport_port *edge_port = usb_get_serial_port_data(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2417) unsigned int result = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2418) unsigned int msr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2419) unsigned int mcr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2420) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2421)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2422) spin_lock_irqsave(&edge_port->ep_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2423)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2424) msr = edge_port->shadow_msr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2425) mcr = edge_port->shadow_mcr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2426) result = ((mcr & MCR_DTR) ? TIOCM_DTR: 0) /* 0x002 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2427) | ((mcr & MCR_RTS) ? TIOCM_RTS: 0) /* 0x004 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2428) | ((msr & EDGEPORT_MSR_CTS) ? TIOCM_CTS: 0) /* 0x020 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2429) | ((msr & EDGEPORT_MSR_CD) ? TIOCM_CAR: 0) /* 0x040 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2430) | ((msr & EDGEPORT_MSR_RI) ? TIOCM_RI: 0) /* 0x080 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2431) | ((msr & EDGEPORT_MSR_DSR) ? TIOCM_DSR: 0); /* 0x100 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2432)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2433)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2434) dev_dbg(&port->dev, "%s -- %x\n", __func__, result);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2435) spin_unlock_irqrestore(&edge_port->ep_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2436)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2437) return result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2438) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2439)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2440) static int get_serial_info(struct tty_struct *tty,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2441) struct serial_struct *ss)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2442) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2443) struct usb_serial_port *port = tty->driver_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2444) struct edgeport_port *edge_port = usb_get_serial_port_data(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2445) unsigned cwait;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2446)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2447) cwait = edge_port->port->port.closing_wait;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2448) if (cwait != ASYNC_CLOSING_WAIT_NONE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2449) cwait = jiffies_to_msecs(cwait) / 10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2450)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2451) ss->type = PORT_16550A;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2452) ss->line = edge_port->port->minor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2453) ss->port = edge_port->port->port_number;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2454) ss->irq = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2455) ss->xmit_fifo_size = edge_port->port->bulk_out_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2456) ss->baud_base = 9600;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2457) ss->close_delay = 5*HZ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2458) ss->closing_wait = cwait;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2459) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2460) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2461)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2462) static void edge_break(struct tty_struct *tty, int break_state)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2463) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2464) struct usb_serial_port *port = tty->driver_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2465) struct edgeport_port *edge_port = usb_get_serial_port_data(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2466) int status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2467) int bv = 0; /* Off */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2468)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2469) if (break_state == -1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2470) bv = 1; /* On */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2471) status = ti_do_config(edge_port, UMPC_SET_CLR_BREAK, bv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2472) if (status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2473) dev_dbg(&port->dev, "%s - error %d sending break set/clear command.\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2474) __func__, status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2475) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2476)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2477) static void edge_heartbeat_schedule(struct edgeport_serial *edge_serial)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2478) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2479) if (!edge_serial->use_heartbeat)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2480) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2481)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2482) schedule_delayed_work(&edge_serial->heartbeat_work,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2483) FW_HEARTBEAT_SECS * HZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2484) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2485)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2486) static void edge_heartbeat_work(struct work_struct *work)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2487) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2488) struct edgeport_serial *serial;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2489) struct ti_i2c_desc *rom_desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2490)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2491) serial = container_of(work, struct edgeport_serial,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2492) heartbeat_work.work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2493)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2494) rom_desc = kmalloc(sizeof(*rom_desc), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2495)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2496) /* Descriptor address request is enough to reset the firmware timer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2497) if (!rom_desc || !get_descriptor_addr(serial, I2C_DESC_TYPE_ION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2498) rom_desc)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2499) dev_err(&serial->serial->interface->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2500) "%s - Incomplete heartbeat\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2501) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2502) kfree(rom_desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2503)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2504) edge_heartbeat_schedule(serial);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2505) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2506)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2507) static int edge_calc_num_ports(struct usb_serial *serial,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2508) struct usb_serial_endpoints *epds)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2509) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2510) struct device *dev = &serial->interface->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2511) unsigned char num_ports = serial->type->num_ports;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2512)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2513) /* Make sure we have the required endpoints when in download mode. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2514) if (serial->interface->cur_altsetting->desc.bNumEndpoints > 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2515) if (epds->num_bulk_in < num_ports ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2516) epds->num_bulk_out < num_ports ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2517) epds->num_interrupt_in < 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2518) dev_err(dev, "required endpoints missing\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2519) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2520) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2521) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2522)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2523) return num_ports;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2524) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2525)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2526) static int edge_startup(struct usb_serial *serial)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2527) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2528) struct edgeport_serial *edge_serial;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2529) int status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2530) u16 product_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2531)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2532) /* create our private serial structure */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2533) edge_serial = kzalloc(sizeof(struct edgeport_serial), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2534) if (!edge_serial)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2535) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2536)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2537) mutex_init(&edge_serial->es_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2538) edge_serial->serial = serial;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2539) INIT_DELAYED_WORK(&edge_serial->heartbeat_work, edge_heartbeat_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2540) usb_set_serial_data(serial, edge_serial);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2541)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2542) status = download_fw(edge_serial);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2543) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2544) kfree(edge_serial);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2545) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2546) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2547)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2548) if (status > 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2549) return 1; /* bind but do not register any ports */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2550)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2551) product_id = le16_to_cpu(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2552) edge_serial->serial->dev->descriptor.idProduct);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2553)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2554) /* Currently only the EP/416 models require heartbeat support */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2555) if (edge_serial->fw_version > FW_HEARTBEAT_VERSION_CUTOFF) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2556) if (product_id == ION_DEVICE_ID_TI_EDGEPORT_416 ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2557) product_id == ION_DEVICE_ID_TI_EDGEPORT_416B) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2558) edge_serial->use_heartbeat = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2559) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2560) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2561)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2562) edge_heartbeat_schedule(edge_serial);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2563)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2564) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2565) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2566)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2567) static void edge_disconnect(struct usb_serial *serial)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2568) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2569) struct edgeport_serial *edge_serial = usb_get_serial_data(serial);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2570)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2571) cancel_delayed_work_sync(&edge_serial->heartbeat_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2572) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2573)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2574) static void edge_release(struct usb_serial *serial)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2575) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2576) struct edgeport_serial *edge_serial = usb_get_serial_data(serial);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2577)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2578) cancel_delayed_work_sync(&edge_serial->heartbeat_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2579) kfree(edge_serial);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2580) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2581)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2582) static int edge_port_probe(struct usb_serial_port *port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2583) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2584) struct edgeport_port *edge_port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2585) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2586)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2587) edge_port = kzalloc(sizeof(*edge_port), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2588) if (!edge_port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2589) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2590)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2591) spin_lock_init(&edge_port->ep_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2592) edge_port->port = port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2593) edge_port->edge_serial = usb_get_serial_data(port->serial);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2594) edge_port->bUartMode = default_uart_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2595)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2596) switch (port->port_number) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2597) case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2598) edge_port->uart_base = UMPMEM_BASE_UART1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2599) edge_port->dma_address = UMPD_OEDB1_ADDRESS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2600) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2601) case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2602) edge_port->uart_base = UMPMEM_BASE_UART2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2603) edge_port->dma_address = UMPD_OEDB2_ADDRESS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2604) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2605) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2606) dev_err(&port->dev, "unknown port number\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2607) ret = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2608) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2609) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2610)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2611) dev_dbg(&port->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2612) "%s - port_number = %d, uart_base = %04x, dma_address = %04x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2613) __func__, port->port_number, edge_port->uart_base,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2614) edge_port->dma_address);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2615)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2616) usb_set_serial_port_data(port, edge_port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2617)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2618) ret = edge_create_sysfs_attrs(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2619) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2620) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2621)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2622) port->port.closing_wait = msecs_to_jiffies(closing_wait * 10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2623) port->port.drain_delay = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2624)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2625) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2626) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2627) kfree(edge_port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2628)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2629) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2630) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2631)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2632) static int edge_port_remove(struct usb_serial_port *port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2633) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2634) struct edgeport_port *edge_port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2635)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2636) edge_port = usb_get_serial_port_data(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2637) edge_remove_sysfs_attrs(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2638) kfree(edge_port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2639)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2640) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2641) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2642)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2643) /* Sysfs Attributes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2644)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2645) static ssize_t uart_mode_show(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2646) struct device_attribute *attr, char *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2647) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2648) struct usb_serial_port *port = to_usb_serial_port(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2649) struct edgeport_port *edge_port = usb_get_serial_port_data(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2650)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2651) return sprintf(buf, "%d\n", edge_port->bUartMode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2652) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2653)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2654) static ssize_t uart_mode_store(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2655) struct device_attribute *attr, const char *valbuf, size_t count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2656) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2657) struct usb_serial_port *port = to_usb_serial_port(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2658) struct edgeport_port *edge_port = usb_get_serial_port_data(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2659) unsigned int v = simple_strtoul(valbuf, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2660)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2661) dev_dbg(dev, "%s: setting uart_mode = %d\n", __func__, v);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2662)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2663) if (v < 256)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2664) edge_port->bUartMode = v;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2665) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2666) dev_err(dev, "%s - uart_mode %d is invalid\n", __func__, v);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2667)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2668) return count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2669) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2670) static DEVICE_ATTR_RW(uart_mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2671)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2672) static int edge_create_sysfs_attrs(struct usb_serial_port *port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2673) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2674) return device_create_file(&port->dev, &dev_attr_uart_mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2675) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2676)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2677) static int edge_remove_sysfs_attrs(struct usb_serial_port *port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2678) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2679) device_remove_file(&port->dev, &dev_attr_uart_mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2680) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2681) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2682)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2683) #ifdef CONFIG_PM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2684) static int edge_suspend(struct usb_serial *serial, pm_message_t message)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2685) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2686) struct edgeport_serial *edge_serial = usb_get_serial_data(serial);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2687)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2688) cancel_delayed_work_sync(&edge_serial->heartbeat_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2689)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2690) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2691) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2692)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2693) static int edge_resume(struct usb_serial *serial)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2694) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2695) struct edgeport_serial *edge_serial = usb_get_serial_data(serial);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2696)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2697) edge_heartbeat_schedule(edge_serial);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2698)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2699) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2700) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2701) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2702)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2703) static struct usb_serial_driver edgeport_1port_device = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2704) .driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2705) .owner = THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2706) .name = "edgeport_ti_1",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2707) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2708) .description = "Edgeport TI 1 port adapter",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2709) .id_table = edgeport_1port_id_table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2710) .num_ports = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2711) .num_bulk_out = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2712) .open = edge_open,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2713) .close = edge_close,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2714) .throttle = edge_throttle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2715) .unthrottle = edge_unthrottle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2716) .attach = edge_startup,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2717) .calc_num_ports = edge_calc_num_ports,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2718) .disconnect = edge_disconnect,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2719) .release = edge_release,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2720) .port_probe = edge_port_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2721) .port_remove = edge_port_remove,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2722) .get_serial = get_serial_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2723) .set_termios = edge_set_termios,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2724) .tiocmget = edge_tiocmget,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2725) .tiocmset = edge_tiocmset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2726) .tiocmiwait = usb_serial_generic_tiocmiwait,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2727) .get_icount = usb_serial_generic_get_icount,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2728) .write = edge_write,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2729) .write_room = edge_write_room,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2730) .chars_in_buffer = edge_chars_in_buffer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2731) .tx_empty = edge_tx_empty,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2732) .break_ctl = edge_break,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2733) .read_int_callback = edge_interrupt_callback,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2734) .read_bulk_callback = edge_bulk_in_callback,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2735) .write_bulk_callback = edge_bulk_out_callback,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2736) #ifdef CONFIG_PM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2737) .suspend = edge_suspend,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2738) .resume = edge_resume,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2739) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2740) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2741)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2742) static struct usb_serial_driver edgeport_2port_device = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2743) .driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2744) .owner = THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2745) .name = "edgeport_ti_2",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2746) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2747) .description = "Edgeport TI 2 port adapter",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2748) .id_table = edgeport_2port_id_table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2749) .num_ports = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2750) .num_bulk_out = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2751) .open = edge_open,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2752) .close = edge_close,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2753) .throttle = edge_throttle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2754) .unthrottle = edge_unthrottle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2755) .attach = edge_startup,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2756) .calc_num_ports = edge_calc_num_ports,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2757) .disconnect = edge_disconnect,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2758) .release = edge_release,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2759) .port_probe = edge_port_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2760) .port_remove = edge_port_remove,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2761) .get_serial = get_serial_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2762) .set_termios = edge_set_termios,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2763) .tiocmget = edge_tiocmget,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2764) .tiocmset = edge_tiocmset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2765) .tiocmiwait = usb_serial_generic_tiocmiwait,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2766) .get_icount = usb_serial_generic_get_icount,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2767) .write = edge_write,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2768) .write_room = edge_write_room,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2769) .chars_in_buffer = edge_chars_in_buffer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2770) .tx_empty = edge_tx_empty,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2771) .break_ctl = edge_break,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2772) .read_int_callback = edge_interrupt_callback,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2773) .read_bulk_callback = edge_bulk_in_callback,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2774) .write_bulk_callback = edge_bulk_out_callback,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2775) #ifdef CONFIG_PM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2776) .suspend = edge_suspend,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2777) .resume = edge_resume,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2778) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2779) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2780)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2781) static struct usb_serial_driver * const serial_drivers[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2782) &edgeport_1port_device, &edgeport_2port_device, NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2783) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2784)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2785) module_usb_serial_driver(serial_drivers, id_table_combined);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2786)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2787) MODULE_AUTHOR(DRIVER_AUTHOR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2788) MODULE_DESCRIPTION(DRIVER_DESC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2789) MODULE_LICENSE("GPL");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2790) MODULE_FIRMWARE("edgeport/down3.bin");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2791)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2792) module_param(closing_wait, int, S_IRUGO | S_IWUSR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2793) MODULE_PARM_DESC(closing_wait, "Maximum wait for data to drain, in .01 secs");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2794)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2795) module_param(ignore_cpu_rev, bool, S_IRUGO | S_IWUSR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2796) MODULE_PARM_DESC(ignore_cpu_rev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2797) "Ignore the cpu revision when connecting to a device");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2798)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2799) module_param(default_uart_mode, int, S_IRUGO | S_IWUSR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2800) MODULE_PARM_DESC(default_uart_mode, "Default uart_mode, 0=RS232, ...");