#ifndef _INTELVF_H #define _INTELVF_H /** @file * * Intel 10/100/1000 virtual function network card driver * */ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); #include "intel.h" /** Intel VF BAR size */ #define INTELVF_BAR_SIZE ( 16 * 1024 ) /** Mailbox Control Register */ #define INTELVF_MBCTRL 0x0c40UL #define INTELVF_MBCTRL_REQ 0x00000001UL /**< Request for PF ready */ #define INTELVF_MBCTRL_ACK 0x00000002UL /**< PF message received */ #define INTELVF_MBCTRL_VFU 0x00000004UL /**< Buffer taken by VF */ #define INTELVF_MBCTRL_PFU 0x00000008UL /**< Buffer taken to PF */ #define INTELVF_MBCTRL_PFSTS 0x00000010UL /**< PF wrote a message */ #define INTELVF_MBCTRL_PFACK 0x00000020UL /**< PF acknowledged message */ #define INTELVF_MBCTRL_RSTI 0x00000040UL /**< PF reset in progress */ #define INTELVF_MBCTRL_RSTD 0x00000080UL /**< PF reset complete */ /** Mailbox Memory Register Base */ #define INTELVF_MBMEM 0x0800UL /** Reset mailbox message */ #define INTELVF_MSG_TYPE_RESET 0x00000001UL /** Set MAC address mailbox message */ #define INTELVF_MSG_TYPE_SET_MAC 0x00000002UL /** Set MTU mailbox message */ #define INTELVF_MSG_TYPE_SET_MTU 0x00000005UL /** Get queue configuration message */ #define INTELVF_MSG_TYPE_GET_QUEUES 0x00000009UL /** Control ("ping") mailbox message */ #define INTELVF_MSG_TYPE_CONTROL 0x00000100UL /** Message type mask */ #define INTELVF_MSG_TYPE_MASK 0x0000ffffUL /** Message NACK flag */ #define INTELVF_MSG_NACK 0x40000000UL /** Message ACK flag */ #define INTELVF_MSG_ACK 0x80000000UL /** Message is a response */ #define INTELVF_MSG_RESPONSE ( INTELVF_MSG_ACK | INTELVF_MSG_NACK ) /** MAC address mailbox message */ struct intelvf_msg_mac { /** Message header */ uint32_t hdr; /** MAC address */ uint8_t mac[ETH_ALEN]; /** Alignment padding */ uint8_t reserved[ (-ETH_ALEN) & 0x3 ]; } __attribute__ (( packed )); /** Version number mailbox message */ struct intelvf_msg_version { /** Message header */ uint32_t hdr; /** API version */ uint32_t version; } __attribute__ (( packed )); /** MTU mailbox message */ struct intelvf_msg_mtu { /** Message header */ uint32_t hdr; /** Maximum packet size */ uint32_t mtu; } __attribute__ (( packed )); /** Queue configuration mailbox message (API v1.1+ only) */ struct intelvf_msg_queues { /** Message header */ uint32_t hdr; /** Maximum number of transmit queues */ uint32_t tx; /** Maximum number of receive queues */ uint32_t rx; /** VLAN hand-waving thing * * This is labelled IXGBE_VF_TRANS_VLAN in the Linux driver. * * A comment in the Linux PF driver describes it as "notify VF * of need for VLAN tag stripping, and correct queue". It * will be filled with a non-zero value if the PF is enforcing * the use of a single VLAN tag. It will also be filled with * a non-zero value if the PF is using multiple traffic * classes. * * The Linux VF driver seems to treat this field as being * simply the number of traffic classes, and gives it no * VLAN-related interpretation. * * If the PF is enforcing the use of a single VLAN tag for the * VF, then the VLAN tag will be transparently inserted in * transmitted packets (via the PFVMVIR register) but will * still be visible in received packets. The Linux VF driver * handles this unexpected VLAN tag by simply ignoring any * unrecognised VLAN tags. * * We choose to strip and ignore the VLAN tag if this field * has a non-zero value. */ uint32_t vlan_thing; /** Default queue */ uint32_t dflt; } __attribute__ (( packed )); /** Mailbox message */ union intelvf_msg { /** Message header */ uint32_t hdr; /** MAC address message */ struct intelvf_msg_mac mac; /** Version number message */ struct intelvf_msg_version version; /** MTU message */ struct intelvf_msg_mtu mtu; /** Queue configuration message */ struct intelvf_msg_queues queues; /** Raw dwords */ uint32_t dword[0]; }; /** Maximum time to wait for mailbox message * * This is a policy decision. */ #define INTELVF_MBOX_MAX_WAIT_MS 500 extern int intelvf_mbox_msg ( struct intel_nic *intel, union intelvf_msg *msg ); extern int intelvf_mbox_poll ( struct intel_nic *intel ); extern int intelvf_mbox_wait ( struct intel_nic *intel ); extern int intelvf_mbox_reset ( struct intel_nic *intel, uint8_t *hw_addr ); extern int intelvf_mbox_set_mac ( struct intel_nic *intel, const uint8_t *ll_addr ); extern int intelvf_mbox_set_mtu ( struct intel_nic *intel, size_t mtu ); #endif /* _INTELVF_H */