~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/include/linux/usb/cdc_ncm.h

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 // SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
  2 /*
  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>
  6  *
  7  * USB Host Driver for Network Control Model (NCM)
  8  * http://www.usb.org/developers/devclass_docs/NCM10.zip
  9  *
 10  * The NCM encoding, decoding and initialization logic
 11  * derives from FreeBSD 8.x. if_cdce.c and if_cdcereg.h
 12  *
 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:
 17  *
 18  * Redistribution and use in source and binary forms, with or without
 19  * modification, are permitted provided that the following conditions
 20  * are met:
 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.
 26  *
 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
 37  * SUCH DAMAGE.
 38  */
 39 
 40 #ifndef __LINUX_USB_CDC_NCM_H
 41 #define __LINUX_USB_CDC_NCM_H
 42 
 43 #define CDC_NCM_COMM_ALTSETTING_NCM             0
 44 #define CDC_NCM_COMM_ALTSETTING_MBIM            1
 45 
 46 #define CDC_NCM_DATA_ALTSETTING_NCM             1
 47 #define CDC_NCM_DATA_ALTSETTING_MBIM            2
 48 
 49 /* CDC NCM subclass 3.3.1 */
 50 #define USB_CDC_NCM_NDP16_LENGTH_MIN            0x10
 51 
 52 /* CDC NCM subclass 3.3.2 */
 53 #define USB_CDC_NCM_NDP32_LENGTH_MIN            0x20
 54 
 55 /* Maximum NTB length */
 56 #define CDC_NCM_NTB_MAX_SIZE_TX                 65536   /* bytes */
 57 #define CDC_NCM_NTB_MAX_SIZE_RX                 65536   /* bytes */
 58 
 59 /* Initial NTB length */
 60 #define CDC_NCM_NTB_DEF_SIZE_TX                 16384   /* bytes */
 61 #define CDC_NCM_NTB_DEF_SIZE_RX                 16384   /* bytes */
 62 
 63 /* Minimum value for MaxDatagramSize, ch. 6.2.9 */
 64 #define CDC_NCM_MIN_DATAGRAM_SIZE               1514    /* bytes */
 65 
 66 /* Minimum value for MaxDatagramSize, ch. 8.1.3 */
 67 #define CDC_MBIM_MIN_DATAGRAM_SIZE              2048    /* bytes */
 68 
 69 #define CDC_NCM_MIN_TX_PKT                      512     /* bytes */
 70 
 71 /* Default value for MaxDatagramSize */
 72 #define CDC_NCM_MAX_DATAGRAM_SIZE               8192    /* bytes */
 73 
 74 /*
 75  * Maximum amount of datagrams in NCM Datagram Pointer Table, not counting
 76  * the last NULL entry.
 77  */
 78 #define CDC_NCM_DPT_DATAGRAMS_MAX               40
 79 
 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)
 86 
 87 /* Driver flags */
 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 */
 91 
 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)
 95 
 96 struct cdc_ncm_ctx {
 97         struct usb_cdc_ncm_ntb_parameters ncm_parm;
 98         struct hrtimer tx_timer;
 99         struct tasklet_struct bh;
100 
101         struct usbnet *dev;
102 
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;
107 
108         struct usb_interface *control;
109         struct usb_interface *data;
110 
111         struct sk_buff *tx_curr_skb;
112         struct sk_buff *tx_rem_skb;
113         __le32 tx_rem_sign;
114 
115         spinlock_t mtx;
116         atomic_t stop;
117         int drvflags;
118 
119         u32 timer_interval;
120         u32 max_ndp_size;
121         u8 is_ndp16;
122         union {
123                 struct usb_cdc_ncm_ndp16 *delayed_ndp16;
124                 struct usb_cdc_ncm_ndp32 *delayed_ndp32;
125         };
126 
127         u32 tx_timer_pending;
128         u32 tx_curr_frame_num;
129         u32 rx_max;
130         u32 tx_max;
131         u32 tx_curr_size;
132         u32 tx_low_mem_max_cnt;
133         u32 tx_low_mem_val;
134         u32 max_datagram_size;
135         u16 tx_max_datagrams;
136         u16 tx_remainder;
137         u16 tx_modulus;
138         u16 tx_ndp_modulus;
139         u16 tx_seq;
140         u16 rx_seq;
141         u16 min_tx_pkt;
142 
143         /* statistics */
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;
149         u64 tx_overhead;
150         u64 tx_ntbs;
151         u64 rx_overhead;
152         u64 rx_ntbs;
153 };
154 
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);
164 struct sk_buff *
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);
167 
168 #endif /* __LINUX_USB_CDC_NCM_H */
169 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php