149901133SHans Petter Selasky /* $FreeBSD$ */ 249901133SHans Petter Selasky 349901133SHans Petter Selasky /*- 449901133SHans Petter Selasky * Copyright (c) 2011 Anybots Inc 5*718cf2ccSPedro F. Giffuni * SPDX-License-Identifier: BSD-2-Clause-FreeBSD 6*718cf2ccSPedro F. Giffuni * 749901133SHans Petter Selasky * written by Akinori Furukoshi <moonlightakkiy@yahoo.ca> 849901133SHans Petter Selasky * - ucom part is based on u3g.c 949901133SHans Petter Selasky * 1049901133SHans Petter Selasky * Redistribution and use in source and binary forms, with or without 1149901133SHans Petter Selasky * modification, are permitted provided that the following conditions 1249901133SHans Petter Selasky * are met: 1349901133SHans Petter Selasky * 1. Redistributions of source code must retain the above copyright 1449901133SHans Petter Selasky * notice, this list of conditions and the following disclaimer. 1549901133SHans Petter Selasky * 2. Redistributions in binary form must reproduce the above copyright 1649901133SHans Petter Selasky * notice, this list of conditions and the following disclaimer in the 1749901133SHans Petter Selasky * documentation and/or other materials provided with the distribution. 1849901133SHans Petter Selasky * 1949901133SHans Petter Selasky * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 2049901133SHans Petter Selasky * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2149901133SHans Petter Selasky * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2249901133SHans Petter Selasky * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 2349901133SHans Petter Selasky * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2449901133SHans Petter Selasky * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2549901133SHans Petter Selasky * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2649901133SHans Petter Selasky * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2749901133SHans Petter Selasky * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2849901133SHans Petter Selasky * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2949901133SHans Petter Selasky * SUCH DAMAGE. 3049901133SHans Petter Selasky */ 3149901133SHans Petter Selasky 3249901133SHans Petter Selasky #ifndef _IF_USEVAR_H_ 3349901133SHans Petter Selasky #define _IF_USEVAR_H_ 3449901133SHans Petter Selasky 3549901133SHans Petter Selasky #define USIE_DCD 0x0001 3649901133SHans Petter Selasky #define USIE_DSR 0x0002 3749901133SHans Petter Selasky #define USIE_DTR 0x0004 3849901133SHans Petter Selasky #define USIE_RI 0x0008 3949901133SHans Petter Selasky #define USIE_CTS 0x0100 4049901133SHans Petter Selasky #define USIE_RTS 0x0200 4149901133SHans Petter Selasky 4249901133SHans Petter Selasky #define USIE_HIP_FRM_CHR 0x7e 4349901133SHans Petter Selasky #define USIE_HIP_ESC_CHR 0x7d 4449901133SHans Petter Selasky #define USIE_HIP_IF 0 4549901133SHans Petter Selasky 4649901133SHans Petter Selasky #define USIE_HIPCNS_MIN 16 /* HIP + CnS + 2 framing char */ 4749901133SHans Petter Selasky #define USIE_HIPCNS_MAX 261 /* HIP + max CnS 255 + 2 framing char */ 4849901133SHans Petter Selasky 4949901133SHans Petter Selasky #define USIE_CNFG_INDEX 0 5049901133SHans Petter Selasky #define USIE_IFACE_INDEX 0 5149901133SHans Petter Selasky #define USIE_IFACE_MAX 12 5249901133SHans Petter Selasky #define USIE_BUFSIZE 2048 5349901133SHans Petter Selasky #define USIE_MTU_MAX 1500 5449901133SHans Petter Selasky #define USIE_RXSZ_MAX 4096 5549901133SHans Petter Selasky 5649901133SHans Petter Selasky /* USB control pipe request */ 5749901133SHans Petter Selasky #define USIE_POWER 0x00 5849901133SHans Petter Selasky #define USIE_FW_ATTR 0x06 5949901133SHans Petter Selasky #define USIE_NMEA 0x07 6049901133SHans Petter Selasky #define USIE_LINK_STATE 0x22 6149901133SHans Petter Selasky 6249901133SHans Petter Selasky /* firmware attr flags */ 6349901133SHans Petter Selasky #define USIE_PM_AUTO (1 << 1) 6449901133SHans Petter Selasky #define USIE_FW_DHCP (1 << 3) /* DHCP capable */ 6549901133SHans Petter Selasky 6649901133SHans Petter Selasky /* line state flags */ 6749901133SHans Petter Selasky #define USIE_LS_DTR (1 << 0) 6849901133SHans Petter Selasky #define USIE_LS_RTS (1 << 1) 6949901133SHans Petter Selasky 7049901133SHans Petter Selasky /* Host Interface Porotocol Header */ 7149901133SHans Petter Selasky struct usie_hip { 7249901133SHans Petter Selasky uint16_t len; 7349901133SHans Petter Selasky #define USIE_HIP_LEN_MASK 0x3fff 7449901133SHans Petter Selasky #define USIE_HIP_IP_LEN_MASK 0x07ff 7549901133SHans Petter Selasky 7649901133SHans Petter Selasky uint8_t id; 7749901133SHans Petter Selasky #define USIE_HIP_PAD (1 << 7) 7849901133SHans Petter Selasky #define USIE_HIP_MASK 0x7f 7949901133SHans Petter Selasky #define USIE_HIP_SYNC2M 0x20 /* host -> modem */ 8049901133SHans Petter Selasky #define USIE_HIP_DOWN 0x26 8149901133SHans Petter Selasky #define USIE_HIP_CNS2M 0x2b /* h -> m */ 8249901133SHans Petter Selasky #define USIE_HIP_CTX 0x3f 8349901133SHans Petter Selasky #define USIE_HIP_SYNC2H 0x60 /* h <- m */ 8449901133SHans Petter Selasky #define USIE_HIP_RESTR 0x62 8549901133SHans Petter Selasky #define USIE_HIP_RCGI 0x64 8649901133SHans Petter Selasky #define USIE_HIP_CNS2H 0x6b /* h <- m */ 8749901133SHans Petter Selasky #define USIE_HIP_UMTS 0x78 8849901133SHans Petter Selasky #define USIE_HIP_IP 0x7f 8949901133SHans Petter Selasky 9049901133SHans Petter Selasky uint8_t param; 9149901133SHans Petter Selasky } __packed __aligned(4); 9249901133SHans Petter Selasky 9349901133SHans Petter Selasky /* Control and Status Header */ 9449901133SHans Petter Selasky struct usie_cns { 9549901133SHans Petter Selasky uint16_t obj; /* object type */ 9649901133SHans Petter Selasky #define USIE_CNS_OB_RSSI 0x1001 /* read RSSI */ 9749901133SHans Petter Selasky #define USIE_CNS_OB_HW_DISABLE 0x1011 /* disable h/w */ 9849901133SHans Petter Selasky #define USIE_CNS_OB_PW_SW 0x1071 /* power on/off */ 9949901133SHans Petter Selasky #define USIE_CNS_OB_PROF_WRITE 0x7003 /* write profile */ 10049901133SHans Petter Selasky #define USIE_CNS_OB_LINK_UPDATE 0x7004 /* dis/connect */ 10149901133SHans Petter Selasky #define USIE_CNS_OB_PDP_READ 0x7006 /* read out IP addr */ 10249901133SHans Petter Selasky 10349901133SHans Petter Selasky uint8_t op; /* operation type */ 10449901133SHans Petter Selasky #define USIE_CNS_OP_ERR (1 << 7)/* | == error */ 10549901133SHans Petter Selasky #define USIE_CNS_OP_REQ 0x01 /* host -> modem */ 10649901133SHans Petter Selasky #define USIE_CNS_OP_RSP 0x02 /* h <- m */ 10749901133SHans Petter Selasky #define USIE_CNS_OP_SET 0x03 /* h -> m */ 10849901133SHans Petter Selasky #define USIE_CNS_OP_ACK 0x04 /* h <- m */ 10949901133SHans Petter Selasky #define USIE_CNS_OP_NOTIF_ON 0x05 /* h -> m */ 11049901133SHans Petter Selasky #define USIE_CNS_OP_RSP_ON 0x06 /* h <- m */ 11149901133SHans Petter Selasky #define USIE_CNS_OP_NOTIF 0x07 /* h <- m */ 11249901133SHans Petter Selasky #define USIE_CNS_OP_NOTIF_OFF 0x08 /* h -> m */ 11349901133SHans Petter Selasky #define USIE_CNS_OP_RSP_OFF 0x09 /* h <- m */ 11449901133SHans Petter Selasky #define USIE_CNS_OP_REQ_CHG 0x0a /* h -> m */ 11549901133SHans Petter Selasky #define USIE_CNS_OP_RSP_CHG 0x0b /* h <- m */ 11649901133SHans Petter Selasky 11749901133SHans Petter Selasky uint8_t rsv0; /* reserved, always '0' */ 11849901133SHans Petter Selasky uint32_t id; /* caller ID */ 11949901133SHans Petter Selasky /* 12049901133SHans Petter Selasky * .id is to identify calling functions 12149901133SHans Petter Selasky * h/w responses with the same .id used in request. Only '0' is reserved 12249901133SHans Petter Selasky * for notification (asynchronous message generated by h/w without any 12349901133SHans Petter Selasky * request). All other values are user defineable. 12449901133SHans Petter Selasky */ 12549901133SHans Petter Selasky #define USIE_CNS_ID_NOTIF 0x00000000 /* reserved */ 12649901133SHans Petter Selasky #define USIE_CNS_ID_INIT 0x00000001 12749901133SHans Petter Selasky #define USIE_CNS_ID_STOP 0x00000002 12849901133SHans Petter Selasky #define USIE_CNS_ID_DNS 0x00000003 12949901133SHans Petter Selasky #define USIE_CNS_ID_RSSI 0x00000004 13049901133SHans Petter Selasky 13149901133SHans Petter Selasky uint8_t rsv1; /* reserved, always '0' */ 13249901133SHans Petter Selasky uint8_t len; /* length of param */ 13349901133SHans Petter Selasky } __packed; 13449901133SHans Petter Selasky 13549901133SHans Petter Selasky /* 13649901133SHans Petter Selasky * CnS param attached to struct usie_cns 13749901133SHans Petter Selasky * usie_cns.len is total size of this param 13849901133SHans Petter Selasky * max 255 13949901133SHans Petter Selasky */ 14049901133SHans Petter Selasky #define USIE_CNS_PM_UP 0x01 14149901133SHans Petter Selasky #define USIE_CNS_PM_DOWN 0x00 14249901133SHans Petter Selasky 14349901133SHans Petter Selasky /* Link Sense Indication data structure */ 14449901133SHans Petter Selasky struct usie_lsi { 14549901133SHans Petter Selasky uint8_t proto; 14649901133SHans Petter Selasky #define USIE_LSI_UMTS 0x01 14749901133SHans Petter Selasky 14849901133SHans Petter Selasky uint8_t pad0; 14949901133SHans Petter Selasky uint16_t len; 15049901133SHans Petter Selasky uint8_t area; 15149901133SHans Petter Selasky #define USIE_LSI_AREA_NO 0x00 15249901133SHans Petter Selasky #define USIE_LSI_AREA_NODATA 0x01 15349901133SHans Petter Selasky 15449901133SHans Petter Selasky uint8_t pad1[41]; 15549901133SHans Petter Selasky uint8_t state; 15649901133SHans Petter Selasky #define USIE_LSI_STATE_IDLE 0x00 15749901133SHans Petter Selasky 15849901133SHans Petter Selasky uint8_t pad2[33]; 15949901133SHans Petter Selasky uint8_t type; 16049901133SHans Petter Selasky #define USIE_LSI_IP4 0x00 16149901133SHans Petter Selasky 16249901133SHans Petter Selasky uint8_t pdp_addr_len; /* PDP addr */ 16349901133SHans Petter Selasky uint8_t pdp_addr[16]; 16449901133SHans Petter Selasky uint8_t pad3[23]; 16549901133SHans Petter Selasky uint8_t dns1_addr_len; /* DNS addr */ 16649901133SHans Petter Selasky uint8_t dns1_addr[16]; 16749901133SHans Petter Selasky uint8_t dns2_addr_len; 16849901133SHans Petter Selasky uint8_t dns2_addr[16]; 16949901133SHans Petter Selasky uint8_t wins1_addr_len; /* Wins addr */ 17049901133SHans Petter Selasky uint8_t wins1_addr[16]; 17149901133SHans Petter Selasky uint8_t wins2_addr_len; 17249901133SHans Petter Selasky uint8_t wins2_addr[16]; 17349901133SHans Petter Selasky uint8_t pad4[4]; 17449901133SHans Petter Selasky uint8_t gw_addr_len; /* GW addr */ 17549901133SHans Petter Selasky uint8_t gw_addr[16]; 17649901133SHans Petter Selasky uint8_t rsv[8]; 17749901133SHans Petter Selasky } __packed; 17849901133SHans Petter Selasky 17949901133SHans Petter Selasky struct usie_net_info { 18049901133SHans Petter Selasky uint8_t addr_len; 18149901133SHans Petter Selasky uint8_t pdp_addr[16]; 18249901133SHans Petter Selasky uint8_t dns1_addr[16]; 18349901133SHans Petter Selasky uint8_t dns2_addr[16]; 18449901133SHans Petter Selasky uint8_t gw_addr[16]; 18549901133SHans Petter Selasky } __packed; 18649901133SHans Petter Selasky 18749901133SHans Petter Selasky /* Tx/Rx IP packet descriptor */ 18849901133SHans Petter Selasky struct usie_desc { 18949901133SHans Petter Selasky struct usie_hip hip; 19049901133SHans Petter Selasky uint16_t desc_type; 19149901133SHans Petter Selasky #define USIE_TYPE_MASK 0x03ff 19249901133SHans Petter Selasky #define USIE_IP_TX 0x0002 19349901133SHans Petter Selasky #define USIE_IP_RX 0x0202 19449901133SHans Petter Selasky 19549901133SHans Petter Selasky struct ether_header ethhdr; 19649901133SHans Petter Selasky } __packed; 19749901133SHans Petter Selasky 19849901133SHans Petter Selasky enum { 19949901133SHans Petter Selasky USIE_UC_STATUS, 20049901133SHans Petter Selasky USIE_UC_RX, 20149901133SHans Petter Selasky USIE_UC_TX, 20249901133SHans Petter Selasky USIE_UC_N_XFER 20349901133SHans Petter Selasky }; 20449901133SHans Petter Selasky 20549901133SHans Petter Selasky enum { 20649901133SHans Petter Selasky USIE_IF_STATUS, 20749901133SHans Petter Selasky USIE_IF_RX, 20849901133SHans Petter Selasky USIE_IF_TX, 20949901133SHans Petter Selasky USIE_IF_N_XFER 21049901133SHans Petter Selasky }; 21149901133SHans Petter Selasky 21249901133SHans Petter Selasky struct usie_softc { 21349901133SHans Petter Selasky struct ucom_super_softc sc_super_ucom; 21449901133SHans Petter Selasky 21549901133SHans Petter Selasky #define USIE_UCOM_MAX 6 21649901133SHans Petter Selasky struct ucom_softc sc_ucom[USIE_UCOM_MAX]; 21749901133SHans Petter Selasky uint8_t sc_uc_ifnum[USIE_UCOM_MAX]; 21849901133SHans Petter Selasky 21949901133SHans Petter Selasky struct mtx sc_mtx; 22049901133SHans Petter Selasky 22149901133SHans Petter Selasky struct task sc_if_status_task; 22249901133SHans Petter Selasky struct task sc_if_sync_task; 22349901133SHans Petter Selasky struct usb_callout sc_if_sync_ch; 22449901133SHans Petter Selasky 22549901133SHans Petter Selasky struct usie_net_info sc_net; 22649901133SHans Petter Selasky 22749901133SHans Petter Selasky struct usie_desc sc_txd; 22849901133SHans Petter Selasky 22949901133SHans Petter Selasky struct usb_xfer *sc_uc_xfer[USIE_UCOM_MAX][USIE_UC_N_XFER]; 23049901133SHans Petter Selasky struct usb_xfer *sc_if_xfer[USIE_IF_N_XFER]; 23149901133SHans Petter Selasky 23249901133SHans Petter Selasky struct ifnet *sc_ifp; 23349901133SHans Petter Selasky struct usb_device *sc_udev; 23449901133SHans Petter Selasky device_t sc_dev; 23549901133SHans Petter Selasky 23649901133SHans Petter Selasky struct mbuf *sc_rxm; 23749901133SHans Petter Selasky 23849901133SHans Petter Selasky uint16_t sc_if_ifnum; 23949901133SHans Petter Selasky 24049901133SHans Petter Selasky int16_t sc_rssi; 24149901133SHans Petter Selasky 24249901133SHans Petter Selasky uint8_t sc_msr; 24349901133SHans Petter Selasky uint8_t sc_lsr; 24449901133SHans Petter Selasky uint8_t sc_nucom; 24549901133SHans Petter Selasky 24649901133SHans Petter Selasky uint8_t sc_resp_temp[USIE_BUFSIZE] __aligned(4); 24749901133SHans Petter Selasky uint8_t sc_status_temp[USIE_BUFSIZE] __aligned(4); 24849901133SHans Petter Selasky }; 24949901133SHans Petter Selasky 25049901133SHans Petter Selasky /* Some code assumptions */ 25149901133SHans Petter Selasky 25249901133SHans Petter Selasky extern uint8_t usie_assert[((sizeof(struct usie_hip) + 25349901133SHans Petter Selasky sizeof(struct usie_lsi) + 1) <= USIE_BUFSIZE) ? 1 : -1]; 25449901133SHans Petter Selasky 25549901133SHans Petter Selasky extern uint8_t ucdc_assert[(sizeof(struct usb_cdc_notification) 25649901133SHans Petter Selasky >= 16) ? 1 : -1]; 25749901133SHans Petter Selasky 25849901133SHans Petter Selasky #endif /* _IF_USEVAR_H_ */ 259