1 // SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
3 * Copyright (C) ST-Ericsson 2010-2012
4 * Contact: Alexey Orishko <alexey.orishko@stericsson.com>
5 * Original author: Hans Petter Selasky <hans.petter.selasky@stericsson.com>
7 * USB Host Driver for Network Control Model (NCM)
8 * http://www.usb.org/developers/devclass_docs/NCM10.zip
10 * The NCM encoding, decoding and initialization logic
11 * derives from FreeBSD 8.x. if_cdce.c and if_cdcereg.h
13 * This software is available to you under a choice of one of two
14 * licenses. You may choose this file to be licensed under the terms
15 * of the GNU General Public License (GPL) Version 2 or the 2-clause
16 * BSD license listed below:
18 * Redistribution and use in source and binary forms, with or without
19 * modification, are permitted provided that the following conditions
21 * 1. Redistributions of source code must retain the above copyright
22 * notice, this list of conditions and the following disclaimer.
23 * 2. Redistributions in binary form must reproduce the above copyright
24 * notice, this list of conditions and the following disclaimer in the
25 * documentation and/or other materials provided with the distribution.
27 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
28 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
29 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
30 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
31 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
32 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
33 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
34 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
35 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
36 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
40 #ifndef __LINUX_USB_CDC_NCM_H
41 #define __LINUX_USB_CDC_NCM_H
43 #define CDC_NCM_COMM_ALTSETTING_NCM 0
44 #define CDC_NCM_COMM_ALTSETTING_MBIM 1
46 #define CDC_NCM_DATA_ALTSETTING_NCM 1
47 #define CDC_NCM_DATA_ALTSETTING_MBIM 2
49 /* CDC NCM subclass 3.3.1 */
50 #define USB_CDC_NCM_NDP16_LENGTH_MIN 0x10
52 /* CDC NCM subclass 3.3.2 */
53 #define USB_CDC_NCM_NDP32_LENGTH_MIN 0x20
55 /* Maximum NTB length */
56 #define CDC_NCM_NTB_MAX_SIZE_TX 65536 /* bytes */
57 #define CDC_NCM_NTB_MAX_SIZE_RX 65536 /* bytes */
59 /* Initial NTB length */
60 #define CDC_NCM_NTB_DEF_SIZE_TX 16384 /* bytes */
61 #define CDC_NCM_NTB_DEF_SIZE_RX 16384 /* bytes */
63 /* Minimum value for MaxDatagramSize, ch. 6.2.9 */
64 #define CDC_NCM_MIN_DATAGRAM_SIZE 1514 /* bytes */
66 /* Minimum value for MaxDatagramSize, ch. 8.1.3 */
67 #define CDC_MBIM_MIN_DATAGRAM_SIZE 2048 /* bytes */
69 #define CDC_NCM_MIN_TX_PKT 512 /* bytes */
71 /* Default value for MaxDatagramSize */
72 #define CDC_NCM_MAX_DATAGRAM_SIZE 8192 /* bytes */
75 * Maximum amount of datagrams in NCM Datagram Pointer Table, not counting
76 * the last NULL entry.
78 #define CDC_NCM_DPT_DATAGRAMS_MAX 40
80 /* Restart the timer, if amount of datagrams is less than given value */
81 #define CDC_NCM_RESTART_TIMER_DATAGRAM_CNT 3
82 #define CDC_NCM_TIMER_PENDING_CNT 2
83 #define CDC_NCM_TIMER_INTERVAL_USEC 400UL
84 #define CDC_NCM_TIMER_INTERVAL_MIN 5UL
85 #define CDC_NCM_TIMER_INTERVAL_MAX (U32_MAX / NSEC_PER_USEC)
88 #define CDC_NCM_FLAG_NDP_TO_END 0x02 /* NDP is placed at end of frame */
89 #define CDC_MBIM_FLAG_AVOID_ALTSETTING_TOGGLE 0x04 /* Avoid altsetting toggle during init */
90 #define CDC_NCM_FLAG_PREFER_NTB32 0x08 /* prefer NDP32 over NDP16 */
92 #define cdc_ncm_comm_intf_is_mbim(x) ((x)->desc.bInterfaceSubClass == USB_CDC_SUBCLASS_MBIM && \
93 (x)->desc.bInterfaceProtocol == USB_CDC_PROTO_NONE)
94 #define cdc_ncm_data_intf_is_mbim(x) ((x)->desc.bInterfaceProtocol == USB_CDC_MBIM_PROTO_NTB)
97 struct usb_cdc_ncm_ntb_parameters ncm_parm
;
98 struct hrtimer tx_timer
;
99 struct tasklet_struct bh
;
103 const struct usb_cdc_ncm_desc
*func_desc
;
104 const struct usb_cdc_mbim_desc
*mbim_desc
;
105 const struct usb_cdc_mbim_extended_desc
*mbim_extended_desc
;
106 const struct usb_cdc_ether_desc
*ether_desc
;
108 struct usb_interface
*control
;
109 struct usb_interface
*data
;
111 struct sk_buff
*tx_curr_skb
;
112 struct sk_buff
*tx_rem_skb
;
123 struct usb_cdc_ncm_ndp16
*delayed_ndp16
;
124 struct usb_cdc_ncm_ndp32
*delayed_ndp32
;
127 u32 tx_timer_pending
;
128 u32 tx_curr_frame_num
;
132 u32 tx_low_mem_max_cnt
;
134 u32 max_datagram_size
;
135 u16 tx_max_datagrams
;
144 u32 tx_curr_frame_payload
;
145 u32 tx_reason_ntb_full
;
146 u32 tx_reason_ndp_full
;
147 u32 tx_reason_timeout
;
148 u32 tx_reason_max_datagram
;
155 u8
cdc_ncm_select_altsetting(struct usb_interface
*intf
);
156 int cdc_ncm_change_mtu(struct net_device
*net
, int new_mtu
);
157 int cdc_ncm_bind_common(struct usbnet
*dev
, struct usb_interface
*intf
, u8 data_altsetting
, int drvflags
);
158 void cdc_ncm_unbind(struct usbnet
*dev
, struct usb_interface
*intf
);
159 struct sk_buff
*cdc_ncm_fill_tx_frame(struct usbnet
*dev
, struct sk_buff
*skb
, __le32 sign
);
160 int cdc_ncm_rx_verify_nth16(struct cdc_ncm_ctx
*ctx
, struct sk_buff
*skb_in
);
161 int cdc_ncm_rx_verify_ndp16(struct sk_buff
*skb_in
, int ndpoffset
);
162 int cdc_ncm_rx_verify_nth32(struct cdc_ncm_ctx
*ctx
, struct sk_buff
*skb_in
);
163 int cdc_ncm_rx_verify_ndp32(struct sk_buff
*skb_in
, int ndpoffset
);
165 cdc_ncm_tx_fixup(struct usbnet
*dev
, struct sk_buff
*skb
, gfp_t flags
);
166 int cdc_ncm_rx_fixup(struct usbnet
*dev
, struct sk_buff
*skb_in
);
168 #endif /* __LINUX_USB_CDC_NCM_H */