1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 /* 22 * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 23 * Use is subject to license terms. 24 */ 25 26 #ifndef _SYS_SOFTMAC_IMPL_H 27 #define _SYS_SOFTMAC_IMPL_H 28 29 #pragma ident "%Z%%M% %I% %E% SMI" 30 31 #include <sys/types.h> 32 #include <sys/ethernet.h> 33 #include <sys/taskq.h> 34 #include <sys/sunddi.h> 35 #include <sys/sunldi.h> 36 #include <sys/strsun.h> 37 #include <sys/stream.h> 38 #include <sys/dlpi.h> 39 #include <sys/mac.h> 40 #include <sys/mac_ether.h> 41 42 #ifdef __cplusplus 43 extern "C" { 44 #endif 45 46 typedef struct softmac_lower_s { 47 struct softmac *sl_softmac; 48 queue_t *sl_wq; 49 50 /* 51 * sl_ctl_inprogress is used to serialize the control path. It will 52 * be set when either an ioctl or an M_{PC,}PROTO message is received 53 * from the upper layer, and will be cleared when processing done. 54 */ 55 kmutex_t sl_ctl_mutex; 56 kcondvar_t sl_ctl_cv; 57 boolean_t sl_ctl_inprogress; 58 59 /* 60 * When a control message is processed, either sl_pending_prim or 61 * sl_pending_ioctl will be set. They will be cleared when the 62 * acknowledgement of the specific control message is received 63 * from the underlying legacy driver. 64 */ 65 kmutex_t sl_mutex; 66 kcondvar_t sl_cv; 67 t_uscalar_t sl_pending_prim; 68 boolean_t sl_pending_ioctl; 69 mblk_t *sl_ack_mp; 70 71 mac_resource_handle_t sl_handle; 72 ldi_handle_t sl_lh; 73 } softmac_lower_t; 74 75 enum softmac_state { 76 SOFTMAC_INITIALIZED, 77 SOFTMAC_READY 78 }; 79 80 typedef struct softmac_dev_s { 81 dev_t sd_dev; 82 } softmac_dev_t; 83 84 /* 85 * smac_flag values. 86 */ 87 #define SOFTMAC_GLDV3 0x01 88 #define SOFTMAC_NOSUPP 0x02 89 #define SOFTMAC_ATTACH_DONE 0x04 90 #define SOFTMAC_NEED_RECREATE 0x08 91 92 /* 93 * The softmac structure allows all minor nodes (at most two, style-1 and 94 * style-2) for the same device to be processed. A softmac_dev_t will be 95 * created for each minor node. 96 * 97 * We try to "register" the mac after all the softmac_dev_t's are processed so 98 * that even if DLPI operations fail (because of driver bugs) for one minor 99 * node, the other minor node can still be used to register the mac. 100 * (Specifically, an incorrect xxx_getinfo() implementation will cause style-2 101 * minor node mac registration to fail.) 102 */ 103 typedef struct softmac { 104 /* 105 * The following fields will be set when the softmac is created and 106 * will not change. No lock is required. 107 */ 108 char smac_devname[MAXNAMELEN]; 109 major_t smac_umajor; 110 int smac_uppa; 111 uint32_t smac_cnt; /* # of minor nodes for this device */ 112 113 /* 114 * The following fields are protected by softmac_hash_lock. 115 */ 116 /* 117 * The smac_hold_cnt field increases when softmac_hold_device() is 118 * called to force the dls_vlan_t of the device to be created. The 119 * device pre-detach fails if this counter is not 0. 120 */ 121 uint32_t smac_hold_cnt; 122 123 /* 124 * The following fields are protected by smac_lock. 125 */ 126 kmutex_t smac_mutex; 127 kcondvar_t smac_cv; 128 uint32_t smac_flags; 129 int smac_attacherr; 130 mac_handle_t smac_mh; 131 softmac_dev_t *smac_softmac[2]; 132 taskqid_t smac_taskq; 133 /* 134 * Number of minor nodes whose post-attach routine has succeeded. 135 * This should be the same as the numbers of softmac_dev_t. 136 * Note that it does not imply SOFTMAC_ATTACH_DONE as the taskq might 137 * be still ongoing. 138 */ 139 uint32_t smac_attachok_cnt; 140 /* 141 * Number of softmac_dev_t left when pre-detach fails. This is used 142 * to indicate whether postattach is called because of a failed 143 * pre-detach. 144 */ 145 uint32_t smac_attached_left; 146 147 /* 148 * The remaining fields are used to register the MAC for a legacy 149 * device. They are set in softmac_mac_register() and do not change. 150 * One can access them when mac_register() is done without locks. 151 */ 152 153 /* 154 * media type is needed for create <link name, linkid> mapping, so 155 * it is set for GLDv3 device as well 156 */ 157 uint_t smac_media; 158 /* DLPI style of the underlying device */ 159 int smac_style; 160 dev_t smac_dev; 161 size_t smac_saplen; 162 size_t smac_addrlen; 163 uchar_t smac_unicst_addr[MAXMACADDRLEN]; 164 uint_t smac_min_sdu; 165 uint_t smac_max_sdu; 166 uint32_t smac_margin; 167 168 /* Notifications the underlying driver can support. */ 169 uint32_t smac_notifications; 170 171 /* 172 * Capabilities of the underlying driver. 173 */ 174 uint32_t smac_capab_flags; 175 uint32_t smac_hcksum_txflags; 176 boolean_t smac_no_capability_req; 177 dl_capab_mdt_t smac_mdt_capab; 178 boolean_t smac_mdt; 179 180 /* 181 * The following fields are protected by smac_lock 182 */ 183 krwlock_t smac_lock; 184 enum softmac_state smac_state; 185 /* Lower stream structure */ 186 softmac_lower_t *smac_lower; 187 } softmac_t; 188 189 typedef struct smac_ioc_start_s { 190 softmac_lower_t *si_slp; 191 } smac_ioc_start_t; 192 193 #define SMAC_IOC ('S' << 24 | 'M' << 16 | 'C' << 8) 194 #define SMAC_IOC_START (SMAC_IOC | 0x01) 195 196 #define SOFTMAC_BLANK_TICKS 128 197 #define SOFTMAC_BLANK_PKT_COUNT 8 198 199 extern dev_info_t *softmac_dip; 200 #define SOFTMAC_DEV_NAME "softmac" 201 202 extern int softmac_send_bind_req(softmac_lower_t *, uint_t); 203 extern int softmac_send_notify_req(softmac_lower_t *, uint32_t); 204 extern int softmac_send_promisc_req(softmac_lower_t *, t_uscalar_t, 205 boolean_t); 206 extern void softmac_init(void); 207 extern void softmac_fini(void); 208 extern boolean_t softmac_busy(void); 209 extern int softmac_fill_capab(ldi_handle_t, softmac_t *); 210 extern int softmac_capab_enable(softmac_lower_t *); 211 extern void softmac_rput_process_notdata(queue_t *, mblk_t *); 212 extern void softmac_rput_process_data(softmac_lower_t *, mblk_t *); 213 214 extern int softmac_m_promisc(void *, boolean_t); 215 extern int softmac_m_multicst(void *, boolean_t, const uint8_t *); 216 extern int softmac_m_unicst(void *, const uint8_t *); 217 extern void softmac_m_ioctl(void *, queue_t *, mblk_t *); 218 extern int softmac_m_stat(void *, uint_t, uint64_t *); 219 extern mblk_t *softmac_m_tx(void *, mblk_t *); 220 extern void softmac_m_resources(void *); 221 extern int softmac_proto_tx(softmac_lower_t *, mblk_t *, mblk_t **); 222 extern void softmac_ioctl_tx(softmac_lower_t *, mblk_t *, mblk_t **); 223 224 #ifdef __cplusplus 225 } 226 #endif 227 228 #endif /* _SYS_SOFTMAC_IMPL_H */ 229