|
Packit Service |
646995 |
/*
|
|
Packit Service |
646995 |
* Copyright (c) 2009-2011, Broadcom Corporation
|
|
Packit Service |
646995 |
* Copyright (c) 2014, QLogic Corporation
|
|
Packit Service |
646995 |
*
|
|
Packit Service |
646995 |
* Written by: Benjamin Li (benli@broadcom.com)
|
|
Packit Service |
646995 |
*
|
|
Packit Service |
646995 |
* All rights reserved.
|
|
Packit Service |
646995 |
*
|
|
Packit Service |
646995 |
* Redistribution and use in source and binary forms, with or without
|
|
Packit Service |
646995 |
* modification, are permitted provided that the following conditions
|
|
Packit Service |
646995 |
* are met:
|
|
Packit Service |
646995 |
* 1. Redistributions of source code must retain the above copyright
|
|
Packit Service |
646995 |
* notice, this list of conditions and the following disclaimer.
|
|
Packit Service |
646995 |
* 2. Redistributions in binary form must reproduce the above copyright
|
|
Packit Service |
646995 |
* notice, this list of conditions and the following disclaimer in the
|
|
Packit Service |
646995 |
* documentation and/or other materials provided with the distribution.
|
|
Packit Service |
646995 |
* 3. All advertising materials mentioning features or use of this software
|
|
Packit Service |
646995 |
* must display the following acknowledgement:
|
|
Packit Service |
646995 |
* This product includes software developed by Adam Dunkels.
|
|
Packit Service |
646995 |
* 4. The name of the author may not be used to endorse or promote
|
|
Packit Service |
646995 |
* products derived from this software without specific prior
|
|
Packit Service |
646995 |
* written permission.
|
|
Packit Service |
646995 |
*
|
|
Packit Service |
646995 |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
|
|
Packit Service |
646995 |
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
Packit Service |
646995 |
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
Packit Service |
646995 |
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
|
Packit Service |
646995 |
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
Packit Service |
646995 |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
|
Packit Service |
646995 |
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
Packit Service |
646995 |
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
|
Packit Service |
646995 |
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
Packit Service |
646995 |
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
Packit Service |
646995 |
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
Packit Service |
646995 |
*
|
|
Packit Service |
646995 |
* bnx2x.c - bnx2x user space driver
|
|
Packit Service |
646995 |
*
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/* include nic.h before linux/ethtool.h to avoid redefinitions of
|
|
Packit Service |
646995 |
* eth structs
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
#include "nic.h"
|
|
Packit Service |
646995 |
#include <errno.h>
|
|
Packit Service |
646995 |
#include <stdio.h>
|
|
Packit Service |
646995 |
#include <string.h>
|
|
Packit Service |
646995 |
#include <arpa/inet.h>
|
|
Packit Service |
646995 |
#include <linux/types.h> /* Needed for linux/ethtool.h on RHEL 5.x */
|
|
Packit Service |
646995 |
#include <linux/sockios.h>
|
|
Packit Service |
646995 |
#include <linux/ethtool.h>
|
|
Packit Service |
646995 |
#include <sys/mman.h>
|
|
Packit Service |
646995 |
#include <sys/ioctl.h>
|
|
Packit Service |
646995 |
#include <sys/sysmacros.h>
|
|
Packit Service |
646995 |
#include <sys/types.h>
|
|
Packit Service |
646995 |
#include <sys/stat.h>
|
|
Packit Service |
646995 |
#include <sys/user.h>
|
|
Packit Service |
646995 |
#include <fcntl.h>
|
|
Packit Service |
646995 |
#include <unistd.h>
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
#include "config.h"
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
#include "build_date.h"
|
|
Packit Service |
646995 |
#include "bnx2x.h"
|
|
Packit Service |
646995 |
#include "cnic.h"
|
|
Packit Service |
646995 |
#include "logger.h"
|
|
Packit Service |
646995 |
#include "nic_id.h"
|
|
Packit Service |
646995 |
#include "nic_utils.h"
|
|
Packit Service |
646995 |
#include "options.h"
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
#define PFX "bnx2x "
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/* Foward struct declarations */
|
|
Packit Service |
646995 |
struct nic_ops bnx2x_op;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/*******************************************************************************
|
|
Packit Service |
646995 |
* NIC Library Strings
|
|
Packit Service |
646995 |
******************************************************************************/
|
|
Packit Service |
646995 |
static const char library_name[] = "bnx2x";
|
|
Packit Service |
646995 |
static const char library_version[] = PACKAGE_VERSION;
|
|
Packit Service |
646995 |
static const char library_uio_name[] = "bnx2x_cnic";
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/* The name that should be returned from /sys/class/uio/uio0/name */
|
|
Packit Service |
646995 |
static const char cnic_uio_sysfs_name_tempate[] = "/sys/class/uio/uio%i/name";
|
|
Packit Service |
646995 |
static const char bnx2x_uio_sysfs_name[] = "bnx2x_cnic";
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/*******************************************************************************
|
|
Packit Service |
646995 |
* String constants used to display human readable adapter name
|
|
Packit Service |
646995 |
******************************************************************************/
|
|
Packit Service |
646995 |
static const char brcm_57710[] = "QLogic NetXtreme II BCM57710 10-Gigabit";
|
|
Packit Service |
646995 |
static const char brcm_57711[] = "QLogic NetXtreme II BCM57711 10-Gigabit";
|
|
Packit Service |
646995 |
static const char brcm_57711e[] = "QLogic NetXtreme II BCM57711E 10-Gigabit";
|
|
Packit Service |
646995 |
static const char brcm_57712[] = "QLogic NetXtreme II BCM57712 10-Gigabit";
|
|
Packit Service |
646995 |
static const char brcm_57712_MF[] = "QLogic NetXtreme II BCM57712 MF "
|
|
Packit Service |
646995 |
"10-Gigabit";
|
|
Packit Service |
646995 |
static const char brcm_57712_VF[] = "QLogic NetXtreme II BCM57712 VF "
|
|
Packit Service |
646995 |
"10-Gigabit";
|
|
Packit Service |
646995 |
static const char brcm_57713[] = "QLogic NetXtreme II BCM57713 10-Gigabit";
|
|
Packit Service |
646995 |
static const char brcm_57713e[] = "QLogic NetXtreme II BCM57713E 10-Gigabit";
|
|
Packit Service |
646995 |
static const char brcm_57800[] = "QLogic NetXtreme II BCM57800 10-Gigabit";
|
|
Packit Service |
646995 |
static const char brcm_57800_MF[] = "QLogic NetXtreme II BCM57800 MF "
|
|
Packit Service |
646995 |
"10-Gigabit";
|
|
Packit Service |
646995 |
static const char brcm_57800_VF[] = "QLogic NetXtreme II BCM57800 VF "
|
|
Packit Service |
646995 |
"10-Gigabit";
|
|
Packit Service |
646995 |
static const char brcm_57810[] = "QLogic NetXtreme II BCM57810 10-Gigabit";
|
|
Packit Service |
646995 |
static const char brcm_57810_MF[] = "QLogic NetXtreme II BCM57810 MF "
|
|
Packit Service |
646995 |
"10-Gigabit";
|
|
Packit Service |
646995 |
static const char brcm_57810_VF[] = "QLogic NetXtreme II BCM57810 VF "
|
|
Packit Service |
646995 |
"10-Gigabit";
|
|
Packit Service |
646995 |
static const char brcm_57811[] = "QLogic NetXtreme II BCM57811 10-Gigabit";
|
|
Packit Service |
646995 |
static const char brcm_57811_MF[] = "QLogic NetXtreme II BCM57811 MF "
|
|
Packit Service |
646995 |
"10-Gigabit";
|
|
Packit Service |
646995 |
static const char brcm_57811_VF[] = "QLogic NetXtreme II BCM57811 VF "
|
|
Packit Service |
646995 |
"10-Gigabit";
|
|
Packit Service |
646995 |
static const char brcm_57840[] = "QLogic NetXtreme II BCM57840 10-Gigabit";
|
|
Packit Service |
646995 |
static const char brcm_57840_MF[] = "QLogic NetXtreme II BCM57840 MF "
|
|
Packit Service |
646995 |
"10-Gigabit";
|
|
Packit Service |
646995 |
static const char brcm_57840_VF[] = "QLogic NetXtreme II BCM57840 VF "
|
|
Packit Service |
646995 |
"10-Gigabit";
|
|
Packit Service |
646995 |
static const char brcm_57840_4_10[] = "QLogic NetXtreme II BCM57840 4x"
|
|
Packit Service |
646995 |
"10-Gigabit";
|
|
Packit Service |
646995 |
static const char brcm_57840_2_20[] = "QLogic NetXtreme II BCM57840 2x"
|
|
Packit Service |
646995 |
"20-Gigabit";
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/*******************************************************************************
|
|
Packit Service |
646995 |
* PCI ID constants
|
|
Packit Service |
646995 |
******************************************************************************/
|
|
Packit Service |
646995 |
#define PCI_VENDOR_ID_BROADCOM 0x14e4
|
|
Packit Service |
646995 |
#define PCI_VENDOR_ID_QLOGIC 0x1077
|
|
Packit Service |
646995 |
#define PCI_DEVICE_ID_NX2_57710 0x164e
|
|
Packit Service |
646995 |
#define PCI_DEVICE_ID_NX2_57711 0x164f
|
|
Packit Service |
646995 |
#define PCI_DEVICE_ID_NX2_57711E 0x1650
|
|
Packit Service |
646995 |
#define PCI_DEVICE_ID_NX2_57712 0x1662
|
|
Packit Service |
646995 |
#define PCI_DEVICE_ID_NX2_57712_MF 0x1663
|
|
Packit Service |
646995 |
#define PCI_DEVICE_ID_NX2_57712_VF 0x166f
|
|
Packit Service |
646995 |
#define PCI_DEVICE_ID_NX2_57713 0x1651
|
|
Packit Service |
646995 |
#define PCI_DEVICE_ID_NX2_57713E 0x1652
|
|
Packit Service |
646995 |
#define PCI_DEVICE_ID_NX2_57800 0x168a
|
|
Packit Service |
646995 |
#define PCI_DEVICE_ID_NX2_57800_MF 0x16a5
|
|
Packit Service |
646995 |
#define PCI_DEVICE_ID_NX2_57800_VF 0x16a9
|
|
Packit Service |
646995 |
#define PCI_DEVICE_ID_NX2_57810 0x168e
|
|
Packit Service |
646995 |
#define PCI_DEVICE_ID_NX2_57810_MF 0x16ae
|
|
Packit Service |
646995 |
#define PCI_DEVICE_ID_NX2_57810_VF 0x16af
|
|
Packit Service |
646995 |
#define PCI_DEVICE_ID_NX2_57811 0x163d
|
|
Packit Service |
646995 |
#define PCI_DEVICE_ID_NX2_57811_MF 0x163e
|
|
Packit Service |
646995 |
#define PCI_DEVICE_ID_NX2_57811_VF 0x163f
|
|
Packit Service |
646995 |
#define PCI_DEVICE_ID_NX2_57840_OBSOLETE 0x168d
|
|
Packit Service |
646995 |
#define PCI_DEVICE_ID_NX2_57840_MF_OBSOLETE 0x16ab
|
|
Packit Service |
646995 |
#define PCI_DEVICE_ID_NX2_57840_4_10 0x16a1
|
|
Packit Service |
646995 |
#define PCI_DEVICE_ID_NX2_57840_2_20 0x16a2
|
|
Packit Service |
646995 |
#define PCI_DEVICE_ID_NX2_57840_MF 0x16a4
|
|
Packit Service |
646995 |
#define PCI_DEVICE_ID_NX2_57840_VF 0x16ad
|
|
Packit Service |
646995 |
#define PCI_ANY_ID (~0)
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/* This is the table used to match PCI vendor and device ID's to the
|
|
Packit Service |
646995 |
* human readable string names of the devices */
|
|
Packit Service |
646995 |
static const struct pci_device_id bnx2x_pci_tbl[] = {
|
|
Packit Service |
646995 |
{PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57710,
|
|
Packit Service |
646995 |
PCI_ANY_ID, PCI_ANY_ID, brcm_57710},
|
|
Packit Service |
646995 |
{PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57711,
|
|
Packit Service |
646995 |
PCI_ANY_ID, PCI_ANY_ID, brcm_57711},
|
|
Packit Service |
646995 |
{PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57711E,
|
|
Packit Service |
646995 |
PCI_ANY_ID, PCI_ANY_ID, brcm_57711e},
|
|
Packit Service |
646995 |
{PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57712,
|
|
Packit Service |
646995 |
PCI_ANY_ID, PCI_ANY_ID, brcm_57712},
|
|
Packit Service |
646995 |
{PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57712_MF,
|
|
Packit Service |
646995 |
PCI_ANY_ID, PCI_ANY_ID, brcm_57712_MF},
|
|
Packit Service |
646995 |
{PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57712_VF,
|
|
Packit Service |
646995 |
PCI_ANY_ID, PCI_ANY_ID, brcm_57712_VF},
|
|
Packit Service |
646995 |
{PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57713,
|
|
Packit Service |
646995 |
PCI_ANY_ID, PCI_ANY_ID, brcm_57713},
|
|
Packit Service |
646995 |
{PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57713E,
|
|
Packit Service |
646995 |
PCI_ANY_ID, PCI_ANY_ID, brcm_57713e},
|
|
Packit Service |
646995 |
{PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57800,
|
|
Packit Service |
646995 |
PCI_ANY_ID, PCI_ANY_ID, brcm_57800},
|
|
Packit Service |
646995 |
{PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57800_MF,
|
|
Packit Service |
646995 |
PCI_ANY_ID, PCI_ANY_ID, brcm_57800_MF},
|
|
Packit Service |
646995 |
{PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57800_VF,
|
|
Packit Service |
646995 |
PCI_ANY_ID, PCI_ANY_ID, brcm_57800_VF},
|
|
Packit Service |
646995 |
{PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57810,
|
|
Packit Service |
646995 |
PCI_ANY_ID, PCI_ANY_ID, brcm_57810},
|
|
Packit Service |
646995 |
{PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57810_MF,
|
|
Packit Service |
646995 |
PCI_ANY_ID, PCI_ANY_ID, brcm_57810_MF},
|
|
Packit Service |
646995 |
{PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57810_VF,
|
|
Packit Service |
646995 |
PCI_ANY_ID, PCI_ANY_ID, brcm_57810_VF},
|
|
Packit Service |
646995 |
{PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57811,
|
|
Packit Service |
646995 |
PCI_ANY_ID, PCI_ANY_ID, brcm_57811},
|
|
Packit Service |
646995 |
{PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57811_MF,
|
|
Packit Service |
646995 |
PCI_ANY_ID, PCI_ANY_ID, brcm_57811_MF},
|
|
Packit Service |
646995 |
{PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57811_VF,
|
|
Packit Service |
646995 |
PCI_ANY_ID, PCI_ANY_ID, brcm_57811_VF},
|
|
Packit Service |
646995 |
{PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57840_OBSOLETE,
|
|
Packit Service |
646995 |
PCI_ANY_ID, PCI_ANY_ID, brcm_57840},
|
|
Packit Service |
646995 |
{PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57840_MF_OBSOLETE,
|
|
Packit Service |
646995 |
PCI_ANY_ID, PCI_ANY_ID, brcm_57840_MF},
|
|
Packit Service |
646995 |
{PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57840_4_10,
|
|
Packit Service |
646995 |
PCI_ANY_ID, PCI_ANY_ID, brcm_57840_4_10},
|
|
Packit Service |
646995 |
{PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57840_2_20,
|
|
Packit Service |
646995 |
PCI_ANY_ID, PCI_ANY_ID, brcm_57840_2_20},
|
|
Packit Service |
646995 |
{PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57840_MF,
|
|
Packit Service |
646995 |
PCI_ANY_ID, PCI_ANY_ID, brcm_57840_MF},
|
|
Packit Service |
646995 |
{PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_57840_VF,
|
|
Packit Service |
646995 |
PCI_ANY_ID, PCI_ANY_ID, brcm_57840_VF},
|
|
Packit Service |
646995 |
{PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_NX2_57840_4_10,
|
|
Packit Service |
646995 |
PCI_ANY_ID, PCI_ANY_ID, brcm_57840_4_10},
|
|
Packit Service |
646995 |
{PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_NX2_57840_2_20,
|
|
Packit Service |
646995 |
PCI_ANY_ID, PCI_ANY_ID, brcm_57840_2_20},
|
|
Packit Service |
646995 |
{PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_NX2_57840_MF,
|
|
Packit Service |
646995 |
PCI_ANY_ID, PCI_ANY_ID, brcm_57840_MF},
|
|
Packit Service |
646995 |
{PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_NX2_57840_VF,
|
|
Packit Service |
646995 |
PCI_ANY_ID, PCI_ANY_ID, brcm_57840_VF},
|
|
Packit Service |
646995 |
};
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
static struct iro e1_iro[2] = {
|
|
Packit Service |
646995 |
{0x45a0, 0x90, 0x8, 0x0, 0x8}, /* T6.0 */
|
|
Packit Service |
646995 |
{0x50c8, 0x90, 0x8, 0x0, 0x8}, /* T6.4 */
|
|
Packit Service |
646995 |
};
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
static struct iro e1h_iro[2] = {
|
|
Packit Service |
646995 |
{0x1c40, 0xe0, 0x8, 0x0, 0x8}, /* T6.0 */
|
|
Packit Service |
646995 |
{0x1e00, 0xe0, 0x8, 0x0, 0x8}, /* T6.4 */
|
|
Packit Service |
646995 |
};
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
static struct iro e2_iro[2] = {
|
|
Packit Service |
646995 |
{0x6000, 0x20, 0x0, 0x0, 0x8}, /* T6.0 */
|
|
Packit Service |
646995 |
{0x6000, 0x20, 0x0, 0x0, 0x8}, /* T6.4 */
|
|
Packit Service |
646995 |
};
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
struct bnx2x_driver_version bnx2x_version = {
|
|
Packit Service |
646995 |
BNX2X_UNKNOWN_MAJOR_VERSION,
|
|
Packit Service |
646995 |
BNX2X_UNKNOWN_MINOR_VERSION,
|
|
Packit Service |
646995 |
BNX2X_UNKNOWN_SUB_MINOR_VERSION,
|
|
Packit Service |
646995 |
};
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
static int bnx2x_clear_tx_intr(nic_t *nic);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/*******************************************************************************
|
|
Packit Service |
646995 |
* BNX2X Library Functions
|
|
Packit Service |
646995 |
******************************************************************************/
|
|
Packit Service |
646995 |
/**
|
|
Packit Service |
646995 |
* bnx2x_get_library_name() - Used to get the name of this NIC libary
|
|
Packit Service |
646995 |
* @param name - This function will return the pointer to this NIC
|
|
Packit Service |
646995 |
* library name
|
|
Packit Service |
646995 |
* @param name_size
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
static void bnx2x_get_library_name(char **name, size_t *name_size)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
*name = (char *)library_name;
|
|
Packit Service |
646995 |
*name_size = sizeof(library_name);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/**
|
|
Packit Service |
646995 |
* bnx2x_get_library_version() - Used to get the version string of this
|
|
Packit Service |
646995 |
* NIC libary
|
|
Packit Service |
646995 |
* @param version - This function will return the pointer to this NIC
|
|
Packit Service |
646995 |
* library version string
|
|
Packit Service |
646995 |
* @param version_size - This will be set with the version size
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
static void bnx2x_get_library_version(char **version, size_t *version_size)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
*version = (char *)library_version;
|
|
Packit Service |
646995 |
*version_size = sizeof(library_version);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/**
|
|
Packit Service |
646995 |
* bnx2x_get_build_date() - Used to get the build date string of this library
|
|
Packit Service |
646995 |
* @param version - This function will return the pointer to this NIC
|
|
Packit Service |
646995 |
* library build date string
|
|
Packit Service |
646995 |
* @param version_size - This will be set with the build date string size
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
static void bnx2x_get_build_date(char **build, size_t *build_size)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
*build = (char *)build_date;
|
|
Packit Service |
646995 |
*build_size = sizeof(build_date);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/**
|
|
Packit Service |
646995 |
* bnx2x_get_transport_name() - Used to get the transport name associated
|
|
Packit Service |
646995 |
* with this this NIC libary
|
|
Packit Service |
646995 |
* @param transport_name - This function will return the pointer to this NIC
|
|
Packit Service |
646995 |
* library's associated transport string
|
|
Packit Service |
646995 |
* @param transport_name_size - This will be set with the transport name size
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
static void bnx2x_get_transport_name(char **transport_name,
|
|
Packit Service |
646995 |
size_t *transport_name_size)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
*transport_name = (char *)bnx2i_library_transport_name;
|
|
Packit Service |
646995 |
*transport_name_size = bnx2i_library_transport_name_size;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/**
|
|
Packit Service |
646995 |
* bnx2x_get_uio_name() - Used to get the uio name associated with this this
|
|
Packit Service |
646995 |
* NIC libary
|
|
Packit Service |
646995 |
* @param uio_name - This function will return the pointer to this NIC
|
|
Packit Service |
646995 |
* library's associated uio string
|
|
Packit Service |
646995 |
* @param transport_name_size - This will be set with the uio name size
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
static void bnx2x_get_uio_name(char **uio_name, size_t *uio_name_size)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
*uio_name = (char *)library_uio_name;
|
|
Packit Service |
646995 |
*uio_name_size = sizeof(library_uio_name);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/**
|
|
Packit Service |
646995 |
* bnx2x_get_pci_table() - Used to get the PCI table for this NIC libary to
|
|
Packit Service |
646995 |
* determine which NIC's based off of PCI ID's are
|
|
Packit Service |
646995 |
* supported
|
|
Packit Service |
646995 |
* @param table - This function will return the pointer to the PCI table
|
|
Packit Service |
646995 |
* @param entries - This function will return the number of entries in the NIC
|
|
Packit Service |
646995 |
* library's PCI table
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
static void bnx2x_get_pci_table(struct pci_device_id **table,
|
|
Packit Service |
646995 |
uint32_t *entries)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
*table = (struct pci_device_id *)bnx2x_pci_tbl;
|
|
Packit Service |
646995 |
*entries =
|
|
Packit Service |
646995 |
(uint32_t) (sizeof(bnx2x_pci_tbl) / sizeof(bnx2x_pci_tbl[0]));
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/**
|
|
Packit Service |
646995 |
* bnx2x_get_ops() - Used to get the NIC library op table
|
|
Packit Service |
646995 |
* @param op - The op table of this NIC library
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
struct nic_ops *bnx2x_get_ops()
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
return &bnx2x_op;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/*******************************************************************************
|
|
Packit Service |
646995 |
* bnx2x Utility Functions
|
|
Packit Service |
646995 |
******************************************************************************/
|
|
Packit Service |
646995 |
/*******************************************************************************
|
|
Packit Service |
646995 |
* Utility Functions Used to read register from the bnx2x device
|
|
Packit Service |
646995 |
******************************************************************************/
|
|
Packit Service |
646995 |
static void bnx2x_set_drv_version_unknown(bnx2x_t *bp)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
bp->version.major = BNX2X_UNKNOWN_MAJOR_VERSION;
|
|
Packit Service |
646995 |
bp->version.minor = BNX2X_UNKNOWN_MINOR_VERSION;
|
|
Packit Service |
646995 |
bp->version.sub_minor = BNX2X_UNKNOWN_SUB_MINOR_VERSION;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/* Return: 1 = Unknown, 0 = Known */
|
|
Packit Service |
646995 |
static int bnx2x_is_drv_version_unknown(struct bnx2x_driver_version *version)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
if ((version->major == (uint16_t)BNX2X_UNKNOWN_MAJOR_VERSION) &&
|
|
Packit Service |
646995 |
(version->minor == (uint16_t)BNX2X_UNKNOWN_MINOR_VERSION) &&
|
|
Packit Service |
646995 |
(version->sub_minor == (uint16_t)BNX2X_UNKNOWN_SUB_MINOR_VERSION)) {
|
|
Packit Service |
646995 |
return 1;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/**
|
|
Packit Service |
646995 |
* bnx2x_get_drv_version() - Used to determine the driver version
|
|
Packit Service |
646995 |
* @param bp - Device used to determine bnx2x driver version
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
static int bnx2x_get_drv_version(bnx2x_t *bp)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
nic_t *nic = bp->parent;
|
|
Packit Service |
646995 |
int fd, rc;
|
|
Packit Service |
646995 |
struct ifreq ifr;
|
|
Packit Service |
646995 |
struct ethtool_drvinfo drvinfo;
|
|
Packit Service |
646995 |
char *tok, *save_ptr = NULL;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/* Setup our control structures. */
|
|
Packit Service |
646995 |
memset(&ifr, 0, sizeof(ifr));
|
|
Packit Service |
646995 |
strcpy(ifr.ifr_name, nic->eth_device_name);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/* Open control socket. */
|
|
Packit Service |
646995 |
fd = socket(AF_INET, SOCK_DGRAM, 0);
|
|
Packit Service |
646995 |
if (fd < 0) {
|
|
Packit Service |
646995 |
LOG_ERR(PFX "%s: Cannot get socket to determine version "
|
|
Packit Service |
646995 |
"[0x%x %s]", nic->log_name, errno, strerror(errno));
|
|
Packit Service |
646995 |
return -EIO;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
memset(&drvinfo, 0, sizeof(drvinfo));
|
|
Packit Service |
646995 |
drvinfo.cmd = ETHTOOL_GDRVINFO;
|
|
Packit Service |
646995 |
ifr.ifr_data = (caddr_t) &drvinfo;
|
|
Packit Service |
646995 |
rc = ioctl(fd, SIOCETHTOOL, &ifr);
|
|
Packit Service |
646995 |
if (rc < 0) {
|
|
Packit Service |
646995 |
LOG_ERR(PFX "%s: call to ethool IOCTL failed [0x%x %s]",
|
|
Packit Service |
646995 |
nic->log_name, errno, strerror(errno));
|
|
Packit Service |
646995 |
goto error;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
tok = strtok_r(drvinfo.version, ".", &save_ptr);
|
|
Packit Service |
646995 |
if (tok == NULL) {
|
|
Packit Service |
646995 |
rc = -EIO;
|
|
Packit Service |
646995 |
goto error;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
bp->version.major = atoi(tok);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
tok = strtok_r(NULL, ".", &save_ptr);
|
|
Packit Service |
646995 |
if (tok == NULL) {
|
|
Packit Service |
646995 |
rc = -EIO;
|
|
Packit Service |
646995 |
goto error;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
bp->version.minor = atoi(tok);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
tok = strtok_r(NULL, ".", &save_ptr);
|
|
Packit Service |
646995 |
if (tok == NULL) {
|
|
Packit Service |
646995 |
rc = -EIO;
|
|
Packit Service |
646995 |
goto error;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
bp->version.sub_minor = atoi(tok);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
LOG_INFO(PFX "%s: bnx2x driver using version %d.%d.%d",
|
|
Packit Service |
646995 |
nic->log_name,
|
|
Packit Service |
646995 |
bp->version.major, bp->version.minor, bp->version.sub_minor);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
close(fd);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
error:
|
|
Packit Service |
646995 |
close(fd);
|
|
Packit Service |
646995 |
bnx2x_set_drv_version_unknown(bp);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
LOG_ERR(PFX "%s: error parsing driver string: '%s'",
|
|
Packit Service |
646995 |
nic->log_name, drvinfo.version);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
return rc;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
static inline int bnx2x_is_ver70(bnx2x_t *bp)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
return (bp->version.major == 1 && bp->version.minor >= 70);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
static inline int bnx2x_is_ver60(bnx2x_t *bp)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
return (bp->version.major == 1 && (bp->version.minor == 60 ||
|
|
Packit Service |
646995 |
bp->version.minor == 62 ||
|
|
Packit Service |
646995 |
bp->version.minor == 64));
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
static inline int bnx2x_is_ver60_plus(bnx2x_t *bp)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
return bnx2x_is_ver60(bp) || bnx2x_is_ver70(bp);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
static inline int bnx2x_is_ver52(bnx2x_t *bp)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
return (bp->version.major == 1 && bp->version.minor == 52);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
static void bnx2x_wr32(bnx2x_t *bp, __u32 off, __u32 val)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
*((volatile __u32 *)(bp->reg + off)) = val;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
static void bnx2x_doorbell(bnx2x_t *bp, __u32 off, __u32 val)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
*((volatile __u32 *)(bp->reg2 + off)) = val;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
static void bnx2x_flush_doorbell(bnx2x_t *bp, __u32 off)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
volatile __u32 tmp __attribute__((__unused__));
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
barrier();
|
|
Packit Service |
646995 |
tmp = *((volatile __u32 *)(bp->reg2 + off));
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
static __u32 bnx2x_rd32(bnx2x_t *bp, __u32 off)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
return *((volatile __u32 *)(bp->reg + off));
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
static int bnx2x_reg_sync(bnx2x_t *bp, __u32 off, __u16 length)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
return msync(bp->reg + off, length, MS_SYNC);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
static void bnx2x_update_rx_prod(bnx2x_t *bp)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
struct ustorm_eth_rx_producers rx_prods = { 0 };
|
|
Packit Service |
646995 |
int i;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
rx_prods.bd_prod = bp->rx_bd_prod;
|
|
Packit Service |
646995 |
rx_prods.cqe_prod = bp->rx_prod;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
barrier();
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
for (i = 0; i < sizeof(struct ustorm_eth_rx_producers) / 4; i++)
|
|
Packit Service |
646995 |
bnx2x_wr32(bp, bp->rx_prod_io + i * 4,
|
|
Packit Service |
646995 |
((__u32 *)&rx_prods)[i]);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
barrier();
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
bnx2x_reg_sync(bp, bp->rx_prod_io,
|
|
Packit Service |
646995 |
sizeof(struct ustorm_eth_rx_producers));
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/**
|
|
Packit Service |
646995 |
* bnx2x_get_chip_id() - Used to retrive the chip ID from the nic
|
|
Packit Service |
646995 |
* @param dev - Device used to determin NIC type
|
|
Packit Service |
646995 |
* @return Chip ID read from the MISC ID register
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
static int bnx2x_get_chip_id(bnx2x_t *bp)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
int val, id;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/* Get the chip revision id and number. */
|
|
Packit Service |
646995 |
/* chip num:16-31, rev:12-15, metal:4-11, bond_id:0-3 */
|
|
Packit Service |
646995 |
val = bnx2x_rd32(bp, BNX2X_MISC_REG_CHIP_NUM);
|
|
Packit Service |
646995 |
id = ((val & 0xffff) << 16);
|
|
Packit Service |
646995 |
val = bnx2x_rd32(bp, BNX2X_MISC_REG_CHIP_REV);
|
|
Packit Service |
646995 |
id |= ((val & 0xf) << 12);
|
|
Packit Service |
646995 |
val = bnx2x_rd32(bp, BNX2X_MISC_REG_CHIP_METAL);
|
|
Packit Service |
646995 |
id |= ((val & 0xff) << 4);
|
|
Packit Service |
646995 |
val = bnx2x_rd32(bp, BNX2X_MISC_REG_BOND_ID);
|
|
Packit Service |
646995 |
id |= (val & 0xf);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
return id;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/**
|
|
Packit Service |
646995 |
* bnx2x_uio_verify()
|
|
Packit Service |
646995 |
*
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
static int bnx2x_uio_verify(nic_t *nic)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
char *raw = NULL, *raw_tmp;
|
|
Packit Service |
646995 |
uint32_t raw_size = 0;
|
|
Packit Service |
646995 |
char temp_path[sizeof(cnic_uio_sysfs_name_tempate) + 8];
|
|
Packit Service |
646995 |
int rc = 0;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/* Build the path to determine uio name */
|
|
Packit Service |
646995 |
snprintf(temp_path, sizeof(temp_path),
|
|
Packit Service |
646995 |
cnic_uio_sysfs_name_tempate, nic->uio_minor);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
rc = capture_file(&raw, &raw_size, temp_path);
|
|
Packit Service |
646995 |
if (rc != 0)
|
|
Packit Service |
646995 |
goto error;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/* sanitize name string by replacing newline with null termination */
|
|
Packit Service |
646995 |
raw_tmp = raw;
|
|
Packit Service |
646995 |
while (*raw_tmp != '\n')
|
|
Packit Service |
646995 |
raw_tmp++;
|
|
Packit Service |
646995 |
*raw_tmp = '\0';
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (strncmp(raw, bnx2x_uio_sysfs_name,
|
|
Packit Service |
646995 |
sizeof(bnx2x_uio_sysfs_name)) != 0) {
|
|
Packit Service |
646995 |
LOG_ERR(PFX "%s: uio names not equal: "
|
|
Packit Service |
646995 |
"expecting %s got %s from %s",
|
|
Packit Service |
646995 |
nic->log_name, bnx2x_uio_sysfs_name, raw, temp_path);
|
|
Packit Service |
646995 |
rc = -EIO;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
free(raw);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
LOG_INFO(PFX "%s: Verified is a cnic_uio device", nic->log_name);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
error:
|
|
Packit Service |
646995 |
return rc;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/*******************************************************************************
|
|
Packit Service |
646995 |
* bnx2x Utility Functions to get to the hardware consumer indexes
|
|
Packit Service |
646995 |
******************************************************************************/
|
|
Packit Service |
646995 |
static __u16 bnx2x_get_rx(bnx2x_t *bp)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
struct host_def_status_block *sblk = bp->status_blk.def;
|
|
Packit Service |
646995 |
__u16 rx_comp_cons;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
msync(sblk, sizeof(*sblk), MS_SYNC);
|
|
Packit Service |
646995 |
rx_comp_cons =
|
|
Packit Service |
646995 |
sblk->u_def_status_block.
|
|
Packit Service |
646995 |
index_values[HC_INDEX_DEF_U_ETH_ISCSI_RX_CQ_CONS];
|
|
Packit Service |
646995 |
if ((rx_comp_cons & BNX2X_MAX_RCQ_DESC_CNT(bp)) ==
|
|
Packit Service |
646995 |
BNX2X_MAX_RCQ_DESC_CNT(bp))
|
|
Packit Service |
646995 |
rx_comp_cons++;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
return rx_comp_cons;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
static __u16 bnx2x_get_rx_60(bnx2x_t *bp)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
struct host_sp_status_block *sblk = bp->status_blk.sp;
|
|
Packit Service |
646995 |
__u16 rx_comp_cons;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
msync(sblk, sizeof(*sblk), MS_SYNC);
|
|
Packit Service |
646995 |
rx_comp_cons =
|
|
Packit Service |
646995 |
sblk->sp_sb.index_values[HC_SP_INDEX_ETH_ISCSI_RX_CQ_CONS];
|
|
Packit Service |
646995 |
if ((rx_comp_cons & BNX2X_MAX_RCQ_DESC_CNT(bp)) ==
|
|
Packit Service |
646995 |
BNX2X_MAX_RCQ_DESC_CNT(bp))
|
|
Packit Service |
646995 |
rx_comp_cons++;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
return rx_comp_cons;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
static __u16 bnx2x_get_tx(bnx2x_t *bp)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
struct host_def_status_block *sblk = bp->status_blk.def;
|
|
Packit Service |
646995 |
__u16 tx_cons;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
msync(sblk, sizeof(*sblk), MS_SYNC);
|
|
Packit Service |
646995 |
tx_cons =
|
|
Packit Service |
646995 |
sblk->c_def_status_block.
|
|
Packit Service |
646995 |
index_values[HC_INDEX_DEF_C_ETH_ISCSI_CQ_CONS];
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
return tx_cons;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
static __u16 bnx2x_get_tx_60(bnx2x_t *bp)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
struct host_sp_status_block *sblk = bp->status_blk.sp;
|
|
Packit Service |
646995 |
__u16 tx_cons;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
msync(sblk, sizeof(*sblk), MS_SYNC);
|
|
Packit Service |
646995 |
tx_cons = sblk->sp_sb.index_values[HC_SP_INDEX_ETH_ISCSI_CQ_CONS];
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
return tx_cons;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
typedef enum {
|
|
Packit Service |
646995 |
CNIC_VLAN_STRIPPING_ENABLED = 1,
|
|
Packit Service |
646995 |
CNIC_VLAN_STRIPPING_DISABLED = 2,
|
|
Packit Service |
646995 |
} CNIC_VLAN_STRIPPING_MODE;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/**
|
|
Packit Service |
646995 |
* bnx2x_strip_vlan_enabled() - This will query the device to determine whether
|
|
Packit Service |
646995 |
* VLAN tag stripping is enabled or not
|
|
Packit Service |
646995 |
* @param dev - device to check stripping or not
|
|
Packit Service |
646995 |
* @ return CNIC_VLAN_STRIPPING_ENABLED stripping is enabled
|
|
Packit Service |
646995 |
* CNIC_VLAN_STRIPPING_DISABLED stripping is not enabled
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
static CNIC_VLAN_STRIPPING_MODE bnx2x_strip_vlan_enabled(bnx2x_t *bp)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
return CNIC_VLAN_STRIPPING_DISABLED;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/**
|
|
Packit Service |
646995 |
* bnx2x_free() - Used to free a bnx2x structure
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
static void bnx2x_free(nic_t *nic)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
if (nic->priv)
|
|
Packit Service |
646995 |
free(nic->priv);
|
|
Packit Service |
646995 |
nic->priv = NULL;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/**
|
|
Packit Service |
646995 |
* bnx2x_alloc() - Used to allocate a bnx2x structure
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
static bnx2x_t *bnx2x_alloc(nic_t *nic)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
bnx2x_t *bp = malloc(sizeof(*bp));
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (bp == NULL) {
|
|
Packit Service |
646995 |
LOG_ERR(PFX "%s: Could not allocate BNX2X space",
|
|
Packit Service |
646995 |
nic->log_name);
|
|
Packit Service |
646995 |
return NULL;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/* Clear out the CNIC contents */
|
|
Packit Service |
646995 |
memset(bp, 0, sizeof(*bp));
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
bp->bar0_fd = INVALID_FD;
|
|
Packit Service |
646995 |
bp->bar2_fd = INVALID_FD;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
bp->parent = nic;
|
|
Packit Service |
646995 |
nic->priv = (void *)bp;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
bnx2x_set_drv_version_unknown(bp);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
return bp;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/**
|
|
Packit Service |
646995 |
* bnx2x_open() - This will initialize all the hardware resources underneath
|
|
Packit Service |
646995 |
* a struct cnic_uio device
|
|
Packit Service |
646995 |
* @param dev - The struct cnic_uio device to attach the hardware with
|
|
Packit Service |
646995 |
* @return 0 on success, on failure a errno will be returned
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
static int bnx2x_open(nic_t *nic)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
bnx2x_t *bp;
|
|
Packit Service |
646995 |
struct stat uio_stat;
|
|
Packit Service |
646995 |
int i, rc;
|
|
Packit Service |
646995 |
__u32 val;
|
|
Packit Service |
646995 |
int count;
|
|
Packit Service |
646995 |
char sysfs_resc_path[80];
|
|
Packit Service |
646995 |
uint32_t bus;
|
|
Packit Service |
646995 |
uint32_t slot;
|
|
Packit Service |
646995 |
uint32_t func;
|
|
Packit Service |
646995 |
uint32_t mode;
|
|
Packit Service |
646995 |
__u32 proto_offset;
|
|
Packit Service |
646995 |
__u32 ovtag_offset;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/* Sanity Check: validate the parameters */
|
|
Packit Service |
646995 |
if (nic == NULL) {
|
|
Packit Service |
646995 |
LOG_ERR(PFX "nic == NULL");
|
|
Packit Service |
646995 |
return -EINVAL;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if ((nic->priv) != NULL &&
|
|
Packit Service |
646995 |
(((bnx2x_t *) (nic->priv))->flags & BNX2X_OPENED)) {
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
bp = bnx2x_alloc(nic);
|
|
Packit Service |
646995 |
if (bp == NULL)
|
|
Packit Service |
646995 |
return -ENOMEM;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (bnx2x_is_drv_version_unknown(&bnx2x_version)) {
|
|
Packit Service |
646995 |
/* If version is unknown, go read from ethtool */
|
|
Packit Service |
646995 |
rc = bnx2x_get_drv_version(bp);
|
|
Packit Service |
646995 |
if (rc)
|
|
Packit Service |
646995 |
goto open_error;
|
|
Packit Service |
646995 |
} else {
|
|
Packit Service |
646995 |
/* Version is not unknown, just use it */
|
|
Packit Service |
646995 |
bnx2x_version.major = bp->version.major;
|
|
Packit Service |
646995 |
bnx2x_version.minor = bp->version.minor;
|
|
Packit Service |
646995 |
bnx2x_version.sub_minor = bp->version.sub_minor;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
count = 0;
|
|
Packit Service |
646995 |
while ((nic->fd < 0) && count < 15) {
|
|
Packit Service |
646995 |
/* udev might not have created the file yet */
|
|
Packit Service |
646995 |
pthread_mutex_unlock(&nic->nic_mutex);
|
|
Packit Service |
646995 |
sleep(1);
|
|
Packit Service |
646995 |
pthread_mutex_lock(&nic->nic_mutex);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
nic->fd = open(nic->uio_device_name, O_RDWR | O_NONBLOCK);
|
|
Packit Service |
646995 |
if (nic->fd != INVALID_FD) {
|
|
Packit Service |
646995 |
LOG_ERR(PFX "%s: uio device has been brought up "
|
|
Packit Service |
646995 |
"via pid: %d on fd: %d",
|
|
Packit Service |
646995 |
nic->uio_device_name, getpid(), nic->fd);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
rc = bnx2x_uio_verify(nic);
|
|
Packit Service |
646995 |
if (rc != 0)
|
|
Packit Service |
646995 |
continue;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
break;
|
|
Packit Service |
646995 |
} else {
|
|
Packit Service |
646995 |
LOG_WARN(PFX "%s: Could not open device: %s, [%s]",
|
|
Packit Service |
646995 |
nic->log_name, nic->uio_device_name,
|
|
Packit Service |
646995 |
strerror(errno));
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
manually_trigger_uio_event(nic, nic->uio_minor);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/* udev might not have created the file yet */
|
|
Packit Service |
646995 |
pthread_mutex_unlock(&nic->nic_mutex);
|
|
Packit Service |
646995 |
sleep(1);
|
|
Packit Service |
646995 |
pthread_mutex_lock(&nic->nic_mutex);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
count++;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
if (fstat(nic->fd, &uio_stat) < 0) {
|
|
Packit Service |
646995 |
LOG_ERR(PFX "%s: Could not fstat device", nic->log_name);
|
|
Packit Service |
646995 |
rc = -ENODEV;
|
|
Packit Service |
646995 |
goto open_error;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
nic->uio_minor = minor(uio_stat.st_rdev);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
cnic_get_sysfs_pci_resource_path(nic, 0, sysfs_resc_path, 80);
|
|
Packit Service |
646995 |
bp->bar0_fd = open(sysfs_resc_path, O_RDWR | O_SYNC);
|
|
Packit Service |
646995 |
if (bp->bar0_fd < 0) {
|
|
Packit Service |
646995 |
LOG_ERR(PFX "%s: Could not open %s", nic->log_name,
|
|
Packit Service |
646995 |
sysfs_resc_path);
|
|
Packit Service |
646995 |
rc = -ENODEV;
|
|
Packit Service |
646995 |
goto open_error;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
bp->reg = mmap(NULL, BNX2X_BAR_SIZE, PROT_READ | PROT_WRITE,
|
|
Packit Service |
646995 |
MAP_SHARED, bp->bar0_fd, (off_t) 0);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (bp->reg == MAP_FAILED) {
|
|
Packit Service |
646995 |
LOG_INFO(PFX "%s: Couldn't mmap BAR registers: %s",
|
|
Packit Service |
646995 |
nic->log_name, strerror(errno));
|
|
Packit Service |
646995 |
bp->reg = NULL;
|
|
Packit Service |
646995 |
rc = errno;
|
|
Packit Service |
646995 |
goto open_error;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
msync(bp->reg, BNX2X_BAR_SIZE, MS_SYNC);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
cnic_get_sysfs_pci_resource_path(nic, 2, sysfs_resc_path, 80);
|
|
Packit Service |
646995 |
bp->bar2_fd = open(sysfs_resc_path, O_RDWR | O_SYNC);
|
|
Packit Service |
646995 |
if (bp->bar2_fd < 0) {
|
|
Packit Service |
646995 |
LOG_ERR(PFX "%s: Could not open %s", nic->log_name,
|
|
Packit Service |
646995 |
sysfs_resc_path);
|
|
Packit Service |
646995 |
rc = -ENODEV;
|
|
Packit Service |
646995 |
goto open_error;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
bp->reg2 = mmap(NULL, BNX2X_BAR2_SIZE, PROT_READ | PROT_WRITE,
|
|
Packit Service |
646995 |
MAP_SHARED, bp->bar2_fd, (off_t) 0);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (bp->reg2 == MAP_FAILED) {
|
|
Packit Service |
646995 |
LOG_INFO(PFX "%s: Couldn't mmap BAR2 registers: %s",
|
|
Packit Service |
646995 |
nic->log_name, strerror(errno));
|
|
Packit Service |
646995 |
bp->reg2 = NULL;
|
|
Packit Service |
646995 |
rc = errno;
|
|
Packit Service |
646995 |
goto open_error;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/* TODO: hardcoded with the cnic driver */
|
|
Packit Service |
646995 |
bp->rx_ring_size = 15;
|
|
Packit Service |
646995 |
bp->rx_buffer_size = 0x400;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
LOG_DEBUG(PFX "%s: using rx ring size: %d, rx buffer size: %d",
|
|
Packit Service |
646995 |
nic->log_name, bp->rx_ring_size, bp->rx_buffer_size);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/* Determine the number of UIO events that have already occured */
|
|
Packit Service |
646995 |
rc = detemine_initial_uio_events(nic, &nic->intr_count);
|
|
Packit Service |
646995 |
if (rc != 0) {
|
|
Packit Service |
646995 |
LOG_ERR("Could not determine the number ofinitial UIO events");
|
|
Packit Service |
646995 |
nic->intr_count = 0;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/* Allocate space for rx pkt ring */
|
|
Packit Service |
646995 |
bp->rx_pkt_ring = malloc(sizeof(void *) * bp->rx_ring_size);
|
|
Packit Service |
646995 |
if (bp->rx_pkt_ring == NULL) {
|
|
Packit Service |
646995 |
LOG_ERR(PFX "%s: Could not allocate space for rx_pkt_ring",
|
|
Packit Service |
646995 |
nic->log_name);
|
|
Packit Service |
646995 |
rc = errno;
|
|
Packit Service |
646995 |
goto open_error;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (bnx2x_is_ver60_plus(bp))
|
|
Packit Service |
646995 |
bp->status_blk_size = sizeof(struct host_sp_status_block);
|
|
Packit Service |
646995 |
else if (bnx2x_is_ver52(bp))
|
|
Packit Service |
646995 |
bp->status_blk_size = sizeof(struct host_def_status_block);
|
|
Packit Service |
646995 |
else {
|
|
Packit Service |
646995 |
LOG_INFO(PFX "%s: Unsupported bnx2x driver [%d.%d]",
|
|
Packit Service |
646995 |
nic->log_name, bp->version.major, bp->version.minor);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
rc = -ENOTSUP;
|
|
Packit Service |
646995 |
goto open_error;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
bp->status_blk.def = mmap(NULL, bp->status_blk_size,
|
|
Packit Service |
646995 |
PROT_READ | PROT_WRITE, MAP_SHARED,
|
|
Packit Service |
646995 |
nic->fd, (off_t) nic->page_size);
|
|
Packit Service |
646995 |
if (bp->status_blk.def == MAP_FAILED) {
|
|
Packit Service |
646995 |
LOG_INFO(PFX "%s: Could not mmap status block: %s",
|
|
Packit Service |
646995 |
nic->log_name, strerror(errno));
|
|
Packit Service |
646995 |
bp->status_blk.def = NULL;
|
|
Packit Service |
646995 |
rc = errno;
|
|
Packit Service |
646995 |
goto open_error;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
bp->tx_ring = mmap(NULL, 4 * nic->page_size,
|
|
Packit Service |
646995 |
PROT_READ | PROT_WRITE,
|
|
Packit Service |
646995 |
MAP_SHARED | MAP_LOCKED,
|
|
Packit Service |
646995 |
nic->fd, (off_t) 2 * nic->page_size);
|
|
Packit Service |
646995 |
if (bp->tx_ring == MAP_FAILED) {
|
|
Packit Service |
646995 |
LOG_INFO(PFX "%s: Could not mmap tx ring: %s",
|
|
Packit Service |
646995 |
nic->log_name, strerror(errno));
|
|
Packit Service |
646995 |
bp->tx_ring = NULL;
|
|
Packit Service |
646995 |
rc = errno;
|
|
Packit Service |
646995 |
goto open_error;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
bp->rx_comp_ring.cqe = (union eth_rx_cqe *)
|
|
Packit Service |
646995 |
(((__u8 *) bp->tx_ring) + 2 * nic->page_size);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
bp->bufs = mmap(NULL, (bp->rx_ring_size + 1) * bp->rx_buffer_size,
|
|
Packit Service |
646995 |
PROT_READ | PROT_WRITE,
|
|
Packit Service |
646995 |
MAP_SHARED | MAP_LOCKED,
|
|
Packit Service |
646995 |
nic->fd, (off_t) 3 * nic->page_size);
|
|
Packit Service |
646995 |
if (bp->bufs == MAP_FAILED) {
|
|
Packit Service |
646995 |
LOG_INFO(PFX "%s: Could not mmap buffers: %s",
|
|
Packit Service |
646995 |
nic->log_name, strerror(errno));
|
|
Packit Service |
646995 |
bp->bufs = NULL;
|
|
Packit Service |
646995 |
rc = errno;
|
|
Packit Service |
646995 |
goto open_error;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
bp->chip_id = bnx2x_get_chip_id(bp);
|
|
Packit Service |
646995 |
LOG_DEBUG(PFX "Chip ID: %x", bp->chip_id);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
rc = get_bus_slot_func_num(nic, &bus, &slot, &func);
|
|
Packit Service |
646995 |
if (rc != 0) {
|
|
Packit Service |
646995 |
LOG_INFO(PFX "%s: Couldn't determine bus:slot.func",
|
|
Packit Service |
646995 |
nic->log_name);
|
|
Packit Service |
646995 |
goto open_error;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
/* In E1/E1H use pci device function as read from sysfs.
|
|
Packit Service |
646995 |
* In E2/E3 read physical function from ME register since these chips
|
|
Packit Service |
646995 |
* support Physical Device Assignment where kernel BDF maybe arbitrary
|
|
Packit Service |
646995 |
* (depending on hypervisor).
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
if (CHIP_IS_E2_PLUS(bp)) {
|
|
Packit Service |
646995 |
func = (bnx2x_rd32(bp, BAR_ME_REGISTER) & ME_REG_ABS_PF_NUM) >>
|
|
Packit Service |
646995 |
ME_REG_ABS_PF_NUM_SHIFT;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
bp->func = func;
|
|
Packit Service |
646995 |
bp->port = bp->func % PORT_MAX;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (CHIP_IS_E2_PLUS(bp)) {
|
|
Packit Service |
646995 |
__u32 val = bnx2x_rd32(bp, MISC_REG_PORT4MODE_EN_OVWR);
|
|
Packit Service |
646995 |
if (!(val & 1))
|
|
Packit Service |
646995 |
val = bnx2x_rd32(bp, MISC_REG_PORT4MODE_EN);
|
|
Packit Service |
646995 |
else
|
|
Packit Service |
646995 |
val = (val >> 1) & 1;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (val)
|
|
Packit Service |
646995 |
bp->pfid = func >> 1;
|
|
Packit Service |
646995 |
else
|
|
Packit Service |
646995 |
bp->pfid = func & 0x6;
|
|
Packit Service |
646995 |
} else {
|
|
Packit Service |
646995 |
bp->pfid = func;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (bnx2x_is_ver60_plus(bp))
|
|
Packit Service |
646995 |
bp->port = bp->pfid & 1;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
bp->cid = 17;
|
|
Packit Service |
646995 |
bp->client_id = 17;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (bnx2x_is_ver60_plus(bp)) {
|
|
Packit Service |
646995 |
struct client_init_general_data *data = bp->bufs;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
bp->client_id = data->client_id;
|
|
Packit Service |
646995 |
if (data->uid.cid)
|
|
Packit Service |
646995 |
bp->cid = data->uid.cid;
|
|
Packit Service |
646995 |
if (bp->version.minor >= 78 && bp->version.sub_minor >= 55 &&
|
|
Packit Service |
646995 |
data->uid.cid_override_key == UIO_USE_TX_DOORBELL) {
|
|
Packit Service |
646995 |
bp->tx_doorbell = data->uid.tx_db_off;
|
|
Packit Service |
646995 |
LOG_INFO(PFX "%s: tx doorbell override offset = 0x%x",
|
|
Packit Service |
646995 |
nic->log_name, bp->tx_doorbell);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
LOG_INFO(PFX "%s: func 0x%x, pfid 0x%x, client_id 0x%x, cid 0x%x",
|
|
Packit Service |
646995 |
nic->log_name, bp->func, bp->pfid, bp->client_id, bp->cid);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (CHIP_IS_E1(bp))
|
|
Packit Service |
646995 |
bp->iro = e1_iro;
|
|
Packit Service |
646995 |
else if (CHIP_IS_E1H(bp))
|
|
Packit Service |
646995 |
bp->iro = e1h_iro;
|
|
Packit Service |
646995 |
else if (CHIP_IS_E2_PLUS(bp))
|
|
Packit Service |
646995 |
bp->iro = e2_iro;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (bnx2x_is_ver60_plus(bp)) {
|
|
Packit Service |
646995 |
__u32 cl_qzone_id = BNX2X_CL_QZONE_ID(bp, bp->client_id);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
bp->iro_idx = 0;
|
|
Packit Service |
646995 |
if (bp->version.minor >= 64) {
|
|
Packit Service |
646995 |
bp->iro_idx = 1;
|
|
Packit Service |
646995 |
cl_qzone_id = BNX2X_CL_QZONE_ID_64(bp, bp->client_id);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
bp->rx_prod_io = BAR_USTRORM_INTMEM +
|
|
Packit Service |
646995 |
(CHIP_IS_E2_PLUS(bp) ?
|
|
Packit Service |
646995 |
USTORM_RX_PRODS_E2_OFFSET(cl_qzone_id) :
|
|
Packit Service |
646995 |
USTORM_RX_PRODS_E1X_OFFSET(bp->port, bp->client_id));
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (!bp->tx_doorbell)
|
|
Packit Service |
646995 |
bp->tx_doorbell = bp->cid * 0x80 + 0x40;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
bp->get_rx_cons = bnx2x_get_rx_60;
|
|
Packit Service |
646995 |
bp->get_tx_cons = bnx2x_get_tx_60;
|
|
Packit Service |
646995 |
bp->tx_vlan_tag_bit = ETH_TX_BD_FLAGS_VLAN_TAG_T6X;
|
|
Packit Service |
646995 |
} else {
|
|
Packit Service |
646995 |
bp->rx_prod_io = BAR_USTRORM_INTMEM +
|
|
Packit Service |
646995 |
USTORM_RX_PRODS_OFFSET(bp->port, bp->client_id);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
bp->tx_doorbell = bp->cid * nic->page_size + 0x40;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
bp->get_rx_cons = bnx2x_get_rx;
|
|
Packit Service |
646995 |
bp->get_tx_cons = bnx2x_get_tx;
|
|
Packit Service |
646995 |
bp->tx_vlan_tag_bit = ETH_TX_BD_FLAGS_VLAN_TAG_T5X;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
bp->tx_cons = 0;
|
|
Packit Service |
646995 |
bp->tx_prod = 0;
|
|
Packit Service |
646995 |
bp->tx_bd_prod = 0;
|
|
Packit Service |
646995 |
bp->tx_pkt = bp->bufs;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
bp->rx_index = 0;
|
|
Packit Service |
646995 |
bp->rx_cons = 0;
|
|
Packit Service |
646995 |
bp->rx_bd_cons = 0;
|
|
Packit Service |
646995 |
bp->rx_prod = 127;
|
|
Packit Service |
646995 |
bp->rx_bd_prod = bp->rx_ring_size;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
for (i = 0; i < bp->rx_ring_size; i++) {
|
|
Packit Service |
646995 |
void *ptr = bp->bufs + (bp->rx_buffer_size * (i + 1));
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
bp->rx_pkt_ring[i] = ptr;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
val = bnx2x_rd32(bp, MISC_REG_SHARED_MEM_ADDR);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
bp->shmem_base = val;
|
|
Packit Service |
646995 |
val = bnx2x_rd32(bp, bp->shmem_base + SHMEM_ISCSI_MAC_UPPER(bp));
|
|
Packit Service |
646995 |
nic->mac_addr[0] = (__u8) (val >> 8);
|
|
Packit Service |
646995 |
nic->mac_addr[1] = (__u8) val;
|
|
Packit Service |
646995 |
val = bnx2x_rd32(bp, bp->shmem_base + SHMEM_ISCSI_MAC_LOWER(bp));
|
|
Packit Service |
646995 |
nic->mac_addr[2] = (__u8) (val >> 24);
|
|
Packit Service |
646995 |
nic->mac_addr[3] = (__u8) (val >> 16);
|
|
Packit Service |
646995 |
nic->mac_addr[4] = (__u8) (val >> 8);
|
|
Packit Service |
646995 |
nic->mac_addr[5] = (__u8) val;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (bnx2x_is_ver60_plus(bp) && CHIP_IS_E2_PLUS(bp)) {
|
|
Packit Service |
646995 |
__u32 mf_cfg_addr = 0;
|
|
Packit Service |
646995 |
__u32 mac_offset;
|
|
Packit Service |
646995 |
__u8 mac[6];
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
val = bnx2x_rd32(bp, (BNX2X_PATH(bp) ? MISC_REG_GENERIC_CR_1 :
|
|
Packit Service |
646995 |
MISC_REG_GENERIC_CR_0));
|
|
Packit Service |
646995 |
bp->shmem_base2 = val;
|
|
Packit Service |
646995 |
if (bp->shmem_base2) {
|
|
Packit Service |
646995 |
/* size */
|
|
Packit Service |
646995 |
val = bnx2x_rd32(bp, bp->shmem_base2);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (val > 0x10)
|
|
Packit Service |
646995 |
mf_cfg_addr =
|
|
Packit Service |
646995 |
bnx2x_rd32(bp, bp->shmem_base2 + 0x10);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (!mf_cfg_addr)
|
|
Packit Service |
646995 |
mf_cfg_addr = bp->shmem_base + 0x7e4;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/* shared_feat_cfg.config */
|
|
Packit Service |
646995 |
mode = bnx2x_rd32(bp, bp->shmem_base + 0x354);
|
|
Packit Service |
646995 |
mode &= 0x700;
|
|
Packit Service |
646995 |
LOG_DEBUG(PFX "%s: mode = 0x%x", nic->log_name, mode);
|
|
Packit Service |
646995 |
switch (mode) {
|
|
Packit Service |
646995 |
case 0x300: /* SI mode */
|
|
Packit Service |
646995 |
mac_offset = 0xe4 + (bp->func * 0x28) + 4;
|
|
Packit Service |
646995 |
val = bnx2x_rd32(bp, mf_cfg_addr + mac_offset);
|
|
Packit Service |
646995 |
mac[0] = (__u8) (val >> 8);
|
|
Packit Service |
646995 |
mac[1] = (__u8) val;
|
|
Packit Service |
646995 |
mac_offset += 4;
|
|
Packit Service |
646995 |
val = bnx2x_rd32(bp, mf_cfg_addr + mac_offset);
|
|
Packit Service |
646995 |
mac[2] = (__u8) (val >> 24);
|
|
Packit Service |
646995 |
mac[3] = (__u8) (val >> 16);
|
|
Packit Service |
646995 |
mac[4] = (__u8) (val >> 8);
|
|
Packit Service |
646995 |
mac[5] = (__u8) val;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (mac[0] != 0xff) {
|
|
Packit Service |
646995 |
memcpy(nic->mac_addr, mac, 6);
|
|
Packit Service |
646995 |
} else if (bp->func > 1) {
|
|
Packit Service |
646995 |
LOG_INFO(PFX "%s: Invalid mac address: "
|
|
Packit Service |
646995 |
"%02x:%02x:%02x:%02x:%02x:%02x, abort",
|
|
Packit Service |
646995 |
nic->log_name,
|
|
Packit Service |
646995 |
mac[0], mac[1], mac[2],
|
|
Packit Service |
646995 |
mac[3], mac[4], mac[5]);
|
|
Packit Service |
646995 |
rc = -ENOTSUP;
|
|
Packit Service |
646995 |
goto open_error;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
break;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
case 0x0: /* MF SD mode */
|
|
Packit Service |
646995 |
case 0x500:
|
|
Packit Service |
646995 |
case 0x600:
|
|
Packit Service |
646995 |
proto_offset = 0x24 + (bp->func * 0x18);
|
|
Packit Service |
646995 |
ovtag_offset = proto_offset + 0xc;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
rc = -ENOTSUP;
|
|
Packit Service |
646995 |
val = bnx2x_rd32(bp, mf_cfg_addr + ovtag_offset);
|
|
Packit Service |
646995 |
val &= 0xffff;
|
|
Packit Service |
646995 |
/* SD mode, check for valid outer VLAN */
|
|
Packit Service |
646995 |
if (val == 0xffff) {
|
|
Packit Service |
646995 |
LOG_ERR(PFX "%s: Invalid OV detected for SD, "
|
|
Packit Service |
646995 |
" fallback to SF mode!\n",
|
|
Packit Service |
646995 |
nic->log_name);
|
|
Packit Service |
646995 |
goto SF;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
/* Check for iSCSI protocol */
|
|
Packit Service |
646995 |
val = bnx2x_rd32(bp, mf_cfg_addr + proto_offset);
|
|
Packit Service |
646995 |
if ((val & 6) != 6)
|
|
Packit Service |
646995 |
goto open_error;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
mac_offset = proto_offset + 0x4;
|
|
Packit Service |
646995 |
val = bnx2x_rd32(bp, mf_cfg_addr + mac_offset);
|
|
Packit Service |
646995 |
mac[0] = (__u8) (val >> 8);
|
|
Packit Service |
646995 |
mac[1] = (__u8) val;
|
|
Packit Service |
646995 |
mac_offset += 4;
|
|
Packit Service |
646995 |
val = bnx2x_rd32(bp, mf_cfg_addr + mac_offset);
|
|
Packit Service |
646995 |
mac[2] = (__u8) (val >> 24);
|
|
Packit Service |
646995 |
mac[3] = (__u8) (val >> 16);
|
|
Packit Service |
646995 |
mac[4] = (__u8) (val >> 8);
|
|
Packit Service |
646995 |
mac[5] = (__u8) val;
|
|
Packit Service |
646995 |
memcpy(nic->mac_addr, mac, 6);
|
|
Packit Service |
646995 |
break;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
SF:
|
|
Packit Service |
646995 |
LOG_INFO(PFX "%s: Using mac address: %02x:%02x:%02x:%02x:%02x:%02x",
|
|
Packit Service |
646995 |
nic->log_name,
|
|
Packit Service |
646995 |
nic->mac_addr[0], nic->mac_addr[1], nic->mac_addr[2],
|
|
Packit Service |
646995 |
nic->mac_addr[3], nic->mac_addr[4], nic->mac_addr[5]);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/* Determine if Hardware VLAN tag stripping is enabled or not */
|
|
Packit Service |
646995 |
if (CNIC_VLAN_STRIPPING_ENABLED == bnx2x_strip_vlan_enabled(bp))
|
|
Packit Service |
646995 |
nic->flags |= NIC_VLAN_STRIP_ENABLED;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
msync(bp->reg, BNX2X_BAR_SIZE, MS_SYNC);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
LOG_INFO("%s: bnx2x initialized", nic->log_name);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
bnx2x_update_rx_prod(bp);
|
|
Packit Service |
646995 |
bp->flags |= BNX2X_OPENED;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
open_error:
|
|
Packit Service |
646995 |
if (bp->tx_ring) {
|
|
Packit Service |
646995 |
munmap(bp->tx_ring, 4 * nic->page_size);
|
|
Packit Service |
646995 |
bp->tx_ring = NULL;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (bp->status_blk.def) {
|
|
Packit Service |
646995 |
munmap(bp->status_blk.def, bp->status_blk_size);
|
|
Packit Service |
646995 |
bp->status_blk.def = NULL;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (bp->reg) {
|
|
Packit Service |
646995 |
munmap(bp->reg, BNX2X_BAR_SIZE);
|
|
Packit Service |
646995 |
bp->reg = NULL;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (bp->reg2) {
|
|
Packit Service |
646995 |
munmap(bp->reg2, BNX2X_BAR2_SIZE);
|
|
Packit Service |
646995 |
bp->reg2 = NULL;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (bp->rx_pkt_ring) {
|
|
Packit Service |
646995 |
free(bp->rx_pkt_ring);
|
|
Packit Service |
646995 |
bp->rx_pkt_ring = NULL;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (bp->bar2_fd != INVALID_FD) {
|
|
Packit Service |
646995 |
close(bp->bar2_fd);
|
|
Packit Service |
646995 |
bp->bar2_fd = INVALID_FD;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (bp->bar0_fd != INVALID_FD) {
|
|
Packit Service |
646995 |
close(bp->bar0_fd);
|
|
Packit Service |
646995 |
bp->bar0_fd = INVALID_FD;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
if (nic->fd != INVALID_FD) {
|
|
Packit Service |
646995 |
close(nic->fd);
|
|
Packit Service |
646995 |
nic->fd = INVALID_FD;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
bnx2x_free(nic);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
return rc;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/**
|
|
Packit Service |
646995 |
* bnx2x_uio_close_resources() - Used to free resource for the NIC/CNIC
|
|
Packit Service |
646995 |
* @param nic - NIC device to free resource
|
|
Packit Service |
646995 |
* @param graceful - whether to wait to close gracefully
|
|
Packit Service |
646995 |
* @return 0 on success, <0 on failure
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
static int bnx2x_uio_close_resources(nic_t *nic, NIC_SHUTDOWN_T graceful)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
bnx2x_t *bp = (bnx2x_t *) nic->priv;
|
|
Packit Service |
646995 |
int rc = 0;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/* Check if there is an assoicated bnx2x device */
|
|
Packit Service |
646995 |
if (bp == NULL) {
|
|
Packit Service |
646995 |
LOG_WARN(PFX "%s: when closing resources there is "
|
|
Packit Service |
646995 |
"no assoicated bnx2x", nic->log_name);
|
|
Packit Service |
646995 |
return -EIO;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/* Clean up allocated memory */
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (bp->rx_pkt_ring != NULL) {
|
|
Packit Service |
646995 |
free(bp->rx_pkt_ring);
|
|
Packit Service |
646995 |
bp->rx_pkt_ring = NULL;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/* Clean up mapped registers */
|
|
Packit Service |
646995 |
if (bp->bufs != NULL) {
|
|
Packit Service |
646995 |
rc = munmap(bp->bufs,
|
|
Packit Service |
646995 |
(bp->rx_ring_size + 1) * bp->rx_buffer_size);
|
|
Packit Service |
646995 |
if (rc != 0)
|
|
Packit Service |
646995 |
LOG_WARN(PFX "%s: Couldn't unmap bufs", nic->log_name);
|
|
Packit Service |
646995 |
bp->bufs = NULL;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (bp->tx_ring != NULL) {
|
|
Packit Service |
646995 |
rc = munmap(bp->tx_ring, 4 * nic->page_size);
|
|
Packit Service |
646995 |
if (rc != 0)
|
|
Packit Service |
646995 |
LOG_WARN(PFX "%s: Couldn't unmap tx_rings",
|
|
Packit Service |
646995 |
nic->log_name);
|
|
Packit Service |
646995 |
bp->tx_ring = NULL;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (bp->status_blk.def != NULL) {
|
|
Packit Service |
646995 |
rc = munmap(bp->status_blk.def, bp->status_blk_size);
|
|
Packit Service |
646995 |
if (rc != 0)
|
|
Packit Service |
646995 |
LOG_WARN(PFX "%s: Couldn't unmap status block",
|
|
Packit Service |
646995 |
nic->log_name);
|
|
Packit Service |
646995 |
bp->status_blk.def = NULL;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (bp->reg != NULL) {
|
|
Packit Service |
646995 |
rc = munmap(bp->reg, BNX2X_BAR_SIZE);
|
|
Packit Service |
646995 |
if (rc != 0)
|
|
Packit Service |
646995 |
LOG_WARN(PFX "%s: Couldn't unmap regs", nic->log_name);
|
|
Packit Service |
646995 |
bp->reg = NULL;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (bp->reg2 != NULL) {
|
|
Packit Service |
646995 |
rc = munmap(bp->reg2, BNX2X_BAR2_SIZE);
|
|
Packit Service |
646995 |
if (rc != 0)
|
|
Packit Service |
646995 |
LOG_WARN(PFX "%s: Couldn't unmap regs", nic->log_name);
|
|
Packit Service |
646995 |
bp->reg2 = NULL;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (bp->bar2_fd != INVALID_FD) {
|
|
Packit Service |
646995 |
close(bp->bar2_fd);
|
|
Packit Service |
646995 |
bp->bar2_fd = INVALID_FD;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (bp->bar0_fd != INVALID_FD) {
|
|
Packit Service |
646995 |
close(bp->bar0_fd);
|
|
Packit Service |
646995 |
bp->bar0_fd = INVALID_FD;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (nic->fd != INVALID_FD) {
|
|
Packit Service |
646995 |
rc = close(nic->fd);
|
|
Packit Service |
646995 |
if (rc != 0) {
|
|
Packit Service |
646995 |
LOG_WARN(PFX
|
|
Packit Service |
646995 |
"%s: Couldn't close uio file descriptor: %d",
|
|
Packit Service |
646995 |
nic->log_name, nic->fd);
|
|
Packit Service |
646995 |
} else {
|
|
Packit Service |
646995 |
LOG_DEBUG(PFX "%s: Closed uio file descriptor: %d",
|
|
Packit Service |
646995 |
nic->log_name, nic->fd);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
nic->fd = INVALID_FD;
|
|
Packit Service |
646995 |
} else {
|
|
Packit Service |
646995 |
LOG_WARN(PFX "%s: Invalid uio file descriptor: %d",
|
|
Packit Service |
646995 |
nic->log_name, nic->fd);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
bnx2x_set_drv_version_unknown(bp);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
LOG_INFO(PFX "%s: Closed all resources", nic->log_name);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/**
|
|
Packit Service |
646995 |
* bnx2x_close() - Used to close the NIC device
|
|
Packit Service |
646995 |
* @param nic - NIC device to close
|
|
Packit Service |
646995 |
* @param graceful - whether to wait to close gracefully
|
|
Packit Service |
646995 |
* @return 0 if successful, <0 if there is an error
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
static int bnx2x_close(nic_t *nic, NIC_SHUTDOWN_T graceful)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
/* Sanity Check: validate the parameters */
|
|
Packit Service |
646995 |
if (nic == NULL) {
|
|
Packit Service |
646995 |
LOG_ERR(PFX "bnx2x_close(): nic == NULL");
|
|
Packit Service |
646995 |
return -EINVAL;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
if (nic->priv == NULL) {
|
|
Packit Service |
646995 |
LOG_ERR(PFX "bnx2x_close(): nic->priv == NULL");
|
|
Packit Service |
646995 |
return -EINVAL;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
LOG_INFO(PFX "Closing NIC device: %s", nic->log_name);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
bnx2x_uio_close_resources(nic, graceful);
|
|
Packit Service |
646995 |
bnx2x_free(nic);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
static void bnx2x_prepare_xmit_packet(nic_t *nic,
|
|
Packit Service |
646995 |
nic_interface_t *nic_iface,
|
|
Packit Service |
646995 |
struct packet *pkt)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
bnx2x_t *bp = (bnx2x_t *) nic->priv;
|
|
Packit Service |
646995 |
struct uip_vlan_eth_hdr *eth_vlan = (struct uip_vlan_eth_hdr *)pkt->buf;
|
|
Packit Service |
646995 |
struct uip_eth_hdr *eth = (struct uip_eth_hdr *)bp->tx_pkt;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (eth_vlan->tpid == htons(UIP_ETHTYPE_8021Q)) {
|
|
Packit Service |
646995 |
memcpy(bp->tx_pkt, pkt->buf, sizeof(struct uip_eth_hdr));
|
|
Packit Service |
646995 |
eth->type = eth_vlan->type;
|
|
Packit Service |
646995 |
pkt->buf_size -= (sizeof(struct uip_vlan_eth_hdr) -
|
|
Packit Service |
646995 |
sizeof(struct uip_eth_hdr));
|
|
Packit Service |
646995 |
memcpy(bp->tx_pkt + sizeof(struct uip_eth_hdr),
|
|
Packit Service |
646995 |
pkt->buf + sizeof(struct uip_vlan_eth_hdr),
|
|
Packit Service |
646995 |
pkt->buf_size - sizeof(struct uip_eth_hdr));
|
|
Packit Service |
646995 |
} else
|
|
Packit Service |
646995 |
memcpy(bp->tx_pkt, pkt->buf, pkt->buf_size);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
msync(bp->tx_pkt, pkt->buf_size, MS_SYNC);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/**
|
|
Packit Service |
646995 |
* bnx2x_get_tx_pkt() - This function is used to a TX packet from the NIC
|
|
Packit Service |
646995 |
* @param nic - The NIC device to send the packet
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
void *bnx2x_get_tx_pkt(nic_t *nic)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
bnx2x_t *bp = (bnx2x_t *) nic->priv;
|
|
Packit Service |
646995 |
return bp->tx_pkt;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/**
|
|
Packit Service |
646995 |
* bnx2x_start_xmit() - This function is used to send a packet of data
|
|
Packit Service |
646995 |
* @param nic - The NIC device to send the packet
|
|
Packit Service |
646995 |
* @param len - the length of the TX packet
|
|
Packit Service |
646995 |
*
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
void bnx2x_start_xmit(nic_t *nic, size_t len, u16_t vlan_id)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
bnx2x_t *bp = (bnx2x_t *) nic->priv;
|
|
Packit Service |
646995 |
uint16_t ring_prod;
|
|
Packit Service |
646995 |
struct eth_tx_start_bd *txbd;
|
|
Packit Service |
646995 |
struct eth_tx_bd *txbd2;
|
|
Packit Service |
646995 |
struct eth_rx_bd *rx_bd;
|
|
Packit Service |
646995 |
rx_bd = (struct eth_rx_bd *)(((__u8 *) bp->tx_ring) + nic->page_size);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if ((rx_bd->addr_hi == 0) && (rx_bd->addr_lo == 0)) {
|
|
Packit Service |
646995 |
LOG_PACKET(PFX "%s: trying to transmit when device is closed",
|
|
Packit Service |
646995 |
nic->log_name);
|
|
Packit Service |
646995 |
return;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
ring_prod = BNX2X_TX_RING_IDX(bp->tx_bd_prod);
|
|
Packit Service |
646995 |
txbd = &bp->tx_ring[ring_prod];
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
BNX2X_SET_TX_VLAN(bp, txbd, vlan_id);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
bp->tx_prod++;
|
|
Packit Service |
646995 |
bp->tx_bd_prod = BNX2X_NEXT_TX_BD(bp->tx_bd_prod);
|
|
Packit Service |
646995 |
bp->tx_bd_prod = BNX2X_NEXT_TX_BD(bp->tx_bd_prod);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
ring_prod = BNX2X_TX_RING_IDX(bp->tx_bd_prod);
|
|
Packit Service |
646995 |
txbd2 = (struct eth_tx_bd *)&bp->tx_ring[ring_prod];
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
txbd2->nbytes = len - 0x10;
|
|
Packit Service |
646995 |
txbd2->total_pkt_bytes = len;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
bp->tx_bd_prod = BNX2X_NEXT_TX_BD(bp->tx_bd_prod);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
barrier();
|
|
Packit Service |
646995 |
if (nic->nl_process_if_down == 0) {
|
|
Packit Service |
646995 |
bnx2x_doorbell(bp, bp->tx_doorbell, 0x02 |
|
|
Packit Service |
646995 |
(bp->tx_bd_prod << 16));
|
|
Packit Service |
646995 |
bnx2x_flush_doorbell(bp, bp->tx_doorbell);
|
|
Packit Service |
646995 |
} else {
|
|
Packit Service |
646995 |
LOG_ERR(PFX "Pkt transmission failed.");
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
LOG_PACKET(PFX "%s: sent %d bytes using bp->tx_prod: %d",
|
|
Packit Service |
646995 |
nic->log_name, len, bp->tx_prod);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/**
|
|
Packit Service |
646995 |
* bnx2x_write() - Used to write the data to the hardware
|
|
Packit Service |
646995 |
* @param nic - NIC hardware to read from
|
|
Packit Service |
646995 |
* @param pkt - The packet which will hold the data to be sent on the wire
|
|
Packit Service |
646995 |
* @return 0 if successful, <0 if failed
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
int bnx2x_write(nic_t *nic, nic_interface_t *nic_iface, packet_t *pkt)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
bnx2x_t *bp;
|
|
Packit Service |
646995 |
struct uip_stack *uip;
|
|
Packit Service |
646995 |
int i = 0;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/* Sanity Check: validate the parameters */
|
|
Packit Service |
646995 |
if (nic == NULL || nic_iface == NULL || pkt == NULL) {
|
|
Packit Service |
646995 |
LOG_ERR(PFX "%s: bnx2x_write() nic == 0x%p || "
|
|
Packit Service |
646995 |
" nic_iface == 0x%p || "
|
|
Packit Service |
646995 |
" pkt == 0x%x", nic, nic_iface, pkt);
|
|
Packit Service |
646995 |
return -EINVAL;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
bp = (bnx2x_t *) nic->priv;
|
|
Packit Service |
646995 |
uip = &nic_iface->ustack;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (pkt->buf_size == 0) {
|
|
Packit Service |
646995 |
LOG_ERR(PFX "%s: Trying to transmitted 0 sized packet",
|
|
Packit Service |
646995 |
nic->log_name);
|
|
Packit Service |
646995 |
return -EINVAL;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/* Try to wait for a TX completion */
|
|
Packit Service |
646995 |
for (i = 0; i < 15; i++) {
|
|
Packit Service |
646995 |
struct timespec sleep_req = {.tv_sec = 0, .tv_nsec = 5000000 },
|
|
Packit Service |
646995 |
sleep_rem;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (bnx2x_clear_tx_intr(nic) == 0)
|
|
Packit Service |
646995 |
break;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
nanosleep(&sleep_req, &sleep_rem);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (pthread_mutex_trylock(&nic->xmit_mutex) != 0) {
|
|
Packit Service |
646995 |
LOG_PACKET(PFX "%s: Dropped previous transmitted packet",
|
|
Packit Service |
646995 |
nic->log_name);
|
|
Packit Service |
646995 |
return -EINVAL;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
bnx2x_prepare_xmit_packet(nic, nic_iface, pkt);
|
|
Packit Service |
646995 |
bnx2x_start_xmit(nic, pkt->buf_size,
|
|
Packit Service |
646995 |
(nic_iface->vlan_priority << 12) |
|
|
Packit Service |
646995 |
nic_iface->vlan_id);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/* bump the cnic dev send statistics */
|
|
Packit Service |
646995 |
nic->stats.tx.packets++;
|
|
Packit Service |
646995 |
nic->stats.tx.bytes += uip->uip_len;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
LOG_PACKET(PFX "%s: transmitted %d bytes "
|
|
Packit Service |
646995 |
"dev->tx_cons: %d, dev->tx_prod: %d, dev->tx_bd_prod:%d",
|
|
Packit Service |
646995 |
nic->log_name, pkt->buf_size,
|
|
Packit Service |
646995 |
bp->tx_cons, bp->tx_prod, bp->tx_bd_prod);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
pthread_mutex_unlock(&nic->xmit_mutex);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
static inline int bnx2x_get_rx_pad(bnx2x_t *bp, union eth_rx_cqe *cqe)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
int pad = 0;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (bnx2x_is_ver70(bp))
|
|
Packit Service |
646995 |
pad = ((union eth_rx_cqe_70 *)cqe)->fast_path_cqe_70. \
|
|
Packit Service |
646995 |
placement_offset;
|
|
Packit Service |
646995 |
else if (bnx2x_is_ver60(bp)) {
|
|
Packit Service |
646995 |
if (bp->version.minor >= 64)
|
|
Packit Service |
646995 |
pad = cqe->fast_path_cqe_64.placement_offset;
|
|
Packit Service |
646995 |
else
|
|
Packit Service |
646995 |
pad = cqe->fast_path_cqe.placement_offset;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
return pad;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/**
|
|
Packit Service |
646995 |
* bnx2x_read() - Used to read the data from the hardware
|
|
Packit Service |
646995 |
* @param nic - NIC hardware to read from
|
|
Packit Service |
646995 |
* @param pkt - The packet which will hold the data
|
|
Packit Service |
646995 |
* @return 0 if successful, <0 if failed
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
static int bnx2x_read(nic_t *nic, packet_t *pkt)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
bnx2x_t *bp;
|
|
Packit Service |
646995 |
int rc = 0;
|
|
Packit Service |
646995 |
uint16_t hw_cons, sw_cons, bd_cons, bd_prod;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/* Sanity Check: validate the parameters */
|
|
Packit Service |
646995 |
if (nic == NULL || pkt == NULL) {
|
|
Packit Service |
646995 |
LOG_ERR(PFX "%s: bnx2x_read() nic == 0x%p || "
|
|
Packit Service |
646995 |
" pkt == 0x%x", nic, pkt);
|
|
Packit Service |
646995 |
return -EINVAL;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
bp = (bnx2x_t *) nic->priv;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
hw_cons = bp->get_rx_cons(bp);
|
|
Packit Service |
646995 |
sw_cons = bp->rx_cons;
|
|
Packit Service |
646995 |
bd_cons = BNX2X_RX_BD(bp->rx_bd_cons);
|
|
Packit Service |
646995 |
bd_prod = BNX2X_RX_BD(bp->rx_bd_prod);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (sw_cons != hw_cons) {
|
|
Packit Service |
646995 |
uint16_t comp_ring_index = sw_cons & BNX2X_MAX_RCQ_DESC_CNT(bp);
|
|
Packit Service |
646995 |
uint8_t ring_index;
|
|
Packit Service |
646995 |
union eth_rx_cqe *cqe;
|
|
Packit Service |
646995 |
__u8 cqe_fp_flags;
|
|
Packit Service |
646995 |
void *rx_pkt;
|
|
Packit Service |
646995 |
int len, pad, cqe_size, max_len;
|
|
Packit Service |
646995 |
rc = 1;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (bnx2x_is_ver70(bp)) {
|
|
Packit Service |
646995 |
cqe = (union eth_rx_cqe *)
|
|
Packit Service |
646995 |
&bp->rx_comp_ring.cqe70[comp_ring_index];
|
|
Packit Service |
646995 |
cqe_size = sizeof(union eth_rx_cqe_70);
|
|
Packit Service |
646995 |
} else {
|
|
Packit Service |
646995 |
cqe = &bp->rx_comp_ring.cqe[comp_ring_index];
|
|
Packit Service |
646995 |
cqe_size = sizeof(union eth_rx_cqe);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
cqe_fp_flags = cqe->fast_path_cqe.type_error_flags;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
LOG_PACKET(PFX "%s: clearing rx interrupt: %d %d",
|
|
Packit Service |
646995 |
nic->log_name, sw_cons, hw_cons);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
msync(cqe, cqe_size, MS_SYNC);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (!(cqe_fp_flags & ETH_FAST_PATH_RX_CQE_TYPE)) {
|
|
Packit Service |
646995 |
ring_index = bd_cons % 15;
|
|
Packit Service |
646995 |
len = cqe->fast_path_cqe.pkt_len;
|
|
Packit Service |
646995 |
pad = bnx2x_get_rx_pad(bp, cqe);
|
|
Packit Service |
646995 |
rx_pkt = bp->rx_pkt_ring[ring_index] + pad;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/* Doto query MTU size of physical device */
|
|
Packit Service |
646995 |
/* Ensure len is valid */
|
|
Packit Service |
646995 |
max_len = pkt->max_buf_size < bp->rx_buffer_size ?
|
|
Packit Service |
646995 |
pkt->max_buf_size : bp->rx_buffer_size;
|
|
Packit Service |
646995 |
if (len + pad > max_len) {
|
|
Packit Service |
646995 |
LOG_DEBUG(PFX "%s: bad BD length: %d",
|
|
Packit Service |
646995 |
nic->log_name, len);
|
|
Packit Service |
646995 |
len = max_len - pad;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
if (len > 0) {
|
|
Packit Service |
646995 |
msync(rx_pkt, len, MS_SYNC);
|
|
Packit Service |
646995 |
/* Copy the data */
|
|
Packit Service |
646995 |
memcpy(pkt->buf, rx_pkt, len);
|
|
Packit Service |
646995 |
pkt->buf_size = len;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/* Properly set the packet flags */
|
|
Packit Service |
646995 |
/* check if there is VLAN tagging */
|
|
Packit Service |
646995 |
if (cqe->fast_path_cqe.vlan_tag != 0) {
|
|
Packit Service |
646995 |
pkt->vlan_tag =
|
|
Packit Service |
646995 |
cqe->fast_path_cqe.vlan_tag;
|
|
Packit Service |
646995 |
pkt->flags |= VLAN_TAGGED;
|
|
Packit Service |
646995 |
} else {
|
|
Packit Service |
646995 |
pkt->vlan_tag = 0;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
LOG_PACKET(PFX
|
|
Packit Service |
646995 |
"%s: processing packet length: %d",
|
|
Packit Service |
646995 |
nic->log_name, len);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/* bump the cnic dev recv statistics */
|
|
Packit Service |
646995 |
nic->stats.rx.packets++;
|
|
Packit Service |
646995 |
nic->stats.rx.bytes += pkt->buf_size;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
bd_cons = BNX2X_NEXT_RX_IDX(bd_cons);
|
|
Packit Service |
646995 |
bd_prod = BNX2X_NEXT_RX_IDX(bd_prod);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
sw_cons = BNX2X_NEXT_RCQ_IDX(bp, sw_cons);
|
|
Packit Service |
646995 |
bp->rx_prod = BNX2X_NEXT_RCQ_IDX(bp, bp->rx_prod);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
bp->rx_cons = sw_cons;
|
|
Packit Service |
646995 |
bp->rx_bd_cons = bd_cons;
|
|
Packit Service |
646995 |
bp->rx_bd_prod = bd_prod;
|
|
Packit Service |
646995 |
bp->rx_hw_prod = hw_cons;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (rc)
|
|
Packit Service |
646995 |
bnx2x_update_rx_prod(bp);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
return rc;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/*******************************************************************************
|
|
Packit Service |
646995 |
* Clearing TX interrupts
|
|
Packit Service |
646995 |
******************************************************************************/
|
|
Packit Service |
646995 |
/**
|
|
Packit Service |
646995 |
* bnx2x_clear_tx_intr() - This routine is called when a TX interrupt occurs
|
|
Packit Service |
646995 |
* @param nic - the nic the interrupt occured on
|
|
Packit Service |
646995 |
* @return 0 on success
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
static int bnx2x_clear_tx_intr(nic_t *nic)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
bnx2x_t *bp;
|
|
Packit Service |
646995 |
uint16_t hw_cons;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/* Sanity check: ensure the parameters passed in are valid */
|
|
Packit Service |
646995 |
if (unlikely(nic == NULL)) {
|
|
Packit Service |
646995 |
LOG_ERR(PFX "bnx2x_read() nic == NULL");
|
|
Packit Service |
646995 |
return -EINVAL;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
bp = (bnx2x_t *) nic->priv;
|
|
Packit Service |
646995 |
hw_cons = bp->get_tx_cons(bp);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (bp->tx_cons == hw_cons) {
|
|
Packit Service |
646995 |
if (bp->tx_cons == bp->tx_prod)
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
return -EAGAIN;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (pthread_mutex_trylock(&nic->xmit_mutex)) {
|
|
Packit Service |
646995 |
LOG_ERR(PFX "%s: unable to get xmit_mutex.", nic->log_name);
|
|
Packit Service |
646995 |
return -EINVAL;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
LOG_PACKET(PFX "%s: clearing tx interrupt [%d %d]",
|
|
Packit Service |
646995 |
nic->log_name, bp->tx_cons, hw_cons);
|
|
Packit Service |
646995 |
bp->tx_cons = hw_cons;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/* There is a queued TX packet that needs to be sent out. The usual
|
|
Packit Service |
646995 |
* case is when stack will send an ARP packet out before sending the
|
|
Packit Service |
646995 |
* intended packet */
|
|
Packit Service |
646995 |
if (nic->tx_packet_queue != NULL) {
|
|
Packit Service |
646995 |
packet_t *pkt;
|
|
Packit Service |
646995 |
int i;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
LOG_PACKET(PFX "%s: sending queued tx packet", nic->log_name);
|
|
Packit Service |
646995 |
pkt = nic_dequeue_tx_packet(nic);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/* Got a TX packet buffer of the TX queue and put it onto
|
|
Packit Service |
646995 |
* the hardware */
|
|
Packit Service |
646995 |
if (pkt != NULL) {
|
|
Packit Service |
646995 |
bnx2x_prepare_xmit_packet(nic, pkt->nic_iface, pkt);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
bnx2x_start_xmit(nic, pkt->buf_size,
|
|
Packit Service |
646995 |
(pkt->nic_iface->vlan_priority << 12) |
|
|
Packit Service |
646995 |
pkt->nic_iface->vlan_id);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
LOG_PACKET(PFX "%s: transmitted queued packet %d bytes "
|
|
Packit Service |
646995 |
"dev->tx_cons: %d, dev->tx_prod: %d, "
|
|
Packit Service |
646995 |
"dev->tx_bd_prod:%d",
|
|
Packit Service |
646995 |
nic->log_name, pkt->buf_size,
|
|
Packit Service |
646995 |
bp->tx_cons, bp->tx_prod, bp->tx_bd_prod);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
pthread_mutex_unlock(&nic->xmit_mutex);
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/* Try to wait for a TX completion */
|
|
Packit Service |
646995 |
for (i = 0; i < 15; i++) {
|
|
Packit Service |
646995 |
struct timespec sleep_req = {.tv_sec = 0,
|
|
Packit Service |
646995 |
.tv_nsec = 5000000
|
|
Packit Service |
646995 |
}, sleep_rem;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
hw_cons = bp->get_tx_cons(bp);
|
|
Packit Service |
646995 |
if (bp->tx_cons != hw_cons) {
|
|
Packit Service |
646995 |
LOG_PACKET(PFX
|
|
Packit Service |
646995 |
"%s: clearing tx interrupt [%d %d]",
|
|
Packit Service |
646995 |
nic->log_name, bp->tx_cons, hw_cons);
|
|
Packit Service |
646995 |
bp->tx_cons = hw_cons;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
break;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
nanosleep(&sleep_req, &sleep_rem);
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
pthread_mutex_unlock(&nic->xmit_mutex);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/*******************************************************************************
|
|
Packit Service |
646995 |
* bnx2x NIC op's table
|
|
Packit Service |
646995 |
******************************************************************************/
|
|
Packit Service |
646995 |
struct nic_ops bnx2x_op = {
|
|
Packit Service |
646995 |
.description = "bnx2x",
|
|
Packit Service |
646995 |
.open = bnx2x_open,
|
|
Packit Service |
646995 |
.close = bnx2x_close,
|
|
Packit Service |
646995 |
.write = bnx2x_write,
|
|
Packit Service |
646995 |
.get_tx_pkt = bnx2x_get_tx_pkt,
|
|
Packit Service |
646995 |
.start_xmit = bnx2x_start_xmit,
|
|
Packit Service |
646995 |
.read = bnx2x_read,
|
|
Packit Service |
646995 |
.clear_tx_intr = bnx2x_clear_tx_intr,
|
|
Packit Service |
646995 |
.handle_iscsi_path_req = cnic_handle_iscsi_path_req,
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
.lib_ops = {
|
|
Packit Service |
646995 |
.get_library_name = bnx2x_get_library_name,
|
|
Packit Service |
646995 |
.get_pci_table = bnx2x_get_pci_table,
|
|
Packit Service |
646995 |
.get_library_version = bnx2x_get_library_version,
|
|
Packit Service |
646995 |
.get_build_date = bnx2x_get_build_date,
|
|
Packit Service |
646995 |
.get_transport_name = bnx2x_get_transport_name,
|
|
Packit Service |
646995 |
.get_uio_name = bnx2x_get_uio_name,
|
|
Packit Service |
646995 |
},
|
|
Packit Service |
646995 |
};
|