^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) * hfcsusb.h, HFC-S USB mISDN driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) #ifndef __HFCSUSB_H__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #define __HFCSUSB_H__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #define DRIVER_NAME "HFC-S_USB"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #define DBG_HFC_CALL_TRACE 0x00010000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #define DBG_HFC_FIFO_VERBOSE 0x00020000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #define DBG_HFC_USB_VERBOSE 0x00100000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #define DBG_HFC_URB_INFO 0x00200000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #define DBG_HFC_URB_ERROR 0x00400000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #define DEFAULT_TRANSP_BURST_SZ 128
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #define HFC_CTRL_TIMEOUT 20 /* 5ms timeout writing/reading regs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #define CLKDEL_TE 0x0f /* CLKDEL in TE mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #define CLKDEL_NT 0x6c /* CLKDEL in NT mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) /* hfcsusb Layer1 commands */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #define HFC_L1_ACTIVATE_TE 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #define HFC_L1_ACTIVATE_NT 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #define HFC_L1_DEACTIVATE_NT 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #define HFC_L1_FORCE_DEACTIVATE_TE 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) /* cmd FLAGS in HFCUSB_STATES register */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #define HFCUSB_LOAD_STATE 0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #define HFCUSB_ACTIVATE 0x20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #define HFCUSB_DO_ACTION 0x40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #define HFCUSB_NT_G2_G3 0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) /* timers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #define NT_ACTIVATION_TIMER 0x01 /* enables NT mode activation Timer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) #define NT_T1_COUNT 10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #define MAX_BCH_SIZE 2048 /* allowed B-channel packet size */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #define HFCUSB_RX_THRESHOLD 64 /* threshold for fifo report bit rx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) #define HFCUSB_TX_THRESHOLD 96 /* threshold for fifo report bit tx */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) #define HFCUSB_CHIP_ID 0x16 /* Chip ID register index */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) #define HFCUSB_CIRM 0x00 /* cirm register index */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) #define HFCUSB_USB_SIZE 0x07 /* int length register */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) #define HFCUSB_USB_SIZE_I 0x06 /* iso length register */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) #define HFCUSB_F_CROSS 0x0b /* bit order register */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) #define HFCUSB_CLKDEL 0x37 /* bit delay register */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) #define HFCUSB_CON_HDLC 0xfa /* channel connect register */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) #define HFCUSB_HDLC_PAR 0xfb
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) #define HFCUSB_SCTRL 0x31 /* S-bus control register (tx) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) #define HFCUSB_SCTRL_E 0x32 /* same for E and special funcs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) #define HFCUSB_SCTRL_R 0x33 /* S-bus control register (rx) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) #define HFCUSB_F_THRES 0x0c /* threshold register */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) #define HFCUSB_FIFO 0x0f /* fifo select register */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) #define HFCUSB_F_USAGE 0x1a /* fifo usage register */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) #define HFCUSB_MST_MODE0 0x14
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) #define HFCUSB_MST_MODE1 0x15
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) #define HFCUSB_P_DATA 0x1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) #define HFCUSB_INC_RES_F 0x0e
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) #define HFCUSB_B1_SSL 0x20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) #define HFCUSB_B2_SSL 0x21
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) #define HFCUSB_B1_RSL 0x24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) #define HFCUSB_B2_RSL 0x25
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) #define HFCUSB_STATES 0x30
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) #define HFCUSB_CHIPID 0x40 /* ID value of HFC-S USB */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) /* fifo registers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) #define HFCUSB_NUM_FIFOS 8 /* maximum number of fifos */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) #define HFCUSB_B1_TX 0 /* index for B1 transmit bulk/int */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) #define HFCUSB_B1_RX 1 /* index for B1 receive bulk/int */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) #define HFCUSB_B2_TX 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) #define HFCUSB_B2_RX 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) #define HFCUSB_D_TX 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) #define HFCUSB_D_RX 5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) #define HFCUSB_PCM_TX 6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) #define HFCUSB_PCM_RX 7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) #define USB_INT 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) #define USB_BULK 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) #define USB_ISOC 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) #define ISOC_PACKETS_D 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) #define ISOC_PACKETS_B 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) #define ISO_BUFFER_SIZE 128
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) /* defines how much ISO packets are handled in one URB */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) static int iso_packets[8] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) { ISOC_PACKETS_B, ISOC_PACKETS_B, ISOC_PACKETS_B, ISOC_PACKETS_B,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) ISOC_PACKETS_D, ISOC_PACKETS_D, ISOC_PACKETS_D, ISOC_PACKETS_D
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) /* Fifo flow Control for TX ISO */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) #define SINK_MAX 68
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) #define SINK_MIN 48
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) #define SINK_DMIN 12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) #define SINK_DMAX 18
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) #define BITLINE_INF (-96 * 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) /* HFC-S USB register access by Control-URSs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) #define write_reg_atomic(a, b, c) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) usb_control_msg((a)->dev, (a)->ctrl_out_pipe, 0, 0x40, (c), (b), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) 0, 0, HFC_CTRL_TIMEOUT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) #define read_reg_atomic(a, b, c) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) usb_control_msg((a)->dev, (a)->ctrl_in_pipe, 1, 0xC0, 0, (b), (c), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) 1, HFC_CTRL_TIMEOUT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) #define HFC_CTRL_BUFSIZE 64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) struct ctrl_buf {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) __u8 hfcs_reg; /* register number */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) __u8 reg_val; /* value to be written (or read) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) * URB error codes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) * Used to represent a list of values and their respective symbolic names
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) struct hfcusb_symbolic_list {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) const int num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) const char *name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) static struct hfcusb_symbolic_list urb_errlist[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) {-ENOMEM, "No memory for allocation of internal structures"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) {-ENOSPC, "The host controller's bandwidth is already consumed"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) {-ENOENT, "URB was canceled by unlink_urb"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) {-EXDEV, "ISO transfer only partially completed"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) {-EAGAIN, "Too match scheduled for the future"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) {-ENXIO, "URB already queued"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) {-EFBIG, "Too much ISO frames requested"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) {-ENOSR, "Buffer error (overrun)"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) {-EPIPE, "Specified endpoint is stalled (device not responding)"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) {-EOVERFLOW, "Babble (bad cable?)"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) {-EPROTO, "Bit-stuff error (bad cable?)"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) {-EILSEQ, "CRC/Timeout"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) {-ETIMEDOUT, "NAK (device does not respond)"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) {-ESHUTDOWN, "Device unplugged"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) {-1, NULL}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) static inline const char *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) symbolic(struct hfcusb_symbolic_list list[], const int num)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) for (i = 0; list[i].name != NULL; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) if (list[i].num == num)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) return list[i].name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) return "<unknown USB Error>";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) /* USB descriptor need to contain one of the following EndPoint combination: */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) #define CNF_4INT3ISO 1 /* 4 INT IN, 3 ISO OUT */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) #define CNF_3INT3ISO 2 /* 3 INT IN, 3 ISO OUT */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) #define CNF_4ISO3ISO 3 /* 4 ISO IN, 3 ISO OUT */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) #define CNF_3ISO3ISO 4 /* 3 ISO IN, 3 ISO OUT */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) #define EP_NUL 1 /* Endpoint at this position not allowed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) #define EP_NOP 2 /* all type of endpoints allowed at this position */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) #define EP_ISO 3 /* Isochron endpoint mandatory at this position */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) #define EP_BLK 4 /* Bulk endpoint mandatory at this position */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) #define EP_INT 5 /* Interrupt endpoint mandatory at this position */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) #define HFC_CHAN_B1 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) #define HFC_CHAN_B2 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) #define HFC_CHAN_D 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) #define HFC_CHAN_E 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) * List of all supported endpoint configuration sets, used to find the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) * best matching endpoint configuration within a device's USB descriptor.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) * We need at least 3 RX endpoints, and 3 TX endpoints, either
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) * INT-in and ISO-out, or ISO-in and ISO-out)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) * with 4 RX endpoints even E-Channel logging is possible
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) validconf[][19] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) /* INT in, ISO out config */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) {EP_NUL, EP_INT, EP_NUL, EP_INT, EP_NUL, EP_INT, EP_NOP, EP_INT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) EP_ISO, EP_NUL, EP_ISO, EP_NUL, EP_ISO, EP_NUL, EP_NUL, EP_NUL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) CNF_4INT3ISO, 2, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) {EP_NUL, EP_INT, EP_NUL, EP_INT, EP_NUL, EP_INT, EP_NUL, EP_NUL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) EP_ISO, EP_NUL, EP_ISO, EP_NUL, EP_ISO, EP_NUL, EP_NUL, EP_NUL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) CNF_3INT3ISO, 2, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) /* ISO in, ISO out config */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) {EP_NOP, EP_NOP, EP_NOP, EP_NOP, EP_NOP, EP_NOP, EP_NOP, EP_NOP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) EP_ISO, EP_ISO, EP_ISO, EP_ISO, EP_ISO, EP_ISO, EP_NOP, EP_ISO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) CNF_4ISO3ISO, 2, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) {EP_NUL, EP_NUL, EP_NUL, EP_NUL, EP_NUL, EP_NUL, EP_NUL, EP_NUL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) EP_ISO, EP_ISO, EP_ISO, EP_ISO, EP_ISO, EP_ISO, EP_NUL, EP_NUL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) CNF_3ISO3ISO, 2, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} /* EOL element */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) /* string description of chosen config */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) static char *conf_str[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) "4 Interrupt IN + 3 Isochron OUT",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) "3 Interrupt IN + 3 Isochron OUT",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) "4 Isochron IN + 3 Isochron OUT",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) "3 Isochron IN + 3 Isochron OUT"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) #define LED_OFF 0 /* no LED support */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) #define LED_SCHEME1 1 /* LED standard scheme */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) #define LED_SCHEME2 2 /* not used yet... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) #define LED_POWER_ON 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) #define LED_POWER_OFF 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) #define LED_S0_ON 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) #define LED_S0_OFF 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) #define LED_B1_ON 5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) #define LED_B1_OFF 6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) #define LED_B1_DATA 7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) #define LED_B2_ON 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) #define LED_B2_OFF 9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) #define LED_B2_DATA 10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) #define LED_NORMAL 0 /* LEDs are normal */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) #define LED_INVERTED 1 /* LEDs are inverted */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) /* time in ms to perform a Flashing LED when B-Channel has traffic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) #define LED_TIME 250
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) struct hfcsusb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) struct usb_fifo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) /* structure defining input+output fifos (interrupt/bulk mode) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) struct iso_urb {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) struct urb *urb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) __u8 buffer[ISO_BUFFER_SIZE]; /* buffer rx/tx USB URB data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) struct usb_fifo *owner_fifo; /* pointer to owner fifo */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) __u8 indx; /* Fifos's ISO double buffer 0 or 1 ? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) #ifdef ISO_FRAME_START_DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) int start_frames[ISO_FRAME_START_RING_COUNT];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) __u8 iso_frm_strt_pos; /* index in start_frame[] */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) struct usb_fifo {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) int fifonum; /* fifo index attached to this structure */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) int active; /* fifo is currently active */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) struct hfcsusb *hw; /* pointer to main structure */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) int pipe; /* address of endpoint */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) __u8 usb_packet_maxlen; /* maximum length for usb transfer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) unsigned int max_size; /* maximum size of receive/send packet */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) __u8 intervall; /* interrupt interval */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) struct urb *urb; /* transfer structure for usb routines */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) __u8 buffer[128]; /* buffer USB INT OUT URB data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) int bit_line; /* how much bits are in the fifo? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) __u8 usb_transfer_mode; /* switched between ISO and INT */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) struct iso_urb iso[2]; /* two urbs to have one always
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) one pending */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) struct dchannel *dch; /* link to hfcsusb_t->dch */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) struct bchannel *bch; /* link to hfcsusb_t->bch */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) struct dchannel *ech; /* link to hfcsusb_t->ech, TODO: E-CHANNEL */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) int last_urblen; /* remember length of last packet */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) __u8 stop_gracefull; /* stops URB retransmission */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) struct hfcsusb {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) struct list_head list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) struct dchannel dch;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) struct bchannel bch[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) struct dchannel ech; /* TODO : wait for struct echannel ;) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) struct usb_device *dev; /* our device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) struct usb_interface *intf; /* used interface */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) int if_used; /* used interface number */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) int alt_used; /* used alternate config */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) int cfg_used; /* configuration index used */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) int vend_idx; /* index in hfcsusb_idtab */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) int packet_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) int iso_packet_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) struct usb_fifo fifos[HFCUSB_NUM_FIFOS];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) /* control pipe background handling */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) struct ctrl_buf ctrl_buff[HFC_CTRL_BUFSIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) int ctrl_in_idx, ctrl_out_idx, ctrl_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) struct urb *ctrl_urb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) struct usb_ctrlrequest ctrl_write;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) struct usb_ctrlrequest ctrl_read;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) int ctrl_paksize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) int ctrl_in_pipe, ctrl_out_pipe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) spinlock_t ctrl_lock; /* lock for ctrl */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) spinlock_t lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) __u8 threshold_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) __u8 led_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) __u8 protocol;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) int nt_timer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) int open;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) __u8 timers;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) __u8 initdone;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) char name[MISDN_MAX_IDLEN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) /* private vendor specific data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) struct hfcsusb_vdata {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) __u8 led_scheme; /* led display scheme */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) signed short led_bits[8]; /* array of 8 possible LED bitmask */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) char *vend_name; /* device name */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) };
^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) #define HFC_MAX_TE_LAYER1_STATE 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) #define HFC_MAX_NT_LAYER1_STATE 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) static const char *HFC_TE_LAYER1_STATES[HFC_MAX_TE_LAYER1_STATE + 1] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) "TE F0 - Reset",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) "TE F1 - Reset",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) "TE F2 - Sensing",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) "TE F3 - Deactivated",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) "TE F4 - Awaiting signal",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) "TE F5 - Identifying input",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) "TE F6 - Synchronized",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) "TE F7 - Activated",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) "TE F8 - Lost framing",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) static const char *HFC_NT_LAYER1_STATES[HFC_MAX_NT_LAYER1_STATE + 1] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) "NT G0 - Reset",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) "NT G1 - Deactive",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) "NT G2 - Pending activation",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) "NT G3 - Active",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) "NT G4 - Pending deactivation",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) /* supported devices */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) static const struct usb_device_id hfcsusb_idtab[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) USB_DEVICE(0x0959, 0x2bd0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) .driver_info = (unsigned long) &((struct hfcsusb_vdata)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) {LED_OFF, {4, 0, 2, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) "ISDN USB TA (Cologne Chip HFC-S USB based)"}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) USB_DEVICE(0x0675, 0x1688),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) .driver_info = (unsigned long) &((struct hfcsusb_vdata)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) {LED_SCHEME1, {1, 2, 0, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) "DrayTek miniVigor 128 USB ISDN TA"}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) USB_DEVICE(0x07b0, 0x0007),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) .driver_info = (unsigned long) &((struct hfcsusb_vdata)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) {LED_SCHEME1, {0x80, -64, -32, -16},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) "Billion tiny USB ISDN TA 128"}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) USB_DEVICE(0x0742, 0x2008),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) .driver_info = (unsigned long) &((struct hfcsusb_vdata)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) {LED_SCHEME1, {4, 0, 2, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) "Stollmann USB TA"}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) USB_DEVICE(0x0742, 0x2009),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) .driver_info = (unsigned long) &((struct hfcsusb_vdata)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) {LED_SCHEME1, {4, 0, 2, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) "Aceex USB ISDN TA"}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) USB_DEVICE(0x0742, 0x200A),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) .driver_info = (unsigned long) &((struct hfcsusb_vdata)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) {LED_SCHEME1, {4, 0, 2, 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) "OEM USB ISDN TA"}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) USB_DEVICE(0x08e3, 0x0301),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) .driver_info = (unsigned long) &((struct hfcsusb_vdata)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) {LED_SCHEME1, {2, 0, 1, 4},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) "Olitec USB RNIS"}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) USB_DEVICE(0x07fa, 0x0846),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) .driver_info = (unsigned long) &((struct hfcsusb_vdata)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) {LED_SCHEME1, {0x80, -64, -32, -16},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) "Bewan Modem RNIS USB"}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) USB_DEVICE(0x07fa, 0x0847),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) .driver_info = (unsigned long) &((struct hfcsusb_vdata)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) {LED_SCHEME1, {0x80, -64, -32, -16},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) "Djinn Numeris USB"}),
^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) USB_DEVICE(0x07b0, 0x0006),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) .driver_info = (unsigned long) &((struct hfcsusb_vdata)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) {LED_SCHEME1, {0x80, -64, -32, -16},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) "Twister ISDN TA"}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) USB_DEVICE(0x071d, 0x1005),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) .driver_info = (unsigned long) &((struct hfcsusb_vdata)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) {LED_SCHEME1, {0x02, 0, 0x01, 0x04},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) "Eicon DIVA USB 4.0"}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) USB_DEVICE(0x0586, 0x0102),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) .driver_info = (unsigned long) &((struct hfcsusb_vdata)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) {LED_SCHEME1, {0x88, -64, -32, -16},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) "ZyXEL OMNI.NET USB II"}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) USB_DEVICE(0x1ae7, 0x0525),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) .driver_info = (unsigned long) &((struct hfcsusb_vdata)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) {LED_SCHEME1, {0x88, -64, -32, -16},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) "X-Tensions USB ISDN TA XC-525"}),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) MODULE_DEVICE_TABLE(usb, hfcsusb_idtab);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) #endif /* __HFCSUSB_H__ */