MFC of version 2.1.7 of the ixgbe driver.
This commit is contained in:
parent
54d9759401
commit
8a101f2852
@ -1,6 +1,6 @@
|
||||
/******************************************************************************
|
||||
|
||||
Copyright (c) 2001-2009, Intel Corporation
|
||||
Copyright (c) 2001-2010, Intel Corporation
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,6 +1,6 @@
|
||||
/******************************************************************************
|
||||
|
||||
Copyright (c) 2001-2009, Intel Corporation
|
||||
Copyright (c) 2001-2010, Intel Corporation
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
@ -134,9 +134,11 @@
|
||||
#define MAX_LOOP 10
|
||||
|
||||
/*
|
||||
* This parameter controls the duration of transmit watchdog timer.
|
||||
* This is the max watchdog interval, ie. the time that can
|
||||
* pass between any two TX clean operations, such only happening
|
||||
* when the TX hardware is functioning.
|
||||
*/
|
||||
#define IXGBE_TX_TIMEOUT 5 /* set to 5 seconds */
|
||||
#define IXGBE_WATCHDOG (10 * hz)
|
||||
|
||||
/*
|
||||
* This parameters control when the driver calls the routine to reclaim
|
||||
@ -148,7 +150,7 @@
|
||||
#define IXGBE_MAX_FRAME_SIZE 0x3F00
|
||||
|
||||
/* Flow control constants */
|
||||
#define IXGBE_FC_PAUSE 0x680
|
||||
#define IXGBE_FC_PAUSE 0xFFFF
|
||||
#define IXGBE_FC_HI 0x20000
|
||||
#define IXGBE_FC_LO 0x10000
|
||||
|
||||
@ -177,7 +179,13 @@
|
||||
#define IXGBE_RX_HDR 128
|
||||
#define IXGBE_VFTA_SIZE 128
|
||||
#define IXGBE_BR_SIZE 4096
|
||||
#define CSUM_OFFLOAD 7 /* Bits in csum flags */
|
||||
|
||||
/* Offload bits in mbuf flag */
|
||||
#if __FreeBSD_version >= 800000
|
||||
#define CSUM_OFFLOAD (CSUM_IP|CSUM_TCP|CSUM_UDP|CSUM_SCTP)
|
||||
#else
|
||||
#define CSUM_OFFLOAD (CSUM_IP|CSUM_TCP|CSUM_UDP)
|
||||
#endif
|
||||
|
||||
/* For 6.X code compatibility */
|
||||
#if !defined(ETHER_BPF_MTAP)
|
||||
@ -229,6 +237,7 @@ struct ixgbe_tx_buf {
|
||||
struct ixgbe_rx_buf {
|
||||
struct mbuf *m_head;
|
||||
struct mbuf *m_pack;
|
||||
struct mbuf *fmp;
|
||||
bus_dmamap_t map;
|
||||
};
|
||||
|
||||
@ -246,21 +255,36 @@ struct ixgbe_dma_alloc {
|
||||
};
|
||||
|
||||
/*
|
||||
* The transmit ring, one per tx queue
|
||||
** Driver queue struct: this is the interrupt container
|
||||
** for the associated tx and rx ring.
|
||||
*/
|
||||
struct ix_queue {
|
||||
struct adapter *adapter;
|
||||
u32 msix; /* This queue's MSIX vector */
|
||||
u32 eims; /* This queue's EIMS bit */
|
||||
u32 eitr_setting;
|
||||
struct resource *res;
|
||||
void *tag;
|
||||
struct tx_ring *txr;
|
||||
struct rx_ring *rxr;
|
||||
struct task que_task;
|
||||
struct taskqueue *tq;
|
||||
u64 irqs;
|
||||
};
|
||||
|
||||
/*
|
||||
* The transmit ring, one per queue
|
||||
*/
|
||||
struct tx_ring {
|
||||
struct adapter *adapter;
|
||||
struct mtx tx_mtx;
|
||||
u32 me;
|
||||
u32 msix;
|
||||
u32 watchdog_timer;
|
||||
bool watchdog_check;
|
||||
int watchdog_time;
|
||||
union ixgbe_adv_tx_desc *tx_base;
|
||||
volatile u32 tx_hwb;
|
||||
struct ixgbe_dma_alloc txdma;
|
||||
struct task tx_task;
|
||||
struct taskqueue *tq;
|
||||
u32 next_avail_tx_desc;
|
||||
u32 next_tx_to_clean;
|
||||
u32 next_avail_desc;
|
||||
u32 next_to_clean;
|
||||
struct ixgbe_tx_buf *tx_buffers;
|
||||
volatile u16 tx_avail;
|
||||
u32 txd_cmd;
|
||||
@ -269,14 +293,14 @@ struct tx_ring {
|
||||
#if __FreeBSD_version >= 800000
|
||||
struct buf_ring *br;
|
||||
#endif
|
||||
/* Interrupt resources */
|
||||
void *tag;
|
||||
struct resource *res;
|
||||
|
||||
#ifdef IXGBE_FDIR
|
||||
u16 atr_sample;
|
||||
u16 atr_count;
|
||||
#endif
|
||||
u32 bytes; /* used for AIM */
|
||||
u32 packets;
|
||||
/* Soft Stats */
|
||||
u32 no_tx_desc_avail;
|
||||
u32 no_tx_desc_late;
|
||||
u64 tx_irq;
|
||||
u64 no_desc_avail;
|
||||
u64 total_packets;
|
||||
};
|
||||
|
||||
@ -288,129 +312,125 @@ struct rx_ring {
|
||||
struct adapter *adapter;
|
||||
struct mtx rx_mtx;
|
||||
u32 me;
|
||||
u32 msix;
|
||||
u32 payload;
|
||||
struct task rx_task;
|
||||
struct taskqueue *tq;
|
||||
union ixgbe_adv_rx_desc *rx_base;
|
||||
struct ixgbe_dma_alloc rxdma;
|
||||
struct lro_ctrl lro;
|
||||
bool lro_enabled;
|
||||
bool hdr_split;
|
||||
unsigned int last_cleaned;
|
||||
unsigned int next_to_check;
|
||||
bool hw_rsc;
|
||||
bool discard;
|
||||
u32 next_to_refresh;
|
||||
u32 next_to_check;
|
||||
char mtx_name[16];
|
||||
struct ixgbe_rx_buf *rx_buffers;
|
||||
bus_dma_tag_t rxtag;
|
||||
bus_dmamap_t spare_map;
|
||||
struct mbuf *fmp;
|
||||
struct mbuf *lmp;
|
||||
char mtx_name[16];
|
||||
|
||||
u32 bytes; /* Used for AIM calc */
|
||||
u32 eitr_setting;
|
||||
|
||||
/* Interrupt resources */
|
||||
void *tag;
|
||||
struct resource *res;
|
||||
u32 packets;
|
||||
|
||||
/* Soft stats */
|
||||
u64 rx_irq;
|
||||
u64 rx_split_packets;
|
||||
u64 rx_packets;
|
||||
u64 rx_bytes;
|
||||
u64 rx_discarded;
|
||||
u64 rsc_num;
|
||||
#ifdef IXGBE_FDIR
|
||||
u64 flm;
|
||||
#endif
|
||||
};
|
||||
|
||||
/* Our adapter structure */
|
||||
struct adapter {
|
||||
struct ifnet *ifp;
|
||||
struct ixgbe_hw hw;
|
||||
struct ifnet *ifp;
|
||||
struct ixgbe_hw hw;
|
||||
|
||||
struct ixgbe_osdep osdep;
|
||||
struct device *dev;
|
||||
struct device *dev;
|
||||
|
||||
struct resource *pci_mem;
|
||||
struct resource *msix_mem;
|
||||
struct resource *pci_mem;
|
||||
struct resource *msix_mem;
|
||||
|
||||
/*
|
||||
* Interrupt resources: this set is
|
||||
* either used for legacy, or for Link
|
||||
* when doing MSIX
|
||||
*/
|
||||
void *tag;
|
||||
struct resource *res;
|
||||
void *tag;
|
||||
struct resource *res;
|
||||
|
||||
struct ifmedia media;
|
||||
struct callout timer;
|
||||
int msix;
|
||||
int if_flags;
|
||||
struct ifmedia media;
|
||||
struct callout timer;
|
||||
int msix;
|
||||
int if_flags;
|
||||
|
||||
struct mtx core_mtx;
|
||||
struct mtx core_mtx;
|
||||
|
||||
eventhandler_tag vlan_attach;
|
||||
eventhandler_tag vlan_detach;
|
||||
eventhandler_tag vlan_attach;
|
||||
eventhandler_tag vlan_detach;
|
||||
|
||||
u32 num_vlans;
|
||||
u16 num_queues;
|
||||
u16 num_vlans;
|
||||
u16 num_queues;
|
||||
|
||||
/* Info about the board itself */
|
||||
u32 part_num;
|
||||
u32 optics;
|
||||
bool link_active;
|
||||
u16 max_frame_size;
|
||||
u32 link_speed;
|
||||
bool link_up;
|
||||
u32 linkvec;
|
||||
u32 tx_int_delay;
|
||||
u32 tx_abs_int_delay;
|
||||
u32 rx_int_delay;
|
||||
u32 rx_abs_int_delay;
|
||||
u32 optics;
|
||||
bool link_active;
|
||||
u16 max_frame_size;
|
||||
u32 link_speed;
|
||||
bool link_up;
|
||||
u32 linkvec;
|
||||
|
||||
/* Mbuf cluster size */
|
||||
u32 rx_mbuf_sz;
|
||||
u32 rx_mbuf_sz;
|
||||
|
||||
/* Support for pluggable optics */
|
||||
bool sfp_probe;
|
||||
struct task link_task; /* Link tasklet */
|
||||
struct task mod_task; /* SFP tasklet */
|
||||
struct task msf_task; /* Multispeed Fiber tasklet */
|
||||
bool sfp_probe;
|
||||
struct task link_task; /* Link tasklet */
|
||||
struct task mod_task; /* SFP tasklet */
|
||||
struct task msf_task; /* Multispeed Fiber */
|
||||
#ifdef IXGBE_FDIR
|
||||
int fdir_reinit;
|
||||
struct task fdir_task;
|
||||
#endif
|
||||
struct taskqueue *tq;
|
||||
|
||||
/*
|
||||
** Queues:
|
||||
** This is the irq holder, it has
|
||||
** and RX/TX pair or rings associated
|
||||
** with it.
|
||||
*/
|
||||
struct ix_queue *queues;
|
||||
|
||||
/*
|
||||
* Transmit rings:
|
||||
* Allocated at run time, an array of rings.
|
||||
*/
|
||||
struct tx_ring *tx_rings;
|
||||
int num_tx_desc;
|
||||
struct tx_ring *tx_rings;
|
||||
int num_tx_desc;
|
||||
|
||||
/*
|
||||
* Receive rings:
|
||||
* Allocated at run time, an array of rings.
|
||||
*/
|
||||
struct rx_ring *rx_rings;
|
||||
int num_rx_desc;
|
||||
u64 rx_mask;
|
||||
u32 rx_process_limit;
|
||||
|
||||
#ifdef IXGBE_IEEE1588
|
||||
/* IEEE 1588 precision time support */
|
||||
struct cyclecounter cycles;
|
||||
struct nettimer clock;
|
||||
struct nettime_compare compare;
|
||||
struct hwtstamp_ctrl hwtstamp;
|
||||
#endif
|
||||
struct rx_ring *rx_rings;
|
||||
int num_rx_desc;
|
||||
u64 que_mask;
|
||||
u32 rx_process_limit;
|
||||
|
||||
/* Misc stats maintained by the driver */
|
||||
unsigned long dropped_pkts;
|
||||
unsigned long mbuf_defrag_failed;
|
||||
unsigned long mbuf_header_failed;
|
||||
unsigned long mbuf_packet_failed;
|
||||
unsigned long no_tx_map_avail;
|
||||
unsigned long no_tx_dma_setup;
|
||||
unsigned long watchdog_events;
|
||||
unsigned long tso_tx;
|
||||
unsigned long link_irq;
|
||||
unsigned long dropped_pkts;
|
||||
unsigned long mbuf_defrag_failed;
|
||||
unsigned long mbuf_header_failed;
|
||||
unsigned long mbuf_packet_failed;
|
||||
unsigned long no_tx_map_avail;
|
||||
unsigned long no_tx_dma_setup;
|
||||
unsigned long watchdog_events;
|
||||
unsigned long tso_tx;
|
||||
unsigned long link_irq;
|
||||
|
||||
struct ixgbe_hw_stats stats;
|
||||
struct ixgbe_hw_stats stats;
|
||||
};
|
||||
|
||||
/* Precision Time Sync (IEEE 1588) defines */
|
||||
@ -423,12 +443,12 @@ struct adapter {
|
||||
#define IXGBE_CORE_LOCK_INIT(_sc, _name) \
|
||||
mtx_init(&(_sc)->core_mtx, _name, "IXGBE Core Lock", MTX_DEF)
|
||||
#define IXGBE_CORE_LOCK_DESTROY(_sc) mtx_destroy(&(_sc)->core_mtx)
|
||||
#define IXGBE_TX_LOCK_DESTROY(_sc) mtx_destroy(&(_sc)->tx_mtx)
|
||||
#define IXGBE_RX_LOCK_DESTROY(_sc) mtx_destroy(&(_sc)->rx_mtx)
|
||||
#define IXGBE_TX_LOCK_DESTROY(_sc) mtx_destroy(&(_sc)->tx_mtx)
|
||||
#define IXGBE_RX_LOCK_DESTROY(_sc) mtx_destroy(&(_sc)->rx_mtx)
|
||||
#define IXGBE_CORE_LOCK(_sc) mtx_lock(&(_sc)->core_mtx)
|
||||
#define IXGBE_TX_LOCK(_sc) mtx_lock(&(_sc)->tx_mtx)
|
||||
#define IXGBE_TX_TRYLOCK(_sc) mtx_trylock(&(_sc)->tx_mtx)
|
||||
#define IXGBE_RX_LOCK(_sc) mtx_lock(&(_sc)->rx_mtx)
|
||||
#define IXGBE_TX_LOCK(_sc) mtx_lock(&(_sc)->tx_mtx)
|
||||
#define IXGBE_TX_TRYLOCK(_sc) mtx_trylock(&(_sc)->tx_mtx)
|
||||
#define IXGBE_RX_LOCK(_sc) mtx_lock(&(_sc)->rx_mtx)
|
||||
#define IXGBE_CORE_UNLOCK(_sc) mtx_unlock(&(_sc)->core_mtx)
|
||||
#define IXGBE_TX_UNLOCK(_sc) mtx_unlock(&(_sc)->tx_mtx)
|
||||
#define IXGBE_RX_UNLOCK(_sc) mtx_unlock(&(_sc)->rx_mtx)
|
||||
@ -444,8 +464,8 @@ ixgbe_is_sfp(struct ixgbe_hw *hw)
|
||||
case ixgbe_phy_sfp_ftl:
|
||||
case ixgbe_phy_sfp_intel:
|
||||
case ixgbe_phy_sfp_unknown:
|
||||
case ixgbe_phy_tw_tyco:
|
||||
case ixgbe_phy_tw_unknown:
|
||||
case ixgbe_phy_sfp_passive_tyco:
|
||||
case ixgbe_phy_sfp_passive_unknown:
|
||||
return TRUE;
|
||||
default:
|
||||
return FALSE;
|
||||
|
@ -1,6 +1,6 @@
|
||||
/******************************************************************************
|
||||
|
||||
Copyright (c) 2001-2009, Intel Corporation
|
||||
Copyright (c) 2001-2010, Intel Corporation
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
@ -44,20 +44,22 @@ static s32 ixgbe_get_link_capabilities_82598(struct ixgbe_hw *hw,
|
||||
bool *autoneg);
|
||||
static enum ixgbe_media_type ixgbe_get_media_type_82598(struct ixgbe_hw *hw);
|
||||
s32 ixgbe_fc_enable_82598(struct ixgbe_hw *hw, s32 packetbuf_num);
|
||||
static s32 ixgbe_setup_mac_link_82598(struct ixgbe_hw *hw);
|
||||
static s32 ixgbe_start_mac_link_82598(struct ixgbe_hw *hw,
|
||||
bool autoneg_wait_to_complete);
|
||||
static s32 ixgbe_check_mac_link_82598(struct ixgbe_hw *hw,
|
||||
ixgbe_link_speed *speed, bool *link_up,
|
||||
bool link_up_wait_to_complete);
|
||||
static s32 ixgbe_setup_mac_link_speed_82598(struct ixgbe_hw *hw,
|
||||
static s32 ixgbe_setup_mac_link_82598(struct ixgbe_hw *hw,
|
||||
ixgbe_link_speed speed,
|
||||
bool autoneg,
|
||||
bool autoneg_wait_to_complete);
|
||||
static s32 ixgbe_setup_copper_link_82598(struct ixgbe_hw *hw);
|
||||
static s32 ixgbe_setup_copper_link_speed_82598(struct ixgbe_hw *hw,
|
||||
static s32 ixgbe_setup_copper_link_82598(struct ixgbe_hw *hw,
|
||||
ixgbe_link_speed speed,
|
||||
bool autoneg,
|
||||
bool autoneg_wait_to_complete);
|
||||
static s32 ixgbe_reset_hw_82598(struct ixgbe_hw *hw);
|
||||
s32 ixgbe_start_hw_82598(struct ixgbe_hw *hw);
|
||||
void ixgbe_enable_relaxed_ordering_82598(struct ixgbe_hw *hw);
|
||||
s32 ixgbe_set_vmdq_82598(struct ixgbe_hw *hw, u32 rar, u32 vmdq);
|
||||
static s32 ixgbe_clear_vmdq_82598(struct ixgbe_hw *hw, u32 rar, u32 vmdq);
|
||||
s32 ixgbe_set_vfta_82598(struct ixgbe_hw *hw, u32 vlan,
|
||||
@ -70,7 +72,50 @@ s32 ixgbe_read_i2c_eeprom_82598(struct ixgbe_hw *hw, u8 byte_offset,
|
||||
u32 ixgbe_get_supported_physical_layer_82598(struct ixgbe_hw *hw);
|
||||
s32 ixgbe_init_phy_ops_82598(struct ixgbe_hw *hw);
|
||||
void ixgbe_set_lan_id_multi_port_pcie_82598(struct ixgbe_hw *hw);
|
||||
void ixgbe_set_pcie_completion_timeout(struct ixgbe_hw *hw);
|
||||
static s32 ixgbe_validate_link_ready(struct ixgbe_hw *hw);
|
||||
|
||||
/**
|
||||
* ixgbe_set_pcie_completion_timeout - set pci-e completion timeout
|
||||
* @hw: pointer to the HW structure
|
||||
*
|
||||
* The defaults for 82598 should be in the range of 50us to 50ms,
|
||||
* however the hardware default for these parts is 500us to 1ms which is less
|
||||
* than the 10ms recommended by the pci-e spec. To address this we need to
|
||||
* increase the value to either 10ms to 250ms for capability version 1 config,
|
||||
* or 16ms to 55ms for version 2.
|
||||
**/
|
||||
void ixgbe_set_pcie_completion_timeout(struct ixgbe_hw *hw)
|
||||
{
|
||||
u32 gcr = IXGBE_READ_REG(hw, IXGBE_GCR);
|
||||
u16 pcie_devctl2;
|
||||
|
||||
/* only take action if timeout value is defaulted to 0 */
|
||||
if (gcr & IXGBE_GCR_CMPL_TMOUT_MASK)
|
||||
goto out;
|
||||
|
||||
/*
|
||||
* if capababilities version is type 1 we can write the
|
||||
* timeout of 10ms to 250ms through the GCR register
|
||||
*/
|
||||
if (!(gcr & IXGBE_GCR_CAP_VER2)) {
|
||||
gcr |= IXGBE_GCR_CMPL_TMOUT_10ms;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/*
|
||||
* for version 2 capabilities we need to write the config space
|
||||
* directly in order to set the completion timeout value for
|
||||
* 16ms to 55ms
|
||||
*/
|
||||
pcie_devctl2 = IXGBE_READ_PCIE_WORD(hw, IXGBE_PCI_DEVICE_CONTROL2);
|
||||
pcie_devctl2 |= IXGBE_PCI_DEVICE_CONTROL2_16ms;
|
||||
IXGBE_WRITE_PCIE_WORD(hw, IXGBE_PCI_DEVICE_CONTROL2, pcie_devctl2);
|
||||
out:
|
||||
/* disable completion timeout resend */
|
||||
gcr &= ~IXGBE_GCR_CMPL_TMOUT_RESEND;
|
||||
IXGBE_WRITE_REG(hw, IXGBE_GCR, gcr);
|
||||
}
|
||||
|
||||
/**
|
||||
* ixgbe_get_pcie_msix_count_82598 - Gets MSI-X vector count
|
||||
@ -83,6 +128,8 @@ u32 ixgbe_get_pcie_msix_count_82598(struct ixgbe_hw *hw)
|
||||
{
|
||||
u32 msix_count = 18;
|
||||
|
||||
DEBUGFUNC("ixgbe_get_pcie_msix_count_82598");
|
||||
|
||||
if (hw->mac.msix_vectors_from_pcie) {
|
||||
msix_count = IXGBE_READ_PCIE_WORD(hw,
|
||||
IXGBE_PCIE_MSIX_82598_CAPS);
|
||||
@ -108,6 +155,8 @@ s32 ixgbe_init_ops_82598(struct ixgbe_hw *hw)
|
||||
struct ixgbe_phy_info *phy = &hw->phy;
|
||||
s32 ret_val;
|
||||
|
||||
DEBUGFUNC("ixgbe_init_ops_82598");
|
||||
|
||||
ret_val = ixgbe_init_phy_ops_generic(hw);
|
||||
ret_val = ixgbe_init_ops_generic(hw);
|
||||
|
||||
@ -115,6 +164,8 @@ s32 ixgbe_init_ops_82598(struct ixgbe_hw *hw)
|
||||
phy->ops.init = &ixgbe_init_phy_ops_82598;
|
||||
|
||||
/* MAC */
|
||||
mac->ops.start_hw = &ixgbe_start_hw_82598;
|
||||
mac->ops.enable_relaxed_ordering = &ixgbe_enable_relaxed_ordering_82598;
|
||||
mac->ops.reset_hw = &ixgbe_reset_hw_82598;
|
||||
mac->ops.get_media_type = &ixgbe_get_media_type_82598;
|
||||
mac->ops.get_supported_physical_layer =
|
||||
@ -145,7 +196,6 @@ s32 ixgbe_init_ops_82598(struct ixgbe_hw *hw)
|
||||
/* Link */
|
||||
mac->ops.check_link = &ixgbe_check_mac_link_82598;
|
||||
mac->ops.setup_link = &ixgbe_setup_mac_link_82598;
|
||||
mac->ops.setup_link_speed = &ixgbe_setup_mac_link_speed_82598;
|
||||
mac->ops.get_link_capabilities =
|
||||
&ixgbe_get_link_capabilities_82598;
|
||||
|
||||
@ -168,6 +218,7 @@ s32 ixgbe_init_phy_ops_82598(struct ixgbe_hw *hw)
|
||||
s32 ret_val = IXGBE_SUCCESS;
|
||||
u16 list_offset, data_offset;
|
||||
|
||||
DEBUGFUNC("ixgbe_init_phy_ops_82598");
|
||||
|
||||
/* Identify the PHY */
|
||||
phy->ops.identify(hw);
|
||||
@ -175,21 +226,20 @@ s32 ixgbe_init_phy_ops_82598(struct ixgbe_hw *hw)
|
||||
/* Overwrite the link function pointers if copper PHY */
|
||||
if (mac->ops.get_media_type(hw) == ixgbe_media_type_copper) {
|
||||
mac->ops.setup_link = &ixgbe_setup_copper_link_82598;
|
||||
mac->ops.setup_link_speed =
|
||||
&ixgbe_setup_copper_link_speed_82598;
|
||||
mac->ops.get_link_capabilities =
|
||||
&ixgbe_get_copper_link_capabilities_generic;
|
||||
}
|
||||
|
||||
switch (hw->phy.type) {
|
||||
case ixgbe_phy_tn:
|
||||
phy->ops.setup_link = &ixgbe_setup_phy_link_tnx;
|
||||
phy->ops.check_link = &ixgbe_check_phy_link_tnx;
|
||||
phy->ops.get_firmware_version =
|
||||
&ixgbe_get_phy_firmware_version_tnx;
|
||||
break;
|
||||
case ixgbe_phy_aq:
|
||||
phy->ops.get_firmware_version =
|
||||
&ixgbe_get_phy_firmware_version_aq;
|
||||
&ixgbe_get_phy_firmware_version_generic;
|
||||
break;
|
||||
case ixgbe_phy_nl:
|
||||
phy->ops.reset = &ixgbe_reset_phy_nl;
|
||||
@ -220,6 +270,47 @@ out:
|
||||
return ret_val;
|
||||
}
|
||||
|
||||
/**
|
||||
* ixgbe_start_hw_82598 - Prepare hardware for Tx/Rx
|
||||
* @hw: pointer to hardware structure
|
||||
*
|
||||
* Starts the hardware using the generic start_hw function.
|
||||
* Disables relaxed ordering Then set pcie completion timeout
|
||||
*
|
||||
**/
|
||||
s32 ixgbe_start_hw_82598(struct ixgbe_hw *hw)
|
||||
{
|
||||
u32 regval;
|
||||
u32 i;
|
||||
s32 ret_val = IXGBE_SUCCESS;
|
||||
|
||||
DEBUGFUNC("ixgbe_start_hw_82598");
|
||||
|
||||
ret_val = ixgbe_start_hw_generic(hw);
|
||||
|
||||
/* Disable relaxed ordering */
|
||||
for (i = 0; ((i < hw->mac.max_tx_queues) &&
|
||||
(i < IXGBE_DCA_MAX_QUEUES_82598)); i++) {
|
||||
regval = IXGBE_READ_REG(hw, IXGBE_DCA_TXCTRL(i));
|
||||
regval &= ~IXGBE_DCA_TXCTRL_TX_WB_RO_EN;
|
||||
IXGBE_WRITE_REG(hw, IXGBE_DCA_TXCTRL(i), regval);
|
||||
}
|
||||
|
||||
for (i = 0; ((i < hw->mac.max_rx_queues) &&
|
||||
(i < IXGBE_DCA_MAX_QUEUES_82598)); i++) {
|
||||
regval = IXGBE_READ_REG(hw, IXGBE_DCA_RXCTRL(i));
|
||||
regval &= ~(IXGBE_DCA_RXCTRL_DESC_WRO_EN |
|
||||
IXGBE_DCA_RXCTRL_DESC_HSRO_EN);
|
||||
IXGBE_WRITE_REG(hw, IXGBE_DCA_RXCTRL(i), regval);
|
||||
}
|
||||
|
||||
/* set the completion timeout for interface */
|
||||
if (ret_val == IXGBE_SUCCESS)
|
||||
ixgbe_set_pcie_completion_timeout(hw);
|
||||
|
||||
return ret_val;
|
||||
}
|
||||
|
||||
/**
|
||||
* ixgbe_get_link_capabilities_82598 - Determines link capabilities
|
||||
* @hw: pointer to hardware structure
|
||||
@ -235,6 +326,8 @@ static s32 ixgbe_get_link_capabilities_82598(struct ixgbe_hw *hw,
|
||||
s32 status = IXGBE_SUCCESS;
|
||||
u32 autoc = 0;
|
||||
|
||||
DEBUGFUNC("ixgbe_get_link_capabilities_82598");
|
||||
|
||||
/*
|
||||
* Determine link capabilities based on the stored value of AUTOC,
|
||||
* which represents EEPROM defaults. If AUTOC value has not been
|
||||
@ -289,6 +382,8 @@ static enum ixgbe_media_type ixgbe_get_media_type_82598(struct ixgbe_hw *hw)
|
||||
{
|
||||
enum ixgbe_media_type media_type;
|
||||
|
||||
DEBUGFUNC("ixgbe_get_media_type_82598");
|
||||
|
||||
/* Detect if there is a copper PHY attached. */
|
||||
if (hw->phy.type == ixgbe_phy_cu_unknown ||
|
||||
hw->phy.type == ixgbe_phy_tn ||
|
||||
@ -306,15 +401,18 @@ static enum ixgbe_media_type ixgbe_get_media_type_82598(struct ixgbe_hw *hw)
|
||||
break;
|
||||
case IXGBE_DEV_ID_82598AF_DUAL_PORT:
|
||||
case IXGBE_DEV_ID_82598AF_SINGLE_PORT:
|
||||
case IXGBE_DEV_ID_82598EB_CX4:
|
||||
case IXGBE_DEV_ID_82598_CX4_DUAL_PORT:
|
||||
case IXGBE_DEV_ID_82598_DA_DUAL_PORT:
|
||||
case IXGBE_DEV_ID_82598_SR_DUAL_PORT_EM:
|
||||
case IXGBE_DEV_ID_82598EB_XF_LR:
|
||||
case IXGBE_DEV_ID_82598EB_SFP_LOM:
|
||||
media_type = ixgbe_media_type_fiber;
|
||||
break;
|
||||
case IXGBE_DEV_ID_82598EB_CX4:
|
||||
case IXGBE_DEV_ID_82598_CX4_DUAL_PORT:
|
||||
media_type = ixgbe_media_type_cx4;
|
||||
break;
|
||||
case IXGBE_DEV_ID_82598AT:
|
||||
case IXGBE_DEV_ID_82598AT2:
|
||||
media_type = ixgbe_media_type_copper;
|
||||
break;
|
||||
default:
|
||||
@ -338,9 +436,31 @@ s32 ixgbe_fc_enable_82598(struct ixgbe_hw *hw, s32 packetbuf_num)
|
||||
u32 fctrl_reg;
|
||||
u32 rmcs_reg;
|
||||
u32 reg;
|
||||
u32 link_speed = 0;
|
||||
bool link_up;
|
||||
|
||||
DEBUGFUNC("ixgbe_fc_enable_82598");
|
||||
|
||||
/*
|
||||
* On 82598 having Rx FC on causes resets while doing 1G
|
||||
* so if it's on turn it off once we know link_speed. For
|
||||
* more details see 82598 Specification update.
|
||||
*/
|
||||
hw->mac.ops.check_link(hw, &link_speed, &link_up, FALSE);
|
||||
if (link_up && link_speed == IXGBE_LINK_SPEED_1GB_FULL) {
|
||||
switch (hw->fc.requested_mode) {
|
||||
case ixgbe_fc_full:
|
||||
hw->fc.requested_mode = ixgbe_fc_tx_pause;
|
||||
break;
|
||||
case ixgbe_fc_rx_pause:
|
||||
hw->fc.requested_mode = ixgbe_fc_none;
|
||||
break;
|
||||
default:
|
||||
/* no change */
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Negotiate the fc mode to use */
|
||||
ret_val = ixgbe_fc_autoneg(hw);
|
||||
if (ret_val)
|
||||
@ -394,7 +514,7 @@ s32 ixgbe_fc_enable_82598(struct ixgbe_hw *hw, s32 packetbuf_num)
|
||||
break;
|
||||
default:
|
||||
DEBUGOUT("Flow control param set incorrectly\n");
|
||||
ret_val = -IXGBE_ERR_CONFIG;
|
||||
ret_val = IXGBE_ERR_CONFIG;
|
||||
goto out;
|
||||
break;
|
||||
}
|
||||
@ -433,26 +553,29 @@ out:
|
||||
}
|
||||
|
||||
/**
|
||||
* ixgbe_setup_mac_link_82598 - Configures MAC link settings
|
||||
* ixgbe_start_mac_link_82598 - Configures MAC link settings
|
||||
* @hw: pointer to hardware structure
|
||||
*
|
||||
* Configures link settings based on values in the ixgbe_hw struct.
|
||||
* Restarts the link. Performs autonegotiation if needed.
|
||||
**/
|
||||
static s32 ixgbe_setup_mac_link_82598(struct ixgbe_hw *hw)
|
||||
static s32 ixgbe_start_mac_link_82598(struct ixgbe_hw *hw,
|
||||
bool autoneg_wait_to_complete)
|
||||
{
|
||||
u32 autoc_reg;
|
||||
u32 links_reg;
|
||||
u32 i;
|
||||
s32 status = IXGBE_SUCCESS;
|
||||
|
||||
DEBUGFUNC("ixgbe_start_mac_link_82598");
|
||||
|
||||
/* Restart link */
|
||||
autoc_reg = IXGBE_READ_REG(hw, IXGBE_AUTOC);
|
||||
autoc_reg |= IXGBE_AUTOC_AN_RESTART;
|
||||
IXGBE_WRITE_REG(hw, IXGBE_AUTOC, autoc_reg);
|
||||
|
||||
/* Only poll for autoneg to complete if specified to do so */
|
||||
if (hw->phy.autoneg_wait_to_complete) {
|
||||
if (autoneg_wait_to_complete) {
|
||||
if ((autoc_reg & IXGBE_AUTOC_LMS_MASK) ==
|
||||
IXGBE_AUTOC_LMS_KX4_AN ||
|
||||
(autoc_reg & IXGBE_AUTOC_LMS_MASK) ==
|
||||
@ -494,6 +617,8 @@ static s32 ixgbe_check_mac_link_82598(struct ixgbe_hw *hw,
|
||||
u32 i;
|
||||
u16 link_reg, adapt_comp_reg;
|
||||
|
||||
DEBUGFUNC("ixgbe_check_mac_link_82598");
|
||||
|
||||
/*
|
||||
* SERDES PHY requires us to read link status from undocumented
|
||||
* register 0xC79F. Bit 0 set indicates link is up/ready; clear
|
||||
@ -558,17 +683,22 @@ static s32 ixgbe_check_mac_link_82598(struct ixgbe_hw *hw,
|
||||
else
|
||||
*speed = IXGBE_LINK_SPEED_1GB_FULL;
|
||||
|
||||
if ((hw->device_id == IXGBE_DEV_ID_82598AT2) && (*link_up == TRUE) &&
|
||||
(ixgbe_validate_link_ready(hw) != IXGBE_SUCCESS))
|
||||
*link_up = FALSE;
|
||||
|
||||
/* if link is down, zero out the current_mode */
|
||||
if (*link_up == FALSE) {
|
||||
hw->fc.current_mode = ixgbe_fc_none;
|
||||
hw->fc.fc_was_autonegged = FALSE;
|
||||
}
|
||||
|
||||
out:
|
||||
return IXGBE_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* ixgbe_setup_mac_link_speed_82598 - Set MAC link speed
|
||||
* ixgbe_setup_mac_link_82598 - Set MAC link speed
|
||||
* @hw: pointer to hardware structure
|
||||
* @speed: new link speed
|
||||
* @autoneg: TRUE if autonegotiation enabled
|
||||
@ -576,7 +706,7 @@ out:
|
||||
*
|
||||
* Set the link speed in the AUTOC register and restarts link.
|
||||
**/
|
||||
static s32 ixgbe_setup_mac_link_speed_82598(struct ixgbe_hw *hw,
|
||||
static s32 ixgbe_setup_mac_link_82598(struct ixgbe_hw *hw,
|
||||
ixgbe_link_speed speed, bool autoneg,
|
||||
bool autoneg_wait_to_complete)
|
||||
{
|
||||
@ -586,6 +716,8 @@ static s32 ixgbe_setup_mac_link_speed_82598(struct ixgbe_hw *hw,
|
||||
u32 autoc = curr_autoc;
|
||||
u32 link_mode = autoc & IXGBE_AUTOC_LMS_MASK;
|
||||
|
||||
DEBUGFUNC("ixgbe_setup_mac_link_82598");
|
||||
|
||||
/* Check to see if speed passed in is supported. */
|
||||
ixgbe_get_link_capabilities(hw, &link_capabilities, &autoneg);
|
||||
speed &= link_capabilities;
|
||||
@ -606,14 +738,13 @@ static s32 ixgbe_setup_mac_link_speed_82598(struct ixgbe_hw *hw,
|
||||
}
|
||||
|
||||
if (status == IXGBE_SUCCESS) {
|
||||
hw->phy.autoneg_wait_to_complete = autoneg_wait_to_complete;
|
||||
|
||||
/*
|
||||
* Setup and restart the link based on the new values in
|
||||
* ixgbe_hw This will write the AUTOC register based on the new
|
||||
* stored values
|
||||
*/
|
||||
status = ixgbe_setup_mac_link_82598(hw);
|
||||
status = ixgbe_start_mac_link_82598(hw,
|
||||
autoneg_wait_to_complete);
|
||||
}
|
||||
|
||||
return status;
|
||||
@ -621,29 +752,7 @@ static s32 ixgbe_setup_mac_link_speed_82598(struct ixgbe_hw *hw,
|
||||
|
||||
|
||||
/**
|
||||
* ixgbe_setup_copper_link_82598 - Setup copper link settings
|
||||
* @hw: pointer to hardware structure
|
||||
*
|
||||
* Configures link settings based on values in the ixgbe_hw struct.
|
||||
* Restarts the link. Performs autonegotiation if needed. Restart
|
||||
* phy and wait for autonegotiate to finish. Then synchronize the
|
||||
* MAC and PHY.
|
||||
**/
|
||||
static s32 ixgbe_setup_copper_link_82598(struct ixgbe_hw *hw)
|
||||
{
|
||||
s32 status;
|
||||
|
||||
/* Restart autonegotiation on PHY */
|
||||
status = hw->phy.ops.setup_link(hw);
|
||||
|
||||
/* Set up MAC */
|
||||
ixgbe_setup_mac_link_82598(hw);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
* ixgbe_setup_copper_link_speed_82598 - Set the PHY autoneg advertised field
|
||||
* ixgbe_setup_copper_link_82598 - Set the PHY autoneg advertised field
|
||||
* @hw: pointer to hardware structure
|
||||
* @speed: new link speed
|
||||
* @autoneg: TRUE if autonegotiation enabled
|
||||
@ -651,18 +760,20 @@ static s32 ixgbe_setup_copper_link_82598(struct ixgbe_hw *hw)
|
||||
*
|
||||
* Sets the link speed in the AUTOC register in the MAC and restarts link.
|
||||
**/
|
||||
static s32 ixgbe_setup_copper_link_speed_82598(struct ixgbe_hw *hw,
|
||||
static s32 ixgbe_setup_copper_link_82598(struct ixgbe_hw *hw,
|
||||
ixgbe_link_speed speed,
|
||||
bool autoneg,
|
||||
bool autoneg_wait_to_complete)
|
||||
{
|
||||
s32 status;
|
||||
|
||||
DEBUGFUNC("ixgbe_setup_copper_link_82598");
|
||||
|
||||
/* Setup the PHY according to input speed */
|
||||
status = hw->phy.ops.setup_link_speed(hw, speed, autoneg,
|
||||
autoneg_wait_to_complete);
|
||||
/* Set up MAC */
|
||||
ixgbe_setup_mac_link_82598(hw);
|
||||
ixgbe_start_mac_link_82598(hw, autoneg_wait_to_complete);
|
||||
|
||||
return status;
|
||||
}
|
||||
@ -685,6 +796,8 @@ static s32 ixgbe_reset_hw_82598(struct ixgbe_hw *hw)
|
||||
u32 autoc;
|
||||
u8 analog_val;
|
||||
|
||||
DEBUGFUNC("ixgbe_reset_hw_82598");
|
||||
|
||||
/* Call adapter stop to disable tx/rx and clear interrupts */
|
||||
hw->mac.ops.stop_adapter(hw);
|
||||
|
||||
@ -740,12 +853,9 @@ no_phy_reset:
|
||||
* Prevent the PCI-E bus from from hanging by disabling PCI-E master
|
||||
* access and verify no pending requests before reset
|
||||
*/
|
||||
status = ixgbe_disable_pcie_master(hw);
|
||||
if (status != IXGBE_SUCCESS) {
|
||||
status = IXGBE_ERR_MASTER_REQUESTS_PENDING;
|
||||
DEBUGOUT("PCI-E Master disable polling has failed.\n");
|
||||
}
|
||||
ixgbe_disable_pcie_master(hw);
|
||||
|
||||
mac_reset_top:
|
||||
/*
|
||||
* Issue global reset to the MAC. This needs to be a SW reset.
|
||||
* If link reset is used, it might reset the MAC when mng is using it
|
||||
@ -766,6 +876,19 @@ no_phy_reset:
|
||||
DEBUGOUT("Reset polling failed to complete.\n");
|
||||
}
|
||||
|
||||
/*
|
||||
* Double resets are required for recovery from certain error
|
||||
* conditions. Between resets, it is necessary to stall to allow time
|
||||
* for any pending HW events to complete. We use 1usec since that is
|
||||
* what is needed for ixgbe_disable_pcie_master(). The second reset
|
||||
* then clears out any effects of those events.
|
||||
*/
|
||||
if (hw->mac.flags & IXGBE_FLAGS_DOUBLE_RESET_REQUIRED) {
|
||||
hw->mac.flags &= ~IXGBE_FLAGS_DOUBLE_RESET_REQUIRED;
|
||||
usec_delay(1);
|
||||
goto mac_reset_top;
|
||||
}
|
||||
|
||||
msec_delay(50);
|
||||
|
||||
gheccr = IXGBE_READ_REG(hw, IXGBE_GHECCR);
|
||||
@ -811,6 +934,8 @@ s32 ixgbe_set_vmdq_82598(struct ixgbe_hw *hw, u32 rar, u32 vmdq)
|
||||
{
|
||||
u32 rar_high;
|
||||
|
||||
DEBUGFUNC("ixgbe_set_vmdq_82598");
|
||||
|
||||
rar_high = IXGBE_READ_REG(hw, IXGBE_RAH(rar));
|
||||
rar_high &= ~IXGBE_RAH_VIND_MASK;
|
||||
rar_high |= ((vmdq << IXGBE_RAH_VIND_SHIFT) & IXGBE_RAH_VIND_MASK);
|
||||
@ -861,6 +986,8 @@ s32 ixgbe_set_vfta_82598(struct ixgbe_hw *hw, u32 vlan, u32 vind,
|
||||
u32 bits;
|
||||
u32 vftabyte;
|
||||
|
||||
DEBUGFUNC("ixgbe_set_vfta_82598");
|
||||
|
||||
if (vlan > 4095)
|
||||
return IXGBE_ERR_PARAM;
|
||||
|
||||
@ -903,6 +1030,8 @@ static s32 ixgbe_clear_vfta_82598(struct ixgbe_hw *hw)
|
||||
u32 offset;
|
||||
u32 vlanbyte;
|
||||
|
||||
DEBUGFUNC("ixgbe_clear_vfta_82598");
|
||||
|
||||
for (offset = 0; offset < hw->mac.vft_size; offset++)
|
||||
IXGBE_WRITE_REG(hw, IXGBE_VFTA(offset), 0);
|
||||
|
||||
@ -926,6 +1055,8 @@ s32 ixgbe_read_analog_reg8_82598(struct ixgbe_hw *hw, u32 reg, u8 *val)
|
||||
{
|
||||
u32 atlas_ctl;
|
||||
|
||||
DEBUGFUNC("ixgbe_read_analog_reg8_82598");
|
||||
|
||||
IXGBE_WRITE_REG(hw, IXGBE_ATLASCTL,
|
||||
IXGBE_ATLASCTL_WRITE_CMD | (reg << 8));
|
||||
IXGBE_WRITE_FLUSH(hw);
|
||||
@ -948,6 +1079,8 @@ s32 ixgbe_write_analog_reg8_82598(struct ixgbe_hw *hw, u32 reg, u8 val)
|
||||
{
|
||||
u32 atlas_ctl;
|
||||
|
||||
DEBUGFUNC("ixgbe_write_analog_reg8_82598");
|
||||
|
||||
atlas_ctl = (reg << 8) | val;
|
||||
IXGBE_WRITE_REG(hw, IXGBE_ATLASCTL, atlas_ctl);
|
||||
IXGBE_WRITE_FLUSH(hw);
|
||||
@ -973,6 +1106,8 @@ s32 ixgbe_read_i2c_eeprom_82598(struct ixgbe_hw *hw, u8 byte_offset,
|
||||
u16 sfp_stat = 0;
|
||||
u32 i;
|
||||
|
||||
DEBUGFUNC("ixgbe_read_i2c_eeprom_82598");
|
||||
|
||||
if (hw->phy.type == ixgbe_phy_nl) {
|
||||
/*
|
||||
* NetLogic phy SDA/SCL registers are at addresses 0xC30A to
|
||||
@ -1032,6 +1167,8 @@ u32 ixgbe_get_supported_physical_layer_82598(struct ixgbe_hw *hw)
|
||||
u32 pma_pmd_1g = autoc & IXGBE_AUTOC_1G_PMA_PMD_MASK;
|
||||
u16 ext_ability = 0;
|
||||
|
||||
DEBUGFUNC("ixgbe_get_supported_physical_layer_82598");
|
||||
|
||||
hw->phy.ops.identify(hw);
|
||||
|
||||
/* Copper PHY must be checked before AUTOC LMS to determine correct
|
||||
@ -1128,6 +1265,8 @@ void ixgbe_set_lan_id_multi_port_pcie_82598(struct ixgbe_hw *hw)
|
||||
struct ixgbe_bus_info *bus = &hw->bus;
|
||||
u16 pci_gen, pci_ctrl2;
|
||||
|
||||
DEBUGFUNC("ixgbe_set_lan_id_multi_port_pcie_82598");
|
||||
|
||||
ixgbe_set_lan_id_multi_port_pcie(hw);
|
||||
|
||||
/* check if LAN0 is disabled */
|
||||
@ -1146,4 +1285,67 @@ void ixgbe_set_lan_id_multi_port_pcie_82598(struct ixgbe_hw *hw)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* ixgbe_validate_link_ready - Function looks for phy link
|
||||
* @hw: pointer to hardware structure
|
||||
*
|
||||
* Function indicates success when phy link is available. If phy is not ready
|
||||
* within 5 seconds of MAC indicating link, the function returns error.
|
||||
**/
|
||||
static s32 ixgbe_validate_link_ready(struct ixgbe_hw *hw)
|
||||
{
|
||||
u32 timeout;
|
||||
u16 an_reg;
|
||||
|
||||
if (hw->device_id != IXGBE_DEV_ID_82598AT2)
|
||||
return IXGBE_SUCCESS;
|
||||
|
||||
for (timeout = 0;
|
||||
timeout < IXGBE_VALIDATE_LINK_READY_TIMEOUT; timeout++) {
|
||||
hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_STATUS,
|
||||
IXGBE_MDIO_AUTO_NEG_DEV_TYPE, &an_reg);
|
||||
|
||||
if ((an_reg & IXGBE_MII_AUTONEG_COMPLETE) &&
|
||||
(an_reg & IXGBE_MII_AUTONEG_LINK_UP))
|
||||
break;
|
||||
|
||||
msec_delay(100);
|
||||
}
|
||||
|
||||
if (timeout == IXGBE_VALIDATE_LINK_READY_TIMEOUT) {
|
||||
DEBUGOUT("Link was indicated but link is down\n");
|
||||
return IXGBE_ERR_LINK_SETUP;
|
||||
}
|
||||
|
||||
return IXGBE_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* ixgbe_enable_relaxed_ordering_82598 - enable relaxed ordering
|
||||
* @hw: pointer to hardware structure
|
||||
*
|
||||
**/
|
||||
void ixgbe_enable_relaxed_ordering_82598(struct ixgbe_hw *hw)
|
||||
{
|
||||
u32 regval;
|
||||
u32 i;
|
||||
|
||||
DEBUGFUNC("ixgbe_enable_relaxed_ordering_82598");
|
||||
|
||||
/* Enable relaxed ordering */
|
||||
for (i = 0; ((i < hw->mac.max_tx_queues) &&
|
||||
(i < IXGBE_DCA_MAX_QUEUES_82598)); i++) {
|
||||
regval = IXGBE_READ_REG(hw, IXGBE_DCA_TXCTRL(i));
|
||||
regval |= IXGBE_DCA_TXCTRL_TX_WB_RO_EN;
|
||||
IXGBE_WRITE_REG(hw, IXGBE_DCA_TXCTRL(i), regval);
|
||||
}
|
||||
|
||||
for (i = 0; ((i < hw->mac.max_rx_queues) &&
|
||||
(i < IXGBE_DCA_MAX_QUEUES_82598)); i++) {
|
||||
regval = IXGBE_READ_REG(hw, IXGBE_DCA_RXCTRL(i));
|
||||
regval |= (IXGBE_DCA_RXCTRL_DESC_WRO_EN |
|
||||
IXGBE_DCA_RXCTRL_DESC_HSRO_EN);
|
||||
IXGBE_WRITE_REG(hw, IXGBE_DCA_RXCTRL(i), regval);
|
||||
}
|
||||
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,6 +1,6 @@
|
||||
/******************************************************************************
|
||||
|
||||
Copyright (c) 2001-2009, Intel Corporation
|
||||
Copyright (c) 2001-2010, Intel Corporation
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
@ -54,6 +54,8 @@ s32 ixgbe_init_shared_code(struct ixgbe_hw *hw)
|
||||
{
|
||||
s32 status;
|
||||
|
||||
DEBUGFUNC("ixgbe_init_shared_code");
|
||||
|
||||
/*
|
||||
* Set the mac type
|
||||
*/
|
||||
@ -94,6 +96,7 @@ s32 ixgbe_set_mac_type(struct ixgbe_hw *hw)
|
||||
case IXGBE_DEV_ID_82598AF_SINGLE_PORT:
|
||||
case IXGBE_DEV_ID_82598AF_DUAL_PORT:
|
||||
case IXGBE_DEV_ID_82598AT:
|
||||
case IXGBE_DEV_ID_82598AT2:
|
||||
case IXGBE_DEV_ID_82598EB_CX4:
|
||||
case IXGBE_DEV_ID_82598_CX4_DUAL_PORT:
|
||||
case IXGBE_DEV_ID_82598_DA_DUAL_PORT:
|
||||
@ -103,9 +106,12 @@ s32 ixgbe_set_mac_type(struct ixgbe_hw *hw)
|
||||
hw->mac.type = ixgbe_mac_82598EB;
|
||||
break;
|
||||
case IXGBE_DEV_ID_82599_KX4:
|
||||
case IXGBE_DEV_ID_82599_KX4_MEZZ:
|
||||
case IXGBE_DEV_ID_82599_XAUI_LOM:
|
||||
case IXGBE_DEV_ID_82599_COMBO_BACKPLANE:
|
||||
case IXGBE_DEV_ID_82599_SFP:
|
||||
case IXGBE_DEV_ID_82599_CX4:
|
||||
case IXGBE_DEV_ID_82599_T3_LOM:
|
||||
hw->mac.type = ixgbe_mac_82599EB;
|
||||
break;
|
||||
default:
|
||||
@ -162,6 +168,20 @@ s32 ixgbe_start_hw(struct ixgbe_hw *hw)
|
||||
IXGBE_NOT_IMPLEMENTED);
|
||||
}
|
||||
|
||||
/**
|
||||
* ixgbe_enable_relaxed_ordering - Enables tx relaxed ordering,
|
||||
* which is disabled by default in ixgbe_start_hw();
|
||||
*
|
||||
* @hw: pointer to hardware structure
|
||||
*
|
||||
* Enable relaxed ordering;
|
||||
**/
|
||||
void ixgbe_enable_relaxed_ordering(struct ixgbe_hw *hw)
|
||||
{
|
||||
if (hw->mac.ops.enable_relaxed_ordering)
|
||||
hw->mac.ops.enable_relaxed_ordering(hw);
|
||||
}
|
||||
|
||||
/**
|
||||
* ixgbe_clear_hw_cntrs - Clear hardware counters
|
||||
* @hw: pointer to hardware structure
|
||||
@ -243,6 +263,23 @@ s32 ixgbe_get_device_caps(struct ixgbe_hw *hw, u16 *device_caps)
|
||||
(hw, device_caps), IXGBE_NOT_IMPLEMENTED);
|
||||
}
|
||||
|
||||
/**
|
||||
* ixgbe_get_wwn_prefix - Get alternative WWNN/WWPN prefix from the EEPROM
|
||||
* @hw: pointer to hardware structure
|
||||
* @wwnn_prefix: the alternative WWNN prefix
|
||||
* @wwpn_prefix: the alternative WWPN prefix
|
||||
*
|
||||
* This function will read the EEPROM from the alternative SAN MAC address
|
||||
* block to check the support for the alternative WWNN/WWPN prefix support.
|
||||
**/
|
||||
s32 ixgbe_get_wwn_prefix(struct ixgbe_hw *hw, u16 *wwnn_prefix,
|
||||
u16 *wwpn_prefix)
|
||||
{
|
||||
return ixgbe_call_func(hw, hw->mac.ops.get_wwn_prefix,
|
||||
(hw, wwnn_prefix, wwpn_prefix),
|
||||
IXGBE_NOT_IMPLEMENTED);
|
||||
}
|
||||
|
||||
/**
|
||||
* ixgbe_get_bus_info - Set PCI bus info
|
||||
* @hw: pointer to hardware structure
|
||||
@ -438,19 +475,6 @@ s32 ixgbe_setup_phy_link_speed(struct ixgbe_hw *hw, ixgbe_link_speed speed,
|
||||
IXGBE_NOT_IMPLEMENTED);
|
||||
}
|
||||
|
||||
/**
|
||||
* ixgbe_setup_link - Configure link settings
|
||||
* @hw: pointer to hardware structure
|
||||
*
|
||||
* Configures link settings based on values in the ixgbe_hw struct.
|
||||
* Restarts the link. Performs autonegotiation if needed.
|
||||
**/
|
||||
s32 ixgbe_setup_link(struct ixgbe_hw *hw)
|
||||
{
|
||||
return ixgbe_call_func(hw, hw->mac.ops.setup_link, (hw),
|
||||
IXGBE_NOT_IMPLEMENTED);
|
||||
}
|
||||
|
||||
/**
|
||||
* ixgbe_check_link - Get link and speed status
|
||||
* @hw: pointer to hardware structure
|
||||
@ -466,18 +490,19 @@ s32 ixgbe_check_link(struct ixgbe_hw *hw, ixgbe_link_speed *speed,
|
||||
}
|
||||
|
||||
/**
|
||||
* ixgbe_setup_link_speed - Set link speed
|
||||
* ixgbe_setup_link - Set link speed
|
||||
* @hw: pointer to hardware structure
|
||||
* @speed: new link speed
|
||||
* @autoneg: TRUE if autonegotiation enabled
|
||||
*
|
||||
* Set the link speed and restarts the link.
|
||||
* Configures link settings. Restarts the link.
|
||||
* Performs autonegotiation if needed.
|
||||
**/
|
||||
s32 ixgbe_setup_link_speed(struct ixgbe_hw *hw, ixgbe_link_speed speed,
|
||||
s32 ixgbe_setup_link(struct ixgbe_hw *hw, ixgbe_link_speed speed,
|
||||
bool autoneg,
|
||||
bool autoneg_wait_to_complete)
|
||||
{
|
||||
return ixgbe_call_func(hw, hw->mac.ops.setup_link_speed, (hw, speed,
|
||||
return ixgbe_call_func(hw, hw->mac.ops.setup_link, (hw, speed,
|
||||
autoneg, autoneg_wait_to_complete),
|
||||
IXGBE_NOT_IMPLEMENTED);
|
||||
}
|
||||
|
@ -1,6 +1,6 @@
|
||||
/******************************************************************************
|
||||
|
||||
Copyright (c) 2001-2009, Intel Corporation
|
||||
Copyright (c) 2001-2010, Intel Corporation
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
@ -43,6 +43,7 @@ s32 ixgbe_set_mac_type(struct ixgbe_hw *hw);
|
||||
s32 ixgbe_init_hw(struct ixgbe_hw *hw);
|
||||
s32 ixgbe_reset_hw(struct ixgbe_hw *hw);
|
||||
s32 ixgbe_start_hw(struct ixgbe_hw *hw);
|
||||
void ixgbe_enable_relaxed_ordering(struct ixgbe_hw *hw);
|
||||
s32 ixgbe_clear_hw_cntrs(struct ixgbe_hw *hw);
|
||||
enum ixgbe_media_type ixgbe_get_media_type(struct ixgbe_hw *hw);
|
||||
s32 ixgbe_get_mac_addr(struct ixgbe_hw *hw, u8 *mac_addr);
|
||||
@ -67,8 +68,7 @@ s32 ixgbe_setup_phy_link_speed(struct ixgbe_hw *hw,
|
||||
ixgbe_link_speed speed,
|
||||
bool autoneg,
|
||||
bool autoneg_wait_to_complete);
|
||||
s32 ixgbe_setup_link(struct ixgbe_hw *hw);
|
||||
s32 ixgbe_setup_link_speed(struct ixgbe_hw *hw, ixgbe_link_speed speed,
|
||||
s32 ixgbe_setup_link(struct ixgbe_hw *hw, ixgbe_link_speed speed,
|
||||
bool autoneg, bool autoneg_wait_to_complete);
|
||||
s32 ixgbe_check_link(struct ixgbe_hw *hw, ixgbe_link_speed *speed,
|
||||
bool *link_up, bool link_up_wait_to_complete);
|
||||
@ -97,6 +97,7 @@ s32 ixgbe_update_uc_addr_list(struct ixgbe_hw *hw, u8 *addr_list,
|
||||
u32 addr_count, ixgbe_mc_addr_itr func);
|
||||
s32 ixgbe_update_mc_addr_list(struct ixgbe_hw *hw, u8 *mc_addr_list,
|
||||
u32 mc_addr_count, ixgbe_mc_addr_itr func);
|
||||
void ixgbe_add_uc_addr(struct ixgbe_hw *hw, u8 *addr_list, u32 vmdq);
|
||||
s32 ixgbe_enable_mc(struct ixgbe_hw *hw);
|
||||
s32 ixgbe_disable_mc(struct ixgbe_hw *hw);
|
||||
s32 ixgbe_clear_vfta(struct ixgbe_hw *hw);
|
||||
@ -122,6 +123,7 @@ s32 ixgbe_fdir_add_signature_filter_82599(struct ixgbe_hw *hw,
|
||||
u8 queue);
|
||||
s32 ixgbe_fdir_add_perfect_filter_82599(struct ixgbe_hw *hw,
|
||||
struct ixgbe_atr_input *input,
|
||||
struct ixgbe_atr_input_masks *masks,
|
||||
u16 soft_id,
|
||||
u8 queue);
|
||||
u16 ixgbe_atr_compute_hash_82599(struct ixgbe_atr_input *input, u32 key);
|
||||
@ -164,6 +166,8 @@ s32 ixgbe_set_san_mac_addr(struct ixgbe_hw *hw, u8 *san_mac_addr);
|
||||
s32 ixgbe_get_device_caps(struct ixgbe_hw *hw, u16 *device_caps);
|
||||
s32 ixgbe_acquire_swfw_semaphore(struct ixgbe_hw *hw, u16 mask);
|
||||
void ixgbe_release_swfw_semaphore(struct ixgbe_hw *hw, u16 mask);
|
||||
s32 ixgbe_get_wwn_prefix(struct ixgbe_hw *hw, u16 *wwnn_prefix,
|
||||
u16 *wwpn_prefix);
|
||||
|
||||
|
||||
#endif /* _IXGBE_API_H_ */
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -42,6 +42,8 @@
|
||||
IXGBE_WRITE_REG(hw, reg + 4, (u32) (value >> 32)); \
|
||||
} while (0)
|
||||
|
||||
u32 ixgbe_get_pcie_msix_count_generic(struct ixgbe_hw *hw);
|
||||
|
||||
s32 ixgbe_init_ops_generic(struct ixgbe_hw *hw);
|
||||
s32 ixgbe_init_hw_generic(struct ixgbe_hw *hw);
|
||||
s32 ixgbe_start_hw_generic(struct ixgbe_hw *hw);
|
||||
@ -57,12 +59,14 @@ s32 ixgbe_led_off_generic(struct ixgbe_hw *hw, u32 index);
|
||||
|
||||
s32 ixgbe_init_eeprom_params_generic(struct ixgbe_hw *hw);
|
||||
s32 ixgbe_write_eeprom_generic(struct ixgbe_hw *hw, u16 offset, u16 data);
|
||||
s32 ixgbe_read_eeprom_generic(struct ixgbe_hw *hw, u16 offset, u16 *data);
|
||||
s32 ixgbe_read_eerd_generic(struct ixgbe_hw *hw, u16 offset, u16 *data);
|
||||
s32 ixgbe_read_eeprom_bit_bang_generic(struct ixgbe_hw *hw, u16 offset,
|
||||
u16 *data);
|
||||
u16 ixgbe_calc_eeprom_checksum_generic(struct ixgbe_hw *hw);
|
||||
s32 ixgbe_validate_eeprom_checksum_generic(struct ixgbe_hw *hw,
|
||||
u16 *checksum_val);
|
||||
s32 ixgbe_update_eeprom_checksum_generic(struct ixgbe_hw *hw);
|
||||
s32 ixgbe_poll_eerd_eewr_done(struct ixgbe_hw *hw, u32 ee_reg);
|
||||
|
||||
s32 ixgbe_set_rar_generic(struct ixgbe_hw *hw, u32 index, u8 *addr, u32 vmdq,
|
||||
u32 enable_addr);
|
||||
@ -73,7 +77,6 @@ s32 ixgbe_update_mc_addr_list_generic(struct ixgbe_hw *hw, u8 *mc_addr_list,
|
||||
ixgbe_mc_addr_itr func);
|
||||
s32 ixgbe_update_uc_addr_list_generic(struct ixgbe_hw *hw, u8 *addr_list,
|
||||
u32 addr_count, ixgbe_mc_addr_itr func);
|
||||
void ixgbe_add_uc_addr(struct ixgbe_hw *hw, u8 *addr, u32 vmdq);
|
||||
s32 ixgbe_enable_mc_generic(struct ixgbe_hw *hw);
|
||||
s32 ixgbe_disable_mc_generic(struct ixgbe_hw *hw);
|
||||
s32 ixgbe_enable_rx_dma_generic(struct ixgbe_hw *hw, u32 regval);
|
||||
@ -87,9 +90,25 @@ s32 ixgbe_acquire_swfw_sync(struct ixgbe_hw *hw, u16 mask);
|
||||
void ixgbe_release_swfw_sync(struct ixgbe_hw *hw, u16 mask);
|
||||
s32 ixgbe_disable_pcie_master(struct ixgbe_hw *hw);
|
||||
|
||||
s32 ixgbe_read_analog_reg8_generic(struct ixgbe_hw *hw, u32 reg, u8 *val);
|
||||
s32 ixgbe_write_analog_reg8_generic(struct ixgbe_hw *hw, u32 reg, u8 val);
|
||||
s32 ixgbe_blink_led_start_generic(struct ixgbe_hw *hw, u32 index);
|
||||
s32 ixgbe_blink_led_stop_generic(struct ixgbe_hw *hw, u32 index);
|
||||
|
||||
s32 ixgbe_get_san_mac_addr_generic(struct ixgbe_hw *hw, u8 *san_mac_addr);
|
||||
s32 ixgbe_set_san_mac_addr_generic(struct ixgbe_hw *hw, u8 *san_mac_addr);
|
||||
|
||||
s32 ixgbe_set_vmdq_generic(struct ixgbe_hw *hw, u32 rar, u32 vmdq);
|
||||
s32 ixgbe_clear_vmdq_generic(struct ixgbe_hw *hw, u32 rar, u32 vmdq);
|
||||
s32 ixgbe_insert_mac_addr_generic(struct ixgbe_hw *hw, u8 *addr, u32 vmdq);
|
||||
s32 ixgbe_init_uta_tables_generic(struct ixgbe_hw *hw);
|
||||
s32 ixgbe_set_vfta_generic(struct ixgbe_hw *hw, u32 vlan,
|
||||
u32 vind, bool vlan_on);
|
||||
s32 ixgbe_clear_vfta_generic(struct ixgbe_hw *hw);
|
||||
|
||||
s32 ixgbe_check_mac_link_generic(struct ixgbe_hw *hw,
|
||||
ixgbe_link_speed *speed,
|
||||
bool *link_up, bool link_up_wait_to_complete);
|
||||
|
||||
s32 ixgbe_get_wwn_prefix_generic(struct ixgbe_hw *hw, u16 *wwnn_prefix,
|
||||
u16 *wwpn_prefix);
|
||||
|
||||
#endif /* IXGBE_COMMON */
|
||||
|
@ -110,6 +110,16 @@ typedef boolean_t bool;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(__i386__) || defined(__amd64__)
|
||||
static __inline
|
||||
void prefetch(void *x)
|
||||
{
|
||||
__asm volatile("prefetcht0 %0" :: "m" (*(unsigned long *)x));
|
||||
}
|
||||
#else
|
||||
#define prefetch(x)
|
||||
#endif
|
||||
|
||||
struct ixgbe_osdep
|
||||
{
|
||||
bus_space_tag_t mem_bus_space_tag;
|
||||
|
@ -1,6 +1,6 @@
|
||||
/******************************************************************************
|
||||
|
||||
Copyright (c) 2001-2009, Intel Corporation
|
||||
Copyright (c) 2001-2010, Intel Corporation
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
@ -59,6 +59,8 @@ s32 ixgbe_init_phy_ops_generic(struct ixgbe_hw *hw)
|
||||
{
|
||||
struct ixgbe_phy_info *phy = &hw->phy;
|
||||
|
||||
DEBUGFUNC("ixgbe_init_phy_ops_generic");
|
||||
|
||||
/* PHY */
|
||||
phy->ops.identify = &ixgbe_identify_phy_generic;
|
||||
phy->ops.reset = &ixgbe_reset_phy_generic;
|
||||
@ -67,7 +69,7 @@ s32 ixgbe_init_phy_ops_generic(struct ixgbe_hw *hw)
|
||||
phy->ops.setup_link = &ixgbe_setup_phy_link_generic;
|
||||
phy->ops.setup_link_speed = &ixgbe_setup_phy_link_speed_generic;
|
||||
phy->ops.check_link = NULL;
|
||||
phy->ops.get_firmware_version = NULL;
|
||||
phy->ops.get_firmware_version = ixgbe_get_phy_firmware_version_generic;
|
||||
phy->ops.read_i2c_byte = &ixgbe_read_i2c_byte_generic;
|
||||
phy->ops.write_i2c_byte = &ixgbe_write_i2c_byte_generic;
|
||||
phy->ops.read_i2c_eeprom = &ixgbe_read_i2c_eeprom_generic;
|
||||
@ -75,7 +77,8 @@ s32 ixgbe_init_phy_ops_generic(struct ixgbe_hw *hw)
|
||||
phy->ops.i2c_bus_clear = &ixgbe_i2c_bus_clear;
|
||||
phy->ops.identify_sfp = &ixgbe_identify_sfp_module_generic;
|
||||
phy->sfp_type = ixgbe_sfp_type_unknown;
|
||||
|
||||
phy->ops.check_overtemp = &ixgbe_tn_check_overtemp;
|
||||
phy->ops.set_low_power_state = &ixgbe_tn_set_low_power_state;
|
||||
return IXGBE_SUCCESS;
|
||||
}
|
||||
|
||||
@ -91,6 +94,8 @@ s32 ixgbe_identify_phy_generic(struct ixgbe_hw *hw)
|
||||
u32 phy_addr;
|
||||
u16 ext_ability = 0;
|
||||
|
||||
DEBUGFUNC("ixgbe_identify_phy_generic");
|
||||
|
||||
if (hw->phy.type == ixgbe_phy_unknown) {
|
||||
for (phy_addr = 0; phy_addr < IXGBE_MAX_PHY_ADDR; phy_addr++) {
|
||||
if (ixgbe_validate_phy_addr(hw, phy_addr)) {
|
||||
@ -138,6 +143,8 @@ bool ixgbe_validate_phy_addr(struct ixgbe_hw *hw, u32 phy_addr)
|
||||
u16 phy_id = 0;
|
||||
bool valid = FALSE;
|
||||
|
||||
DEBUGFUNC("ixgbe_validate_phy_addr");
|
||||
|
||||
hw->phy.addr = phy_addr;
|
||||
hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_ID_HIGH,
|
||||
IXGBE_MDIO_PMA_PMD_DEV_TYPE, &phy_id);
|
||||
@ -159,6 +166,8 @@ s32 ixgbe_get_phy_id(struct ixgbe_hw *hw)
|
||||
u16 phy_id_high = 0;
|
||||
u16 phy_id_low = 0;
|
||||
|
||||
DEBUGFUNC("ixgbe_get_phy_id");
|
||||
|
||||
status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_ID_HIGH,
|
||||
IXGBE_MDIO_PMA_PMD_DEV_TYPE,
|
||||
&phy_id_high);
|
||||
@ -183,6 +192,8 @@ enum ixgbe_phy_type ixgbe_get_phy_type_from_id(u32 phy_id)
|
||||
{
|
||||
enum ixgbe_phy_type phy_type;
|
||||
|
||||
DEBUGFUNC("ixgbe_get_phy_type_from_id");
|
||||
|
||||
switch (phy_id) {
|
||||
case TN1010_PHY_ID:
|
||||
phy_type = ixgbe_phy_tn;
|
||||
@ -215,6 +226,8 @@ s32 ixgbe_reset_phy_generic(struct ixgbe_hw *hw)
|
||||
u16 ctrl = 0;
|
||||
s32 status = IXGBE_SUCCESS;
|
||||
|
||||
DEBUGFUNC("ixgbe_reset_phy_generic");
|
||||
|
||||
if (hw->phy.type == ixgbe_phy_unknown)
|
||||
status = ixgbe_identify_phy_generic(hw);
|
||||
|
||||
@ -229,13 +242,19 @@ s32 ixgbe_reset_phy_generic(struct ixgbe_hw *hw)
|
||||
IXGBE_MDIO_PHY_XS_DEV_TYPE,
|
||||
IXGBE_MDIO_PHY_XS_RESET);
|
||||
|
||||
/* Poll for reset bit to self-clear indicating reset is complete */
|
||||
for (i = 0; i < 500; i++) {
|
||||
msec_delay(1);
|
||||
/*
|
||||
* Poll for reset bit to self-clear indicating reset is complete.
|
||||
* Some PHYs could take up to 3 seconds to complete and need about
|
||||
* 1.7 usec delay after the reset is complete.
|
||||
*/
|
||||
for (i = 0; i < 30; i++) {
|
||||
msec_delay(100);
|
||||
hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_XS_CONTROL,
|
||||
IXGBE_MDIO_PHY_XS_DEV_TYPE, &ctrl);
|
||||
if (!(ctrl & IXGBE_MDIO_PHY_XS_RESET))
|
||||
if (!(ctrl & IXGBE_MDIO_PHY_XS_RESET)) {
|
||||
usec_delay(2);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (ctrl & IXGBE_MDIO_PHY_XS_RESET) {
|
||||
@ -262,6 +281,8 @@ s32 ixgbe_read_phy_reg_generic(struct ixgbe_hw *hw, u32 reg_addr,
|
||||
s32 status = IXGBE_SUCCESS;
|
||||
u16 gssr;
|
||||
|
||||
DEBUGFUNC("ixgbe_read_phy_reg_generic");
|
||||
|
||||
if (IXGBE_READ_REG(hw, IXGBE_STATUS) & IXGBE_STATUS_LAN_ID_1)
|
||||
gssr = IXGBE_GSSR_PHY1_SM;
|
||||
else
|
||||
@ -359,6 +380,8 @@ s32 ixgbe_write_phy_reg_generic(struct ixgbe_hw *hw, u32 reg_addr,
|
||||
s32 status = IXGBE_SUCCESS;
|
||||
u16 gssr;
|
||||
|
||||
DEBUGFUNC("ixgbe_write_phy_reg_generic");
|
||||
|
||||
if (IXGBE_READ_REG(hw, IXGBE_STATUS) & IXGBE_STATUS_LAN_ID_1)
|
||||
gssr = IXGBE_GSSR_PHY1_SM;
|
||||
else
|
||||
@ -437,10 +460,10 @@ s32 ixgbe_write_phy_reg_generic(struct ixgbe_hw *hw, u32 reg_addr,
|
||||
}
|
||||
|
||||
/**
|
||||
* ixgbe_setup_phy_link_generic - Set and restart autoneg
|
||||
* @hw: pointer to hardware structure
|
||||
* ixgbe_setup_phy_link_generic - Set and restart autoneg
|
||||
* @hw: pointer to hardware structure
|
||||
*
|
||||
* Restart autonegotiation and PHY and waits for completion.
|
||||
* Restart autonegotiation and PHY and waits for completion.
|
||||
**/
|
||||
s32 ixgbe_setup_phy_link_generic(struct ixgbe_hw *hw)
|
||||
{
|
||||
@ -448,23 +471,59 @@ s32 ixgbe_setup_phy_link_generic(struct ixgbe_hw *hw)
|
||||
u32 time_out;
|
||||
u32 max_time_out = 10;
|
||||
u16 autoneg_reg = IXGBE_MII_AUTONEG_REG;
|
||||
bool autoneg = FALSE;
|
||||
ixgbe_link_speed speed;
|
||||
|
||||
/*
|
||||
* Set advertisement settings in PHY based on autoneg_advertised
|
||||
* settings. If autoneg_advertised = 0, then advertise default values
|
||||
* tnx devices cannot be "forced" to a autoneg 10G and fail. But can
|
||||
* for a 1G.
|
||||
*/
|
||||
hw->phy.ops.read_reg(hw, IXGBE_MII_SPEED_SELECTION_REG,
|
||||
IXGBE_MDIO_AUTO_NEG_DEV_TYPE, &autoneg_reg);
|
||||
DEBUGFUNC("ixgbe_setup_phy_link_generic");
|
||||
|
||||
if (hw->phy.autoneg_advertised == IXGBE_LINK_SPEED_1GB_FULL)
|
||||
autoneg_reg &= 0xEFFF; /* 0 in bit 12 is 1G operation */
|
||||
else
|
||||
autoneg_reg |= 0x1000; /* 1 in bit 12 is 10G/1G operation */
|
||||
ixgbe_get_copper_link_capabilities_generic(hw, &speed, &autoneg);
|
||||
|
||||
hw->phy.ops.write_reg(hw, IXGBE_MII_SPEED_SELECTION_REG,
|
||||
IXGBE_MDIO_AUTO_NEG_DEV_TYPE, autoneg_reg);
|
||||
if (speed & IXGBE_LINK_SPEED_10GB_FULL) {
|
||||
/* Set or unset auto-negotiation 10G advertisement */
|
||||
hw->phy.ops.read_reg(hw, IXGBE_MII_10GBASE_T_AUTONEG_CTRL_REG,
|
||||
IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
|
||||
&autoneg_reg);
|
||||
|
||||
autoneg_reg &= ~IXGBE_MII_10GBASE_T_ADVERTISE;
|
||||
if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_10GB_FULL)
|
||||
autoneg_reg |= IXGBE_MII_10GBASE_T_ADVERTISE;
|
||||
|
||||
hw->phy.ops.write_reg(hw, IXGBE_MII_10GBASE_T_AUTONEG_CTRL_REG,
|
||||
IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
|
||||
autoneg_reg);
|
||||
}
|
||||
|
||||
if (speed & IXGBE_LINK_SPEED_1GB_FULL) {
|
||||
/* Set or unset auto-negotiation 1G advertisement */
|
||||
hw->phy.ops.read_reg(hw,
|
||||
IXGBE_MII_AUTONEG_VENDOR_PROVISION_1_REG,
|
||||
IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
|
||||
&autoneg_reg);
|
||||
|
||||
autoneg_reg &= ~IXGBE_MII_1GBASE_T_ADVERTISE;
|
||||
if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_1GB_FULL)
|
||||
autoneg_reg |= IXGBE_MII_1GBASE_T_ADVERTISE;
|
||||
|
||||
hw->phy.ops.write_reg(hw,
|
||||
IXGBE_MII_AUTONEG_VENDOR_PROVISION_1_REG,
|
||||
IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
|
||||
autoneg_reg);
|
||||
}
|
||||
|
||||
if (speed & IXGBE_LINK_SPEED_100_FULL) {
|
||||
/* Set or unset auto-negotiation 100M advertisement */
|
||||
hw->phy.ops.read_reg(hw, IXGBE_MII_AUTONEG_ADVERTISE_REG,
|
||||
IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
|
||||
&autoneg_reg);
|
||||
|
||||
autoneg_reg &= ~IXGBE_MII_100BASE_T_ADVERTISE;
|
||||
if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_100_FULL)
|
||||
autoneg_reg |= IXGBE_MII_100BASE_T_ADVERTISE;
|
||||
|
||||
hw->phy.ops.write_reg(hw, IXGBE_MII_AUTONEG_ADVERTISE_REG,
|
||||
IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
|
||||
autoneg_reg);
|
||||
}
|
||||
|
||||
/* Restart PHY autonegotiation and wait for completion */
|
||||
hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_CONTROL,
|
||||
@ -489,8 +548,10 @@ s32 ixgbe_setup_phy_link_generic(struct ixgbe_hw *hw)
|
||||
}
|
||||
}
|
||||
|
||||
if (time_out == max_time_out)
|
||||
if (time_out == max_time_out) {
|
||||
status = IXGBE_ERR_LINK_SETUP;
|
||||
DEBUGOUT("ixgbe_setup_phy_link_generic: time out");
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
@ -509,6 +570,8 @@ s32 ixgbe_setup_phy_link_speed_generic(struct ixgbe_hw *hw,
|
||||
UNREFERENCED_PARAMETER(autoneg);
|
||||
UNREFERENCED_PARAMETER(autoneg_wait_to_complete);
|
||||
|
||||
DEBUGFUNC("ixgbe_setup_phy_link_speed_generic");
|
||||
|
||||
/*
|
||||
* Clear autoneg_advertised and set new values based on input link
|
||||
* speed.
|
||||
@ -545,6 +608,8 @@ s32 ixgbe_get_copper_link_capabilities_generic(struct ixgbe_hw *hw,
|
||||
s32 status = IXGBE_ERR_LINK_SETUP;
|
||||
u16 speed_ability;
|
||||
|
||||
DEBUGFUNC("ixgbe_get_copper_link_capabilities_generic");
|
||||
|
||||
*speed = 0;
|
||||
*autoneg = TRUE;
|
||||
|
||||
@ -581,6 +646,8 @@ s32 ixgbe_check_phy_link_tnx(struct ixgbe_hw *hw, ixgbe_link_speed *speed,
|
||||
u16 phy_speed = 0;
|
||||
u16 phy_data = 0;
|
||||
|
||||
DEBUGFUNC("ixgbe_check_phy_link_tnx");
|
||||
|
||||
/* Initialize speed and link to default case */
|
||||
*link_up = FALSE;
|
||||
*speed = IXGBE_LINK_SPEED_10GB_FULL;
|
||||
@ -612,6 +679,102 @@ s32 ixgbe_check_phy_link_tnx(struct ixgbe_hw *hw, ixgbe_link_speed *speed,
|
||||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
* ixgbe_setup_phy_link_tnx - Set and restart autoneg
|
||||
* @hw: pointer to hardware structure
|
||||
*
|
||||
* Restart autonegotiation and PHY and waits for completion.
|
||||
**/
|
||||
s32 ixgbe_setup_phy_link_tnx(struct ixgbe_hw *hw)
|
||||
{
|
||||
s32 status = IXGBE_SUCCESS;
|
||||
u32 time_out;
|
||||
u32 max_time_out = 10;
|
||||
u16 autoneg_reg = IXGBE_MII_AUTONEG_REG;
|
||||
bool autoneg = FALSE;
|
||||
ixgbe_link_speed speed;
|
||||
|
||||
DEBUGFUNC("ixgbe_setup_phy_link_tnx");
|
||||
|
||||
ixgbe_get_copper_link_capabilities_generic(hw, &speed, &autoneg);
|
||||
|
||||
if (speed & IXGBE_LINK_SPEED_10GB_FULL) {
|
||||
/* Set or unset auto-negotiation 10G advertisement */
|
||||
hw->phy.ops.read_reg(hw, IXGBE_MII_10GBASE_T_AUTONEG_CTRL_REG,
|
||||
IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
|
||||
&autoneg_reg);
|
||||
|
||||
autoneg_reg &= ~IXGBE_MII_10GBASE_T_ADVERTISE;
|
||||
if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_10GB_FULL)
|
||||
autoneg_reg |= IXGBE_MII_10GBASE_T_ADVERTISE;
|
||||
|
||||
hw->phy.ops.write_reg(hw, IXGBE_MII_10GBASE_T_AUTONEG_CTRL_REG,
|
||||
IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
|
||||
autoneg_reg);
|
||||
}
|
||||
|
||||
if (speed & IXGBE_LINK_SPEED_1GB_FULL) {
|
||||
/* Set or unset auto-negotiation 1G advertisement */
|
||||
hw->phy.ops.read_reg(hw, IXGBE_MII_AUTONEG_XNP_TX_REG,
|
||||
IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
|
||||
&autoneg_reg);
|
||||
|
||||
autoneg_reg &= ~IXGBE_MII_1GBASE_T_ADVERTISE_XNP_TX;
|
||||
if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_1GB_FULL)
|
||||
autoneg_reg |= IXGBE_MII_1GBASE_T_ADVERTISE_XNP_TX;
|
||||
|
||||
hw->phy.ops.write_reg(hw, IXGBE_MII_AUTONEG_XNP_TX_REG,
|
||||
IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
|
||||
autoneg_reg);
|
||||
}
|
||||
|
||||
if (speed & IXGBE_LINK_SPEED_100_FULL) {
|
||||
/* Set or unset auto-negotiation 100M advertisement */
|
||||
hw->phy.ops.read_reg(hw, IXGBE_MII_AUTONEG_ADVERTISE_REG,
|
||||
IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
|
||||
&autoneg_reg);
|
||||
|
||||
autoneg_reg &= ~IXGBE_MII_100BASE_T_ADVERTISE;
|
||||
if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_100_FULL)
|
||||
autoneg_reg |= IXGBE_MII_100BASE_T_ADVERTISE;
|
||||
|
||||
hw->phy.ops.write_reg(hw, IXGBE_MII_AUTONEG_ADVERTISE_REG,
|
||||
IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
|
||||
autoneg_reg);
|
||||
}
|
||||
|
||||
/* Restart PHY autonegotiation and wait for completion */
|
||||
hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_CONTROL,
|
||||
IXGBE_MDIO_AUTO_NEG_DEV_TYPE, &autoneg_reg);
|
||||
|
||||
autoneg_reg |= IXGBE_MII_RESTART;
|
||||
|
||||
hw->phy.ops.write_reg(hw, IXGBE_MDIO_AUTO_NEG_CONTROL,
|
||||
IXGBE_MDIO_AUTO_NEG_DEV_TYPE, autoneg_reg);
|
||||
|
||||
/* Wait for autonegotiation to finish */
|
||||
for (time_out = 0; time_out < max_time_out; time_out++) {
|
||||
usec_delay(10);
|
||||
/* Restart PHY autonegotiation and wait for completion */
|
||||
status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_STATUS,
|
||||
IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
|
||||
&autoneg_reg);
|
||||
|
||||
autoneg_reg &= IXGBE_MII_AUTONEG_COMPLETE;
|
||||
if (autoneg_reg == IXGBE_MII_AUTONEG_COMPLETE) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (time_out == max_time_out) {
|
||||
status = IXGBE_ERR_LINK_SETUP;
|
||||
DEBUGOUT("ixgbe_setup_phy_link_tnx: time out");
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* ixgbe_get_phy_firmware_version_tnx - Gets the PHY Firmware Version
|
||||
* @hw: pointer to hardware structure
|
||||
@ -622,6 +785,8 @@ s32 ixgbe_get_phy_firmware_version_tnx(struct ixgbe_hw *hw,
|
||||
{
|
||||
s32 status = IXGBE_SUCCESS;
|
||||
|
||||
DEBUGFUNC("ixgbe_get_phy_firmware_version_tnx");
|
||||
|
||||
status = hw->phy.ops.read_reg(hw, TNX_FW_REV,
|
||||
IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
|
||||
firmware_version);
|
||||
@ -631,15 +796,17 @@ s32 ixgbe_get_phy_firmware_version_tnx(struct ixgbe_hw *hw,
|
||||
|
||||
|
||||
/**
|
||||
* ixgbe_get_phy_firmware_version_aq - Gets the PHY Firmware Version
|
||||
* ixgbe_get_phy_firmware_version_generic - Gets the PHY Firmware Version
|
||||
* @hw: pointer to hardware structure
|
||||
* @firmware_version: pointer to the PHY Firmware Version
|
||||
**/
|
||||
s32 ixgbe_get_phy_firmware_version_aq(struct ixgbe_hw *hw,
|
||||
s32 ixgbe_get_phy_firmware_version_generic(struct ixgbe_hw *hw,
|
||||
u16 *firmware_version)
|
||||
{
|
||||
s32 status = IXGBE_SUCCESS;
|
||||
|
||||
DEBUGFUNC("ixgbe_get_phy_firmware_version_generic");
|
||||
|
||||
status = hw->phy.ops.read_reg(hw, AQ_FW_REV,
|
||||
IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
|
||||
firmware_version);
|
||||
@ -660,6 +827,8 @@ s32 ixgbe_reset_phy_nl(struct ixgbe_hw *hw)
|
||||
s32 ret_val = IXGBE_SUCCESS;
|
||||
u32 i;
|
||||
|
||||
DEBUGFUNC("ixgbe_reset_phy_nl");
|
||||
|
||||
hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_XS_CONTROL,
|
||||
IXGBE_MDIO_PHY_XS_DEV_TYPE, &phy_data);
|
||||
|
||||
@ -760,8 +929,11 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)
|
||||
u8 comp_codes_10g = 0;
|
||||
u8 oui_bytes[3] = {0, 0, 0};
|
||||
u8 cable_tech = 0;
|
||||
u8 cable_spec = 0;
|
||||
u16 enforce_sfp = 0;
|
||||
|
||||
DEBUGFUNC("ixgbe_identify_sfp_module_generic");
|
||||
|
||||
if (hw->mac.ops.get_media_type(hw) != ixgbe_media_type_fiber) {
|
||||
hw->phy.sfp_type = ixgbe_sfp_type_not_present;
|
||||
status = IXGBE_ERR_SFP_NOT_PRESENT;
|
||||
@ -804,6 +976,8 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)
|
||||
* 4 SFP_DA_CORE1 - 82599-specific
|
||||
* 5 SFP_SR/LR_CORE0 - 82599-specific
|
||||
* 6 SFP_SR/LR_CORE1 - 82599-specific
|
||||
* 7 SFP_act_lmt_DA_CORE0 - 82599-specific
|
||||
* 8 SFP_act_lmt_DA_CORE1 - 82599-specific
|
||||
*/
|
||||
if (hw->mac.type == ixgbe_mac_82598EB) {
|
||||
if (cable_tech & IXGBE_SFF_DA_PASSIVE_CABLE)
|
||||
@ -815,29 +989,40 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)
|
||||
else
|
||||
hw->phy.sfp_type = ixgbe_sfp_type_unknown;
|
||||
} else if (hw->mac.type == ixgbe_mac_82599EB) {
|
||||
if (cable_tech & IXGBE_SFF_DA_PASSIVE_CABLE)
|
||||
if (cable_tech & IXGBE_SFF_DA_PASSIVE_CABLE) {
|
||||
if (hw->bus.lan_id == 0)
|
||||
hw->phy.sfp_type =
|
||||
ixgbe_sfp_type_da_cu_core0;
|
||||
else
|
||||
hw->phy.sfp_type =
|
||||
ixgbe_sfp_type_da_cu_core1;
|
||||
else if (comp_codes_10g & IXGBE_SFF_10GBASESR_CAPABLE)
|
||||
} else if (cable_tech & IXGBE_SFF_DA_ACTIVE_CABLE) {
|
||||
hw->phy.ops.read_i2c_eeprom(
|
||||
hw, IXGBE_SFF_CABLE_SPEC_COMP,
|
||||
&cable_spec);
|
||||
if (cable_spec &
|
||||
IXGBE_SFF_DA_SPEC_ACTIVE_LIMITING) {
|
||||
if (hw->bus.lan_id == 0)
|
||||
hw->phy.sfp_type =
|
||||
ixgbe_sfp_type_da_act_lmt_core0;
|
||||
else
|
||||
hw->phy.sfp_type =
|
||||
ixgbe_sfp_type_da_act_lmt_core1;
|
||||
} else
|
||||
hw->phy.sfp_type =
|
||||
ixgbe_sfp_type_unknown;
|
||||
} else if (comp_codes_10g &
|
||||
(IXGBE_SFF_10GBASESR_CAPABLE |
|
||||
IXGBE_SFF_10GBASELR_CAPABLE)) {
|
||||
if (hw->bus.lan_id == 0)
|
||||
hw->phy.sfp_type =
|
||||
ixgbe_sfp_type_srlr_core0;
|
||||
else
|
||||
hw->phy.sfp_type =
|
||||
ixgbe_sfp_type_srlr_core1;
|
||||
else if (comp_codes_10g & IXGBE_SFF_10GBASELR_CAPABLE)
|
||||
if (hw->bus.lan_id == 0)
|
||||
hw->phy.sfp_type =
|
||||
ixgbe_sfp_type_srlr_core0;
|
||||
else
|
||||
hw->phy.sfp_type =
|
||||
ixgbe_sfp_type_srlr_core1;
|
||||
else
|
||||
} else {
|
||||
hw->phy.sfp_type = ixgbe_sfp_type_unknown;
|
||||
}
|
||||
}
|
||||
|
||||
if (hw->phy.sfp_type != stored_sfp_type)
|
||||
@ -850,6 +1035,7 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)
|
||||
((comp_codes_1g & IXGBE_SFF_1GBASELX_CAPABLE) &&
|
||||
(comp_codes_10g & IXGBE_SFF_10GBASELR_CAPABLE)))
|
||||
hw->phy.multispeed_fiber = TRUE;
|
||||
|
||||
/* Determine PHY vendor */
|
||||
if (hw->phy.type != ixgbe_phy_nl) {
|
||||
hw->phy.id = identifier;
|
||||
@ -871,10 +1057,14 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)
|
||||
switch (vendor_oui) {
|
||||
case IXGBE_SFF_VENDOR_OUI_TYCO:
|
||||
if (cable_tech & IXGBE_SFF_DA_PASSIVE_CABLE)
|
||||
hw->phy.type = ixgbe_phy_tw_tyco;
|
||||
hw->phy.type =
|
||||
ixgbe_phy_sfp_passive_tyco;
|
||||
break;
|
||||
case IXGBE_SFF_VENDOR_OUI_FTL:
|
||||
hw->phy.type = ixgbe_phy_sfp_ftl;
|
||||
if (cable_tech & IXGBE_SFF_DA_ACTIVE_CABLE)
|
||||
hw->phy.type = ixgbe_phy_sfp_ftl_active;
|
||||
else
|
||||
hw->phy.type = ixgbe_phy_sfp_ftl;
|
||||
break;
|
||||
case IXGBE_SFF_VENDOR_OUI_AVAGO:
|
||||
hw->phy.type = ixgbe_phy_sfp_avago;
|
||||
@ -884,15 +1074,20 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)
|
||||
break;
|
||||
default:
|
||||
if (cable_tech & IXGBE_SFF_DA_PASSIVE_CABLE)
|
||||
hw->phy.type = ixgbe_phy_tw_unknown;
|
||||
hw->phy.type =
|
||||
ixgbe_phy_sfp_passive_unknown;
|
||||
else if (cable_tech & IXGBE_SFF_DA_ACTIVE_CABLE)
|
||||
hw->phy.type =
|
||||
ixgbe_phy_sfp_active_unknown;
|
||||
else
|
||||
hw->phy.type = ixgbe_phy_sfp_unknown;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* All passive DA cables are supported */
|
||||
if (cable_tech & IXGBE_SFF_DA_PASSIVE_CABLE) {
|
||||
/* Allow any DA cable vendor */
|
||||
if (cable_tech & (IXGBE_SFF_DA_PASSIVE_CABLE |
|
||||
IXGBE_SFF_DA_ACTIVE_CABLE)) {
|
||||
status = IXGBE_SUCCESS;
|
||||
goto out;
|
||||
}
|
||||
@ -943,6 +1138,9 @@ s32 ixgbe_get_sfp_init_sequence_offsets(struct ixgbe_hw *hw,
|
||||
u16 *data_offset)
|
||||
{
|
||||
u16 sfp_id;
|
||||
u16 sfp_type = hw->phy.sfp_type;
|
||||
|
||||
DEBUGFUNC("ixgbe_get_sfp_init_sequence_offsets");
|
||||
|
||||
if (hw->phy.sfp_type == ixgbe_sfp_type_unknown)
|
||||
return IXGBE_ERR_SFP_NOT_SUPPORTED;
|
||||
@ -954,6 +1152,12 @@ s32 ixgbe_get_sfp_init_sequence_offsets(struct ixgbe_hw *hw,
|
||||
(hw->phy.sfp_type == ixgbe_sfp_type_da_cu))
|
||||
return IXGBE_ERR_SFP_NOT_SUPPORTED;
|
||||
|
||||
/* Limiting active cables must be initialized as SR modules */
|
||||
if (sfp_type == ixgbe_sfp_type_da_act_lmt_core0)
|
||||
sfp_type = ixgbe_sfp_type_srlr_core0;
|
||||
else if (sfp_type == ixgbe_sfp_type_da_act_lmt_core1)
|
||||
sfp_type = ixgbe_sfp_type_srlr_core1;
|
||||
|
||||
/* Read offset to PHY init contents */
|
||||
hw->eeprom.ops.read(hw, IXGBE_PHY_INIT_OFFSET_NL, list_offset);
|
||||
|
||||
@ -970,7 +1174,7 @@ s32 ixgbe_get_sfp_init_sequence_offsets(struct ixgbe_hw *hw,
|
||||
hw->eeprom.ops.read(hw, *list_offset, &sfp_id);
|
||||
|
||||
while (sfp_id != IXGBE_PHY_INIT_END_NL) {
|
||||
if (sfp_id == hw->phy.sfp_type) {
|
||||
if (sfp_id == sfp_type) {
|
||||
(*list_offset)++;
|
||||
hw->eeprom.ops.read(hw, *list_offset, data_offset);
|
||||
if ((!*data_offset) || (*data_offset == 0xFFFF)) {
|
||||
@ -1370,6 +1574,8 @@ static s32 ixgbe_clock_in_i2c_bit(struct ixgbe_hw *hw, bool *data)
|
||||
s32 status;
|
||||
u32 i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL);
|
||||
|
||||
DEBUGFUNC("ixgbe_clock_in_i2c_bit");
|
||||
|
||||
status = ixgbe_raise_i2c_clk(hw, &i2cctl);
|
||||
|
||||
/* Minimum high period of clock is 4us */
|
||||
@ -1398,6 +1604,8 @@ static s32 ixgbe_clock_out_i2c_bit(struct ixgbe_hw *hw, bool data)
|
||||
s32 status;
|
||||
u32 i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL);
|
||||
|
||||
DEBUGFUNC("ixgbe_clock_out_i2c_bit");
|
||||
|
||||
status = ixgbe_set_i2c_data(hw, &i2cctl, data);
|
||||
if (status == IXGBE_SUCCESS) {
|
||||
status = ixgbe_raise_i2c_clk(hw, &i2cctl);
|
||||
@ -1429,6 +1637,8 @@ static s32 ixgbe_raise_i2c_clk(struct ixgbe_hw *hw, u32 *i2cctl)
|
||||
{
|
||||
s32 status = IXGBE_SUCCESS;
|
||||
|
||||
DEBUGFUNC("ixgbe_raise_i2c_clk");
|
||||
|
||||
*i2cctl |= IXGBE_I2C_CLK_OUT;
|
||||
|
||||
IXGBE_WRITE_REG(hw, IXGBE_I2CCTL, *i2cctl);
|
||||
@ -1449,6 +1659,8 @@ static s32 ixgbe_raise_i2c_clk(struct ixgbe_hw *hw, u32 *i2cctl)
|
||||
static void ixgbe_lower_i2c_clk(struct ixgbe_hw *hw, u32 *i2cctl)
|
||||
{
|
||||
|
||||
DEBUGFUNC("ixgbe_lower_i2c_clk");
|
||||
|
||||
*i2cctl &= ~IXGBE_I2C_CLK_OUT;
|
||||
|
||||
IXGBE_WRITE_REG(hw, IXGBE_I2CCTL, *i2cctl);
|
||||
@ -1469,6 +1681,8 @@ static s32 ixgbe_set_i2c_data(struct ixgbe_hw *hw, u32 *i2cctl, bool data)
|
||||
{
|
||||
s32 status = IXGBE_SUCCESS;
|
||||
|
||||
DEBUGFUNC("ixgbe_set_i2c_data");
|
||||
|
||||
if (data)
|
||||
*i2cctl |= IXGBE_I2C_DATA_OUT;
|
||||
else
|
||||
@ -1500,6 +1714,8 @@ static bool ixgbe_get_i2c_data(u32 *i2cctl)
|
||||
{
|
||||
bool data;
|
||||
|
||||
DEBUGFUNC("ixgbe_get_i2c_data");
|
||||
|
||||
if (*i2cctl & IXGBE_I2C_DATA_IN)
|
||||
data = 1;
|
||||
else
|
||||
@ -1543,3 +1759,56 @@ void ixgbe_i2c_bus_clear(struct ixgbe_hw *hw)
|
||||
/* Put the i2c bus back to default state */
|
||||
ixgbe_i2c_stop(hw);
|
||||
}
|
||||
|
||||
/**
|
||||
* ixgbe_check_overtemp - Checks if an overtemp occured.
|
||||
* @hw: pointer to hardware structure
|
||||
*
|
||||
* Checks if the LASI temp alarm status was triggered due to overtemp
|
||||
**/
|
||||
s32 ixgbe_tn_check_overtemp(struct ixgbe_hw *hw)
|
||||
{
|
||||
s32 status = IXGBE_SUCCESS;
|
||||
u16 phy_data = 0;
|
||||
|
||||
DEBUGFUNC("ixgbe_tn_check_overtemp");
|
||||
|
||||
if (hw->device_id != IXGBE_DEV_ID_82599_T3_LOM)
|
||||
goto out;
|
||||
|
||||
/* Check that the LASI temp alarm status was triggered */
|
||||
hw->phy.ops.read_reg(hw, IXGBE_TN_LASI_STATUS_REG,
|
||||
IXGBE_MDIO_PMA_PMD_DEV_TYPE, &phy_data);
|
||||
|
||||
if (!(phy_data & IXGBE_TN_LASI_STATUS_TEMP_ALARM))
|
||||
goto out;
|
||||
|
||||
status = IXGBE_ERR_OVERTEMP;
|
||||
out:
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* ixgbe_set_tn_low_power_state - Sets the teranetics phy into low power state
|
||||
* @hw: pointer to hardware structure
|
||||
*
|
||||
* Sets the phy into low power mode when LASI temp alarm status is triggered
|
||||
**/
|
||||
s32 ixgbe_tn_set_low_power_state(struct ixgbe_hw *hw)
|
||||
{
|
||||
s32 status = IXGBE_SUCCESS;
|
||||
u16 phy_data = 0;
|
||||
|
||||
DEBUGFUNC("ixgbe_set_tn_low_power_state");
|
||||
|
||||
/* Set the phy into low power mode */
|
||||
hw->phy.ops.read_reg(hw, IXGBE_MDIO_PMA_PMD_CONTROL_ADDR,
|
||||
IXGBE_MDIO_PMA_PMD_DEV_TYPE, &phy_data);
|
||||
phy_data |= IXGBE_MDIO_PHY_LOW_POWER_MODE;
|
||||
hw->phy.ops.write_reg(hw, IXGBE_MDIO_PMA_PMD_CONTROL_ADDR,
|
||||
IXGBE_MDIO_PMA_PMD_DEV_TYPE, phy_data);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
/******************************************************************************
|
||||
|
||||
Copyright (c) 2001-2009, Intel Corporation
|
||||
Copyright (c) 2001-2010, Intel Corporation
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
@ -47,9 +47,12 @@
|
||||
#define IXGBE_SFF_1GBE_COMP_CODES 0x6
|
||||
#define IXGBE_SFF_10GBE_COMP_CODES 0x3
|
||||
#define IXGBE_SFF_CABLE_TECHNOLOGY 0x8
|
||||
#define IXGBE_SFF_CABLE_SPEC_COMP 0x3C
|
||||
|
||||
/* Bitmasks */
|
||||
#define IXGBE_SFF_DA_PASSIVE_CABLE 0x4
|
||||
#define IXGBE_SFF_DA_ACTIVE_CABLE 0x8
|
||||
#define IXGBE_SFF_DA_SPEC_ACTIVE_LIMITING 0x4
|
||||
#define IXGBE_SFF_1GBASESX_CAPABLE 0x1
|
||||
#define IXGBE_SFF_1GBASELX_CAPABLE 0x2
|
||||
#define IXGBE_SFF_10GBASESR_CAPABLE 0x10
|
||||
@ -84,6 +87,9 @@
|
||||
#define IXGBE_I2C_T_SU_STO 4
|
||||
#define IXGBE_I2C_T_BUF 5
|
||||
|
||||
#define IXGBE_TN_LASI_STATUS_REG 0x9005
|
||||
#define IXGBE_TN_LASI_STATUS_TEMP_ALARM 0x0008
|
||||
|
||||
|
||||
s32 ixgbe_init_phy_ops_generic(struct ixgbe_hw *hw);
|
||||
bool ixgbe_validate_phy_addr(struct ixgbe_hw *hw, u32 phy_addr);
|
||||
@ -108,9 +114,10 @@ s32 ixgbe_get_copper_link_capabilities_generic(struct ixgbe_hw *hw,
|
||||
s32 ixgbe_check_phy_link_tnx(struct ixgbe_hw *hw,
|
||||
ixgbe_link_speed *speed,
|
||||
bool *link_up);
|
||||
s32 ixgbe_setup_phy_link_tnx(struct ixgbe_hw *hw);
|
||||
s32 ixgbe_get_phy_firmware_version_tnx(struct ixgbe_hw *hw,
|
||||
u16 *firmware_version);
|
||||
s32 ixgbe_get_phy_firmware_version_aq(struct ixgbe_hw *hw,
|
||||
s32 ixgbe_get_phy_firmware_version_generic(struct ixgbe_hw *hw,
|
||||
u16 *firmware_version);
|
||||
|
||||
s32 ixgbe_reset_phy_nl(struct ixgbe_hw *hw);
|
||||
@ -118,6 +125,8 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw);
|
||||
s32 ixgbe_get_sfp_init_sequence_offsets(struct ixgbe_hw *hw,
|
||||
u16 *list_offset,
|
||||
u16 *data_offset);
|
||||
s32 ixgbe_tn_check_overtemp(struct ixgbe_hw *hw);
|
||||
s32 ixgbe_tn_set_low_power_state(struct ixgbe_hw *hw);
|
||||
s32 ixgbe_read_i2c_byte_generic(struct ixgbe_hw *hw, u8 byte_offset,
|
||||
u8 dev_addr, u8 *data);
|
||||
s32 ixgbe_write_i2c_byte_generic(struct ixgbe_hw *hw, u8 byte_offset,
|
||||
|
@ -1,6 +1,6 @@
|
||||
/******************************************************************************
|
||||
|
||||
Copyright (c) 2001-2009, Intel Corporation
|
||||
Copyright (c) 2001-2010, Intel Corporation
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
@ -47,6 +47,7 @@
|
||||
#define IXGBE_DEV_ID_82598AF_DUAL_PORT 0x10C6
|
||||
#define IXGBE_DEV_ID_82598AF_SINGLE_PORT 0x10C7
|
||||
#define IXGBE_DEV_ID_82598AT 0x10C8
|
||||
#define IXGBE_DEV_ID_82598AT2 0x150B
|
||||
#define IXGBE_DEV_ID_82598EB_SFP_LOM 0x10DB
|
||||
#define IXGBE_DEV_ID_82598EB_CX4 0x10DD
|
||||
#define IXGBE_DEV_ID_82598_CX4_DUAL_PORT 0x10EC
|
||||
@ -54,9 +55,13 @@
|
||||
#define IXGBE_DEV_ID_82598_SR_DUAL_PORT_EM 0x10E1
|
||||
#define IXGBE_DEV_ID_82598EB_XF_LR 0x10F4
|
||||
#define IXGBE_DEV_ID_82599_KX4 0x10F7
|
||||
#define IXGBE_DEV_ID_82599_KX4_MEZZ 0x1514
|
||||
#define IXGBE_DEV_ID_82599_COMBO_BACKPLANE 0x10F8
|
||||
#define IXGBE_SUBDEV_ID_82599_KX4_KR_MEZZ 0x000C
|
||||
#define IXGBE_DEV_ID_82599_CX4 0x10F9
|
||||
#define IXGBE_DEV_ID_82599_SFP 0x10FB
|
||||
#define IXGBE_DEV_ID_82599_XAUI_LOM 0x10FC
|
||||
#define IXGBE_DEV_ID_82599_T3_LOM 0x151C
|
||||
|
||||
/* General Registers */
|
||||
#define IXGBE_CTRL 0x00000
|
||||
@ -74,6 +79,7 @@
|
||||
/* NVM Registers */
|
||||
#define IXGBE_EEC 0x10010
|
||||
#define IXGBE_EERD 0x10014
|
||||
#define IXGBE_EEWR 0x10018
|
||||
#define IXGBE_FLA 0x1001C
|
||||
#define IXGBE_EEMNGCTL 0x10110
|
||||
#define IXGBE_EEMNGDATA 0x10114
|
||||
@ -85,7 +91,7 @@
|
||||
|
||||
/* General Receive Control */
|
||||
#define IXGBE_GRC_MNG 0x00000001 /* Manageability Enable */
|
||||
#define IXGBE_GRC_APME 0x00000002 /* Advanced Power Management Enable */
|
||||
#define IXGBE_GRC_APME 0x00000002 /* APM enabled in EEPROM */
|
||||
|
||||
#define IXGBE_VPDDIAG0 0x10204
|
||||
#define IXGBE_VPDDIAG1 0x10208
|
||||
@ -194,6 +200,7 @@
|
||||
#define IXGBE_RFCTL 0x05008
|
||||
#define IXGBE_DRECCCTL 0x02F08
|
||||
#define IXGBE_DRECCCTL_DISABLE 0
|
||||
|
||||
/* Multicast Table Array - 128 entries */
|
||||
#define IXGBE_MTA(_i) (0x05200 + ((_i) * 4))
|
||||
#define IXGBE_RAL(_i) (((_i) <= 15) ? (0x05400 + ((_i) * 8)) : \
|
||||
@ -330,7 +337,7 @@
|
||||
/* Wake Up Control */
|
||||
#define IXGBE_WUC_PME_EN 0x00000002 /* PME Enable */
|
||||
#define IXGBE_WUC_PME_STATUS 0x00000004 /* PME Status */
|
||||
#define IXGBE_WUC_ADVD3WUC 0x00000010 /* D3Cold wake up cap. enable*/
|
||||
#define IXGBE_WUC_WKEN 0x00000010 /* Enable PE_WAKE_N pin assertion */
|
||||
|
||||
/* Wake Up Filter Control */
|
||||
#define IXGBE_WUFC_LNKC 0x00000001 /* Link Status Change Wakeup Enable */
|
||||
@ -352,7 +359,7 @@
|
||||
#define IXGBE_WUFC_FLX5 0x00200000 /* Flexible Filter 5 Enable */
|
||||
#define IXGBE_WUFC_FLX_FILTERS 0x000F0000 /* Mask for 4 flex filters */
|
||||
#define IXGBE_WUFC_EXT_FLX_FILTERS 0x00300000 /* Mask for Ext. flex filters */
|
||||
#define IXGBE_WUFC_ALL_FILTERS 0x003F00FF /* Mask for all 6 wakeup filters*/
|
||||
#define IXGBE_WUFC_ALL_FILTERS 0x003F00FF /* Mask for all wakeup filters */
|
||||
#define IXGBE_WUFC_FLX_OFFSET 16 /* Offset to the Flexible Filters bits */
|
||||
|
||||
/* Wake Up Status */
|
||||
@ -703,6 +710,7 @@
|
||||
#define IXGBE_MREVID 0x11064
|
||||
#define IXGBE_DCA_ID 0x11070
|
||||
#define IXGBE_DCA_CTRL 0x11074
|
||||
#define IXGBE_SWFW_SYNC IXGBE_GSSR
|
||||
|
||||
/* PCI-E registers 82599-Specific */
|
||||
#define IXGBE_GCR_EXT 0x11050
|
||||
@ -725,6 +733,18 @@
|
||||
#define IXGBE_ECC_STATUS_82599 0x110E0
|
||||
#define IXGBE_BAR_CTRL_82599 0x110F4
|
||||
|
||||
/* PCI Express Control */
|
||||
#define IXGBE_GCR_CMPL_TMOUT_MASK 0x0000F000
|
||||
#define IXGBE_GCR_CMPL_TMOUT_10ms 0x00001000
|
||||
#define IXGBE_GCR_CMPL_TMOUT_RESEND 0x00010000
|
||||
#define IXGBE_GCR_CAP_VER2 0x00040000
|
||||
|
||||
#define IXGBE_GCR_EXT_MSIX_EN 0x80000000
|
||||
#define IXGBE_GCR_EXT_VT_MODE_16 0x00000001
|
||||
#define IXGBE_GCR_EXT_VT_MODE_32 0x00000002
|
||||
#define IXGBE_GCR_EXT_VT_MODE_64 0x00000003
|
||||
#define IXGBE_GCR_EXT_SRIOV (IXGBE_GCR_EXT_MSIX_EN | \
|
||||
IXGBE_GCR_EXT_VT_MODE_64)
|
||||
/* Time Sync Registers */
|
||||
#define IXGBE_TSYNCRXCTL 0x05188 /* Rx Time Sync Control register - RW */
|
||||
#define IXGBE_TSYNCTXCTL 0x08C00 /* Tx Time Sync Control register - RW */
|
||||
@ -848,12 +868,16 @@
|
||||
#define IXGBE_MPVC 0x04318
|
||||
#define IXGBE_SGMIIC 0x04314
|
||||
|
||||
/* Copper Pond 2 link timeout */
|
||||
#define IXGBE_VALIDATE_LINK_READY_TIMEOUT 50
|
||||
|
||||
/* Omer CORECTL */
|
||||
#define IXGBE_CORECTL 0x014F00
|
||||
/* BARCTRL */
|
||||
#define IXGBE_BARCTRL 0x110F4
|
||||
#define IXGBE_BARCTRL_FLSIZE 0x0700
|
||||
#define IXGBE_BARCTRL_CSRSIZE 0x2000
|
||||
#define IXGBE_BARCTRL 0x110F4
|
||||
#define IXGBE_BARCTRL_FLSIZE 0x0700
|
||||
#define IXGBE_BARCTRL_FLSIZE_SHIFT 8
|
||||
#define IXGBE_BARCTRL_CSRSIZE 0x2000
|
||||
|
||||
/* RSCCTL Bit Masks */
|
||||
#define IXGBE_RSCCTL_RSCEN 0x01
|
||||
@ -874,6 +898,8 @@
|
||||
#define IXGBE_RDRXCTL_AGGDIS 0x00010000 /* Aggregation disable */
|
||||
#define IXGBE_RDRXCTL_RSCFRSTSIZE 0x003E0000 /* RSC First packet size */
|
||||
#define IXGBE_RDRXCTL_RSCLLIDIS 0x00800000 /* Disable RSC compl on LLI */
|
||||
#define IXGBE_RDRXCTL_RSCACKC 0x02000000 /* must set 1 when RSC enabled */
|
||||
#define IXGBE_RDRXCTL_FCOE_WRFIX 0x04000000 /* must set 1 when RSC enabled */
|
||||
|
||||
/* RQTC Bit Masks and Shifts */
|
||||
#define IXGBE_RQTC_SHIFT_TC(_i) ((_i) * 4)
|
||||
@ -1005,7 +1031,9 @@
|
||||
#define IXGBE_MDIO_PHY_10GBASET_ABILITY 0x0004 /* 10GBaseT capable */
|
||||
#define IXGBE_MDIO_PHY_1000BASET_ABILITY 0x0020 /* 1000BaseT capable */
|
||||
#define IXGBE_MDIO_PHY_100BASETX_ABILITY 0x0080 /* 100BaseTX capable */
|
||||
#define IXGBE_MDIO_PHY_SET_LOW_POWER_MODE 0x0800 /* Set low power mode */
|
||||
|
||||
#define IXGBE_MDIO_PMA_PMD_CONTROL_ADDR 0x0000 /* PMA/PMD Control Reg */
|
||||
#define IXGBE_MDIO_PMA_PMD_SDA_SCL_ADDR 0xC30A /* PHY_XS SDA/SCL Addr Reg */
|
||||
#define IXGBE_MDIO_PMA_PMD_SDA_SCL_DATA 0xC30B /* PHY_XS SDA/SCL Data Reg */
|
||||
#define IXGBE_MDIO_PMA_PMD_SDA_SCL_STAT 0xC30C /* PHY_XS SDA/SCL Status Reg */
|
||||
@ -1013,10 +1041,18 @@
|
||||
/* MII clause 22/28 definitions */
|
||||
#define IXGBE_MDIO_PHY_LOW_POWER_MODE 0x0800
|
||||
|
||||
#define IXGBE_MII_SPEED_SELECTION_REG 0x10
|
||||
#define IXGBE_MII_RESTART 0x200
|
||||
#define IXGBE_MII_AUTONEG_COMPLETE 0x20
|
||||
#define IXGBE_MII_AUTONEG_REG 0x0
|
||||
#define IXGBE_MII_10GBASE_T_AUTONEG_CTRL_REG 0x20 /* 10G Control Reg */
|
||||
#define IXGBE_MII_AUTONEG_VENDOR_PROVISION_1_REG 0xC400 /* 1G Provisioning 1 */
|
||||
#define IXGBE_MII_AUTONEG_XNP_TX_REG 0x17 /* 1G XNP Transmit */
|
||||
#define IXGBE_MII_AUTONEG_ADVERTISE_REG 0x10 /* 100M Advertisement */
|
||||
#define IXGBE_MII_10GBASE_T_ADVERTISE 0x1000 /* full duplex, bit:12*/
|
||||
#define IXGBE_MII_1GBASE_T_ADVERTISE_XNP_TX 0x4000 /* full duplex, bit:14*/
|
||||
#define IXGBE_MII_1GBASE_T_ADVERTISE 0x8000 /* full duplex, bit:15*/
|
||||
#define IXGBE_MII_100BASE_T_ADVERTISE 0x0100 /* full duplex, bit:8 */
|
||||
#define IXGBE_MII_RESTART 0x200
|
||||
#define IXGBE_MII_AUTONEG_COMPLETE 0x20
|
||||
#define IXGBE_MII_AUTONEG_LINK_UP 0x04
|
||||
#define IXGBE_MII_AUTONEG_REG 0x0
|
||||
|
||||
#define IXGBE_PHY_REVISION_MASK 0xFFFFFFF0
|
||||
#define IXGBE_MAX_PHY_ADDR 32
|
||||
@ -1346,10 +1382,12 @@
|
||||
* EAPOL 802.1x (0x888e): Filter 0
|
||||
* FCoE (0x8906): Filter 2
|
||||
* 1588 (0x88f7): Filter 3
|
||||
* FIP (0x8914): Filter 4
|
||||
*/
|
||||
#define IXGBE_ETQF_FILTER_EAPOL 0
|
||||
#define IXGBE_ETQF_FILTER_FCOE 2
|
||||
#define IXGBE_ETQF_FILTER_1588 3
|
||||
#define IXGBE_ETQF_FILTER_FIP 4
|
||||
/* VLAN Control Bit Masks */
|
||||
#define IXGBE_VLNCTRL_VET 0x0000FFFF /* bits 0-15 */
|
||||
#define IXGBE_VLNCTRL_CFI 0x10000000 /* bit 28 */
|
||||
@ -1408,6 +1446,8 @@
|
||||
#define IXGBE_AUTOC_KX4_SUPP 0x80000000
|
||||
#define IXGBE_AUTOC_KX_SUPP 0x40000000
|
||||
#define IXGBE_AUTOC_PAUSE 0x30000000
|
||||
#define IXGBE_AUTOC_ASM_PAUSE 0x20000000
|
||||
#define IXGBE_AUTOC_SYM_PAUSE 0x10000000
|
||||
#define IXGBE_AUTOC_RF 0x08000000
|
||||
#define IXGBE_AUTOC_PD_TMR 0x06000000
|
||||
#define IXGBE_AUTOC_AN_RX_LOOSE 0x01000000
|
||||
@ -1451,6 +1491,7 @@
|
||||
#define IXGBE_AUTOC2_10G_XFI (0x1 << IXGBE_AUTOC2_10G_SERIAL_PMA_PMD_SHIFT)
|
||||
#define IXGBE_AUTOC2_10G_SFI (0x2 << IXGBE_AUTOC2_10G_SERIAL_PMA_PMD_SHIFT)
|
||||
|
||||
|
||||
/* LINKS Bit Masks */
|
||||
#define IXGBE_LINKS_KX_AN_COMP 0x80000000
|
||||
#define IXGBE_LINKS_UP 0x40000000
|
||||
@ -1476,6 +1517,8 @@
|
||||
#define IXGBE_LINK_UP_TIME 90 /* 9.0 Seconds */
|
||||
#define IXGBE_AUTO_NEG_TIME 45 /* 4.5 Seconds */
|
||||
|
||||
#define IXGBE_LINKS2_AN_SUPPORTED 0x00000040
|
||||
|
||||
/* PCS1GLSTA Bit Masks */
|
||||
#define IXGBE_PCS1GLSTA_LINK_OK 1
|
||||
#define IXGBE_PCS1GLSTA_SYNK_OK 0x10
|
||||
@ -1496,12 +1539,18 @@
|
||||
#define IXGBE_PCS1GLCTL_AN_ENABLE 0x10000
|
||||
#define IXGBE_PCS1GLCTL_AN_RESTART 0x20000
|
||||
|
||||
/* ANLP1 Bit Masks */
|
||||
#define IXGBE_ANLP1_PAUSE 0x0C00
|
||||
#define IXGBE_ANLP1_SYM_PAUSE 0x0400
|
||||
#define IXGBE_ANLP1_ASM_PAUSE 0x0800
|
||||
|
||||
/* SW Semaphore Register bitmasks */
|
||||
#define IXGBE_SWSM_SMBI 0x00000001 /* Driver Semaphore bit */
|
||||
#define IXGBE_SWSM_SWESMBI 0x00000002 /* FW Semaphore bit */
|
||||
#define IXGBE_SWSM_WMNG 0x00000004 /* Wake MNG Clock */
|
||||
#define IXGBE_SWFW_REGSMP 0x80000000 /* Register Semaphore bit 31 */
|
||||
|
||||
/* GSSR definitions */
|
||||
/* SW_FW_SYNC/GSSR definitions */
|
||||
#define IXGBE_GSSR_EEP_SM 0x0001
|
||||
#define IXGBE_GSSR_PHY0_SM 0x0002
|
||||
#define IXGBE_GSSR_PHY1_SM 0x0004
|
||||
@ -1521,20 +1570,24 @@
|
||||
#define IXGBE_EEC_GNT 0x00000080 /* EEPROM Access Grant */
|
||||
#define IXGBE_EEC_PRES 0x00000100 /* EEPROM Present */
|
||||
#define IXGBE_EEC_ARD 0x00000200 /* EEPROM Auto Read Done */
|
||||
#define IXGBE_EEC_FLUP 0x00800000 /* Flash update command */
|
||||
#define IXGBE_EEC_FLUDONE 0x04000000 /* Flash update done */
|
||||
/* EEPROM Addressing bits based on type (0-small, 1-large) */
|
||||
#define IXGBE_EEC_ADDR_SIZE 0x00000400
|
||||
#define IXGBE_EEC_SIZE 0x00007800 /* EEPROM Size */
|
||||
|
||||
#define IXGBE_EEC_SIZE_SHIFT 11
|
||||
#define IXGBE_EEPROM_WORD_SIZE_SHIFT 6
|
||||
#define IXGBE_EEPROM_OPCODE_BITS 8
|
||||
#define IXGBE_EEC_SIZE_SHIFT 11
|
||||
#define IXGBE_EEPROM_WORD_SIZE_BASE_SHIFT 6
|
||||
#define IXGBE_EEPROM_OPCODE_BITS 8
|
||||
|
||||
/* Checksum and EEPROM pointers */
|
||||
#define IXGBE_EEPROM_CHECKSUM 0x3F
|
||||
#define IXGBE_EEPROM_SUM 0xBABA
|
||||
#define IXGBE_PCIE_ANALOG_PTR 0x03
|
||||
#define IXGBE_ATLAS0_CONFIG_PTR 0x04
|
||||
#define IXGBE_PHY_PTR 0x04
|
||||
#define IXGBE_ATLAS1_CONFIG_PTR 0x05
|
||||
#define IXGBE_OPTION_ROM_PTR 0x05
|
||||
#define IXGBE_PCIE_GENERAL_PTR 0x06
|
||||
#define IXGBE_PCIE_CONFIG0_PTR 0x07
|
||||
#define IXGBE_PCIE_CONFIG1_PTR 0x08
|
||||
@ -1577,10 +1630,12 @@
|
||||
#define IXGBE_EEPROM_ERASE256_OPCODE_SPI 0xDB /* EEPROM ERASE 256B */
|
||||
|
||||
/* EEPROM Read Register */
|
||||
#define IXGBE_EEPROM_READ_REG_DATA 16 /* data offset in EEPROM read reg */
|
||||
#define IXGBE_EEPROM_READ_REG_DONE 2 /* Offset to READ done bit */
|
||||
#define IXGBE_EEPROM_READ_REG_START 1 /* First bit to start operation */
|
||||
#define IXGBE_EEPROM_READ_ADDR_SHIFT 2 /* Shift to the address bits */
|
||||
#define IXGBE_EEPROM_RW_REG_DATA 16 /* data offset in EEPROM read reg */
|
||||
#define IXGBE_EEPROM_RW_REG_DONE 2 /* Offset to READ done bit */
|
||||
#define IXGBE_EEPROM_RW_REG_START 1 /* First bit to start operation */
|
||||
#define IXGBE_EEPROM_RW_ADDR_SHIFT 2 /* Shift to the address bits */
|
||||
#define IXGBE_NVM_POLL_WRITE 1 /* Flag for polling for write complete */
|
||||
#define IXGBE_NVM_POLL_READ 0 /* Flag for polling for read complete */
|
||||
|
||||
#define IXGBE_ETH_LENGTH_OF_ADDRESS 6
|
||||
|
||||
@ -1588,10 +1643,12 @@
|
||||
#define IXGBE_EEPROM_GRANT_ATTEMPTS 1000 /* EEPROM # attempts to gain grant */
|
||||
#endif
|
||||
|
||||
#ifndef IXGBE_EERD_ATTEMPTS
|
||||
/* Number of 5 microseconds we wait for EERD read to complete */
|
||||
#define IXGBE_EERD_ATTEMPTS 100000
|
||||
#endif
|
||||
/* Number of 5 microseconds we wait for EERD read and
|
||||
* EERW write to complete */
|
||||
#define IXGBE_EERD_EEWR_ATTEMPTS 100000
|
||||
|
||||
/* # attempts we wait for flush update to complete */
|
||||
#define IXGBE_FLUDONE_ATTEMPTS 20000
|
||||
|
||||
#define IXGBE_PCIE_CTRL2 0x5 /* PCIe Control 2 Offset */
|
||||
#define IXGBE_PCIE_CTRL2_DUMMY_ENABLE 0x8 /* Dummy Function Enable */
|
||||
@ -1604,9 +1661,20 @@
|
||||
#define IXGBE_DEVICE_CAPS_FCOE_OFFLOADS 0x2
|
||||
#define IXGBE_FW_PASSTHROUGH_PATCH_CONFIG_PTR 0x4
|
||||
#define IXGBE_FW_PATCH_VERSION_4 0x7
|
||||
#define IXGBE_ALT_SAN_MAC_ADDR_BLK_PTR 0x27 /* Alt. SAN MAC block */
|
||||
#define IXGBE_ALT_SAN_MAC_ADDR_CAPS_OFFSET 0x0 /* Alt. SAN MAC capability */
|
||||
#define IXGBE_ALT_SAN_MAC_ADDR_PORT0_OFFSET 0x1 /* Alt. SAN MAC 0 offset */
|
||||
#define IXGBE_ALT_SAN_MAC_ADDR_PORT1_OFFSET 0x4 /* Alt. SAN MAC 1 offset */
|
||||
#define IXGBE_ALT_SAN_MAC_ADDR_WWNN_OFFSET 0x7 /* Alt. WWNN prefix offset */
|
||||
#define IXGBE_ALT_SAN_MAC_ADDR_WWPN_OFFSET 0x8 /* Alt. WWPN prefix offset */
|
||||
#define IXGBE_ALT_SAN_MAC_ADDR_CAPS_SANMAC 0x0 /* Alt. SAN MAC exists */
|
||||
#define IXGBE_ALT_SAN_MAC_ADDR_CAPS_ALTWWN 0x1 /* Alt. WWN base exists */
|
||||
|
||||
/* PCI Bus Info */
|
||||
#define IXGBE_PCI_DEVICE_STATUS 0xAA
|
||||
#define IXGBE_PCI_DEVICE_STATUS_TRANSACTION_PENDING 0x0020
|
||||
#define IXGBE_PCI_LINK_STATUS 0xB2
|
||||
#define IXGBE_PCI_DEVICE_CONTROL2 0xC8
|
||||
#define IXGBE_PCI_LINK_WIDTH 0x3F0
|
||||
#define IXGBE_PCI_LINK_WIDTH_1 0x10
|
||||
#define IXGBE_PCI_LINK_WIDTH_2 0x20
|
||||
@ -1617,6 +1685,7 @@
|
||||
#define IXGBE_PCI_LINK_SPEED_5000 0x2
|
||||
#define IXGBE_PCI_HEADER_TYPE_REGISTER 0x0E
|
||||
#define IXGBE_PCI_HEADER_TYPE_MULTIFUNC 0x80
|
||||
#define IXGBE_PCI_DEVICE_CONTROL2_16ms 0x0005
|
||||
|
||||
/* Number of 100 microseconds we wait for PCI Express master disable */
|
||||
#define IXGBE_PCI_MASTER_DISABLE_TIMEOUT 800
|
||||
@ -1736,6 +1805,7 @@
|
||||
#define IXGBE_MTQC_64Q_1PB 0x0 /* 64 queues 1 pack buffer */
|
||||
#define IXGBE_MTQC_32VF 0x8 /* 4 TX Queues per pool w/32VF's */
|
||||
#define IXGBE_MTQC_64VF 0x4 /* 2 TX Queues per pool w/64VF's */
|
||||
#define IXGBE_MTQC_4TC_4TQ 0x8 /* 4 TC if RT_ENA and VT_ENA */
|
||||
#define IXGBE_MTQC_8TC_8TQ 0xC /* 8 TC if RT_ENA or 8 TQ if VT_ENA */
|
||||
|
||||
/* Receive Descriptor bit definitions */
|
||||
@ -1949,10 +2019,9 @@ enum ixgbe_fdir_pballoc_type {
|
||||
#define IXGBE_FDIRM_VLANID 0x00000001
|
||||
#define IXGBE_FDIRM_VLANP 0x00000002
|
||||
#define IXGBE_FDIRM_POOL 0x00000004
|
||||
#define IXGBE_FDIRM_L3P 0x00000008
|
||||
#define IXGBE_FDIRM_L4P 0x00000010
|
||||
#define IXGBE_FDIRM_FLEX 0x00000020
|
||||
#define IXGBE_FDIRM_DIPv6 0x00000040
|
||||
#define IXGBE_FDIRM_L4P 0x00000008
|
||||
#define IXGBE_FDIRM_FLEX 0x00000010
|
||||
#define IXGBE_FDIRM_DIPv6 0x00000020
|
||||
|
||||
#define IXGBE_FDIRFREE_FREE_MASK 0xFFFF
|
||||
#define IXGBE_FDIRFREE_FREE_SHIFT 0
|
||||
@ -2167,6 +2236,8 @@ typedef u32 ixgbe_physical_layer;
|
||||
#define IXGBE_PHYSICAL_LAYER_1000BASE_BX 0x0400
|
||||
#define IXGBE_PHYSICAL_LAYER_10GBASE_KR 0x0800
|
||||
#define IXGBE_PHYSICAL_LAYER_10GBASE_XAUI 0x1000
|
||||
#define IXGBE_PHYSICAL_LAYER_SFP_ACTIVE_DA 0x2000
|
||||
|
||||
|
||||
/* Software ATR hash keys */
|
||||
#define IXGBE_ATR_BUCKET_HASH_KEY 0xE214AD3D
|
||||
@ -2207,9 +2278,19 @@ struct ixgbe_atr_input {
|
||||
u8 byte_stream[42];
|
||||
};
|
||||
|
||||
struct ixgbe_atr_input_masks {
|
||||
u32 src_ip_mask;
|
||||
u32 dst_ip_mask;
|
||||
u16 src_port_mask;
|
||||
u16 dst_port_mask;
|
||||
u16 vlan_id_mask;
|
||||
u16 data_mask;
|
||||
};
|
||||
|
||||
enum ixgbe_eeprom_type {
|
||||
ixgbe_eeprom_uninitialized = 0,
|
||||
ixgbe_eeprom_spi,
|
||||
ixgbe_flash,
|
||||
ixgbe_eeprom_none /* No NVM support */
|
||||
};
|
||||
|
||||
@ -2229,10 +2310,12 @@ enum ixgbe_phy_type {
|
||||
ixgbe_phy_qt,
|
||||
ixgbe_phy_xaui,
|
||||
ixgbe_phy_nl,
|
||||
ixgbe_phy_tw_tyco,
|
||||
ixgbe_phy_tw_unknown,
|
||||
ixgbe_phy_sfp_passive_tyco,
|
||||
ixgbe_phy_sfp_passive_unknown,
|
||||
ixgbe_phy_sfp_active_unknown,
|
||||
ixgbe_phy_sfp_avago,
|
||||
ixgbe_phy_sfp_ftl,
|
||||
ixgbe_phy_sfp_ftl_active,
|
||||
ixgbe_phy_sfp_unknown,
|
||||
ixgbe_phy_sfp_intel,
|
||||
ixgbe_phy_sfp_unsupported, /*Enforce bit set with unsupported module*/
|
||||
@ -2260,6 +2343,8 @@ enum ixgbe_sfp_type {
|
||||
ixgbe_sfp_type_da_cu_core1 = 4,
|
||||
ixgbe_sfp_type_srlr_core0 = 5,
|
||||
ixgbe_sfp_type_srlr_core1 = 6,
|
||||
ixgbe_sfp_type_da_act_lmt_core0 = 7,
|
||||
ixgbe_sfp_type_da_act_lmt_core1 = 8,
|
||||
ixgbe_sfp_type_not_present = 0xFFFE,
|
||||
ixgbe_sfp_type_unknown = 0xFFFF
|
||||
};
|
||||
@ -2269,6 +2354,7 @@ enum ixgbe_media_type {
|
||||
ixgbe_media_type_fiber,
|
||||
ixgbe_media_type_copper,
|
||||
ixgbe_media_type_backplane,
|
||||
ixgbe_media_type_cx4,
|
||||
ixgbe_media_type_virtual
|
||||
};
|
||||
|
||||
@ -2281,6 +2367,14 @@ enum ixgbe_fc_mode {
|
||||
ixgbe_fc_default
|
||||
};
|
||||
|
||||
/* Smart Speed Settings */
|
||||
#define IXGBE_SMARTSPEED_MAX_RETRIES 3
|
||||
enum ixgbe_smart_speed {
|
||||
ixgbe_smart_speed_auto = 0,
|
||||
ixgbe_smart_speed_on,
|
||||
ixgbe_smart_speed_off
|
||||
};
|
||||
|
||||
/* PCI bus types */
|
||||
enum ixgbe_bus_type {
|
||||
ixgbe_bus_type_unknown = 0,
|
||||
@ -2293,25 +2387,25 @@ enum ixgbe_bus_type {
|
||||
/* PCI bus speeds */
|
||||
enum ixgbe_bus_speed {
|
||||
ixgbe_bus_speed_unknown = 0,
|
||||
ixgbe_bus_speed_33,
|
||||
ixgbe_bus_speed_66,
|
||||
ixgbe_bus_speed_100,
|
||||
ixgbe_bus_speed_120,
|
||||
ixgbe_bus_speed_133,
|
||||
ixgbe_bus_speed_2500,
|
||||
ixgbe_bus_speed_5000,
|
||||
ixgbe_bus_speed_33 = 33,
|
||||
ixgbe_bus_speed_66 = 66,
|
||||
ixgbe_bus_speed_100 = 100,
|
||||
ixgbe_bus_speed_120 = 120,
|
||||
ixgbe_bus_speed_133 = 133,
|
||||
ixgbe_bus_speed_2500 = 2500,
|
||||
ixgbe_bus_speed_5000 = 5000,
|
||||
ixgbe_bus_speed_reserved
|
||||
};
|
||||
|
||||
/* PCI bus widths */
|
||||
enum ixgbe_bus_width {
|
||||
ixgbe_bus_width_unknown = 0,
|
||||
ixgbe_bus_width_pcie_x1,
|
||||
ixgbe_bus_width_pcie_x2,
|
||||
ixgbe_bus_width_pcie_x1 = 1,
|
||||
ixgbe_bus_width_pcie_x2 = 2,
|
||||
ixgbe_bus_width_pcie_x4 = 4,
|
||||
ixgbe_bus_width_pcie_x8 = 8,
|
||||
ixgbe_bus_width_32,
|
||||
ixgbe_bus_width_64,
|
||||
ixgbe_bus_width_32 = 32,
|
||||
ixgbe_bus_width_64 = 64,
|
||||
ixgbe_bus_width_reserved
|
||||
};
|
||||
|
||||
@ -2434,6 +2528,7 @@ struct ixgbe_eeprom_operations {
|
||||
s32 (*write)(struct ixgbe_hw *, u16, u16);
|
||||
s32 (*validate_checksum)(struct ixgbe_hw *, u16 *);
|
||||
s32 (*update_checksum)(struct ixgbe_hw *);
|
||||
u16 (*calc_checksum)(struct ixgbe_hw *);
|
||||
};
|
||||
|
||||
struct ixgbe_mac_operations {
|
||||
@ -2441,12 +2536,14 @@ struct ixgbe_mac_operations {
|
||||
s32 (*reset_hw)(struct ixgbe_hw *);
|
||||
s32 (*start_hw)(struct ixgbe_hw *);
|
||||
s32 (*clear_hw_cntrs)(struct ixgbe_hw *);
|
||||
void (*enable_relaxed_ordering)(struct ixgbe_hw *);
|
||||
enum ixgbe_media_type (*get_media_type)(struct ixgbe_hw *);
|
||||
u32 (*get_supported_physical_layer)(struct ixgbe_hw *);
|
||||
s32 (*get_mac_addr)(struct ixgbe_hw *, u8 *);
|
||||
s32 (*get_san_mac_addr)(struct ixgbe_hw *, u8 *);
|
||||
s32 (*set_san_mac_addr)(struct ixgbe_hw *, u8 *);
|
||||
s32 (*get_device_caps)(struct ixgbe_hw *, u16 *);
|
||||
s32 (*get_wwn_prefix)(struct ixgbe_hw *, u16 *, u16 *);
|
||||
s32 (*stop_adapter)(struct ixgbe_hw *);
|
||||
s32 (*get_bus_info)(struct ixgbe_hw *);
|
||||
void (*set_lan_id)(struct ixgbe_hw *);
|
||||
@ -2458,9 +2555,7 @@ struct ixgbe_mac_operations {
|
||||
void (*release_swfw_sync)(struct ixgbe_hw *, u16);
|
||||
|
||||
/* Link */
|
||||
s32 (*setup_link)(struct ixgbe_hw *);
|
||||
s32 (*setup_link_speed)(struct ixgbe_hw *, ixgbe_link_speed, bool,
|
||||
bool);
|
||||
s32 (*setup_link)(struct ixgbe_hw *, ixgbe_link_speed, bool, bool);
|
||||
s32 (*check_link)(struct ixgbe_hw *, ixgbe_link_speed *, bool *, bool);
|
||||
s32 (*get_link_capabilities)(struct ixgbe_hw *, ixgbe_link_speed *,
|
||||
bool *);
|
||||
@ -2509,6 +2604,8 @@ struct ixgbe_phy_operations {
|
||||
s32 (*read_i2c_eeprom)(struct ixgbe_hw *, u8 , u8 *);
|
||||
s32 (*write_i2c_eeprom)(struct ixgbe_hw *, u8, u8);
|
||||
void (*i2c_bus_clear)(struct ixgbe_hw *);
|
||||
s32 (*check_overtemp)(struct ixgbe_hw *);
|
||||
s32 (*set_low_power_state)(struct ixgbe_hw *);
|
||||
};
|
||||
|
||||
struct ixgbe_eeprom_info {
|
||||
@ -2519,12 +2616,17 @@ struct ixgbe_eeprom_info {
|
||||
u16 address_bits;
|
||||
};
|
||||
|
||||
#define IXGBE_FLAGS_DOUBLE_RESET_REQUIRED 0x01
|
||||
struct ixgbe_mac_info {
|
||||
struct ixgbe_mac_operations ops;
|
||||
enum ixgbe_mac_type type;
|
||||
u8 addr[IXGBE_ETH_LENGTH_OF_ADDRESS];
|
||||
u8 perm_addr[IXGBE_ETH_LENGTH_OF_ADDRESS];
|
||||
u8 san_addr[IXGBE_ETH_LENGTH_OF_ADDRESS];
|
||||
/* prefix for World Wide Node Name (WWNN) */
|
||||
u16 wwnn_prefix;
|
||||
/* prefix for World Wide Port Name (WWPN) */
|
||||
u16 wwpn_prefix;
|
||||
s32 mc_filter_type;
|
||||
u32 mcft_size;
|
||||
u32 vft_size;
|
||||
@ -2537,9 +2639,8 @@ struct ixgbe_mac_info {
|
||||
u32 orig_autoc;
|
||||
u32 orig_autoc2;
|
||||
bool orig_link_settings_stored;
|
||||
bool autoneg;
|
||||
bool autoneg_succeeded;
|
||||
bool autotry_restart;
|
||||
u8 flags;
|
||||
};
|
||||
|
||||
struct ixgbe_phy_info {
|
||||
@ -2553,7 +2654,8 @@ struct ixgbe_phy_info {
|
||||
enum ixgbe_media_type media_type;
|
||||
bool reset_disable;
|
||||
ixgbe_autoneg_advertised autoneg_advertised;
|
||||
bool autoneg_wait_to_complete;
|
||||
enum ixgbe_smart_speed smart_speed;
|
||||
bool smart_speed_active;
|
||||
bool multispeed_fiber;
|
||||
};
|
||||
|
||||
@ -2604,6 +2706,8 @@ struct ixgbe_hw {
|
||||
#define IXGBE_ERR_NO_SAN_ADDR_PTR -22
|
||||
#define IXGBE_ERR_FDIR_REINIT_FAILED -23
|
||||
#define IXGBE_ERR_EEPROM_VERSION -24
|
||||
#define IXGBE_ERR_NO_SPACE -25
|
||||
#define IXGBE_ERR_OVERTEMP -26
|
||||
#define IXGBE_NOT_IMPLEMENTED 0x7FFFFFFF
|
||||
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user