1300113Sscottl# 2300113Sscottl# Copyright (c) 2014, Matthew Macy (kmacy@freebsd.org) 3300113Sscottl# All rights reserved. 4300113Sscottl# 5300113Sscottl# Redistribution and use in source and binary forms, with or without 6300113Sscottl# modification, are permitted provided that the following conditions are met: 7300113Sscottl# 8300113Sscottl# 1. Redistributions of source code must retain the above copyright notice, 9300113Sscottl# this list of conditions and the following disclaimer. 10300113Sscottl# 11300113Sscottl# 2. Neither the name of Matthew Macy nor the names of its 12300113Sscottl# contributors may be used to endorse or promote products derived from 13300113Sscottl# this software without specific prior written permission. 14300113Sscottl# 15300113Sscottl# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 16300113Sscottl# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17300113Sscottl# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18300113Sscottl# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 19300113Sscottl# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 20300113Sscottl# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 21300113Sscottl# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 22300113Sscottl# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 23300113Sscottl# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 24300113Sscottl# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 25300113Sscottl# POSSIBILITY OF SUCH DAMAGE. 26300113Sscottl# 27300113Sscottl# $FreeBSD: stable/11/sys/net/ifdi_if.m 361055 2020-05-14 20:07:02Z erj $ 28300113Sscottl# 29300113Sscottl 30300113Sscottl#include <sys/types.h> 31300113Sscottl#include <sys/systm.h> 32300113Sscottl#include <sys/socket.h> 33300113Sscottl 34300113Sscottl#include <machine/bus.h> 35300113Sscottl#include <sys/bus.h> 36300113Sscottl 37300113Sscottl#include <net/ethernet.h> 38300113Sscottl#include <net/if.h> 39300113Sscottl#include <net/if_var.h> 40300113Sscottl#include <net/if_media.h> 41300113Sscottl#include <net/iflib.h> 42300113Sscottl 43300113SscottlINTERFACE ifdi; 44300113Sscottl 45300113SscottlCODE { 46300113Sscottl 47300113Sscottl static void 48300113Sscottl null_void_op(if_ctx_t _ctx __unused) 49300113Sscottl { 50300113Sscottl } 51300113Sscottl 52300113Sscottl static void 53300113Sscottl null_timer_op(if_ctx_t _ctx __unused, uint16_t _qsidx __unused) 54300113Sscottl { 55300113Sscottl } 56300113Sscottl 57300113Sscottl static int 58300113Sscottl null_int_op(if_ctx_t _ctx __unused) 59300113Sscottl { 60300113Sscottl return (0); 61300113Sscottl } 62300113Sscottl 63304704Sshurd static int 64300113Sscottl null_queue_intr_enable(if_ctx_t _ctx __unused, uint16_t _qid __unused) 65300113Sscottl { 66304704Sshurd return (ENOTSUP); 67300113Sscottl } 68300113Sscottl 69300113Sscottl static void 70300113Sscottl null_led_func(if_ctx_t _ctx __unused, int _onoff __unused) 71300113Sscottl { 72300113Sscottl } 73300113Sscottl 74300113Sscottl static void 75300113Sscottl null_vlan_register_op(if_ctx_t _ctx __unused, uint16_t vtag __unused) 76300113Sscottl { 77300113Sscottl } 78300113Sscottl 79300113Sscottl static int 80300113Sscottl null_q_setup(if_ctx_t _ctx __unused, uint32_t _qid __unused) 81300113Sscottl { 82300113Sscottl return (0); 83300113Sscottl } 84300113Sscottl 85300113Sscottl static int 86300113Sscottl null_i2c_req(if_ctx_t _sctx __unused, struct ifi2creq *_i2c __unused) 87300113Sscottl { 88300113Sscottl return (ENOTSUP); 89300113Sscottl } 90300113Sscottl 91300113Sscottl static int 92300113Sscottl null_sysctl_int_delay(if_ctx_t _sctx __unused, if_int_delay_info_t _iidi __unused) 93300113Sscottl { 94300113Sscottl return (0); 95300113Sscottl } 96300113Sscottl 97300113Sscottl static int 98300113Sscottl null_iov_init(if_ctx_t _ctx __unused, uint16_t num_vfs __unused, const nvlist_t *params __unused) 99300113Sscottl { 100300113Sscottl return (ENOTSUP); 101300113Sscottl } 102300113Sscottl 103300113Sscottl static int 104300113Sscottl null_vf_add(if_ctx_t _ctx __unused, uint16_t num_vfs __unused, const nvlist_t *params __unused) 105300113Sscottl { 106300113Sscottl return (ENOTSUP); 107300113Sscottl } 108300113Sscottl 109300113Sscottl static int 110300113Sscottl null_priv_ioctl(if_ctx_t _ctx __unused, u_long command, caddr_t *data __unused) 111300113Sscottl { 112300113Sscottl return (ENOTSUP); 113300113Sscottl } 114361055Serj 115361055Serj static bool 116361055Serj null_needs_restart(if_ctx_t _ctx __unused, enum iflib_restart_event _event __unused) 117361055Serj { 118361055Serj return (true); 119361055Serj } 120300113Sscottl}; 121300113Sscottl 122300113Sscottl# 123300113Sscottl# bus interfaces 124300113Sscottl# 125300113Sscottl 126300113SscottlMETHOD int attach_pre { 127300113Sscottl if_ctx_t _ctx; 128300113Sscottl}; 129300113Sscottl 130300113SscottlMETHOD int attach_post { 131300113Sscottl if_ctx_t _ctx; 132300113Sscottl}; 133300113Sscottl 134300113SscottlMETHOD int detach { 135300113Sscottl if_ctx_t _ctx; 136300113Sscottl}; 137300113Sscottl 138300113SscottlMETHOD int suspend { 139300113Sscottl if_ctx_t _ctx; 140300113Sscottl} DEFAULT null_int_op; 141300113Sscottl 142300113SscottlMETHOD int shutdown { 143300113Sscottl if_ctx_t _ctx; 144300113Sscottl} DEFAULT null_int_op; 145300113Sscottl 146300113SscottlMETHOD int resume { 147300113Sscottl if_ctx_t _ctx; 148300113Sscottl} DEFAULT null_int_op; 149300113Sscottl 150300113Sscottl# 151300113Sscottl# downcall to driver to allocate its 152300113Sscottl# own queue state and tie it to the parent 153300113Sscottl# 154300113Sscottl 155300113SscottlMETHOD int tx_queues_alloc { 156300113Sscottl if_ctx_t _ctx; 157300113Sscottl caddr_t *_vaddrs; 158300113Sscottl uint64_t *_paddrs; 159300113Sscottl int ntxqs; 160300113Sscottl int ntxqsets; 161300113Sscottl}; 162300113Sscottl 163300113SscottlMETHOD int rx_queues_alloc { 164300113Sscottl if_ctx_t _ctx; 165300113Sscottl caddr_t *_vaddrs; 166300113Sscottl uint64_t *_paddrs; 167300113Sscottl int nrxqs; 168300113Sscottl int nrxqsets; 169300113Sscottl}; 170300113Sscottl 171300113SscottlMETHOD void queues_free { 172300113Sscottl if_ctx_t _ctx; 173300113Sscottl}; 174300113Sscottl 175300113Sscottl# 176300113Sscottl# interface reset / stop 177300113Sscottl# 178300113Sscottl 179300113SscottlMETHOD void init { 180300113Sscottl if_ctx_t _ctx; 181300113Sscottl}; 182300113Sscottl 183300113SscottlMETHOD void stop { 184300113Sscottl if_ctx_t _ctx; 185300113Sscottl}; 186300113Sscottl 187300113Sscottl# 188300113Sscottl# interrupt setup and manipulation 189300113Sscottl# 190300113Sscottl 191300113SscottlMETHOD int msix_intr_assign { 192300113Sscottl if_ctx_t _sctx; 193300113Sscottl int msix; 194300113Sscottl}; 195300113Sscottl 196300113SscottlMETHOD void intr_enable { 197300113Sscottl if_ctx_t _ctx; 198300113Sscottl}; 199300113Sscottl 200300113SscottlMETHOD void intr_disable { 201300113Sscottl if_ctx_t _ctx; 202300113Sscottl}; 203300113Sscottl 204333338SshurdMETHOD int rx_queue_intr_enable { 205300113Sscottl if_ctx_t _ctx; 206300113Sscottl uint16_t _qid; 207300113Sscottl} DEFAULT null_queue_intr_enable; 208300113Sscottl 209333338SshurdMETHOD int tx_queue_intr_enable { 210333338Sshurd if_ctx_t _ctx; 211333338Sshurd uint16_t _qid; 212333338Sshurd} DEFAULT null_queue_intr_enable; 213333338Sshurd 214300113SscottlMETHOD void link_intr_enable { 215300113Sscottl if_ctx_t _ctx; 216300113Sscottl} DEFAULT null_void_op; 217300113Sscottl 218300113Sscottl# 219300113Sscottl# interface configuration 220300113Sscottl# 221300113Sscottl 222300113SscottlMETHOD void multi_set { 223300113Sscottl if_ctx_t _ctx; 224300113Sscottl}; 225300113Sscottl 226300113SscottlMETHOD int mtu_set { 227300113Sscottl if_ctx_t _ctx; 228300113Sscottl uint32_t _mtu; 229300113Sscottl}; 230300113Sscottl 231300113SscottlMETHOD void media_set{ 232300113Sscottl if_ctx_t _ctx; 233300113Sscottl} DEFAULT null_void_op; 234300113Sscottl 235300113SscottlMETHOD int promisc_set { 236300113Sscottl if_ctx_t _ctx; 237300113Sscottl int _flags; 238300113Sscottl}; 239300113Sscottl 240300113SscottlMETHOD void crcstrip_set { 241300113Sscottl if_ctx_t _ctx; 242300113Sscottl int _onoff; 243333338Sshurd int _strip; 244300113Sscottl}; 245300113Sscottl 246300113Sscottl# 247300113Sscottl# IOV handling 248300113Sscottl# 249300113Sscottl 250300113SscottlMETHOD void vflr_handle { 251300113Sscottl if_ctx_t _ctx; 252300113Sscottl} DEFAULT null_void_op; 253300113Sscottl 254300113SscottlMETHOD int iov_init { 255300113Sscottl if_ctx_t _ctx; 256300113Sscottl uint16_t num_vfs; 257300113Sscottl const nvlist_t * params; 258300113Sscottl} DEFAULT null_iov_init; 259300113Sscottl 260300113SscottlMETHOD void iov_uninit { 261300113Sscottl if_ctx_t _ctx; 262300113Sscottl} DEFAULT null_void_op; 263300113Sscottl 264300113SscottlMETHOD int iov_vf_add { 265300113Sscottl if_ctx_t _ctx; 266300113Sscottl uint16_t num_vfs; 267300113Sscottl const nvlist_t * params; 268300113Sscottl} DEFAULT null_vf_add; 269300113Sscottl 270300113Sscottl 271300113Sscottl# 272300113Sscottl# Device status 273300113Sscottl# 274300113Sscottl 275300113SscottlMETHOD void update_admin_status { 276300113Sscottl if_ctx_t _ctx; 277300113Sscottl}; 278300113Sscottl 279300113SscottlMETHOD void media_status { 280300113Sscottl if_ctx_t _ctx; 281300113Sscottl struct ifmediareq *_ifm; 282300113Sscottl}; 283300113Sscottl 284300113SscottlMETHOD int media_change { 285300113Sscottl if_ctx_t _ctx; 286300113Sscottl}; 287300113Sscottl 288300113SscottlMETHOD uint64_t get_counter { 289300113Sscottl if_ctx_t _ctx; 290300113Sscottl ift_counter cnt; 291300113Sscottl}; 292300113Sscottl 293300113SscottlMETHOD int priv_ioctl { 294300113Sscottl if_ctx_t _ctx; 295300113Sscottl u_long _cmd; 296300113Sscottl caddr_t _data; 297300113Sscottl} DEFAULT null_priv_ioctl; 298300113Sscottl 299300113Sscottl# 300300113Sscottl# optional methods 301300113Sscottl# 302300113Sscottl 303300113SscottlMETHOD int i2c_req { 304300113Sscottl if_ctx_t _ctx; 305300113Sscottl struct ifi2creq *_req; 306300113Sscottl} DEFAULT null_i2c_req; 307300113Sscottl 308300113SscottlMETHOD int txq_setup { 309300113Sscottl if_ctx_t _ctx; 310300113Sscottl uint32_t _txqid; 311300113Sscottl} DEFAULT null_q_setup; 312300113Sscottl 313300113SscottlMETHOD int rxq_setup { 314300113Sscottl if_ctx_t _ctx; 315300113Sscottl uint32_t _txqid; 316300113Sscottl} DEFAULT null_q_setup; 317300113Sscottl 318300113SscottlMETHOD void timer { 319300113Sscottl if_ctx_t _ctx; 320300113Sscottl uint16_t _txqid; 321300113Sscottl} DEFAULT null_timer_op; 322300113Sscottl 323300113SscottlMETHOD void watchdog_reset { 324300113Sscottl if_ctx_t _ctx; 325300113Sscottl} DEFAULT null_void_op; 326300113Sscottl 327300113SscottlMETHOD void led_func { 328300113Sscottl if_ctx_t _ctx; 329300113Sscottl int _onoff; 330300113Sscottl} DEFAULT null_led_func; 331300113Sscottl 332300113SscottlMETHOD void vlan_register { 333300113Sscottl if_ctx_t _ctx; 334300113Sscottl uint16_t _vtag; 335300113Sscottl} DEFAULT null_vlan_register_op; 336300113Sscottl 337300113SscottlMETHOD void vlan_unregister { 338300113Sscottl if_ctx_t _ctx; 339300113Sscottl uint16_t _vtag; 340300113Sscottl} DEFAULT null_vlan_register_op; 341300113Sscottl 342300113SscottlMETHOD int sysctl_int_delay { 343300113Sscottl if_ctx_t _sctx; 344300113Sscottl if_int_delay_info_t _iidi; 345300113Sscottl} DEFAULT null_sysctl_int_delay; 346300113Sscottl 347333338SshurdMETHOD void debug { 348333338Sshurd if_ctx_t _ctx; 349333338Sshurd} DEFAULT null_void_op; 350361055Serj 351361055SerjMETHOD bool needs_restart { 352361055Serj if_ctx_t _ctx; 353361055Serj enum iflib_restart_event _event; 354361055Serj} DEFAULT null_needs_restart; 355