diff options
Diffstat (limited to 'usr/src/uts/common/sys/softmac_impl.h')
-rw-r--r-- | usr/src/uts/common/sys/softmac_impl.h | 234 |
1 files changed, 234 insertions, 0 deletions
diff --git a/usr/src/uts/common/sys/softmac_impl.h b/usr/src/uts/common/sys/softmac_impl.h new file mode 100644 index 0000000000..93071c17a9 --- /dev/null +++ b/usr/src/uts/common/sys/softmac_impl.h @@ -0,0 +1,234 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ +/* + * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +#ifndef _SYS_SOFTMAC_IMPL_H +#define _SYS_SOFTMAC_IMPL_H + +#pragma ident "%Z%%M% %I% %E% SMI" + +#include <sys/types.h> +#include <sys/ethernet.h> +#include <sys/taskq.h> +#include <sys/sunddi.h> +#include <sys/sunldi.h> +#include <sys/strsun.h> +#include <sys/stream.h> +#include <sys/dlpi.h> +#include <sys/mac.h> +#include <sys/mac_ether.h> + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct softmac_lower_s { + struct softmac *sl_softmac; + queue_t *sl_wq; + + /* + * sl_ctl_inprogress is used to serialize the control path. It will + * be set when either an ioctl or an M_{PC,}PROTO message is received + * from the upper layer, and will be cleared when processing done. + */ + kmutex_t sl_ctl_mutex; + kcondvar_t sl_ctl_cv; + boolean_t sl_ctl_inprogress; + + /* + * When a control message is processed, either sl_pending_prim or + * sl_pending_ioctl will be set. They will be cleared when the + * acknowledgement of the specific control message is received + * from the underlying legacy driver. + */ + kmutex_t sl_mutex; + kcondvar_t sl_cv; + t_uscalar_t sl_pending_prim; + boolean_t sl_pending_ioctl; + mblk_t *sl_ack_mp; + + mac_resource_handle_t sl_handle; + ldi_handle_t sl_lh; +} softmac_lower_t; + +enum softmac_state { + SOFTMAC_INITIALIZED, + SOFTMAC_READY +}; + +typedef struct softmac_dev_s { + dev_t sd_dev; +} softmac_dev_t; + +/* + * smac_flag values. + */ +#define SOFTMAC_GLDV3 0x01 +#define SOFTMAC_NOSUPP 0x02 +#define SOFTMAC_ATTACH_DONE 0x04 +#define SOFTMAC_NEED_RECREATE 0x08 + +/* + * The softmac structure allows all minor nodes (at most two, style-1 and + * style-2) for the same device to be processed. A softmac_dev_t will be + * created for each minor node. + * + * We try to "register" the mac after all the softmac_dev_t's are processed so + * that even if DLPI operations fail (because of driver bugs) for one minor + * node, the other minor node can still be used to register the mac. + * (Specifically, an incorrect xxx_getinfo() implementation will cause style-2 + * minor node mac registration to fail.) + */ +typedef struct softmac { + /* + * The following fields will be set when the softmac is created and + * will not change. No lock is required. + */ + char smac_devname[MAXNAMELEN]; + major_t smac_umajor; + int smac_uppa; + uint32_t smac_cnt; /* # of minor nodes for this device */ + + /* + * The following fields are protected by softmac_hash_lock. + */ + /* + * The smac_hold_cnt field increases when softmac_hold_device() is + * called to force the dls_vlan_t of the device to be created. The + * device pre-detach fails if this counter is not 0. + */ + uint32_t smac_hold_cnt; + + /* + * The following fields are protected by smac_lock. + */ + kmutex_t smac_mutex; + kcondvar_t smac_cv; + uint32_t smac_flags; + int smac_attacherr; + mac_handle_t smac_mh; + softmac_dev_t *smac_softmac[2]; + taskqid_t smac_taskq; + /* + * Number of minor nodes whose post-attach routine has succeeded. + * This should be the same as the numbers of softmac_dev_t. + * Note that it does not imply SOFTMAC_ATTACH_DONE as the taskq might + * be still ongoing. + */ + uint32_t smac_attachok_cnt; + /* + * Number of softmac_dev_t left when pre-detach fails. This is used + * to indicate whether postattach is called because of a failed + * pre-detach. + */ + uint32_t smac_attached_left; + + /* + * This field is set and cleared by users of softmac (who calls + * softmac_hold/rele_device()). It is protected by smac_mutex. + */ + dev_info_t *smac_udip; + + /* + * The remaining fields are used to register the MAC for a legacy + * device. They are set in softmac_mac_register() and do not change. + * One can access them when mac_register() is done without locks. + */ + + /* + * media type is needed for create <link name, linkid> mapping, so + * it is set for GLDv3 device as well + */ + uint_t smac_media; + /* DLPI style of the underlying device */ + int smac_style; + dev_t smac_dev; + size_t smac_saplen; + size_t smac_addrlen; + uchar_t smac_unicst_addr[MAXMACADDRLEN]; + uint_t smac_min_sdu; + uint_t smac_max_sdu; + uint32_t smac_margin; + + /* Notifications the underlying driver can support. */ + uint32_t smac_notifications; + + /* + * Capabilities of the underlying driver. + */ + uint32_t smac_capab_flags; + uint32_t smac_hcksum_txflags; + boolean_t smac_no_capability_req; + dl_capab_mdt_t smac_mdt_capab; + boolean_t smac_mdt; + + /* + * The following fields are protected by smac_lock + */ + krwlock_t smac_lock; + enum softmac_state smac_state; + /* Lower stream structure */ + softmac_lower_t *smac_lower; +} softmac_t; + +typedef struct smac_ioc_start_s { + softmac_lower_t *si_slp; +} smac_ioc_start_t; + +#define SMAC_IOC ('S' << 24 | 'M' << 16 | 'C' << 8) +#define SMAC_IOC_START (SMAC_IOC | 0x01) + +#define SOFTMAC_BLANK_TICKS 128 +#define SOFTMAC_BLANK_PKT_COUNT 8 + +extern dev_info_t *softmac_dip; +#define SOFTMAC_DEV_NAME "softmac" + +extern int softmac_send_bind_req(softmac_lower_t *, uint_t); +extern int softmac_send_notify_req(softmac_lower_t *, uint32_t); +extern int softmac_send_promisc_req(softmac_lower_t *, t_uscalar_t, + boolean_t); +extern void softmac_init(void); +extern void softmac_fini(void); +extern boolean_t softmac_busy(void); +extern int softmac_fill_capab(ldi_handle_t, softmac_t *); +extern int softmac_capab_enable(softmac_lower_t *); +extern void softmac_rput_process_notdata(queue_t *, mblk_t *); +extern void softmac_rput_process_data(softmac_lower_t *, mblk_t *); + +extern int softmac_m_promisc(void *, boolean_t); +extern int softmac_m_multicst(void *, boolean_t, const uint8_t *); +extern int softmac_m_unicst(void *, const uint8_t *); +extern void softmac_m_ioctl(void *, queue_t *, mblk_t *); +extern int softmac_m_stat(void *, uint_t, uint64_t *); +extern mblk_t *softmac_m_tx(void *, mblk_t *); +extern void softmac_m_resources(void *); +extern int softmac_proto_tx(softmac_lower_t *, mblk_t *, mblk_t **); +extern void softmac_ioctl_tx(softmac_lower_t *, mblk_t *, mblk_t **); + +#ifdef __cplusplus +} +#endif + +#endif /* _SYS_SOFTMAC_IMPL_H */ |