MFC:
- switch over to standard method for initializing cdevs (contributed by scottl@) - break out timer_reclaim_task to be per-port - move msix teardown into separate function - fix bus_setup_intr for msi-x for the multi-port case so that msi-x resources are not corrupted on unload - handle 10/100/1000 base-T media and auto negotiation - bind qset to cpu even for singleq case - white space cleanups - remove recursive PORT_LOCK - move mtu setting to separate function - stop and re-init port when changing mtu - replace all direct references to m_data with calls to mtod - handle attach failure better by not trying to de-initialize taskqueues when they have not been allocated - no longer default to jumbo frames - fix gcc-4.2 signedness compile errors Sponsored by: Chelsio Inc.
This commit is contained in:
parent
5e114508d2
commit
9506266355
@ -486,6 +486,7 @@ dev/cxgb/cxgb_offload.c optional cxgb pci
|
||||
dev/cxgb/cxgb_l2t.c optional cxgb pci
|
||||
dev/cxgb/cxgb_sge.c optional cxgb pci
|
||||
dev/cxgb/common/cxgb_mc5.c optional cxgb pci
|
||||
dev/cxgb/common/cxgb_vsc7323.c optional cxgb pci
|
||||
dev/cxgb/common/cxgb_vsc8211.c optional cxgb pci
|
||||
dev/cxgb/common/cxgb_ael1002.c optional cxgb pci
|
||||
dev/cxgb/common/cxgb_mv88e1xxx.c optional cxgb pci
|
||||
|
@ -9,11 +9,7 @@ modification, are permitted provided that the following conditions are met:
|
||||
1. Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions and the following disclaimer.
|
||||
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
|
||||
3. Neither the name of the Chelsio Corporation nor the names of its
|
||||
2. Neither the name of the Chelsio Corporation nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
@ -34,8 +30,11 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <dev/cxgb/common/cxgb_common.h>
|
||||
#include <dev/cxgb/common/cxgb_regs.h>
|
||||
#ifdef CONFIG_DEFINED
|
||||
#include <cxgb_include.h>
|
||||
#else
|
||||
#include <dev/cxgb/cxgb_include.h>
|
||||
#endif
|
||||
|
||||
enum {
|
||||
AEL100X_TX_DISABLE = 9,
|
||||
@ -278,7 +277,13 @@ static int xaui_direct_get_link_status(struct cphy *phy, int *link_ok,
|
||||
unsigned int status;
|
||||
|
||||
status = t3_read_reg(phy->adapter,
|
||||
XGM_REG(A_XGM_SERDES_STAT0, phy->addr));
|
||||
XGM_REG(A_XGM_SERDES_STAT0, phy->addr)) |
|
||||
t3_read_reg(phy->adapter,
|
||||
XGM_REG(A_XGM_SERDES_STAT1, phy->addr)) |
|
||||
t3_read_reg(phy->adapter,
|
||||
XGM_REG(A_XGM_SERDES_STAT2, phy->addr)) |
|
||||
t3_read_reg(phy->adapter,
|
||||
XGM_REG(A_XGM_SERDES_STAT3, phy->addr));
|
||||
*link_ok = !(status & F_LOWSIG0);
|
||||
}
|
||||
if (speed)
|
||||
@ -324,5 +329,5 @@ static struct cphy_ops xaui_direct_ops = {
|
||||
void t3_xaui_direct_phy_prep(struct cphy *phy, adapter_t *adapter, int phy_addr,
|
||||
const struct mdio_ops *mdio_ops)
|
||||
{
|
||||
cphy_init(phy, adapter, 1, &xaui_direct_ops, mdio_ops);
|
||||
cphy_init(phy, adapter, phy_addr, &xaui_direct_ops, mdio_ops);
|
||||
}
|
||||
|
@ -9,11 +9,7 @@ modification, are permitted provided that the following conditions are met:
|
||||
1. Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions and the following disclaimer.
|
||||
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
|
||||
3. Neither the name of the Chelsio Corporation nor the names of its
|
||||
2. Neither the name of the Chelsio Corporation nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
@ -35,21 +31,26 @@ $FreeBSD$
|
||||
#ifndef __CHELSIO_COMMON_H
|
||||
#define __CHELSIO_COMMON_H
|
||||
|
||||
#ifdef CONFIG_DEFINED
|
||||
#include <cxgb_osdep.h>
|
||||
#else
|
||||
#include <dev/cxgb/cxgb_osdep.h>
|
||||
#endif
|
||||
|
||||
enum {
|
||||
MAX_NPORTS = 2, /* max # of ports */
|
||||
MAX_FRAME_SIZE = 10240, /* max MAC frame size, including header + FCS */
|
||||
MAX_NPORTS = 4,
|
||||
TP_TMR_RES = 200, /* TP timer resolution in usec */
|
||||
MAX_FRAME_SIZE = 10240, /* max MAC frame size, includes header + FCS */
|
||||
EEPROMSIZE = 8192, /* Serial EEPROM size */
|
||||
RSS_TABLE_SIZE = 64, /* size of RSS lookup and mapping tables */
|
||||
TCB_SIZE = 128, /* TCB size */
|
||||
NMTUS = 16, /* size of MTU table */
|
||||
NCCTRL_WIN = 32, /* # of congestion control windows */
|
||||
NTX_SCHED = 8, /* # of HW Tx scheduling queues */
|
||||
TP_TMR_RES = 200, /* TP timer resolution in usec */
|
||||
PROTO_SRAM_LINES = 128, /* size of protocol sram */
|
||||
};
|
||||
|
||||
#define MAX_RX_COALESCING_LEN 16224U
|
||||
#define MAX_RX_COALESCING_LEN 12288U
|
||||
|
||||
enum {
|
||||
PAUSE_RX = 1 << 0,
|
||||
@ -58,7 +59,7 @@ enum {
|
||||
};
|
||||
|
||||
enum {
|
||||
SUPPORTED_IRQ = 1 << 25
|
||||
SUPPORTED_IRQ = 1 << 24
|
||||
};
|
||||
|
||||
enum { /* adapter interrupt-maintained statistics */
|
||||
@ -69,9 +70,33 @@ enum { /* adapter interrupt-maintained statistics */
|
||||
IRQ_NUM_STATS /* keep last */
|
||||
};
|
||||
|
||||
enum {
|
||||
TP_VERSION_MAJOR = 1,
|
||||
TP_VERSION_MINOR = 0,
|
||||
TP_VERSION_MICRO = 44
|
||||
};
|
||||
|
||||
#define S_TP_VERSION_MAJOR 16
|
||||
#define M_TP_VERSION_MAJOR 0xFF
|
||||
#define V_TP_VERSION_MAJOR(x) ((x) << S_TP_VERSION_MAJOR)
|
||||
#define G_TP_VERSION_MAJOR(x) \
|
||||
(((x) >> S_TP_VERSION_MAJOR) & M_TP_VERSION_MAJOR)
|
||||
|
||||
#define S_TP_VERSION_MINOR 8
|
||||
#define M_TP_VERSION_MINOR 0xFF
|
||||
#define V_TP_VERSION_MINOR(x) ((x) << S_TP_VERSION_MINOR)
|
||||
#define G_TP_VERSION_MINOR(x) \
|
||||
(((x) >> S_TP_VERSION_MINOR) & M_TP_VERSION_MINOR)
|
||||
|
||||
#define S_TP_VERSION_MICRO 0
|
||||
#define M_TP_VERSION_MICRO 0xFF
|
||||
#define V_TP_VERSION_MICRO(x) ((x) << S_TP_VERSION_MICRO)
|
||||
#define G_TP_VERSION_MICRO(x) \
|
||||
(((x) >> S_TP_VERSION_MICRO) & M_TP_VERSION_MICRO)
|
||||
|
||||
enum {
|
||||
FW_VERSION_MAJOR = 4,
|
||||
FW_VERSION_MINOR = 0,
|
||||
FW_VERSION_MINOR = 1,
|
||||
FW_VERSION_MICRO = 0
|
||||
};
|
||||
|
||||
@ -116,10 +141,11 @@ struct mdio_ops {
|
||||
};
|
||||
|
||||
struct adapter_info {
|
||||
unsigned char nports; /* # of ports */
|
||||
unsigned char nports0; /* # of ports on channel 0 */
|
||||
unsigned char nports1; /* # of ports on channel 1 */
|
||||
unsigned char phy_base_addr; /* MDIO PHY base address */
|
||||
unsigned char mdien;
|
||||
unsigned char mdiinv;
|
||||
unsigned char mdien:1;
|
||||
unsigned char mdiinv:1;
|
||||
unsigned int gpio_out; /* GPIO output settings */
|
||||
unsigned int gpio_intr; /* GPIO IRQ enable mask */
|
||||
unsigned long caps; /* adapter capabilities */
|
||||
@ -271,11 +297,13 @@ struct tp_params {
|
||||
unsigned int rx_num_pgs; /* # of Rx pages */
|
||||
unsigned int tx_num_pgs; /* # of Tx pages */
|
||||
unsigned int ntimer_qs; /* # of timer queues */
|
||||
unsigned int tre; /* log2 of core clocks per TP tick */
|
||||
unsigned int dack_re; /* DACK timer resolution */
|
||||
};
|
||||
|
||||
struct qset_params { /* SGE queue set parameters */
|
||||
unsigned int polling; /* polling/interrupt service for rspq */
|
||||
unsigned int lro; /* large receive offload */
|
||||
unsigned int coalesce_nsecs; /* irq coalescing timer */
|
||||
unsigned int rspq_size; /* # of entries in response queue */
|
||||
unsigned int fl_size; /* # of entries in regular free list */
|
||||
@ -354,6 +382,7 @@ struct adapter_params {
|
||||
unsigned short b_wnd[NCCTRL_WIN];
|
||||
#endif
|
||||
unsigned int nports; /* # of ethernet ports */
|
||||
unsigned int chan_map; /* bitmap of in-use Tx channels */
|
||||
unsigned int stats_update_period; /* MAC stats accumulation period */
|
||||
unsigned int linkpoll_period; /* link poll period in 0.1s */
|
||||
unsigned int rev; /* chip revision */
|
||||
@ -430,7 +459,10 @@ static inline unsigned int t3_mc7_size(const struct mc7 *p)
|
||||
struct cmac {
|
||||
adapter_t *adapter;
|
||||
unsigned int offset;
|
||||
unsigned int nucast; /* # of address filters for unicast MACs */
|
||||
unsigned char nucast; /* # of address filters for unicast MACs */
|
||||
unsigned char multiport; /* multiple ports connected to this MAC */
|
||||
unsigned char ext_port; /* external MAC port */
|
||||
unsigned char promisc_map; /* which external ports are promiscuous */
|
||||
unsigned int tx_tcnt;
|
||||
unsigned int tx_xcnt;
|
||||
u64 tx_mcnt;
|
||||
@ -538,7 +570,11 @@ struct addr_val_pair {
|
||||
unsigned int val;
|
||||
};
|
||||
|
||||
#ifdef CONFIG_DEFINED
|
||||
#include <cxgb_adapter.h>
|
||||
#else
|
||||
#include <dev/cxgb/cxgb_adapter.h>
|
||||
#endif
|
||||
|
||||
#ifndef PCI_VENDOR_ID_CHELSIO
|
||||
# define PCI_VENDOR_ID_CHELSIO 0x1425
|
||||
@ -585,9 +621,6 @@ static inline unsigned int is_pcie(const adapter_t *adap)
|
||||
}
|
||||
|
||||
void t3_set_reg_field(adapter_t *adap, unsigned int addr, u32 mask, u32 val);
|
||||
void t3_read_indirect(adapter_t *adap, unsigned int addr_reg,
|
||||
unsigned int data_reg, u32 *vals, unsigned int nregs,
|
||||
unsigned int start_idx);
|
||||
void t3_write_regs(adapter_t *adapter, const struct addr_val_pair *p, int n,
|
||||
unsigned int offset);
|
||||
int t3_wait_op_done_val(adapter_t *adapter, int reg, u32 mask, int polarity,
|
||||
@ -623,13 +656,14 @@ int t3_seeprom_write(adapter_t *adapter, u32 addr, u32 data);
|
||||
int t3_seeprom_wp(adapter_t *adapter, int enable);
|
||||
int t3_read_flash(adapter_t *adapter, unsigned int addr, unsigned int nwords,
|
||||
u32 *data, int byte_oriented);
|
||||
int t3_check_tpsram_version(adapter_t *adapter);
|
||||
int t3_check_tpsram(adapter_t *adapter, u8 *tp_ram, unsigned int size);
|
||||
int t3_load_fw(adapter_t *adapter, const u8 *fw_data, unsigned int size);
|
||||
int t3_get_fw_version(adapter_t *adapter, u32 *vers);
|
||||
int t3_check_fw_version(adapter_t *adapter);
|
||||
int t3_init_hw(adapter_t *adapter, u32 fw_params);
|
||||
void mac_prep(struct cmac *mac, adapter_t *adapter, int index);
|
||||
void early_hw_init(adapter_t *adapter, const struct adapter_info *ai);
|
||||
int t3_reset_adapter(adapter_t *adapter);
|
||||
int t3_prep_adapter(adapter_t *adapter, const struct adapter_info *ai, int reset);
|
||||
void t3_led_ready(adapter_t *adapter);
|
||||
void t3_fatal_err(adapter_t *adapter);
|
||||
@ -637,6 +671,7 @@ void t3_set_vlan_accel(adapter_t *adapter, unsigned int ports, int on);
|
||||
void t3_config_rss(adapter_t *adapter, unsigned int rss_config, const u8 *cpus,
|
||||
const u16 *rspq);
|
||||
int t3_read_rss(adapter_t *adapter, u8 *lkup, u16 *map);
|
||||
int t3_set_proto_sram(adapter_t *adap, u8 *data);
|
||||
int t3_mps_set_active_ports(adapter_t *adap, unsigned int port_mask);
|
||||
void t3_port_failover(adapter_t *adapter, int port);
|
||||
void t3_failover_done(adapter_t *adapter, int port);
|
||||
@ -653,7 +688,7 @@ int t3_mac_disable(struct cmac *mac, int which);
|
||||
int t3_mac_set_mtu(struct cmac *mac, unsigned int mtu);
|
||||
int t3_mac_set_rx_mode(struct cmac *mac, struct t3_rx_mode *rm);
|
||||
int t3_mac_set_address(struct cmac *mac, unsigned int idx, u8 addr[6]);
|
||||
int t3_mac_set_num_ucast(struct cmac *mac, int n);
|
||||
int t3_mac_set_num_ucast(struct cmac *mac, unsigned char n);
|
||||
const struct mac_stats *t3_mac_update_stats(struct cmac *mac);
|
||||
int t3_mac_set_speed_duplex_fc(struct cmac *mac, int speed, int duplex,
|
||||
int fc);
|
||||
@ -714,6 +749,16 @@ int t3_sge_read_rspq(adapter_t *adapter, unsigned int id, u32 data[4]);
|
||||
int t3_sge_cqcntxt_op(adapter_t *adapter, unsigned int id, unsigned int op,
|
||||
unsigned int credits);
|
||||
|
||||
int t3_elmr_blk_write(adapter_t *adap, int start, const u32 *vals, int n);
|
||||
int t3_elmr_blk_read(adapter_t *adap, int start, u32 *vals, int n);
|
||||
int t3_vsc7323_init(adapter_t *adap, int nports);
|
||||
int t3_vsc7323_set_speed_fc(adapter_t *adap, int speed, int fc, int port);
|
||||
int t3_vsc7323_set_addr(adapter_t *adap, u8 addr[6], int port);
|
||||
int t3_vsc7323_set_mtu(adapter_t *adap, unsigned int mtu, int port);
|
||||
int t3_vsc7323_enable(adapter_t *adap, int port, int which);
|
||||
int t3_vsc7323_disable(adapter_t *adap, int port, int which);
|
||||
const struct mac_stats *t3_vsc7323_update_stats(struct cmac *mac);
|
||||
|
||||
void t3_mv88e1xxx_phy_prep(struct cphy *phy, adapter_t *adapter, int phy_addr,
|
||||
const struct mdio_ops *mdio_ops);
|
||||
void t3_vsc8211_phy_prep(struct cphy *phy, adapter_t *adapter, int phy_addr,
|
||||
|
@ -9,11 +9,7 @@ modification, are permitted provided that the following conditions are met:
|
||||
1. Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions and the following disclaimer.
|
||||
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
|
||||
3. Neither the name of the Chelsio Corporation nor the names of its
|
||||
2. Neither the name of the Chelsio Corporation nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
|
@ -9,11 +9,7 @@ modification, are permitted provided that the following conditions are met:
|
||||
1. Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions and the following disclaimer.
|
||||
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
|
||||
3. Neither the name of the Chelsio Corporation nor the names of its
|
||||
2. Neither the name of the Chelsio Corporation nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
@ -34,8 +30,13 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#ifdef CONFIG_DEFINED
|
||||
#include <common/cxgb_common.h>
|
||||
#include <common/cxgb_regs.h>
|
||||
#else
|
||||
#include <dev/cxgb/common/cxgb_common.h>
|
||||
#include <dev/cxgb/common/cxgb_regs.h>
|
||||
#endif
|
||||
|
||||
enum {
|
||||
IDT75P52100 = 4,
|
||||
@ -329,9 +330,9 @@ int t3_mc5_init(struct mc5 *mc5, unsigned int nservers, unsigned int nfilters,
|
||||
unsigned int tcam_size = mc5->tcam_size;
|
||||
adapter_t *adap = mc5->adapter;
|
||||
|
||||
if (tcam_size == 0)
|
||||
if (!tcam_size)
|
||||
return 0;
|
||||
|
||||
|
||||
if (nroutes > MAX_ROUTES || nroutes + nservers + nfilters > tcam_size)
|
||||
return -EINVAL;
|
||||
|
||||
|
@ -9,11 +9,7 @@ modification, are permitted provided that the following conditions are met:
|
||||
1. Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions and the following disclaimer.
|
||||
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
|
||||
3. Neither the name of the Chelsio Corporation nor the names of its
|
||||
2. Neither the name of the Chelsio Corporation nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
@ -34,7 +30,11 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <dev/cxgb/common/cxgb_common.h>
|
||||
#ifdef CONFIG_DEFINED
|
||||
#include <cxgb_include.h>
|
||||
#else
|
||||
#include <dev/cxgb/cxgb_include.h>
|
||||
#endif
|
||||
|
||||
/* Marvell PHY interrupt status bits. */
|
||||
#define MV_INTR_JABBER 0x0001
|
||||
|
@ -9,11 +9,7 @@ modification, are permitted provided that the following conditions are met:
|
||||
1. Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions and the following disclaimer.
|
||||
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
|
||||
3. Neither the name of the Chelsio Corporation nor the names of its
|
||||
2. Neither the name of the Chelsio Corporation nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
|
@ -9,11 +9,7 @@ modification, are permitted provided that the following conditions are met:
|
||||
1. Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions and the following disclaimer.
|
||||
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
|
||||
3. Neither the name of the Chelsio Corporation nor the names of its
|
||||
2. Neither the name of the Chelsio Corporation nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
|
@ -9,11 +9,7 @@ modification, are permitted provided that the following conditions are met:
|
||||
1. Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions and the following disclaimer.
|
||||
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
|
||||
3. Neither the name of the Chelsio Corporation nor the names of its
|
||||
2. Neither the name of the Chelsio Corporation nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
|
@ -9,11 +9,7 @@ modification, are permitted provided that the following conditions are met:
|
||||
1. Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions and the following disclaimer.
|
||||
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
|
||||
3. Neither the name of the Chelsio Corporation nor the names of its
|
||||
2. Neither the name of the Chelsio Corporation nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
@ -34,10 +30,16 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <dev/cxgb/common/cxgb_common.h>
|
||||
#include <dev/cxgb/common/cxgb_regs.h>
|
||||
#include <dev/cxgb/common/cxgb_sge_defs.h>
|
||||
#include <dev/cxgb/common/cxgb_firmware_exports.h>
|
||||
|
||||
#ifdef CONFIG_DEFINED
|
||||
#include <cxgb_include.h>
|
||||
#else
|
||||
#include <dev/cxgb/cxgb_include.h>
|
||||
#endif
|
||||
|
||||
#define DENTER() printf("entered %s\n", __FUNCTION__);
|
||||
#define DEXIT() printf("exiting %s\n", __FUNCTION__);
|
||||
|
||||
|
||||
/**
|
||||
* t3_wait_op_done_val - wait until an operation is completed
|
||||
@ -122,7 +124,7 @@ void t3_set_reg_field(adapter_t *adapter, unsigned int addr, u32 mask, u32 val)
|
||||
* Reads registers that are accessed indirectly through an address/data
|
||||
* register pair.
|
||||
*/
|
||||
void t3_read_indirect(adapter_t *adap, unsigned int addr_reg,
|
||||
static void t3_read_indirect(adapter_t *adap, unsigned int addr_reg,
|
||||
unsigned int data_reg, u32 *vals, unsigned int nregs,
|
||||
unsigned int start_idx)
|
||||
{
|
||||
@ -205,7 +207,7 @@ static void mi1_init(adapter_t *adap, const struct adapter_info *ai)
|
||||
t3_write_reg(adap, A_MI1_CFG, val);
|
||||
}
|
||||
|
||||
#define MDIO_ATTEMPTS 10
|
||||
#define MDIO_ATTEMPTS 20
|
||||
|
||||
/*
|
||||
* MI1 read/write operations for direct-addressed PHYs.
|
||||
@ -222,7 +224,7 @@ static int mi1_read(adapter_t *adapter, int phy_addr, int mmd_addr,
|
||||
MDIO_LOCK(adapter);
|
||||
t3_write_reg(adapter, A_MI1_ADDR, addr);
|
||||
t3_write_reg(adapter, A_MI1_OP, V_MDI_OP(2));
|
||||
ret = t3_wait_op_done(adapter, A_MI1_OP, F_BUSY, 0, MDIO_ATTEMPTS, 20);
|
||||
ret = t3_wait_op_done(adapter, A_MI1_OP, F_BUSY, 0, MDIO_ATTEMPTS, 10);
|
||||
if (!ret)
|
||||
*valp = t3_read_reg(adapter, A_MI1_DATA);
|
||||
MDIO_UNLOCK(adapter);
|
||||
@ -242,7 +244,7 @@ static int mi1_write(adapter_t *adapter, int phy_addr, int mmd_addr,
|
||||
t3_write_reg(adapter, A_MI1_ADDR, addr);
|
||||
t3_write_reg(adapter, A_MI1_DATA, val);
|
||||
t3_write_reg(adapter, A_MI1_OP, V_MDI_OP(1));
|
||||
ret = t3_wait_op_done(adapter, A_MI1_OP, F_BUSY, 0, MDIO_ATTEMPTS, 20);
|
||||
ret = t3_wait_op_done(adapter, A_MI1_OP, F_BUSY, 0, MDIO_ATTEMPTS, 10);
|
||||
MDIO_UNLOCK(adapter);
|
||||
return ret;
|
||||
}
|
||||
@ -265,11 +267,11 @@ static int mi1_ext_read(adapter_t *adapter, int phy_addr, int mmd_addr,
|
||||
t3_write_reg(adapter, A_MI1_ADDR, addr);
|
||||
t3_write_reg(adapter, A_MI1_DATA, reg_addr);
|
||||
t3_write_reg(adapter, A_MI1_OP, V_MDI_OP(0));
|
||||
ret = t3_wait_op_done(adapter, A_MI1_OP, F_BUSY, 0, MDIO_ATTEMPTS, 20);
|
||||
ret = t3_wait_op_done(adapter, A_MI1_OP, F_BUSY, 0, MDIO_ATTEMPTS, 10);
|
||||
if (!ret) {
|
||||
t3_write_reg(adapter, A_MI1_OP, V_MDI_OP(3));
|
||||
ret = t3_wait_op_done(adapter, A_MI1_OP, F_BUSY, 0,
|
||||
MDIO_ATTEMPTS, 20);
|
||||
MDIO_ATTEMPTS, 10);
|
||||
if (!ret)
|
||||
*valp = t3_read_reg(adapter, A_MI1_DATA);
|
||||
}
|
||||
@ -287,12 +289,12 @@ static int mi1_ext_write(adapter_t *adapter, int phy_addr, int mmd_addr,
|
||||
t3_write_reg(adapter, A_MI1_ADDR, addr);
|
||||
t3_write_reg(adapter, A_MI1_DATA, reg_addr);
|
||||
t3_write_reg(adapter, A_MI1_OP, V_MDI_OP(0));
|
||||
ret = t3_wait_op_done(adapter, A_MI1_OP, F_BUSY, 0, MDIO_ATTEMPTS, 20);
|
||||
ret = t3_wait_op_done(adapter, A_MI1_OP, F_BUSY, 0, MDIO_ATTEMPTS, 10);
|
||||
if (!ret) {
|
||||
t3_write_reg(adapter, A_MI1_DATA, val);
|
||||
t3_write_reg(adapter, A_MI1_OP, V_MDI_OP(1));
|
||||
ret = t3_wait_op_done(adapter, A_MI1_OP, F_BUSY, 0,
|
||||
MDIO_ATTEMPTS, 20);
|
||||
MDIO_ATTEMPTS, 10);
|
||||
}
|
||||
MDIO_UNLOCK(adapter);
|
||||
return ret;
|
||||
@ -438,27 +440,32 @@ int t3_set_phy_speed_duplex(struct cphy *phy, int speed, int duplex)
|
||||
}
|
||||
|
||||
static struct adapter_info t3_adap_info[] = {
|
||||
{ 2, 0, 0, 0,
|
||||
{ 1, 1, 0, 0, 0,
|
||||
F_GPIO2_OEN | F_GPIO4_OEN |
|
||||
F_GPIO2_OUT_VAL | F_GPIO4_OUT_VAL, F_GPIO3 | F_GPIO5,
|
||||
0,
|
||||
&mi1_mdio_ops, "Chelsio PE9000" },
|
||||
{ 2, 0, 0, 0,
|
||||
{ 1, 1, 0, 0, 0,
|
||||
F_GPIO2_OEN | F_GPIO4_OEN |
|
||||
F_GPIO2_OUT_VAL | F_GPIO4_OUT_VAL, F_GPIO3 | F_GPIO5,
|
||||
0,
|
||||
&mi1_mdio_ops, "Chelsio T302" },
|
||||
{ 1, 0, 0, 0,
|
||||
{ 1, 0, 0, 0, 0,
|
||||
F_GPIO1_OEN | F_GPIO6_OEN | F_GPIO7_OEN | F_GPIO10_OEN |
|
||||
F_GPIO1_OUT_VAL | F_GPIO6_OUT_VAL | F_GPIO10_OUT_VAL, 0,
|
||||
SUPPORTED_10000baseT_Full | SUPPORTED_AUI,
|
||||
&mi1_mdio_ext_ops, "Chelsio T310" },
|
||||
{ 2, 0, 0, 0,
|
||||
{ 1, 1, 0, 0, 0,
|
||||
F_GPIO1_OEN | F_GPIO2_OEN | F_GPIO4_OEN | F_GPIO5_OEN | F_GPIO6_OEN |
|
||||
F_GPIO7_OEN | F_GPIO10_OEN | F_GPIO11_OEN | F_GPIO1_OUT_VAL |
|
||||
F_GPIO5_OUT_VAL | F_GPIO6_OUT_VAL | F_GPIO10_OUT_VAL, 0,
|
||||
SUPPORTED_10000baseT_Full | SUPPORTED_AUI,
|
||||
&mi1_mdio_ext_ops, "Chelsio T320" },
|
||||
{ 4, 0, 0, 0, 0,
|
||||
F_GPIO5_OEN | F_GPIO6_OEN | F_GPIO7_OEN | F_GPIO5_OUT_VAL |
|
||||
F_GPIO6_OUT_VAL | F_GPIO7_OUT_VAL,
|
||||
F_GPIO1 | F_GPIO2 | F_GPIO3 | F_GPIO4, SUPPORTED_AUI,
|
||||
&mi1_mdio_ops, "Chelsio T304" },
|
||||
};
|
||||
|
||||
/*
|
||||
@ -475,7 +482,7 @@ const struct adapter_info *t3_get_adapter_info(unsigned int id)
|
||||
#define CAPS_10G (SUPPORTED_10000baseT_Full | SUPPORTED_AUI)
|
||||
|
||||
static struct port_type_info port_types[] = {
|
||||
{ NULL },
|
||||
{ NULL, 0, NULL },
|
||||
{ t3_ael1002_phy_prep, CAPS_10G | SUPPORTED_FIBRE,
|
||||
"10GBASE-XR" },
|
||||
{ t3_vsc8211_phy_prep, CAPS_1G | SUPPORTED_TP | SUPPORTED_IRQ,
|
||||
@ -646,11 +653,11 @@ static int get_vpd_params(adapter_t *adapter, struct vpd_params *p)
|
||||
return ret;
|
||||
}
|
||||
|
||||
p->cclk = simple_strtoul(vpd.cclk_data, NULL, 10);
|
||||
p->mclk = simple_strtoul(vpd.mclk_data, NULL, 10);
|
||||
p->uclk = simple_strtoul(vpd.uclk_data, NULL, 10);
|
||||
p->mdc = simple_strtoul(vpd.mdc_data, NULL, 10);
|
||||
p->mem_timing = simple_strtoul(vpd.mt_data, NULL, 10);
|
||||
p->cclk = simple_strtoul((char *)vpd.cclk_data, NULL, 10);
|
||||
p->mclk = simple_strtoul((char *)vpd.mclk_data, NULL, 10);
|
||||
p->uclk = simple_strtoul((char *)vpd.uclk_data, NULL, 10);
|
||||
p->mdc = simple_strtoul((char *)vpd.mdc_data, NULL, 10);
|
||||
p->mem_timing = simple_strtoul((char *)vpd.mt_data, NULL, 10);
|
||||
|
||||
/* Old eeproms didn't have port information */
|
||||
if (adapter->params.rev == 0 && !vpd.port0_data[0]) {
|
||||
@ -659,8 +666,10 @@ static int get_vpd_params(adapter_t *adapter, struct vpd_params *p)
|
||||
} else {
|
||||
p->port_type[0] = (u8)hex2int(vpd.port0_data[0]);
|
||||
p->port_type[1] = (u8)hex2int(vpd.port1_data[0]);
|
||||
p->xauicfg[0] = simple_strtoul(vpd.xaui0cfg_data, NULL, 16);
|
||||
p->xauicfg[1] = simple_strtoul(vpd.xaui1cfg_data, NULL, 16);
|
||||
p->port_type[2] = (u8)hex2int(vpd.port2_data[0]);
|
||||
p->port_type[3] = (u8)hex2int(vpd.port3_data[0]);
|
||||
p->xauicfg[0] = simple_strtoul((char *)vpd.xaui0cfg_data, NULL, 16);
|
||||
p->xauicfg[1] = simple_strtoul((char *)vpd.xaui1cfg_data, NULL, 16);
|
||||
}
|
||||
|
||||
for (i = 0; i < 6; i++)
|
||||
@ -850,6 +859,64 @@ static int t3_write_flash(adapter_t *adapter, unsigned int addr,
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* t3_check_tpsram_version - read the tp sram version
|
||||
* @adapter: the adapter
|
||||
*
|
||||
* Reads the protocol sram version from serial eeprom.
|
||||
*/
|
||||
int t3_check_tpsram_version(adapter_t *adapter)
|
||||
{
|
||||
int ret;
|
||||
u32 vers;
|
||||
unsigned int major, minor;
|
||||
|
||||
/* Get version loaded in SRAM */
|
||||
t3_write_reg(adapter, A_TP_EMBED_OP_FIELD0, 0);
|
||||
ret = t3_wait_op_done(adapter, A_TP_EMBED_OP_FIELD0,
|
||||
1, 1, 5, 1);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
vers = t3_read_reg(adapter, A_TP_EMBED_OP_FIELD1);
|
||||
|
||||
major = G_TP_VERSION_MAJOR(vers);
|
||||
minor = G_TP_VERSION_MINOR(vers);
|
||||
|
||||
if (major == TP_VERSION_MAJOR && minor == TP_VERSION_MINOR)
|
||||
return 0;
|
||||
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/**
|
||||
* t3_check_tpsram - check if provided protocol SRAM
|
||||
* is compatible with this driver
|
||||
* @adapter: the adapter
|
||||
* @tp_sram: the firmware image to write
|
||||
* @size: image size
|
||||
*
|
||||
* Checks if an adapter's tp sram is compatible with the driver.
|
||||
* Returns 0 if the versions are compatible, a negative error otherwise.
|
||||
*/
|
||||
int t3_check_tpsram(adapter_t *adapter, u8 *tp_sram, unsigned int size)
|
||||
{
|
||||
u32 csum;
|
||||
unsigned int i;
|
||||
const u32 *p = (const u32 *)tp_sram;
|
||||
|
||||
/* Verify checksum */
|
||||
for (csum = 0, i = 0; i < size / sizeof(csum); i++)
|
||||
csum += ntohl(p[i]);
|
||||
if (csum != 0xffffffff) {
|
||||
CH_ERR(adapter, "corrupted protocol SRAM image, checksum %u\n",
|
||||
csum);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
enum fw_version_type {
|
||||
FW_VERSION_N3,
|
||||
FW_VERSION_T3
|
||||
@ -892,9 +959,9 @@ int t3_check_fw_version(adapter_t *adapter)
|
||||
minor == FW_VERSION_MINOR)
|
||||
return 0;
|
||||
|
||||
CH_ERR(adapter, "found wrong FW version(%u.%u), "
|
||||
"driver needs version %d.%d\n", major, minor,
|
||||
FW_VERSION_MAJOR, FW_VERSION_MINOR);
|
||||
CH_ERR(adapter, "found wrong FW version (%u.%u), "
|
||||
"driver needs version %d.%d\n", major, minor,
|
||||
FW_VERSION_MAJOR, FW_VERSION_MINOR);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@ -924,7 +991,7 @@ static int t3_flash_erase_sectors(adapter_t *adapter, int start, int end)
|
||||
/*
|
||||
* t3_load_fw - download firmware
|
||||
* @adapter: the adapter
|
||||
* @fw_data: the firrware image to write
|
||||
* @fw_data: the firmware image to write
|
||||
* @size: image size
|
||||
*
|
||||
* Write the supplied firmware image to the card's serial flash.
|
||||
@ -939,7 +1006,7 @@ int t3_load_fw(adapter_t *adapter, const u8 *fw_data, unsigned int size)
|
||||
const u32 *p = (const u32 *)fw_data;
|
||||
int ret, addr, fw_sector = FW_FLASH_BOOT_ADDR >> 16;
|
||||
|
||||
if ((size & 3) || (size < FW_MIN_SIZE))
|
||||
if ((size & 3) || size < FW_MIN_SIZE)
|
||||
return -EINVAL;
|
||||
if (size > FW_VERS_ADDR + 8 - FW_FLASH_BOOT_ADDR)
|
||||
return -EFBIG;
|
||||
@ -1018,9 +1085,10 @@ int t3_cim_ctl_blk_read(adapter_t *adap, unsigned int addr, unsigned int n,
|
||||
void t3_link_changed(adapter_t *adapter, int port_id)
|
||||
{
|
||||
int link_ok, speed, duplex, fc;
|
||||
struct cphy *phy = &adapter->port[port_id].phy;
|
||||
struct cmac *mac = &adapter->port[port_id].mac;
|
||||
struct link_config *lc = &adapter->port[port_id].link_config;
|
||||
struct port_info *pi = adap2pinfo(adapter, port_id);
|
||||
struct cphy *phy = &pi->phy;
|
||||
struct cmac *mac = &pi->mac;
|
||||
struct link_config *lc = &pi->link_config;
|
||||
|
||||
phy->ops->get_link_status(phy, &link_ok, &speed, &duplex, &fc);
|
||||
|
||||
@ -1490,8 +1558,12 @@ static void mc7_intr_handler(struct mc7 *mc7)
|
||||
*/
|
||||
static int mac_intr_handler(adapter_t *adap, unsigned int idx)
|
||||
{
|
||||
struct cmac *mac = &adap->port[idx].mac;
|
||||
u32 cause = t3_read_reg(adap, A_XGM_INT_CAUSE + mac->offset);
|
||||
u32 cause;
|
||||
struct cmac *mac;
|
||||
|
||||
idx = idx == 0 ? 0 : adapter_info(adap)->nports0; /* MAC idx -> port */
|
||||
mac = &adap2pinfo(adap, idx)->mac;
|
||||
cause = t3_read_reg(adap, A_XGM_INT_CAUSE + mac->offset);
|
||||
|
||||
if (cause & V_TXFIFO_PRTY_ERR(M_TXFIFO_PRTY_ERR)) {
|
||||
mac->stats.tx_fifo_parity_err++;
|
||||
@ -1527,7 +1599,7 @@ int t3_phy_intr_handler(adapter_t *adapter)
|
||||
u32 i, cause = t3_read_reg(adapter, A_T3DBG_INT_CAUSE);
|
||||
|
||||
for_each_port(adapter, i) {
|
||||
struct port_info *p = &adapter->port[i];
|
||||
struct port_info *p = adap2pinfo(adapter, i);
|
||||
|
||||
mask = gpi - (gpi & (gpi - 1));
|
||||
gpi -= mask;
|
||||
@ -1559,7 +1631,6 @@ int t3_slow_intr_handler(adapter_t *adapter)
|
||||
cause &= adapter->slow_intr_mask;
|
||||
if (!cause)
|
||||
return 0;
|
||||
|
||||
if (cause & F_PCIM0) {
|
||||
if (is_pcie(adapter))
|
||||
pcie_intr_handler(adapter);
|
||||
@ -1650,11 +1721,10 @@ void t3_intr_enable(adapter_t *adapter)
|
||||
adapter_info(adapter)->gpio_intr);
|
||||
t3_write_reg(adapter, A_T3DBG_INT_ENABLE,
|
||||
adapter_info(adapter)->gpio_intr);
|
||||
if (is_pcie(adapter)) {
|
||||
if (is_pcie(adapter))
|
||||
t3_write_reg(adapter, A_PCIE_INT_ENABLE, PCIE_INTR_MASK);
|
||||
} else {
|
||||
else
|
||||
t3_write_reg(adapter, A_PCIX_INT_ENABLE, PCIX_INTR_MASK);
|
||||
}
|
||||
t3_write_reg(adapter, A_PL_INT_ENABLE0, adapter->slow_intr_mask);
|
||||
(void) t3_read_reg(adapter, A_PL_INT_ENABLE0); /* flush */
|
||||
}
|
||||
@ -1722,8 +1792,10 @@ void t3_intr_clear(adapter_t *adapter)
|
||||
*/
|
||||
void t3_port_intr_enable(adapter_t *adapter, int idx)
|
||||
{
|
||||
t3_write_reg(adapter, XGM_REG(A_XGM_INT_ENABLE, idx), XGM_INTR_MASK);
|
||||
adapter->port[idx].phy.ops->intr_enable(&adapter->port[idx].phy);
|
||||
struct port_info *pi = adap2pinfo(adapter, idx);
|
||||
|
||||
t3_write_reg(adapter, A_XGM_INT_ENABLE + pi->mac.offset, XGM_INTR_MASK);
|
||||
pi->phy.ops->intr_enable(&pi->phy);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1736,8 +1808,10 @@ void t3_port_intr_enable(adapter_t *adapter, int idx)
|
||||
*/
|
||||
void t3_port_intr_disable(adapter_t *adapter, int idx)
|
||||
{
|
||||
t3_write_reg(adapter, XGM_REG(A_XGM_INT_ENABLE, idx), 0);
|
||||
adapter->port[idx].phy.ops->intr_disable(&adapter->port[idx].phy);
|
||||
struct port_info *pi = adap2pinfo(adapter, idx);
|
||||
|
||||
t3_write_reg(adapter, A_XGM_INT_ENABLE + pi->mac.offset, 0);
|
||||
pi->phy.ops->intr_disable(&pi->phy);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1750,10 +1824,11 @@ void t3_port_intr_disable(adapter_t *adapter, int idx)
|
||||
*/
|
||||
void t3_port_intr_clear(adapter_t *adapter, int idx)
|
||||
{
|
||||
t3_write_reg(adapter, XGM_REG(A_XGM_INT_CAUSE, idx), 0xffffffff);
|
||||
adapter->port[idx].phy.ops->intr_clear(&adapter->port[idx].phy);
|
||||
}
|
||||
struct port_info *pi = adap2pinfo(adapter, idx);
|
||||
|
||||
t3_write_reg(adapter, A_XGM_INT_CAUSE + pi->mac.offset, 0xffffffff);
|
||||
pi->phy.ops->intr_clear(&pi->phy);
|
||||
}
|
||||
|
||||
/**
|
||||
* t3_sge_write_context - write an SGE context
|
||||
@ -2347,6 +2422,14 @@ static inline void tp_wr_indirect(adapter_t *adap, unsigned int addr, u32 val)
|
||||
t3_write_reg(adap, A_TP_PIO_DATA, val);
|
||||
}
|
||||
|
||||
static void tp_wr_bits_indirect(adapter_t *adap, unsigned int addr,
|
||||
unsigned int mask, unsigned int val)
|
||||
{
|
||||
t3_write_reg(adap, A_TP_PIO_ADDR, addr);
|
||||
val |= t3_read_reg(adap, A_TP_PIO_DATA) & ~mask;
|
||||
t3_write_reg(adap, A_TP_PIO_DATA, val);
|
||||
}
|
||||
|
||||
static void tp_config(adapter_t *adap, const struct tp_params *p)
|
||||
{
|
||||
t3_write_reg(adap, A_TP_GLOBAL_CONFIG, F_TXPACINGENABLE | F_PATHMTU |
|
||||
@ -2363,14 +2446,16 @@ static void tp_config(adapter_t *adap, const struct tp_params *p)
|
||||
F_IPV6ENABLE | F_NICMODE);
|
||||
t3_write_reg(adap, A_TP_TX_RESOURCE_LIMIT, 0x18141814);
|
||||
t3_write_reg(adap, A_TP_PARA_REG4, 0x5050105);
|
||||
t3_set_reg_field(adap, A_TP_PARA_REG6,
|
||||
adap->params.rev > 0 ? F_ENABLEESND : F_T3A_ENABLEESND,
|
||||
0);
|
||||
t3_set_reg_field(adap, A_TP_PARA_REG6, 0,
|
||||
adap->params.rev > 0 ? F_ENABLEESND :
|
||||
F_T3A_ENABLEESND);
|
||||
t3_set_reg_field(adap, A_TP_PC_CONFIG,
|
||||
F_ENABLEEPCMDAFULL | F_ENABLEOCSPIFULL,
|
||||
F_TXDEFERENABLE | F_HEARBEATDACK | F_TXCONGESTIONMODE |
|
||||
F_RXCONGESTIONMODE);
|
||||
F_ENABLEEPCMDAFULL,
|
||||
F_ENABLEOCSPIFULL |F_TXDEFERENABLE | F_HEARBEATDACK |
|
||||
F_TXCONGESTIONMODE | F_RXCONGESTIONMODE);
|
||||
t3_set_reg_field(adap, A_TP_PC_CONFIG2, F_CHDRAFULL, 0);
|
||||
t3_write_reg(adap, A_TP_PROXY_FLOW_CNTL, 1080);
|
||||
t3_write_reg(adap, A_TP_PROXY_FLOW_CNTL, 1000);
|
||||
|
||||
if (adap->params.rev > 0) {
|
||||
tp_wr_indirect(adap, A_TP_EGRESS_CONFIG, F_REWRITEFORCETOSIZE);
|
||||
@ -2384,7 +2469,21 @@ static void tp_config(adapter_t *adap, const struct tp_params *p)
|
||||
t3_write_reg(adap, A_TP_TX_MOD_QUEUE_WEIGHT1, 0);
|
||||
t3_write_reg(adap, A_TP_TX_MOD_QUEUE_WEIGHT0, 0);
|
||||
t3_write_reg(adap, A_TP_MOD_CHANNEL_WEIGHT, 0);
|
||||
t3_write_reg(adap, A_TP_MOD_RATE_LIMIT, 0);
|
||||
t3_write_reg(adap, A_TP_MOD_RATE_LIMIT, 0xf2200000);
|
||||
|
||||
if (adap->params.nports > 2) {
|
||||
t3_set_reg_field(adap, A_TP_PC_CONFIG2, 0,
|
||||
F_ENABLETXPORTFROMDA | F_ENABLERXPORTFROMADDR);
|
||||
tp_wr_bits_indirect(adap, A_TP_QOS_RX_MAP_MODE,
|
||||
V_RXMAPMODE(M_RXMAPMODE), 0);
|
||||
tp_wr_indirect(adap, A_TP_INGRESS_CONFIG, V_BITPOS0(48) |
|
||||
V_BITPOS1(49) | V_BITPOS2(50) | V_BITPOS3(51) |
|
||||
F_ENABLEEXTRACT | F_ENABLEEXTRACTIONSFD |
|
||||
F_ENABLEINSERTION | F_ENABLEINSERTIONSFD);
|
||||
tp_wr_indirect(adap, A_TP_PREAMBLE_MSB, 0xfb000000);
|
||||
tp_wr_indirect(adap, A_TP_PREAMBLE_LSB, 0xd5);
|
||||
tp_wr_indirect(adap, A_TP_INTF_FROM_TX_PKT, F_INTFFROMTXPKT);
|
||||
}
|
||||
}
|
||||
|
||||
/* TCP timer values in ms */
|
||||
@ -2401,7 +2500,7 @@ static void tp_config(adapter_t *adap, const struct tp_params *p)
|
||||
*/
|
||||
static void tp_set_timers(adapter_t *adap, unsigned int core_clk)
|
||||
{
|
||||
unsigned int tre = fls(core_clk / (1000000 / TP_TMR_RES)) - 1;
|
||||
unsigned int tre = adap->params.tp.tre;
|
||||
unsigned int dack_re = adap->params.tp.dack_re;
|
||||
unsigned int tstamp_re = fls(core_clk / 1000); /* 1ms, at least */
|
||||
unsigned int tps = core_clk >> tre;
|
||||
@ -2459,6 +2558,7 @@ int t3_tp_set_coalescing_size(adapter_t *adap, unsigned int size, int psh)
|
||||
val |= F_RXCOALESCEENABLE;
|
||||
if (psh)
|
||||
val |= F_RXCOALESCEPSHEN;
|
||||
size = min(MAX_RX_COALESCING_LEN, size);
|
||||
t3_write_reg(adap, A_TP_PARA_REG2, V_RXCOALESCESIZE(size) |
|
||||
V_MAXRXDATA(MAX_RX_COALESCING_LEN));
|
||||
}
|
||||
@ -2488,11 +2588,10 @@ static void __devinit init_mtus(unsigned short mtus[])
|
||||
* are enabled and still have at least 8 bytes of payload.
|
||||
*/
|
||||
mtus[0] = 88;
|
||||
mtus[1] = 88; /* workaround for silicon starting at 1 */
|
||||
mtus[1] = 88;
|
||||
mtus[2] = 256;
|
||||
mtus[3] = 512;
|
||||
mtus[4] = 576;
|
||||
/* mtus[4] = 808; */
|
||||
mtus[5] = 1024;
|
||||
mtus[6] = 1280;
|
||||
mtus[7] = 1492;
|
||||
@ -2708,6 +2807,33 @@ static void ulp_config(adapter_t *adap, const struct tp_params *p)
|
||||
ulp_region(adap, PBL, m, p->chan_rx_size / 4);
|
||||
t3_write_reg(adap, A_ULPRX_TDDP_TAGMASK, 0xffffffff);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* t3_set_proto_sram - set the contents of the protocol sram
|
||||
* @adapter: the adapter
|
||||
* @data: the protocol image
|
||||
*
|
||||
* Write the contents of the protocol SRAM.
|
||||
*/
|
||||
int t3_set_proto_sram(adapter_t *adap, u8 *data)
|
||||
{
|
||||
int i;
|
||||
u32 *buf = (u32 *)data;
|
||||
|
||||
for (i = 0; i < PROTO_SRAM_LINES; i++) {
|
||||
t3_write_reg(adap, A_TP_EMBED_OP_FIELD5, htobe32(*buf++));
|
||||
t3_write_reg(adap, A_TP_EMBED_OP_FIELD4, htobe32(*buf++));
|
||||
t3_write_reg(adap, A_TP_EMBED_OP_FIELD3, htobe32(*buf++));
|
||||
t3_write_reg(adap, A_TP_EMBED_OP_FIELD2, htobe32(*buf++));
|
||||
t3_write_reg(adap, A_TP_EMBED_OP_FIELD1, htobe32(*buf++));
|
||||
|
||||
t3_write_reg(adap, A_TP_EMBED_OP_FIELD0, i << 1 | 1 << 31);
|
||||
if (t3_wait_op_done(adap, A_TP_EMBED_OP_FIELD0, 1, 1, 5, 1))
|
||||
return -EIO;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
void t3_config_trace_filter(adapter_t *adapter, const struct trace_params *tp,
|
||||
@ -2886,20 +3012,22 @@ int t3_mps_set_active_ports(adapter_t *adap, unsigned int port_mask)
|
||||
}
|
||||
|
||||
/*
|
||||
* Perform the bits of HW initialization that are dependent on the number
|
||||
* of available ports.
|
||||
* Perform the bits of HW initialization that are dependent on the Tx
|
||||
* channels being used.
|
||||
*/
|
||||
static void init_hw_for_avail_ports(adapter_t *adap, int nports)
|
||||
static void chan_init_hw(adapter_t *adap, unsigned int chan_map)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (nports == 1) {
|
||||
if (chan_map != 3) { /* one channel */
|
||||
t3_set_reg_field(adap, A_ULPRX_CTL, F_ROUND_ROBIN, 0);
|
||||
t3_set_reg_field(adap, A_ULPTX_CONFIG, F_CFG_RR_ARB, 0);
|
||||
t3_write_reg(adap, A_MPS_CFG, F_TPRXPORTEN | F_TPTXPORT0EN |
|
||||
F_PORT0ACTIVE | F_ENFORCEPKT);
|
||||
t3_write_reg(adap, A_PM1_TX_CFG, 0xc000c000);
|
||||
} else {
|
||||
t3_write_reg(adap, A_MPS_CFG, F_TPRXPORTEN | F_ENFORCEPKT |
|
||||
(chan_map == 1 ? F_TPTXPORT0EN | F_PORT0ACTIVE :
|
||||
F_TPTXPORT1EN | F_PORT1ACTIVE));
|
||||
t3_write_reg(adap, A_PM1_TX_CFG,
|
||||
chan_map == 1 ? 0xffffffff : 0);
|
||||
} else { /* two channels */
|
||||
t3_set_reg_field(adap, A_ULPRX_CTL, 0, F_ROUND_ROBIN);
|
||||
t3_set_reg_field(adap, A_ULPTX_CONFIG, 0, F_CFG_RR_ARB);
|
||||
t3_write_reg(adap, A_ULPTX_DMA_WEIGHT,
|
||||
@ -3002,9 +3130,9 @@ static int mc7_init(struct mc7 *mc7, unsigned int mc7_clock, int mem_type)
|
||||
adapter_t *adapter = mc7->adapter;
|
||||
const struct mc7_timing_params *p = &mc7_timings[mem_type];
|
||||
|
||||
if (mc7->size == 0)
|
||||
if (!mc7->size)
|
||||
return 0;
|
||||
|
||||
|
||||
val = t3_read_reg(adapter, mc7->offset + A_MC7_CFG);
|
||||
slow = val & F_SLOW;
|
||||
width = G_WIDTH(val);
|
||||
@ -3169,6 +3297,12 @@ int t3_init_hw(adapter_t *adapter, u32 fw_params)
|
||||
else if (calibrate_xgm(adapter))
|
||||
goto out_err;
|
||||
|
||||
if (adapter->params.nports > 2) {
|
||||
t3_mac_reset(&adap2pinfo(adapter, 0)->mac);
|
||||
if ((err = t3_vsc7323_init(adapter, adapter->params.nports)))
|
||||
goto out_err;
|
||||
}
|
||||
|
||||
if (vpd->mclk) {
|
||||
partition_mem(adapter, &adapter->params.tp);
|
||||
|
||||
@ -3197,8 +3331,8 @@ int t3_init_hw(adapter_t *adapter, u32 fw_params)
|
||||
else
|
||||
t3_set_reg_field(adapter, A_PCIX_CFG, 0, F_CLIDECEN);
|
||||
|
||||
t3_write_reg(adapter, A_PM1_RX_CFG, 0xf000f000);
|
||||
init_hw_for_avail_ports(adapter, adapter->params.nports);
|
||||
t3_write_reg(adapter, A_PM1_RX_CFG, 0xffffffff);
|
||||
chan_init_hw(adapter, adapter->params.chan_map);
|
||||
t3_sge_init(adapter, &adapter->params.sge);
|
||||
|
||||
t3_write_reg(adapter, A_CIM_HOST_ACC_DATA, vpd->uclk | fw_params);
|
||||
@ -3213,6 +3347,7 @@ int t3_init_hw(adapter_t *adapter, u32 fw_params)
|
||||
CH_ERR(adapter, "uP initialization timed out\n");
|
||||
goto out_err;
|
||||
}
|
||||
|
||||
err = 0;
|
||||
out_err:
|
||||
return err;
|
||||
@ -3317,8 +3452,16 @@ static void __devinit mc7_prep(adapter_t *adapter, struct mc7 *mc7,
|
||||
void mac_prep(struct cmac *mac, adapter_t *adapter, int index)
|
||||
{
|
||||
mac->adapter = adapter;
|
||||
mac->multiport = adapter->params.nports > 2;
|
||||
|
||||
if (mac->multiport) {
|
||||
mac->ext_port = (unsigned char)index;
|
||||
mac->nucast = 8;
|
||||
index = 0;
|
||||
} else
|
||||
mac->nucast = 1;
|
||||
|
||||
mac->offset = (XGMAC0_1_BASE_ADDR - XGMAC0_0_BASE_ADDR) * index;
|
||||
mac->nucast = 1;
|
||||
|
||||
if (adapter->params.rev == 0 && uses_xaui(adapter)) {
|
||||
t3_write_reg(adapter, A_XGM_SERDES_CTRL + mac->offset,
|
||||
@ -3330,7 +3473,8 @@ void mac_prep(struct cmac *mac, adapter_t *adapter, int index)
|
||||
|
||||
void early_hw_init(adapter_t *adapter, const struct adapter_info *ai)
|
||||
{
|
||||
u32 val = V_PORTSPEED(is_10G(adapter) ? 3 : 2);
|
||||
u32 val = V_PORTSPEED(is_10G(adapter) || adapter->params.nports > 2 ?
|
||||
3 : 2);
|
||||
|
||||
mi1_init(adapter, ai);
|
||||
t3_write_reg(adapter, A_I2C_CFG, /* set for 80KHz */
|
||||
@ -3338,7 +3482,7 @@ void early_hw_init(adapter_t *adapter, const struct adapter_info *ai)
|
||||
t3_write_reg(adapter, A_T3DBG_GPIO_EN,
|
||||
ai->gpio_out | F_GPIO0_OEN | F_GPIO0_OUT_VAL);
|
||||
t3_write_reg(adapter, A_MC5_DB_SERVER_INDEX, 0);
|
||||
|
||||
|
||||
if (adapter->params.rev == 0 || !uses_xaui(adapter))
|
||||
val |= F_ENRGMII;
|
||||
|
||||
@ -3357,9 +3501,9 @@ void early_hw_init(adapter_t *adapter, const struct adapter_info *ai)
|
||||
* Reset the adapter. PCIe cards lose their config space during reset, PCI-X
|
||||
* ones don't.
|
||||
*/
|
||||
int t3_reset_adapter(adapter_t *adapter)
|
||||
static int t3_reset_adapter(adapter_t *adapter)
|
||||
{
|
||||
int i, save_and_restore_pcie =
|
||||
int i, save_and_restore_pcie =
|
||||
adapter->params.rev < T3_REV_B2 && is_pcie(adapter);
|
||||
uint16_t devid = 0;
|
||||
|
||||
@ -3400,7 +3544,8 @@ int __devinit t3_prep_adapter(adapter_t *adapter,
|
||||
get_pci_mode(adapter, &adapter->params.pci);
|
||||
|
||||
adapter->params.info = ai;
|
||||
adapter->params.nports = ai->nports;
|
||||
adapter->params.nports = ai->nports0 + ai->nports1;
|
||||
adapter->params.chan_map = !!ai->nports0 | (!!ai->nports1 << 1);
|
||||
adapter->params.rev = t3_read_reg(adapter, A_PL_REV);
|
||||
adapter->params.linkpoll_period = 0;
|
||||
adapter->params.stats_update_period = is_10G(adapter) ?
|
||||
@ -3409,9 +3554,10 @@ int __devinit t3_prep_adapter(adapter_t *adapter,
|
||||
t3_os_find_pci_capability(adapter, PCI_CAP_ID_VPD);
|
||||
|
||||
ret = get_vpd_params(adapter, &adapter->params.vpd);
|
||||
if (ret < 0)
|
||||
if (ret < 0) {
|
||||
printf("failed to get VPD params\n");
|
||||
return ret;
|
||||
|
||||
}
|
||||
if (reset && t3_reset_adapter(adapter))
|
||||
return -1;
|
||||
|
||||
@ -3424,7 +3570,7 @@ int __devinit t3_prep_adapter(adapter_t *adapter,
|
||||
mc7_prep(adapter, &adapter->pmtx, MC7_PMTX_BASE_ADDR, "PMTX");
|
||||
mc7_prep(adapter, &adapter->cm, MC7_CM_BASE_ADDR, "CM");
|
||||
|
||||
p->nchan = ai->nports;
|
||||
p->nchan = adapter->params.chan_map == 3 ? 2 : 1;
|
||||
p->pmrx_size = t3_mc7_size(&adapter->pmrx);
|
||||
p->pmtx_size = t3_mc7_size(&adapter->pmtx);
|
||||
p->cm_size = t3_mc7_size(&adapter->cm);
|
||||
@ -3436,11 +3582,14 @@ int __devinit t3_prep_adapter(adapter_t *adapter,
|
||||
p->tx_num_pgs = pm_num_pages(p->chan_tx_size, p->tx_pg_size);
|
||||
p->ntimer_qs = p->cm_size >= (128 << 20) ||
|
||||
adapter->params.rev > 0 ? 12 : 6;
|
||||
p->tre = fls(adapter->params.vpd.cclk / (1000 / TP_TMR_RES)) -
|
||||
1;
|
||||
p->dack_re = fls(adapter->params.vpd.cclk / 10) - 1; /* 100us */
|
||||
}
|
||||
|
||||
adapter->params.offload = t3_mc7_size(&adapter->pmrx) &&
|
||||
t3_mc7_size(&adapter->pmtx) &&
|
||||
t3_mc7_size(&adapter->cm);
|
||||
t3_mc7_size(&adapter->pmtx) &&
|
||||
t3_mc7_size(&adapter->cm);
|
||||
|
||||
if (is_offload(adapter)) {
|
||||
adapter->params.mc5.nservers = DEFAULT_NSERVERS;
|
||||
@ -3459,12 +3608,22 @@ int __devinit t3_prep_adapter(adapter_t *adapter,
|
||||
|
||||
for_each_port(adapter, i) {
|
||||
u8 hw_addr[6];
|
||||
struct port_info *p = &adapter->port[i];
|
||||
struct port_info *p = adap2pinfo(adapter, i);
|
||||
|
||||
while (!adapter->params.vpd.port_type[j])
|
||||
while (adapter->params.vpd.port_type[j] == 0) {
|
||||
++j;
|
||||
}
|
||||
if (adapter->params.vpd.port_type[j] > sizeof(port_types)/sizeof(port_types[0])) {
|
||||
printf("bad port type idx=%d\n", adapter->params.vpd.port_type[j]);
|
||||
printf("port types: ");
|
||||
for (i = 0; i < j; i++)
|
||||
printf("port[%d]=%d ", i, adapter->params.vpd.port_type[i]);
|
||||
printf("\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
p->port_type = &port_types[adapter->params.vpd.port_type[j]];
|
||||
p->port_type = &port_types[adapter->params.vpd.port_type[j]];
|
||||
p->port_type->phy_prep(&p->phy, adapter, ai->phy_base_addr + j,
|
||||
ai->mdio_ops);
|
||||
mac_prep(&p->mac, adapter, j);
|
||||
|
@ -9,11 +9,7 @@ modification, are permitted provided that the following conditions are met:
|
||||
1. Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions and the following disclaimer.
|
||||
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
|
||||
3. Neither the name of the Chelsio Corporation nor the names of its
|
||||
2. Neither the name of the Chelsio Corporation nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
|
@ -9,11 +9,7 @@ modification, are permitted provided that the following conditions are met:
|
||||
1. Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions and the following disclaimer.
|
||||
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
|
||||
3. Neither the name of the Chelsio Corporation nor the names of its
|
||||
2. Neither the name of the Chelsio Corporation nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
|
@ -9,11 +9,7 @@ modification, are permitted provided that the following conditions are met:
|
||||
1. Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions and the following disclaimer.
|
||||
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
|
||||
3. Neither the name of the Chelsio Corporation nor the names of its
|
||||
2. Neither the name of the Chelsio Corporation nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
@ -34,7 +30,11 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <dev/cxgb/common/cxgb_common.h>
|
||||
#ifdef CONFIG_DEFINED
|
||||
#include <cxgb_include.h>
|
||||
#else
|
||||
#include <dev/cxgb/cxgb_include.h>
|
||||
#endif
|
||||
|
||||
/* VSC8211 PHY specific registers. */
|
||||
enum {
|
||||
|
@ -1,3 +1,4 @@
|
||||
|
||||
/**************************************************************************
|
||||
|
||||
Copyright (c) 2007, Chelsio Inc.
|
||||
@ -9,11 +10,7 @@ modification, are permitted provided that the following conditions are met:
|
||||
1. Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions and the following disclaimer.
|
||||
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
|
||||
3. Neither the name of the Chelsio Corporation nor the names of its
|
||||
2. Neither the name of the Chelsio Corporation nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
@ -34,8 +31,11 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <dev/cxgb/common/cxgb_common.h>
|
||||
#include <dev/cxgb/common/cxgb_regs.h>
|
||||
#ifdef CONFIG_DEFINED
|
||||
#include <cxgb_include.h>
|
||||
#else
|
||||
#include <dev/cxgb/cxgb_include.h>
|
||||
#endif
|
||||
|
||||
/*
|
||||
* # of exact address filters. The first one is used for the station address,
|
||||
@ -129,8 +129,23 @@ int t3_mac_reset(struct cmac *mac)
|
||||
xaui_serdes_reset(mac);
|
||||
}
|
||||
|
||||
|
||||
if (mac->multiport) {
|
||||
t3_write_reg(adap, A_XGM_RX_MAX_PKT_SIZE + oft,
|
||||
MAX_FRAME_SIZE - 4);
|
||||
t3_set_reg_field(adap, A_XGM_TXFIFO_CFG + oft, 0,
|
||||
F_DISPREAMBLE);
|
||||
t3_set_reg_field(adap, A_XGM_RX_CFG + oft, 0, F_COPYPREAMBLE |
|
||||
F_ENNON802_3PREAMBLE);
|
||||
t3_set_reg_field(adap, A_XGM_TXFIFO_CFG + oft,
|
||||
V_TXFIFOTHRESH(M_TXFIFOTHRESH),
|
||||
V_TXFIFOTHRESH(64));
|
||||
t3_write_reg(adap, A_XGM_TX_CTRL + oft, F_TXEN);
|
||||
t3_write_reg(adap, A_XGM_RX_CTRL + oft, F_RXEN);
|
||||
}
|
||||
|
||||
val = F_MAC_RESET_;
|
||||
if (is_10G(adap))
|
||||
if (is_10G(adap) || mac->multiport)
|
||||
val |= F_PCS_RESET_;
|
||||
else if (uses_xaui(adap))
|
||||
val |= F_PCS_RESET_ | F_XG2G_RESET_;
|
||||
@ -221,9 +236,14 @@ static void set_addr_filter(struct cmac *mac, int idx, const u8 *addr)
|
||||
/* Set one of the station's unicast MAC addresses. */
|
||||
int t3_mac_set_address(struct cmac *mac, unsigned int idx, u8 addr[6])
|
||||
{
|
||||
if (mac->multiport)
|
||||
idx = mac->ext_port + idx * mac->adapter->params.nports;
|
||||
if (idx >= mac->nucast)
|
||||
return -EINVAL;
|
||||
set_addr_filter(mac, idx, addr);
|
||||
if (mac->multiport && idx < mac->adapter->params.nports)
|
||||
t3_vsc7323_set_addr(mac->adapter, addr, idx);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -232,7 +252,7 @@ int t3_mac_set_address(struct cmac *mac, unsigned int idx, u8 addr[6])
|
||||
* unicast addresses. Caller should reload the unicast and multicast addresses
|
||||
* after calling this.
|
||||
*/
|
||||
int t3_mac_set_num_ucast(struct cmac *mac, int n)
|
||||
int t3_mac_set_num_ucast(struct cmac *mac, unsigned char n)
|
||||
{
|
||||
if (n > EXACT_ADDR_FILTERS)
|
||||
return -EINVAL;
|
||||
@ -240,6 +260,28 @@ int t3_mac_set_num_ucast(struct cmac *mac, int n)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void disable_exact_filters(struct cmac *mac)
|
||||
{
|
||||
unsigned int i, reg = mac->offset + A_XGM_RX_EXACT_MATCH_LOW_1;
|
||||
|
||||
for (i = 0; i < EXACT_ADDR_FILTERS; i++, reg += 8) {
|
||||
u32 v = t3_read_reg(mac->adapter, reg);
|
||||
t3_write_reg(mac->adapter, reg, v);
|
||||
}
|
||||
t3_read_reg(mac->adapter, A_XGM_RX_EXACT_MATCH_LOW_1); /* flush */
|
||||
}
|
||||
|
||||
static void enable_exact_filters(struct cmac *mac)
|
||||
{
|
||||
unsigned int i, reg = mac->offset + A_XGM_RX_EXACT_MATCH_HIGH_1;
|
||||
|
||||
for (i = 0; i < EXACT_ADDR_FILTERS; i++, reg += 8) {
|
||||
u32 v = t3_read_reg(mac->adapter, reg);
|
||||
t3_write_reg(mac->adapter, reg, v);
|
||||
}
|
||||
t3_read_reg(mac->adapter, A_XGM_RX_EXACT_MATCH_LOW_1); /* flush */
|
||||
}
|
||||
|
||||
/* Calculate the RX hash filter index of an Ethernet address */
|
||||
static int hash_hw_addr(const u8 *addr)
|
||||
{
|
||||
@ -256,16 +298,18 @@ static int hash_hw_addr(const u8 *addr)
|
||||
|
||||
int t3_mac_set_rx_mode(struct cmac *mac, struct t3_rx_mode *rm)
|
||||
{
|
||||
u32 val, hash_lo, hash_hi;
|
||||
u32 hash_lo, hash_hi;
|
||||
adapter_t *adap = mac->adapter;
|
||||
unsigned int oft = mac->offset;
|
||||
|
||||
val = t3_read_reg(adap, A_XGM_RX_CFG + oft) & ~F_COPYALLFRAMES;
|
||||
if (promisc_rx_mode(rm))
|
||||
val |= F_COPYALLFRAMES;
|
||||
t3_write_reg(adap, A_XGM_RX_CFG + oft, val);
|
||||
mac->promisc_map |= 1 << mac->ext_port;
|
||||
else
|
||||
mac->promisc_map &= ~(1 << mac->ext_port);
|
||||
t3_set_reg_field(adap, A_XGM_RX_CFG + oft, F_COPYALLFRAMES,
|
||||
mac->promisc_map ? F_COPYALLFRAMES : 0);
|
||||
|
||||
if (allmulti_rx_mode(rm))
|
||||
if (allmulti_rx_mode(rm) || mac->multiport)
|
||||
hash_lo = hash_hi = 0xffffffff;
|
||||
else {
|
||||
u8 *addr;
|
||||
@ -290,7 +334,15 @@ int t3_mac_set_rx_mode(struct cmac *mac, struct t3_rx_mode *rm)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int t3_mac_set_mtu(struct cmac *mac, unsigned int mtu)
|
||||
static int rx_fifo_hwm(int mtu)
|
||||
{
|
||||
int hwm;
|
||||
|
||||
hwm = max(MAC_RXFIFO_SIZE - 3 * mtu, (MAC_RXFIFO_SIZE * 38) / 100);
|
||||
return min(hwm, MAC_RXFIFO_SIZE - 8192);
|
||||
}
|
||||
|
||||
int t3_mac_set_mtu(struct cmac *mac, unsigned int mtu)
|
||||
{
|
||||
int hwm, lwm;
|
||||
unsigned int thres, v;
|
||||
@ -301,17 +353,39 @@ int t3_mac_set_mtu(struct cmac *mac, unsigned int mtu)
|
||||
* packet size register includes header, but not FCS.
|
||||
*/
|
||||
mtu += 14;
|
||||
if (mac->multiport)
|
||||
mtu += 8; /* for preamble */
|
||||
if (mtu > MAX_FRAME_SIZE - 4)
|
||||
return -EINVAL;
|
||||
t3_write_reg(adap, A_XGM_RX_MAX_PKT_SIZE + mac->offset, mtu);
|
||||
if (mac->multiport)
|
||||
return t3_vsc7323_set_mtu(adap, mtu - 4, mac->ext_port);
|
||||
|
||||
if (adap->params.rev == T3_REV_B2 &&
|
||||
(t3_read_reg(adap, A_XGM_RX_CTRL + mac->offset) & F_RXEN)) {
|
||||
disable_exact_filters(mac);
|
||||
v = t3_read_reg(adap, A_XGM_RX_CFG + mac->offset);
|
||||
t3_set_reg_field(adap, A_XGM_RX_CFG + mac->offset,
|
||||
F_ENHASHMCAST | F_COPYALLFRAMES, F_DISBCAST);
|
||||
|
||||
/* drain rx FIFO */
|
||||
if (t3_wait_op_done(adap,
|
||||
A_XGM_RX_MAX_PKT_SIZE_ERR_CNT + mac->offset,
|
||||
1 << 31, 1, 20, 5)) {
|
||||
t3_write_reg(adap, A_XGM_RX_CFG + mac->offset, v);
|
||||
enable_exact_filters(mac);
|
||||
return -EIO;
|
||||
}
|
||||
t3_write_reg(adap, A_XGM_RX_MAX_PKT_SIZE + mac->offset, mtu);
|
||||
t3_write_reg(adap, A_XGM_RX_CFG + mac->offset, v);
|
||||
enable_exact_filters(mac);
|
||||
} else
|
||||
t3_write_reg(adap, A_XGM_RX_MAX_PKT_SIZE + mac->offset, mtu);
|
||||
|
||||
/*
|
||||
* Adjust the PAUSE frame watermarks. We always set the LWM, and the
|
||||
* HWM only if flow-control is enabled.
|
||||
*/
|
||||
hwm = max_t(unsigned int, MAC_RXFIFO_SIZE - 3 * mtu,
|
||||
MAC_RXFIFO_SIZE * 38 / 100);
|
||||
hwm = min(hwm, MAC_RXFIFO_SIZE - 8192);
|
||||
hwm = rx_fifo_hwm(mtu);
|
||||
lwm = min(3 * (int) mtu, MAC_RXFIFO_SIZE /4);
|
||||
v = t3_read_reg(adap, A_XGM_RXFIFO_CFG + mac->offset);
|
||||
v &= ~V_RXFIFOPAUSELWM(M_RXFIFOPAUSELWM);
|
||||
@ -319,6 +393,7 @@ int t3_mac_set_mtu(struct cmac *mac, unsigned int mtu)
|
||||
if (G_RXFIFOPAUSEHWM(v))
|
||||
v = (v & ~V_RXFIFOPAUSEHWM(M_RXFIFOPAUSEHWM)) |
|
||||
V_RXFIFOPAUSEHWM(hwm / 8);
|
||||
|
||||
t3_write_reg(adap, A_XGM_RXFIFO_CFG + mac->offset, v);
|
||||
|
||||
/* Adjust the TX FIFO threshold based on the MTU */
|
||||
@ -336,7 +411,7 @@ int t3_mac_set_mtu(struct cmac *mac, unsigned int mtu)
|
||||
*/
|
||||
if (adap->params.rev > 0)
|
||||
t3_write_reg(adap, A_XGM_PAUSE_TIMER + mac->offset,
|
||||
(hwm-lwm) * 4 / 8);
|
||||
(hwm - lwm) * 4 / 8);
|
||||
t3_write_reg(adap, A_XGM_TX_PAUSE_QUANTA + mac->offset,
|
||||
MAC_RXFIFO_SIZE * 4 * 8 / 512);
|
||||
return 0;
|
||||
@ -350,6 +425,8 @@ int t3_mac_set_speed_duplex_fc(struct cmac *mac, int speed, int duplex, int fc)
|
||||
|
||||
if (duplex >= 0 && duplex != DUPLEX_FULL)
|
||||
return -EINVAL;
|
||||
if (mac->multiport)
|
||||
return t3_vsc7323_set_speed_fc(adap, speed, fc, mac->ext_port);
|
||||
if (speed >= 0) {
|
||||
if (speed == SPEED_10)
|
||||
val = V_PORTSPEED(0);
|
||||
@ -365,13 +442,14 @@ int t3_mac_set_speed_duplex_fc(struct cmac *mac, int speed, int duplex, int fc)
|
||||
t3_set_reg_field(adap, A_XGM_PORT_CFG + oft,
|
||||
V_PORTSPEED(M_PORTSPEED), val);
|
||||
}
|
||||
#if 0
|
||||
|
||||
val = t3_read_reg(adap, A_XGM_RXFIFO_CFG + oft);
|
||||
val &= ~V_RXFIFOPAUSEHWM(M_RXFIFOPAUSEHWM);
|
||||
if (fc & PAUSE_TX)
|
||||
val |= V_RXFIFOPAUSEHWM(G_RXFIFOPAUSELWM(val) + 128); /* +1KB */
|
||||
val |= V_RXFIFOPAUSEHWM(rx_fifo_hwm(t3_read_reg(adap,
|
||||
A_XGM_RX_MAX_PKT_SIZE + oft)) / 8);
|
||||
t3_write_reg(adap, A_XGM_RXFIFO_CFG + oft, val);
|
||||
#endif
|
||||
|
||||
t3_set_reg_field(adap, A_XGM_TX_CFG + oft, F_TXPAUSEEN,
|
||||
(fc & PAUSE_RX) ? F_TXPAUSEEN : 0);
|
||||
return 0;
|
||||
@ -384,6 +462,9 @@ int t3_mac_enable(struct cmac *mac, int which)
|
||||
unsigned int oft = mac->offset;
|
||||
struct mac_stats *s = &mac->stats;
|
||||
|
||||
if (mac->multiport)
|
||||
return t3_vsc7323_enable(adap, mac->ext_port, which);
|
||||
|
||||
if (which & MAC_DIRECTION_TX) {
|
||||
t3_write_reg(adap, A_XGM_TX_CTRL + oft, F_TXEN);
|
||||
t3_write_reg(adap, A_TP_PIO_ADDR, A_TP_TX_DROP_CFG_CH0 + idx);
|
||||
@ -416,6 +497,9 @@ int t3_mac_disable(struct cmac *mac, int which)
|
||||
adapter_t *adap = mac->adapter;
|
||||
int val;
|
||||
|
||||
if (mac->multiport)
|
||||
return t3_vsc7323_disable(adap, mac->ext_port, which);
|
||||
|
||||
if (which & MAC_DIRECTION_TX) {
|
||||
t3_write_reg(adap, A_XGM_TX_CTRL + mac->offset, 0);
|
||||
t3_write_reg(adap, A_TP_PIO_ADDR, A_TP_TX_DROP_CFG_CH0 + idx);
|
||||
|
@ -55,8 +55,15 @@ __FBSDID("$FreeBSD$");
|
||||
#include <dev/pci/pcireg.h>
|
||||
#include <dev/pci/pcivar.h>
|
||||
|
||||
#include <dev/cxgb/ulp/toecore/toedev.h>
|
||||
#ifdef CONFIG_DEFINED
|
||||
#include <cxgb_osdep.h>
|
||||
#include <ulp/toecore/toedev.h>
|
||||
#include <sys/mbufq.h>
|
||||
#else
|
||||
#include <dev/cxgb/cxgb_osdep.h>
|
||||
#include <dev/cxgb/sys/mbufq.h>
|
||||
#include <dev/cxgb/ulp/toecore/toedev.h>
|
||||
#endif
|
||||
|
||||
struct adapter;
|
||||
struct sge_qset;
|
||||
@ -79,6 +86,7 @@ struct port_info {
|
||||
uint8_t first_qset;
|
||||
struct taskqueue *tq;
|
||||
struct task start_task;
|
||||
struct task timer_reclaim_task;
|
||||
struct cdev *port_cdev;
|
||||
};
|
||||
|
||||
@ -274,7 +282,6 @@ struct adapter {
|
||||
|
||||
/* Tasks */
|
||||
struct task ext_intr_task;
|
||||
struct task timer_reclaim_task;
|
||||
struct task slow_intr_task;
|
||||
struct task process_responses_task;
|
||||
struct task mr_refresh_task;
|
||||
@ -284,6 +291,7 @@ struct adapter {
|
||||
|
||||
/* Register lock for use by the hardware layer */
|
||||
struct mtx mdio_lock;
|
||||
struct mtx elmer_lock;
|
||||
|
||||
/* Bookkeeping for the hardware layer */
|
||||
struct adapter_params params;
|
||||
@ -316,6 +324,8 @@ struct t3_rx_mode {
|
||||
|
||||
#define MDIO_LOCK(adapter) mtx_lock(&(adapter)->mdio_lock)
|
||||
#define MDIO_UNLOCK(adapter) mtx_unlock(&(adapter)->mdio_lock)
|
||||
#define ELMR_LOCK(adapter) mtx_lock(&(adapter)->elmer_lock)
|
||||
#define ELMR_UNLOCK(adapter) mtx_unlock(&(adapter)->elmer_lock)
|
||||
|
||||
#define PORT_LOCK(port) mtx_lock(&(port)->lock);
|
||||
#define PORT_UNLOCK(port) mtx_unlock(&(port)->lock);
|
||||
@ -410,7 +420,8 @@ void t3_intr_msi(void *data);
|
||||
void t3_intr_msix(void *data);
|
||||
int t3_encap(struct port_info *, struct mbuf **);
|
||||
|
||||
int t3_sge_init_sw(adapter_t *);
|
||||
int t3_sge_init_adapter(adapter_t *);
|
||||
int t3_sge_init_port(struct port_info *);
|
||||
void t3_sge_deinit_sw(adapter_t *);
|
||||
|
||||
void t3_rx_eth_lro(adapter_t *adap, struct sge_rspq *rq, struct mbuf *m,
|
||||
|
@ -9,11 +9,7 @@ modification, are permitted provided that the following conditions are met:
|
||||
1. Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions and the following disclaimer.
|
||||
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
|
||||
3. Neither the name of the Chelsio Corporation nor the names of its
|
||||
2. Neither the name of the Chelsio Corporation nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
@ -38,7 +34,6 @@ $FreeBSD$
|
||||
|
||||
#ifndef CONFIG_DEFINED
|
||||
#define CONFIG_CHELSIO_T3_CORE
|
||||
#define DEFAULT_JUMBO
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
@ -49,19 +49,15 @@ __FBSDID("$FreeBSD$");
|
||||
#include <netinet/in.h>
|
||||
#include <netinet/if_ether.h>
|
||||
|
||||
|
||||
#include <dev/cxgb/common/cxgb_common.h>
|
||||
#include <dev/cxgb/common/cxgb_regs.h>
|
||||
#include <dev/cxgb/common/cxgb_sge_defs.h>
|
||||
#include <dev/cxgb/common/cxgb_t3_cpl.h>
|
||||
#include <dev/cxgb/common/cxgb_firmware_exports.h>
|
||||
#include <dev/cxgb/common/jhash.h>
|
||||
#include <dev/cxgb/cxgb_l2t.h>
|
||||
#include <dev/cxgb/cxgb_offload.h>
|
||||
#ifdef CONFIG_DEFINED
|
||||
#include <cxgb_include.h>
|
||||
#else
|
||||
#include <dev/cxgb/cxgb_include.h>
|
||||
#endif
|
||||
|
||||
#define VLAN_NONE 0xfff
|
||||
#define SDL(s) ((struct sockaddr_dl *)s)
|
||||
#define RT_ENADDR(rt) ((char *)LLADDR(SDL((rt))))
|
||||
#define RT_ENADDR(rt) ((u_char *)LLADDR(SDL((rt))))
|
||||
#define rt_expire rt_rmx.rmx_expire
|
||||
|
||||
struct llinfo_arp {
|
||||
|
@ -31,11 +31,17 @@ $FreeBSD$
|
||||
#ifndef _CHELSIO_L2T_H
|
||||
#define _CHELSIO_L2T_H
|
||||
|
||||
#ifdef CONFIG_DEFINED
|
||||
#include <ulp/toecore/toedev.h>
|
||||
#else
|
||||
#include <dev/cxgb/ulp/toecore/toedev.h>
|
||||
#endif
|
||||
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#if __FreeBSD_version > 700000
|
||||
#include <sys/rwlock.h>
|
||||
#else
|
||||
#else
|
||||
#define rwlock mtx
|
||||
#define rw_wlock(x) mtx_lock((x))
|
||||
#define rw_wunlock(x) mtx_unlock((x))
|
||||
@ -52,6 +58,7 @@ enum {
|
||||
L2T_STATE_UNUSED /* entry not in use */
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* Each L2T entry plays multiple roles. First of all, it keeps state for the
|
||||
* corresponding entry of the HW L2 table and maintains a queue of offload
|
||||
|
@ -49,9 +49,11 @@ __FBSDID("$FreeBSD$");
|
||||
#include <netinet/ip.h>
|
||||
#include <netinet/tcp.h>
|
||||
|
||||
#include <dev/cxgb/cxgb_osdep.h>
|
||||
#include <dev/cxgb/common/cxgb_common.h>
|
||||
#include <dev/cxgb/common/cxgb_t3_cpl.h>
|
||||
#ifdef CONFIG_DEFINED
|
||||
#include <cxgb_include.h>
|
||||
#else
|
||||
#include <dev/cxgb/cxgb_include.h>
|
||||
#endif
|
||||
|
||||
#include <machine/in_cksum.h>
|
||||
|
||||
@ -84,14 +86,12 @@ __FBSDID("$FreeBSD$");
|
||||
static __inline int
|
||||
lro_match(struct mbuf *m, struct ip *ih, struct tcphdr *th)
|
||||
{
|
||||
struct ip *sih = (struct ip *)(m->m_data + IPH_OFFSET);
|
||||
struct ip *sih = (struct ip *)(mtod(m, uint8_t *) + IPH_OFFSET);
|
||||
struct tcphdr *sth = (struct tcphdr *) (sih + 1);
|
||||
|
||||
/*
|
||||
* Why don't we check dest ports?
|
||||
*/
|
||||
return (*(uint32_t *)&th->th_sport == *(uint32_t *)&sth->th_sport &&
|
||||
ih->ip_src.s_addr == ih->ip_src.s_addr &&
|
||||
return (th->th_sport == sth->th_sport &&
|
||||
th->th_dport == sth->th_dport &&
|
||||
ih->ip_src.s_addr == sih->ip_src.s_addr &&
|
||||
ih->ip_dst.s_addr == sih->ip_dst.s_addr);
|
||||
}
|
||||
|
||||
@ -161,7 +161,7 @@ can_lro_tcpsegment(struct tcphdr *th)
|
||||
static __inline void
|
||||
lro_new_session_init(struct t3_lro_session *s, struct mbuf *m)
|
||||
{
|
||||
struct ip *ih = (struct ip *)(m->m_data + IPH_OFFSET);
|
||||
struct ip *ih = (struct ip *)(mtod(m, uint8_t *) + IPH_OFFSET);
|
||||
struct tcphdr *th = (struct tcphdr *) (ih + 1);
|
||||
int ip_len = ntohs(ih->ip_len);
|
||||
|
||||
@ -180,7 +180,7 @@ lro_flush_session(struct sge_qset *qs, struct t3_lro_session *s, struct mbuf *m)
|
||||
{
|
||||
struct lro_state *l = &qs->lro;
|
||||
struct mbuf *sm = s->head;
|
||||
struct ip *ih = (struct ip *)(sm->m_data + IPH_OFFSET);
|
||||
struct ip *ih = (struct ip *)(mtod(sm, uint8_t *) + IPH_OFFSET);
|
||||
|
||||
|
||||
DPRINTF("%s(qs=%p, s=%p, ", __FUNCTION__,
|
||||
@ -250,9 +250,9 @@ static __inline int
|
||||
lro_update_session(struct t3_lro_session *s, struct mbuf *m)
|
||||
{
|
||||
struct mbuf *sm = s->head;
|
||||
struct cpl_rx_pkt *cpl = (struct cpl_rx_pkt *)(sm->m_data + 2);
|
||||
struct cpl_rx_pkt *ncpl = (struct cpl_rx_pkt *)(m->m_data + 2);
|
||||
struct ip *nih = (struct ip *)(m->m_data + IPH_OFFSET);
|
||||
struct cpl_rx_pkt *cpl = (struct cpl_rx_pkt *)(mtod(sm, uint8_t *) + 2);
|
||||
struct cpl_rx_pkt *ncpl = (struct cpl_rx_pkt *)(mtod(m, uint8_t *) + 2);
|
||||
struct ip *nih = (struct ip *)(mtod(m, uint8_t *) + IPH_OFFSET);
|
||||
struct tcphdr *th, *nth = (struct tcphdr *)(nih + 1);
|
||||
uint32_t seq = ntohl(nth->th_seq);
|
||||
int plen, tcpiphlen, olen = (nth->th_off << 2) - sizeof (*nth);
|
||||
@ -268,7 +268,7 @@ lro_update_session(struct t3_lro_session *s, struct mbuf *m)
|
||||
}
|
||||
|
||||
MBUF_HEADER_CHECK(sm);
|
||||
th = (struct tcphdr *)(sm->m_data + IPH_OFFSET + sizeof (struct ip));
|
||||
th = (struct tcphdr *)(mtod(sm, uint8_t *) + IPH_OFFSET + sizeof (struct ip));
|
||||
|
||||
if (olen) {
|
||||
uint32_t *ptr = (uint32_t *)(th + 1);
|
||||
@ -335,7 +335,7 @@ t3_rx_eth_lro(adapter_t *adap, struct sge_rspq *rq, struct mbuf *m,
|
||||
int ethpad, uint32_t rss_hash, uint32_t rss_csum, int lro)
|
||||
{
|
||||
struct sge_qset *qs = rspq_to_qset(rq);
|
||||
struct cpl_rx_pkt *cpl = (struct cpl_rx_pkt *)(m->m_data + ethpad);
|
||||
struct cpl_rx_pkt *cpl = (struct cpl_rx_pkt *)(mtod(m, uint8_t *) + ethpad);
|
||||
struct ether_header *eh = (struct ether_header *)(cpl + 1);
|
||||
struct ip *ih;
|
||||
struct tcphdr *th;
|
||||
|
@ -72,22 +72,18 @@ __FBSDID("$FreeBSD$");
|
||||
#include <dev/pci/pcivar.h>
|
||||
#include <dev/pci/pci_private.h>
|
||||
|
||||
#include <dev/cxgb/cxgb_osdep.h>
|
||||
#include <dev/cxgb/common/cxgb_common.h>
|
||||
#include <dev/cxgb/cxgb_ioctl.h>
|
||||
#include <dev/cxgb/cxgb_offload.h>
|
||||
#include <dev/cxgb/common/cxgb_regs.h>
|
||||
#include <dev/cxgb/common/cxgb_t3_cpl.h>
|
||||
#include <dev/cxgb/common/cxgb_firmware_exports.h>
|
||||
|
||||
#include <dev/cxgb/sys/mvec.h>
|
||||
|
||||
#ifdef CONFIG_DEFINED
|
||||
#include <cxgb_include.h>
|
||||
#else
|
||||
#include <dev/cxgb/cxgb_include.h>
|
||||
#endif
|
||||
|
||||
#ifdef PRIV_SUPPORTED
|
||||
#include <sys/priv.h>
|
||||
#endif
|
||||
|
||||
static int cxgb_setup_msix(adapter_t *, int);
|
||||
static void cxgb_teardown_msix(adapter_t *);
|
||||
static void cxgb_init(void *);
|
||||
static void cxgb_init_locked(struct port_info *);
|
||||
static void cxgb_stop_locked(struct port_info *);
|
||||
@ -116,8 +112,9 @@ static __inline void reg_block_dump(struct adapter *ap, uint8_t *buf, unsigned i
|
||||
static void cxgb_get_regs(adapter_t *sc, struct ifconf_regs *regs, uint8_t *buf);
|
||||
static int cxgb_get_regs_len(void);
|
||||
static int offload_open(struct port_info *pi);
|
||||
#ifdef notyet
|
||||
static int offload_close(struct toedev *tdev);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
static device_method_t cxgb_controller_methods[] = {
|
||||
@ -163,6 +160,17 @@ static driver_t cxgb_port_driver = {
|
||||
};
|
||||
|
||||
static d_ioctl_t cxgb_extension_ioctl;
|
||||
static d_open_t cxgb_extension_open;
|
||||
static d_close_t cxgb_extension_close;
|
||||
|
||||
static struct cdevsw cxgb_cdevsw = {
|
||||
.d_version = D_VERSION,
|
||||
.d_flags = 0,
|
||||
.d_open = cxgb_extension_open,
|
||||
.d_close = cxgb_extension_close,
|
||||
.d_ioctl = cxgb_extension_ioctl,
|
||||
.d_name = "cxgb",
|
||||
};
|
||||
|
||||
static devclass_t cxgb_port_devclass;
|
||||
DRIVER_MODULE(cxgb, cxgbc, cxgb_port_driver, cxgb_port_devclass, 0, 0);
|
||||
@ -234,6 +242,7 @@ struct cxgb_ident {
|
||||
{PCI_VENDOR_ID_CHELSIO, 0x0030, 2, "T3B10"},
|
||||
{PCI_VENDOR_ID_CHELSIO, 0x0031, 3, "T3B20"},
|
||||
{PCI_VENDOR_ID_CHELSIO, 0x0032, 1, "T3B02"},
|
||||
{PCI_VENDOR_ID_CHELSIO, 0x0033, 4, "T3B04"},
|
||||
{0, 0, 0, NULL}
|
||||
};
|
||||
|
||||
@ -271,17 +280,19 @@ cxgb_controller_probe(device_t dev)
|
||||
{
|
||||
const struct adapter_info *ai;
|
||||
char *ports, buf[80];
|
||||
|
||||
int nports;
|
||||
|
||||
ai = cxgb_get_adapter_info(dev);
|
||||
if (ai == NULL)
|
||||
return (ENXIO);
|
||||
|
||||
if (ai->nports == 1)
|
||||
nports = ai->nports0 + ai->nports1;
|
||||
if (nports == 1)
|
||||
ports = "port";
|
||||
else
|
||||
ports = "ports";
|
||||
|
||||
snprintf(buf, sizeof(buf), "%s RNIC, %d %s", ai->desc, ai->nports, ports);
|
||||
snprintf(buf, sizeof(buf), "%s RNIC, %d %s", ai->desc, nports, ports);
|
||||
device_set_desc_copy(dev, buf);
|
||||
return (BUS_PROBE_DEFAULT);
|
||||
}
|
||||
@ -317,7 +328,6 @@ upgrade_fw(adapter_t *sc)
|
||||
static int
|
||||
cxgb_controller_attach(device_t dev)
|
||||
{
|
||||
driver_intr_t *cxgb_intr = NULL;
|
||||
device_t child;
|
||||
const struct adapter_info *ai;
|
||||
struct adapter *sc;
|
||||
@ -347,14 +357,13 @@ cxgb_controller_attach(device_t dev)
|
||||
}
|
||||
|
||||
pci_enable_busmaster(dev);
|
||||
|
||||
/*
|
||||
* Allocate the registers and make them available to the driver.
|
||||
* The registers that we care about for NIC mode are in BAR 0
|
||||
*/
|
||||
sc->regs_rid = PCIR_BAR(0);
|
||||
if ((sc->regs_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
|
||||
&sc->regs_rid, RF_ACTIVE)) == NULL) {
|
||||
(int *)&sc->regs_rid, RF_ACTIVE)) == NULL) {
|
||||
device_printf(dev, "Cannot allocate BAR\n");
|
||||
return (ENXIO);
|
||||
}
|
||||
@ -362,6 +371,7 @@ cxgb_controller_attach(device_t dev)
|
||||
mtx_init(&sc->sge.reg_lock, "SGE reg lock", NULL, MTX_DEF);
|
||||
mtx_init(&sc->lock, "cxgb controller lock", NULL, MTX_DEF);
|
||||
mtx_init(&sc->mdio_lock, "cxgb mdio", NULL, MTX_DEF);
|
||||
mtx_init(&sc->elmer_lock, "cxgb elmer", NULL, MTX_DEF);
|
||||
|
||||
sc->bt = rman_get_bustag(sc->regs_res);
|
||||
sc->bh = rman_get_bushandle(sc->regs_res);
|
||||
@ -369,10 +379,10 @@ cxgb_controller_attach(device_t dev)
|
||||
|
||||
ai = cxgb_get_adapter_info(dev);
|
||||
if (t3_prep_adapter(sc, ai, 1) < 0) {
|
||||
printf("prep adapter failed\n");
|
||||
error = ENODEV;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Allocate the BAR for doing MSI-X. If it succeeds, try to allocate
|
||||
* enough messages for the queue sets. If that fails, try falling
|
||||
* back to MSI. If that fails, then try falling back to the legacy
|
||||
@ -399,7 +409,7 @@ cxgb_controller_attach(device_t dev)
|
||||
sc->msix_regs_res = NULL;
|
||||
} else {
|
||||
sc->flags |= USING_MSIX;
|
||||
cxgb_intr = t3_intr_msix;
|
||||
sc->cxgb_intr = t3_intr_msix;
|
||||
}
|
||||
}
|
||||
|
||||
@ -412,14 +422,14 @@ cxgb_controller_attach(device_t dev)
|
||||
} else {
|
||||
sc->flags |= USING_MSI;
|
||||
sc->irq_rid = 1;
|
||||
cxgb_intr = t3_intr_msi;
|
||||
sc->cxgb_intr = t3_intr_msi;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
if (sc->msi_count == 0) {
|
||||
device_printf(dev, "using line interrupts\n");
|
||||
sc->irq_rid = 0;
|
||||
cxgb_intr = t3b_intr;
|
||||
sc->cxgb_intr = t3b_intr;
|
||||
}
|
||||
|
||||
|
||||
@ -484,7 +494,7 @@ cxgb_controller_attach(device_t dev)
|
||||
sc->params.stats_update_period = 1;
|
||||
|
||||
/* initialize sge private state */
|
||||
t3_sge_init_sw(sc);
|
||||
t3_sge_init_adapter(sc);
|
||||
|
||||
t3_led_ready(sc);
|
||||
|
||||
@ -560,12 +570,13 @@ cxgb_free(struct adapter *sc)
|
||||
}
|
||||
|
||||
bus_generic_detach(sc->dev);
|
||||
|
||||
#ifdef notyet
|
||||
if (is_offload(sc)) {
|
||||
cxgb_adapter_unofld(sc);
|
||||
if (isset(&sc->open_device_map, OFFLOAD_DEVMAP_BIT))
|
||||
offload_close(&sc->tdev);
|
||||
}
|
||||
#endif
|
||||
t3_free_sge_resources(sc);
|
||||
t3_sge_free(sc);
|
||||
|
||||
@ -622,6 +633,28 @@ setup_sge_qsets(adapter_t *sc)
|
||||
return (0);
|
||||
}
|
||||
|
||||
static void
|
||||
cxgb_teardown_msix(adapter_t *sc)
|
||||
{
|
||||
int i, nqsets;
|
||||
|
||||
for (nqsets = i = 0; i < (sc)->params.nports; i++)
|
||||
nqsets += sc->port[i].nqsets;
|
||||
|
||||
for (i = 0; i < nqsets; i++) {
|
||||
if (sc->msix_intr_tag[i] != NULL) {
|
||||
bus_teardown_intr(sc->dev, sc->msix_irq_res[i],
|
||||
sc->msix_intr_tag[i]);
|
||||
sc->msix_intr_tag[i] = NULL;
|
||||
}
|
||||
if (sc->msix_irq_res[i] != NULL) {
|
||||
bus_release_resource(sc->dev, SYS_RES_IRQ,
|
||||
sc->msix_irq_rid[i], sc->msix_irq_res[i]);
|
||||
sc->msix_irq_res[i] = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
cxgb_setup_msix(adapter_t *sc, int msix_count)
|
||||
{
|
||||
@ -643,9 +676,9 @@ cxgb_setup_msix(adapter_t *sc, int msix_count)
|
||||
device_printf(sc->dev, "Cannot set up interrupt\n");
|
||||
return (EINVAL);
|
||||
}
|
||||
for (i = 0, k = 0; i < (sc)->params.nports; ++i) {
|
||||
for (i = k = 0; i < (sc)->params.nports; i++) {
|
||||
nqsets = sc->port[i].nqsets;
|
||||
for (j = 0; j < nqsets; ++j, k++) {
|
||||
for (j = 0; j < nqsets; j++, k++) {
|
||||
struct sge_qset *qs = &sc->sge.qs[k];
|
||||
|
||||
rid = k + 2;
|
||||
@ -659,7 +692,7 @@ cxgb_setup_msix(adapter_t *sc, int msix_count)
|
||||
return (EINVAL);
|
||||
}
|
||||
sc->msix_irq_rid[k] = rid;
|
||||
if (bus_setup_intr(sc->dev, sc->msix_irq_res[j],
|
||||
if (bus_setup_intr(sc->dev, sc->msix_irq_res[k],
|
||||
INTR_MPSAFE|INTR_TYPE_NET,
|
||||
#ifdef INTR_FILTERS
|
||||
NULL,
|
||||
@ -693,17 +726,9 @@ cxgb_port_probe(device_t dev)
|
||||
static int
|
||||
cxgb_makedev(struct port_info *pi)
|
||||
{
|
||||
struct cdevsw *cxgb_cdevsw;
|
||||
|
||||
if ((cxgb_cdevsw = malloc(sizeof(struct cdevsw), M_DEVBUF, M_NOWAIT|M_ZERO)) == NULL)
|
||||
return (ENOMEM);
|
||||
|
||||
cxgb_cdevsw->d_version = D_VERSION;
|
||||
cxgb_cdevsw->d_name = strdup(pi->ifp->if_xname, M_DEVBUF);
|
||||
cxgb_cdevsw->d_ioctl = cxgb_extension_ioctl;
|
||||
|
||||
pi->port_cdev = make_dev(cxgb_cdevsw, 0, UID_ROOT, GID_WHEEL, 0600,
|
||||
pi->ifp->if_xname);
|
||||
pi->port_cdev = make_dev(&cxgb_cdevsw, pi->ifp->if_dunit,
|
||||
UID_ROOT, GID_WHEEL, 0600, pi->ifp->if_xname);
|
||||
|
||||
if (pi->port_cdev == NULL)
|
||||
return (ENOMEM);
|
||||
@ -732,8 +757,7 @@ cxgb_port_attach(device_t dev)
|
||||
{
|
||||
struct port_info *p;
|
||||
struct ifnet *ifp;
|
||||
int media_flags;
|
||||
int err;
|
||||
int err, media_flags;
|
||||
char buf[64];
|
||||
|
||||
p = device_get_softc(dev);
|
||||
@ -768,7 +792,6 @@ cxgb_port_attach(device_t dev)
|
||||
ifp->if_capabilities |= CXGB_CAP;
|
||||
ifp->if_capenable |= CXGB_CAP_ENABLE;
|
||||
ifp->if_hwassist |= (CSUM_TCP | CSUM_UDP | CSUM_IP | CSUM_TSO);
|
||||
ifp->if_baudrate = 100000000;
|
||||
|
||||
ether_ifattach(ifp, p->hw_addr);
|
||||
#ifdef DEFAULT_JUMBO
|
||||
@ -780,21 +803,36 @@ cxgb_port_attach(device_t dev)
|
||||
}
|
||||
ifmedia_init(&p->media, IFM_IMASK, cxgb_media_change,
|
||||
cxgb_media_status);
|
||||
|
||||
if (!strcmp(p->port_type->desc, "10GBASE-CX4"))
|
||||
media_flags = IFM_ETHER | IFM_10G_CX4;
|
||||
else if (!strcmp(p->port_type->desc, "10GBASE-SR"))
|
||||
media_flags = IFM_ETHER | IFM_10G_SR;
|
||||
else if (!strcmp(p->port_type->desc, "10GBASE-XR"))
|
||||
media_flags = IFM_ETHER | IFM_10G_LR;
|
||||
else {
|
||||
|
||||
if (!strcmp(p->port_type->desc, "10GBASE-CX4")) {
|
||||
media_flags = IFM_ETHER | IFM_10G_CX4 | IFM_FDX;
|
||||
} else if (!strcmp(p->port_type->desc, "10GBASE-SR")) {
|
||||
media_flags = IFM_ETHER | IFM_10G_SR | IFM_FDX;
|
||||
} else if (!strcmp(p->port_type->desc, "10GBASE-XR")) {
|
||||
media_flags = IFM_ETHER | IFM_10G_LR | IFM_FDX;
|
||||
} else if (!strcmp(p->port_type->desc, "10/100/1000BASE-T")) {
|
||||
ifmedia_add(&p->media, IFM_ETHER | IFM_10_T, 0, NULL);
|
||||
ifmedia_add(&p->media, IFM_ETHER | IFM_10_T | IFM_FDX,
|
||||
0, NULL);
|
||||
ifmedia_add(&p->media, IFM_ETHER | IFM_100_TX,
|
||||
0, NULL);
|
||||
ifmedia_add(&p->media, IFM_ETHER | IFM_100_TX | IFM_FDX,
|
||||
0, NULL);
|
||||
ifmedia_add(&p->media, IFM_ETHER | IFM_1000_T | IFM_FDX,
|
||||
0, NULL);
|
||||
media_flags = 0;
|
||||
} else {
|
||||
printf("unsupported media type %s\n", p->port_type->desc);
|
||||
return (ENXIO);
|
||||
}
|
||||
|
||||
ifmedia_add(&p->media, media_flags, 0, NULL);
|
||||
ifmedia_add(&p->media, IFM_ETHER | IFM_AUTO, 0, NULL);
|
||||
ifmedia_set(&p->media, media_flags);
|
||||
if (media_flags) {
|
||||
ifmedia_add(&p->media, media_flags, 0, NULL);
|
||||
ifmedia_set(&p->media, media_flags);
|
||||
} else {
|
||||
ifmedia_add(&p->media, IFM_ETHER | IFM_AUTO, 0, NULL);
|
||||
ifmedia_set(&p->media, IFM_ETHER | IFM_AUTO);
|
||||
}
|
||||
|
||||
|
||||
snprintf(buf, sizeof(buf), "cxgb_port_taskq%d", p->port);
|
||||
#ifdef TASKQUEUE_CURRENT
|
||||
@ -806,8 +844,7 @@ cxgb_port_attach(device_t dev)
|
||||
p->tq = taskqueue_create_fast(buf, M_NOWAIT,
|
||||
taskqueue_thread_enqueue, &p->tq);
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
if (p->tq == NULL) {
|
||||
device_printf(dev, "failed to allocate port task queue\n");
|
||||
return (ENOMEM);
|
||||
@ -816,7 +853,8 @@ cxgb_port_attach(device_t dev)
|
||||
device_get_nameunit(dev));
|
||||
TASK_INIT(&p->start_task, 0, cxgb_start_proc, ifp);
|
||||
|
||||
|
||||
t3_sge_init_port(p);
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
@ -828,7 +866,8 @@ cxgb_port_detach(device_t dev)
|
||||
p = device_get_softc(dev);
|
||||
|
||||
PORT_LOCK(p);
|
||||
cxgb_stop_locked(p);
|
||||
if (p->ifp->if_drv_flags & IFF_DRV_RUNNING)
|
||||
cxgb_stop_locked(p);
|
||||
PORT_UNLOCK(p);
|
||||
|
||||
mtx_destroy(&p->lock);
|
||||
@ -841,9 +880,9 @@ cxgb_port_detach(device_t dev)
|
||||
ether_ifdetach(p->ifp);
|
||||
if_free(p->ifp);
|
||||
|
||||
destroy_dev(p->port_cdev);
|
||||
|
||||
|
||||
if (p->port_cdev != NULL)
|
||||
destroy_dev(p->port_cdev);
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
@ -1013,7 +1052,7 @@ cxgb_link_start(struct port_info *p)
|
||||
|
||||
t3_init_rx_mode(&rm, p);
|
||||
t3_mac_reset(mac);
|
||||
t3_mac_set_mtu(mac, ifp->if_mtu + ETHER_HDR_LEN);
|
||||
t3_mac_set_mtu(mac, ifp->if_mtu + ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN);
|
||||
t3_mac_set_address(mac, 0, p->hw_addr);
|
||||
t3_mac_set_rx_mode(mac, &rm);
|
||||
t3_link_start(&p->phy, mac, &p->link_config);
|
||||
@ -1066,7 +1105,7 @@ offload_tx(struct toedev *tdev, struct mbuf *m)
|
||||
critical_enter();
|
||||
ret = t3_offload_tx(tdev, m);
|
||||
critical_exit();
|
||||
return ret;
|
||||
return (ret);
|
||||
}
|
||||
|
||||
static int
|
||||
@ -1141,9 +1180,6 @@ bind_qsets(adapter_t *sc)
|
||||
{
|
||||
int i, j;
|
||||
|
||||
if (singleq)
|
||||
return;
|
||||
|
||||
for (i = 0; i < (sc)->params.nports; ++i) {
|
||||
const struct port_info *pi = adap2pinfo(sc, i);
|
||||
|
||||
@ -1201,13 +1237,12 @@ cxgb_up(struct adapter *sc)
|
||||
}
|
||||
device_printf(sc->dev, "allocated irq_res=%p\n", sc->irq_res);
|
||||
|
||||
if (bus_setup_intr(sc->dev, sc->irq_res, INTR_MPSAFE|INTR_TYPE_NET,
|
||||
if ((err = bus_setup_intr(sc->dev, sc->irq_res, INTR_MPSAFE|INTR_TYPE_NET,
|
||||
#ifdef INTR_FILTERS
|
||||
NULL,
|
||||
#endif
|
||||
sc->cxgb_intr, sc, &sc->intr_tag)) {
|
||||
device_printf(sc->dev, "Cannot set up interrupt\n");
|
||||
err = EINVAL;
|
||||
sc->cxgb_intr, sc, &sc->intr_tag))) {
|
||||
device_printf(sc->dev, "Cannot set up interrupt %d\n", err);
|
||||
goto irq_err;
|
||||
}
|
||||
} else {
|
||||
@ -1235,23 +1270,13 @@ static void
|
||||
cxgb_down(struct adapter *sc)
|
||||
{
|
||||
int i;
|
||||
|
||||
|
||||
t3_sge_stop(sc);
|
||||
ADAPTER_LOCK(sc);
|
||||
t3_intr_disable(sc);
|
||||
ADAPTER_UNLOCK(sc);
|
||||
|
||||
for (i = 0; i < SGE_QSETS; i++) {
|
||||
if (sc->msix_intr_tag[i] != NULL) {
|
||||
bus_teardown_intr(sc->dev, sc->msix_irq_res[i],
|
||||
sc->msix_intr_tag[i]);
|
||||
sc->msix_intr_tag[i] = NULL;
|
||||
}
|
||||
if (sc->msix_irq_res[i] != NULL) {
|
||||
bus_release_resource(sc->dev, SYS_RES_IRQ,
|
||||
sc->msix_irq_rid[i], sc->msix_irq_res[i]);
|
||||
sc->msix_irq_res[i] = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (sc->intr_tag != NULL) {
|
||||
bus_teardown_intr(sc->dev, sc->irq_res, sc->intr_tag);
|
||||
sc->intr_tag = NULL;
|
||||
@ -1263,10 +1288,17 @@ cxgb_down(struct adapter *sc)
|
||||
sc->irq_res);
|
||||
sc->irq_res = NULL;
|
||||
}
|
||||
|
||||
if (sc->flags & USING_MSIX)
|
||||
cxgb_teardown_msix(sc);
|
||||
|
||||
callout_drain(&sc->sge_timer_ch);
|
||||
taskqueue_drain(sc->tq, &sc->slow_intr_task);
|
||||
taskqueue_drain(sc->tq, &sc->timer_reclaim_task);
|
||||
if (sc->tq != NULL)
|
||||
taskqueue_drain(sc->tq, &sc->slow_intr_task);
|
||||
for (i = 0; i < sc->params.nports; i++)
|
||||
if (sc->port[i].tq != NULL)
|
||||
taskqueue_drain(sc->port[i].tq, &sc->port[i].timer_reclaim_task);
|
||||
|
||||
}
|
||||
|
||||
static int
|
||||
@ -1315,13 +1347,14 @@ out:
|
||||
return (err);
|
||||
}
|
||||
|
||||
#ifdef notyet
|
||||
static int
|
||||
offload_close(struct toedev *tdev)
|
||||
{
|
||||
struct adapter *adapter = tdev2adap(tdev);
|
||||
|
||||
if (!isset(&adapter->open_device_map, OFFLOAD_DEVMAP_BIT))
|
||||
return 0;
|
||||
return (0);
|
||||
|
||||
/* Call back all registered clients */
|
||||
cxgb_remove_clients(tdev);
|
||||
@ -1336,8 +1369,9 @@ offload_close(struct toedev *tdev)
|
||||
ADAPTER_UNLOCK(adapter);
|
||||
|
||||
cxgb_offload_deactivate(adapter);
|
||||
return 0;
|
||||
return (0);
|
||||
}
|
||||
#endif
|
||||
|
||||
static void
|
||||
cxgb_init(void *arg)
|
||||
@ -1369,8 +1403,8 @@ cxgb_init_locked(struct port_info *p)
|
||||
t3_intr_clear(sc);
|
||||
|
||||
setbit(&p->adapter->open_device_map, p->port);
|
||||
|
||||
ADAPTER_UNLOCK(p->adapter);
|
||||
|
||||
if (is_offload(sc) && !ofld_disable) {
|
||||
err = offload_open(p);
|
||||
if (err)
|
||||
@ -1378,6 +1412,9 @@ cxgb_init_locked(struct port_info *p)
|
||||
"Could not initialize offload capabilities\n");
|
||||
}
|
||||
cxgb_link_start(p);
|
||||
t3_link_changed(sc, p->port);
|
||||
ifp->if_baudrate = p->link_config.speed * 1000000;
|
||||
|
||||
t3_port_intr_enable(sc, p->port);
|
||||
|
||||
callout_reset(&sc->cxgb_tick_ch, sc->params.stats_update_period * hz,
|
||||
@ -1396,7 +1433,7 @@ cxgb_set_rxmode(struct port_info *p)
|
||||
struct cmac *mac = &p->mac;
|
||||
|
||||
mtx_assert(&p->lock, MA_OWNED);
|
||||
|
||||
|
||||
t3_init_rx_mode(&rm, p);
|
||||
t3_mac_set_rx_mode(mac, &rm);
|
||||
}
|
||||
@ -1408,13 +1445,11 @@ cxgb_stop_locked(struct port_info *p)
|
||||
|
||||
mtx_assert(&p->lock, MA_OWNED);
|
||||
mtx_assert(&p->adapter->lock, MA_NOTOWNED);
|
||||
|
||||
|
||||
ifp = p->ifp;
|
||||
|
||||
t3_port_intr_disable(p->adapter, p->port);
|
||||
PORT_LOCK(p);
|
||||
ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE);
|
||||
PORT_UNLOCK(p);
|
||||
p->phy.ops->power_down(&p->phy, 1);
|
||||
t3_mac_disable(&p->mac, MAC_DIRECTION_TX | MAC_DIRECTION_RX);
|
||||
|
||||
@ -1428,6 +1463,27 @@ cxgb_stop_locked(struct port_info *p)
|
||||
ADAPTER_UNLOCK(p->adapter);
|
||||
}
|
||||
|
||||
static int
|
||||
cxgb_set_mtu(struct port_info *p, int mtu)
|
||||
{
|
||||
struct ifnet *ifp = p->ifp;
|
||||
int error = 0;
|
||||
|
||||
if ((mtu < ETHERMIN) || (mtu > ETHER_MAX_LEN_JUMBO))
|
||||
error = EINVAL;
|
||||
else if (ifp->if_mtu != mtu) {
|
||||
PORT_LOCK(p);
|
||||
ifp->if_mtu = mtu;
|
||||
if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
|
||||
callout_stop(&p->adapter->cxgb_tick_ch);
|
||||
cxgb_stop_locked(p);
|
||||
cxgb_init_locked(p);
|
||||
}
|
||||
PORT_UNLOCK(p);
|
||||
}
|
||||
return (error);
|
||||
}
|
||||
|
||||
static int
|
||||
cxgb_ioctl(struct ifnet *ifp, unsigned long command, caddr_t data)
|
||||
{
|
||||
@ -1442,30 +1498,23 @@ cxgb_ioctl(struct ifnet *ifp, unsigned long command, caddr_t data)
|
||||
*/
|
||||
switch (command) {
|
||||
case SIOCSIFMTU:
|
||||
if ((ifr->ifr_mtu < ETHERMIN) ||
|
||||
(ifr->ifr_mtu > ETHER_MAX_LEN_JUMBO))
|
||||
error = EINVAL;
|
||||
else if (ifp->if_mtu != ifr->ifr_mtu) {
|
||||
PORT_LOCK(p);
|
||||
ifp->if_mtu = ifr->ifr_mtu;
|
||||
t3_mac_set_mtu(&p->mac, ifp->if_mtu + ETHER_HDR_LEN);
|
||||
PORT_UNLOCK(p);
|
||||
}
|
||||
error = cxgb_set_mtu(p, ifr->ifr_mtu);
|
||||
break;
|
||||
case SIOCSIFADDR:
|
||||
case SIOCGIFADDR:
|
||||
PORT_LOCK(p);
|
||||
if (ifa->ifa_addr->sa_family == AF_INET) {
|
||||
ifp->if_flags |= IFF_UP;
|
||||
if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) {
|
||||
cxgb_init(p);
|
||||
}
|
||||
if (!(ifp->if_drv_flags & IFF_DRV_RUNNING))
|
||||
cxgb_init_locked(p);
|
||||
arp_ifinit(ifp, ifa);
|
||||
} else
|
||||
error = ether_ioctl(ifp, command, data);
|
||||
PORT_UNLOCK(p);
|
||||
break;
|
||||
case SIOCSIFFLAGS:
|
||||
PORT_LOCK(p);
|
||||
if (ifp->if_flags & IFF_UP) {
|
||||
PORT_LOCK(p);
|
||||
if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
|
||||
flags = p->if_flags;
|
||||
if (((ifp->if_flags ^ flags) & IFF_PROMISC) ||
|
||||
@ -1475,10 +1524,8 @@ cxgb_ioctl(struct ifnet *ifp, unsigned long command, caddr_t data)
|
||||
} else
|
||||
cxgb_init_locked(p);
|
||||
p->if_flags = ifp->if_flags;
|
||||
PORT_UNLOCK(p);
|
||||
} else {
|
||||
callout_drain(&p->adapter->cxgb_tick_ch);
|
||||
PORT_LOCK(p);
|
||||
callout_stop(&p->adapter->cxgb_tick_ch);
|
||||
if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
|
||||
cxgb_stop_locked(p);
|
||||
} else {
|
||||
@ -1487,10 +1534,8 @@ cxgb_ioctl(struct ifnet *ifp, unsigned long command, caddr_t data)
|
||||
sc->params.stats_update_period * hz,
|
||||
cxgb_tick, sc);
|
||||
}
|
||||
PORT_UNLOCK(p);
|
||||
}
|
||||
|
||||
|
||||
PORT_UNLOCK(p);
|
||||
break;
|
||||
case SIOCSIFMEDIA:
|
||||
case SIOCGIFMEDIA:
|
||||
@ -1535,7 +1580,6 @@ cxgb_ioctl(struct ifnet *ifp, unsigned long command, caddr_t data)
|
||||
error = ether_ioctl(ifp, command, data);
|
||||
break;
|
||||
}
|
||||
|
||||
return (error);
|
||||
}
|
||||
|
||||
@ -1547,7 +1591,7 @@ cxgb_start_tx(struct ifnet *ifp, uint32_t txmax)
|
||||
struct port_info *p = ifp->if_softc;
|
||||
struct mbuf *m0, *m = NULL;
|
||||
int err, in_use_init;
|
||||
|
||||
|
||||
if (!p->link_config.link_ok)
|
||||
return (ENXIO);
|
||||
|
||||
@ -1600,19 +1644,18 @@ cxgb_start_tx(struct ifnet *ifp, uint32_t txmax)
|
||||
|
||||
if (__predict_false(err)) {
|
||||
if (err == ENOMEM) {
|
||||
ifp->if_drv_flags |= IFF_DRV_OACTIVE;
|
||||
IFQ_LOCK(&ifp->if_snd);
|
||||
IFQ_DRV_PREPEND(&ifp->if_snd, m);
|
||||
IFQ_UNLOCK(&ifp->if_snd);
|
||||
}
|
||||
}
|
||||
if (err == 0 && m == NULL) {
|
||||
ifp->if_drv_flags |= IFF_DRV_OACTIVE;
|
||||
return (ENOBUFS);
|
||||
}
|
||||
if ((err == 0) && (txq->size <= txq->in_use + TX_MAX_DESC) &&
|
||||
if (err == 0 && m == NULL)
|
||||
err = ENOBUFS;
|
||||
else if ((err == 0) && (txq->size <= txq->in_use + TX_MAX_DESC) &&
|
||||
(ifp->if_drv_flags & IFF_DRV_OACTIVE) == 0) {
|
||||
ifp->if_drv_flags |= IFF_DRV_OACTIVE;
|
||||
return (ENOSPC);
|
||||
err = ENOSPC;
|
||||
}
|
||||
return (err);
|
||||
}
|
||||
@ -1624,18 +1667,18 @@ cxgb_start_proc(void *arg, int ncount)
|
||||
struct port_info *pi = ifp->if_softc;
|
||||
struct sge_qset *qs;
|
||||
struct sge_txq *txq;
|
||||
int error = 0;
|
||||
int error;
|
||||
|
||||
qs = &pi->adapter->sge.qs[pi->first_qset];
|
||||
txq = &qs->txq[TXQ_ETH];
|
||||
|
||||
while (error == 0) {
|
||||
do {
|
||||
if (desc_reclaimable(txq) > TX_CLEAN_MAX_DESC)
|
||||
taskqueue_enqueue(pi->adapter->tq,
|
||||
&pi->adapter->timer_reclaim_task);
|
||||
&pi->timer_reclaim_task);
|
||||
|
||||
error = cxgb_start_tx(ifp, TX_START_MAX_DESC);
|
||||
}
|
||||
} while (error == 0);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -1651,7 +1694,7 @@ cxgb_start(struct ifnet *ifp)
|
||||
|
||||
if (desc_reclaimable(txq) > TX_CLEAN_MAX_DESC)
|
||||
taskqueue_enqueue(pi->adapter->tq,
|
||||
&pi->adapter->timer_reclaim_task);
|
||||
&pi->timer_reclaim_task);
|
||||
|
||||
err = cxgb_start_tx(ifp, TX_START_MAX_DESC);
|
||||
|
||||
@ -1680,6 +1723,18 @@ cxgb_media_status(struct ifnet *ifp, struct ifmediareq *ifmr)
|
||||
|
||||
ifmr->ifm_status |= IFM_ACTIVE;
|
||||
|
||||
switch (p->link_config.speed) {
|
||||
case 10:
|
||||
ifmr->ifm_active |= IFM_10_T;
|
||||
break;
|
||||
case 100:
|
||||
ifmr->ifm_active |= IFM_100_TX;
|
||||
break;
|
||||
case 1000:
|
||||
ifmr->ifm_active |= IFM_1000_T;
|
||||
break;
|
||||
}
|
||||
|
||||
if (p->link_config.duplex)
|
||||
ifmr->ifm_active |= IFM_FDX;
|
||||
else
|
||||
@ -1726,8 +1781,9 @@ check_link_status(adapter_t *sc)
|
||||
for (i = 0; i < (sc)->params.nports; ++i) {
|
||||
struct port_info *p = &sc->port[i];
|
||||
|
||||
if (!(p->port_type->caps & SUPPORTED_IRQ))
|
||||
if (!(p->port_type->caps & SUPPORTED_IRQ))
|
||||
t3_link_changed(sc, i);
|
||||
p->ifp->if_baudrate = p->link_config.speed * 1000000;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1753,7 +1809,8 @@ check_t3b2_mac(struct adapter *adapter)
|
||||
else if (status == 2) {
|
||||
struct cmac *mac = &p->mac;
|
||||
|
||||
t3_mac_set_mtu(mac, ifp->if_mtu + ETHER_HDR_LEN);
|
||||
t3_mac_set_mtu(mac, ifp->if_mtu + ETHER_HDR_LEN
|
||||
+ ETHER_VLAN_ENCAP_LEN);
|
||||
t3_mac_set_address(mac, 0, p->hw_addr);
|
||||
cxgb_set_rxmode(p);
|
||||
t3_link_start(&p->phy, mac, &p->link_config);
|
||||
@ -1781,9 +1838,9 @@ cxgb_tick(void *arg)
|
||||
* port lock
|
||||
*/
|
||||
ADAPTER_UNLOCK(sc);
|
||||
|
||||
if (p->rev == T3_REV_B2)
|
||||
check_t3b2_mac(sc);
|
||||
|
||||
}
|
||||
|
||||
static int
|
||||
@ -1792,6 +1849,18 @@ in_range(int val, int lo, int hi)
|
||||
return val < 0 || (val <= hi && val >= lo);
|
||||
}
|
||||
|
||||
static int
|
||||
cxgb_extension_open(struct cdev *dev, int flags, int fmp, d_thread_t *td)
|
||||
{
|
||||
return (0);
|
||||
}
|
||||
|
||||
static int
|
||||
cxgb_extension_close(struct cdev *dev, int flags, int fmt, d_thread_t *td)
|
||||
{
|
||||
return (0);
|
||||
}
|
||||
|
||||
static int
|
||||
cxgb_extension_ioctl(struct cdev *dev, unsigned long cmd, caddr_t data,
|
||||
int fflag, struct thread *td)
|
||||
@ -2170,7 +2239,7 @@ cxgb_extension_ioctl(struct cdev *dev, unsigned long cmd, caddr_t data,
|
||||
t3_set_sched_ipg(sc, t->sched, t->class_ipg);
|
||||
if (t->flow_ipg >= 0) {
|
||||
t->flow_ipg *= 1000; /* us -> ns */
|
||||
t3_set_pace_tbl(sc, &t->flow_ipg, t->sched, 1);
|
||||
t3_set_pace_tbl(sc, (uint32_t *)&t->flow_ipg, t->sched, 1);
|
||||
}
|
||||
if (t->mode >= 0) {
|
||||
int bit = 1 << (S_TX_MOD_TIMER_MODE + t->sched);
|
||||
|
@ -1,4 +1,3 @@
|
||||
|
||||
/**************************************************************************
|
||||
|
||||
Copyright (c) 2007, Chelsio Inc.
|
||||
@ -55,14 +54,11 @@ __FBSDID("$FreeBSD$");
|
||||
#include <sys/queue.h>
|
||||
#include <sys/taskqueue.h>
|
||||
|
||||
#include <dev/cxgb/cxgb_osdep.h>
|
||||
#include <dev/cxgb/common/cxgb_common.h>
|
||||
#include <dev/cxgb/cxgb_ioctl.h>
|
||||
#include <dev/cxgb/common/cxgb_regs.h>
|
||||
#include <dev/cxgb/common/cxgb_t3_cpl.h>
|
||||
#include <dev/cxgb/common/cxgb_ctl_defs.h>
|
||||
#include <dev/cxgb/common/cxgb_firmware_exports.h>
|
||||
#include <dev/cxgb/cxgb_offload.h>
|
||||
#ifdef CONFIG_DEFINED
|
||||
#include <cxgb_include.h>
|
||||
#else
|
||||
#include <dev/cxgb/cxgb_include.h>
|
||||
#endif
|
||||
|
||||
#include <net/if_vlan_var.h>
|
||||
#include <net/route.h>
|
||||
@ -529,7 +525,7 @@ cxgb_insert_tid(struct toedev *tdev, struct cxgb_client *client,
|
||||
|
||||
t->tid_tab[tid].client = client;
|
||||
t->tid_tab[tid].ctx = ctx;
|
||||
atomic_add_int(&t->tids_in_use, 1);
|
||||
atomic_add_int((volatile unsigned int *)&t->tids_in_use, 1);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -611,7 +607,7 @@ cxgb_remove_tid(struct toedev *tdev, void *ctx, unsigned int tid)
|
||||
} else
|
||||
cxgb_queue_tid_release(tdev, tid);
|
||||
}
|
||||
atomic_add_int(&t->tids_in_use, -1);
|
||||
atomic_add_int((volatile unsigned int *)&t->tids_in_use, -1);
|
||||
}
|
||||
|
||||
int
|
||||
@ -723,8 +719,14 @@ static int
|
||||
do_hwtid_rpl(struct toedev *dev, struct mbuf *m)
|
||||
{
|
||||
union opcode_tid *p = cplhdr(m);
|
||||
unsigned int hwtid = G_TID(ntohl(p->opcode_tid));
|
||||
unsigned int hwtid;
|
||||
struct toe_tid_entry *toe_tid;
|
||||
|
||||
printf("do_hwtid_rpl m=%p\n", m);
|
||||
return (0);
|
||||
|
||||
|
||||
hwtid = G_TID(ntohl(p->opcode_tid));
|
||||
|
||||
toe_tid = lookup_tid(&(TOE_DATA(dev))->tid_maps, hwtid);
|
||||
if (toe_tid->ctx && toe_tid->client->handlers &&
|
||||
@ -1118,7 +1120,7 @@ process_rx(struct toedev *dev, struct mbuf **m, int n)
|
||||
{
|
||||
while (n--) {
|
||||
struct mbuf *m0 = *m++;
|
||||
unsigned int opcode = G_OPCODE(ntohl(m0->m_pkthdr.csum_data));
|
||||
unsigned int opcode = G_OPCODE(ntohl(m0->m_pkthdr.csum_data));
|
||||
int ret = cpl_handlers[opcode] (dev, m0);
|
||||
|
||||
#if VALIDATE_TID
|
||||
@ -1317,7 +1319,7 @@ init_tid_tabs(struct tid_info *t, unsigned int ntids,
|
||||
t->atid_base = atid_base;
|
||||
t->afree = NULL;
|
||||
t->stids_in_use = t->atids_in_use = 0;
|
||||
atomic_set_int(&t->tids_in_use, 0);
|
||||
atomic_set_int((volatile unsigned int *)&t->tids_in_use, 0);
|
||||
mtx_init(&t->stid_lock, "stid", NULL, MTX_DEF);
|
||||
mtx_init(&t->atid_lock, "atid", NULL, MTX_DEF);
|
||||
|
||||
|
@ -37,12 +37,11 @@ $FreeBSD$
|
||||
#ifndef _CXGB_OFFLOAD_H
|
||||
#define _CXGB_OFFLOAD_H
|
||||
|
||||
|
||||
#include <dev/cxgb/common/cxgb_tcb.h>
|
||||
#include <dev/cxgb/cxgb_l2t.h>
|
||||
|
||||
#include <dev/cxgb/ulp/toecore/toedev.h>
|
||||
#include <dev/cxgb/common/cxgb_t3_cpl.h>
|
||||
#ifdef CONFIG_DEFINED
|
||||
#include <cxgb_include.h>
|
||||
#else
|
||||
#include <dev/cxgb/cxgb_include.h>
|
||||
#endif
|
||||
|
||||
struct adapter;
|
||||
struct cxgb_client;
|
||||
@ -130,7 +129,7 @@ typedef int (*cpl_handler_func)(struct toedev *dev, struct mbuf *m);
|
||||
*/
|
||||
static inline void *cplhdr(struct mbuf *m)
|
||||
{
|
||||
return m->m_data;
|
||||
return mtod(m, uint8_t *);
|
||||
}
|
||||
|
||||
void t3_register_cpl_handler(unsigned int opcode, cpl_handler_func h);
|
||||
|
@ -57,14 +57,12 @@ __FBSDID("$FreeBSD$");
|
||||
|
||||
#include <dev/pci/pcireg.h>
|
||||
#include <dev/pci/pcivar.h>
|
||||
#include <dev/cxgb/common/cxgb_common.h>
|
||||
#include <dev/cxgb/common/cxgb_regs.h>
|
||||
#include <dev/cxgb/common/cxgb_sge_defs.h>
|
||||
#include <dev/cxgb/common/cxgb_t3_cpl.h>
|
||||
#include <dev/cxgb/common/cxgb_firmware_exports.h>
|
||||
#include <dev/cxgb/cxgb_offload.h>
|
||||
|
||||
#include <dev/cxgb/sys/mvec.h>
|
||||
#ifdef CONFIG_DEFINED
|
||||
#include <cxgb_include.h>
|
||||
#else
|
||||
#include <dev/cxgb/cxgb_include.h>
|
||||
#endif
|
||||
|
||||
uint32_t collapse_free = 0;
|
||||
uint32_t mb_free_vec_free = 0;
|
||||
@ -309,7 +307,7 @@ get_imm_packet(adapter_t *sc, const struct rsp_desc *resp, struct mbuf *m, void
|
||||
switch (sopeop) {
|
||||
case RSPQ_SOP_EOP:
|
||||
m->m_len = m->m_pkthdr.len = len;
|
||||
memcpy(m->m_data, resp->imm_data, len);
|
||||
memcpy(mtod(m, uint8_t *), resp->imm_data, len);
|
||||
break;
|
||||
case RSPQ_EOP:
|
||||
memcpy(cl, resp->imm_data, len);
|
||||
@ -668,6 +666,7 @@ static void
|
||||
sge_timer_cb(void *arg)
|
||||
{
|
||||
adapter_t *sc = arg;
|
||||
struct port_info *p;
|
||||
struct sge_qset *qs;
|
||||
struct sge_txq *txq;
|
||||
int i, j;
|
||||
@ -682,11 +681,11 @@ sge_timer_cb(void *arg)
|
||||
refill_rx = ((qs->fl[0].credits < qs->fl[0].size) ||
|
||||
(qs->fl[1].credits < qs->fl[1].size));
|
||||
if (reclaim_eth || reclaim_ofl || refill_rx) {
|
||||
taskqueue_enqueue(sc->tq, &sc->timer_reclaim_task);
|
||||
goto done;
|
||||
p = &sc->port[i];
|
||||
taskqueue_enqueue(p->tq, &p->timer_reclaim_task);
|
||||
break;
|
||||
}
|
||||
}
|
||||
done:
|
||||
callout_reset(&sc->sge_timer_ch, TX_RECLAIM_PERIOD, sge_timer_cb, sc);
|
||||
}
|
||||
|
||||
@ -696,24 +695,33 @@ done:
|
||||
*
|
||||
*/
|
||||
int
|
||||
t3_sge_init_sw(adapter_t *sc)
|
||||
t3_sge_init_adapter(adapter_t *sc)
|
||||
{
|
||||
|
||||
callout_init(&sc->sge_timer_ch, CALLOUT_MPSAFE);
|
||||
callout_reset(&sc->sge_timer_ch, TX_RECLAIM_PERIOD, sge_timer_cb, sc);
|
||||
TASK_INIT(&sc->timer_reclaim_task, 0, sge_timer_reclaim, sc);
|
||||
TASK_INIT(&sc->slow_intr_task, 0, sge_slow_intr_handler, sc);
|
||||
return (0);
|
||||
}
|
||||
|
||||
int
|
||||
t3_sge_init_port(struct port_info *p)
|
||||
{
|
||||
TASK_INIT(&p->timer_reclaim_task, 0, sge_timer_reclaim, p);
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
void
|
||||
t3_sge_deinit_sw(adapter_t *sc)
|
||||
{
|
||||
int i;
|
||||
|
||||
callout_drain(&sc->sge_timer_ch);
|
||||
if (sc->tq) {
|
||||
taskqueue_drain(sc->tq, &sc->timer_reclaim_task);
|
||||
if (sc->tq)
|
||||
taskqueue_drain(sc->tq, &sc->slow_intr_task);
|
||||
}
|
||||
for (i = 0; i < sc->params.nports; i++)
|
||||
if (sc->port[i].tq != NULL)
|
||||
taskqueue_drain(sc->port[i].tq, &sc->port[i].timer_reclaim_task);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -738,38 +746,34 @@ refill_rspq(adapter_t *sc, const struct sge_rspq *q, u_int credits)
|
||||
static void
|
||||
sge_timer_reclaim(void *arg, int ncount)
|
||||
{
|
||||
adapter_t *sc = arg;
|
||||
int i, nqsets = 0;
|
||||
struct port_info *p = arg;
|
||||
int i, nqsets = p->nqsets;
|
||||
adapter_t *sc = p->adapter;
|
||||
struct sge_qset *qs;
|
||||
struct sge_txq *txq;
|
||||
struct mtx *lock;
|
||||
struct mbuf *m_vec[TX_CLEAN_MAX_DESC];
|
||||
int n, reclaimable;
|
||||
/*
|
||||
* XXX assuming these quantities are allowed to change during operation
|
||||
*/
|
||||
for (i = 0; i < sc->params.nports; i++)
|
||||
nqsets += sc->port[i].nqsets;
|
||||
|
||||
for (i = 0; i < nqsets; i++) {
|
||||
qs = &sc->sge.qs[i];
|
||||
txq = &qs->txq[TXQ_ETH];
|
||||
reclaimable = desc_reclaimable(txq);
|
||||
if (reclaimable > 0) {
|
||||
mtx_lock(&txq->lock);
|
||||
mtx_lock(&txq->lock);
|
||||
n = reclaim_completed_tx(sc, txq, TX_CLEAN_MAX_DESC, m_vec);
|
||||
mtx_unlock(&txq->lock);
|
||||
|
||||
for (i = 0; i < n; i++) {
|
||||
for (i = 0; i < n; i++)
|
||||
m_freem_vec(m_vec[i]);
|
||||
}
|
||||
if (qs->port->ifp->if_drv_flags & IFF_DRV_OACTIVE &&
|
||||
|
||||
if (p->ifp->if_drv_flags & IFF_DRV_OACTIVE &&
|
||||
txq->size - txq->in_use >= TX_START_MAX_DESC) {
|
||||
qs->port->ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
|
||||
taskqueue_enqueue(qs->port->tq, &qs->port->start_task);
|
||||
p->ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
|
||||
taskqueue_enqueue(p->tq, &p->start_task);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
txq = &qs->txq[TXQ_OFLD];
|
||||
reclaimable = desc_reclaimable(txq);
|
||||
if (reclaimable > 0) {
|
||||
@ -777,9 +781,8 @@ sge_timer_reclaim(void *arg, int ncount)
|
||||
n = reclaim_completed_tx(sc, txq, TX_CLEAN_MAX_DESC, m_vec);
|
||||
mtx_unlock(&txq->lock);
|
||||
|
||||
for (i = 0; i < n; i++) {
|
||||
for (i = 0; i < n; i++)
|
||||
m_freem_vec(m_vec[i]);
|
||||
}
|
||||
}
|
||||
|
||||
lock = (sc->flags & USING_MSIX) ? &qs->rspq.lock :
|
||||
@ -1097,8 +1100,8 @@ t3_encap(struct port_info *p, struct mbuf **m)
|
||||
struct sge_txq *txq;
|
||||
struct tx_sw_desc *stx;
|
||||
struct txq_state txqs;
|
||||
unsigned int nsegs, ndesc, flits, cntrl, mlen;
|
||||
int err, tso_info = 0;
|
||||
unsigned int ndesc, flits, cntrl, mlen;
|
||||
int nsegs, err, tso_info = 0;
|
||||
|
||||
struct work_request_hdr *wrp;
|
||||
struct tx_sw_desc *txsd;
|
||||
@ -1149,9 +1152,9 @@ t3_encap(struct port_info *p, struct mbuf **m)
|
||||
|
||||
if (__predict_false(m0->m_len < TCPPKTHDRSIZE)) {
|
||||
pkthdr = &tmp[0];
|
||||
m_copydata(m0, 0, TCPPKTHDRSIZE, pkthdr);
|
||||
m_copydata(m0, 0, TCPPKTHDRSIZE, (caddr_t)pkthdr);
|
||||
} else {
|
||||
pkthdr = m0->m_data;
|
||||
pkthdr = mtod(m0, uint8_t *);
|
||||
}
|
||||
|
||||
if (__predict_false(m0->m_flags & M_VLANTAG)) {
|
||||
@ -1180,7 +1183,7 @@ t3_encap(struct port_info *p, struct mbuf **m)
|
||||
m_set_priority(m0, txqs.pidx);
|
||||
|
||||
if (m0->m_len == m0->m_pkthdr.len)
|
||||
memcpy(&txd->flit[2], m0->m_data, mlen);
|
||||
memcpy(&txd->flit[2], mtod(m0, uint8_t *), mlen);
|
||||
else
|
||||
m_copydata(m0, 0, mlen, (caddr_t)&txd->flit[2]);
|
||||
|
||||
@ -1345,7 +1348,7 @@ static int
|
||||
ctrl_xmit(adapter_t *adap, struct sge_txq *q, struct mbuf *m)
|
||||
{
|
||||
int ret;
|
||||
struct work_request_hdr *wrp = (struct work_request_hdr *)m->m_data;
|
||||
struct work_request_hdr *wrp = mtod(m, struct work_request_hdr *);
|
||||
|
||||
if (__predict_false(!immediate(m))) {
|
||||
m_freem(m);
|
||||
@ -1549,6 +1552,9 @@ t3_sge_stop(adapter_t *sc)
|
||||
int i;
|
||||
t3_set_reg_field(sc, A_SG_CONTROL, F_GLOBALENABLE, 0);
|
||||
|
||||
if (sc->tq == NULL)
|
||||
return;
|
||||
|
||||
for (i = 0; i < SGE_QSETS; ++i) {
|
||||
struct sge_qset *qs = &sc->sge.qs[i];
|
||||
|
||||
@ -1716,8 +1722,8 @@ static int
|
||||
ofld_xmit(adapter_t *adap, struct sge_txq *q, struct mbuf *m)
|
||||
{
|
||||
int ret;
|
||||
unsigned int pidx, gen, nsegs;
|
||||
unsigned int ndesc;
|
||||
unsigned int pidx, gen, ndesc;
|
||||
int nsegs;
|
||||
struct mbuf *m_vec[TX_CLEAN_MAX_DESC];
|
||||
bus_dma_segment_t segs[TX_MAX_SEGS];
|
||||
int i, cleaned;
|
||||
@ -2107,12 +2113,12 @@ err:
|
||||
void
|
||||
t3_rx_eth(struct port_info *pi, struct sge_rspq *rq, struct mbuf *m, int ethpad)
|
||||
{
|
||||
struct cpl_rx_pkt *cpl = (struct cpl_rx_pkt *)(m->m_data + ethpad);
|
||||
struct cpl_rx_pkt *cpl = (struct cpl_rx_pkt *)(mtod(m, uint8_t *) + ethpad);
|
||||
struct ifnet *ifp = pi->ifp;
|
||||
|
||||
DPRINTF("rx_eth m=%p m->m_data=%p p->iff=%d\n", m, m->m_data, cpl->iff);
|
||||
DPRINTF("rx_eth m=%p m->m_data=%p p->iff=%d\n", m, mtod(m, uint8_t *), cpl->iff);
|
||||
if (&pi->adapter->port[cpl->iff] != pi)
|
||||
panic("bad port index %d m->m_data=%p\n", cpl->iff, m->m_data);
|
||||
panic("bad port index %d m->m_data=%p\n", cpl->iff, mtod(m, uint8_t *));
|
||||
|
||||
if ((ifp->if_capenable & IFCAP_RXCSUM) && !cpl->fragment &&
|
||||
cpl->csum_valid && cpl->csum == 0xffff) {
|
||||
@ -2132,7 +2138,7 @@ t3_rx_eth(struct port_info *pi, struct sge_rspq *rq, struct mbuf *m, int ethpad)
|
||||
#endif
|
||||
|
||||
m->m_pkthdr.rcvif = ifp;
|
||||
m->m_pkthdr.header = m->m_data + sizeof(*cpl) + ethpad;
|
||||
m->m_pkthdr.header = mtod(m, uint8_t *) + sizeof(*cpl) + ethpad;
|
||||
m_explode(m);
|
||||
/*
|
||||
* adjust after conversion to mbuf chain
|
||||
@ -2217,7 +2223,6 @@ done:
|
||||
return (ret);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* handle_rsp_cntrl_info - handles control information in a response
|
||||
* @qs: the queue set corresponding to the response
|
||||
@ -2241,7 +2246,7 @@ handle_rsp_cntrl_info(struct sge_qset *qs, uint32_t flags)
|
||||
qs->txq[TXQ_ETH].processed += credits;
|
||||
if (desc_reclaimable(&qs->txq[TXQ_ETH]) > TX_START_MAX_DESC)
|
||||
taskqueue_enqueue(qs->port->adapter->tq,
|
||||
&qs->port->adapter->timer_reclaim_task);
|
||||
&qs->port->timer_reclaim_task);
|
||||
}
|
||||
|
||||
credits = G_RSPD_TXQ2_CR(flags);
|
||||
@ -2363,8 +2368,8 @@ process_responses(adapter_t *adap, struct sge_qset *qs, int budget)
|
||||
}
|
||||
|
||||
if (eop) {
|
||||
prefetch(rspq->m->m_data);
|
||||
prefetch(rspq->m->m_data + L1_CACHE_BYTES);
|
||||
prefetch(mtod(rspq->m, uint8_t *));
|
||||
prefetch(mtod(rspq->m, uint8_t *) + L1_CACHE_BYTES);
|
||||
|
||||
if (eth) {
|
||||
t3_rx_eth_lro(adap, rspq, rspq->m, ethpad,
|
||||
@ -2390,7 +2395,6 @@ process_responses(adapter_t *adap, struct sge_qset *qs, int budget)
|
||||
}
|
||||
--budget_left;
|
||||
}
|
||||
|
||||
|
||||
deliver_partial_bundle(&adap->tdev, rspq, offload_mbufs, ngathered);
|
||||
t3_lro_flush(adap, qs, &qs->lro);
|
||||
@ -2522,9 +2526,8 @@ t3_lro_enable(SYSCTL_HANDLER_ARGS)
|
||||
enabled = sc->sge.qs[0].lro.enabled;
|
||||
err = sysctl_handle_int(oidp, &enabled, arg2, req);
|
||||
|
||||
if (err != 0) {
|
||||
if (err != 0)
|
||||
return (err);
|
||||
}
|
||||
if (enabled == sc->sge.qs[0].lro.enabled)
|
||||
return (0);
|
||||
|
||||
@ -2532,9 +2535,8 @@ t3_lro_enable(SYSCTL_HANDLER_ARGS)
|
||||
for (j = 0; j < sc->port[i].nqsets; j++)
|
||||
nqsets++;
|
||||
|
||||
for (i = 0; i < nqsets; i++) {
|
||||
for (i = 0; i < nqsets; i++)
|
||||
sc->sge.qs[i].lro.enabled = enabled;
|
||||
}
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
@ -29,6 +29,9 @@ $FreeBSD$
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
#ifndef CXGB_MBUFQ_H_
|
||||
#define CXGB_MBUFQ_H_
|
||||
|
||||
struct mbuf_head {
|
||||
struct mbuf *head;
|
||||
struct mbuf *tail;
|
||||
@ -84,3 +87,5 @@ mbufq_peek(struct mbuf_head *l)
|
||||
{
|
||||
return (l->head);
|
||||
}
|
||||
|
||||
#endif /* CXGB_MBUFQ_H_ */
|
||||
|
@ -49,7 +49,7 @@ struct mbuf_iovec {
|
||||
uint16_t mi_flags; /* per-cluster flags */
|
||||
uint16_t mi_len; /* length of cluster */
|
||||
uint32_t mi_offset; /* data offsets into cluster */
|
||||
uint8_t *mi_base; /* pointers to cluster */
|
||||
caddr_t mi_base; /* pointers to cluster */
|
||||
volatile uint32_t *mi_refcnt; /* refcnt for cluster*/
|
||||
#ifdef __i386__
|
||||
void *mi_args; /* for sf_buf */
|
||||
@ -149,7 +149,7 @@ m_iovinit(struct mbuf *m)
|
||||
}
|
||||
|
||||
static __inline void
|
||||
m_iovappend(struct mbuf *m, uint8_t *cl, int size, int len, int offset)
|
||||
m_iovappend(struct mbuf *m, caddr_t cl, int size, int len, int offset)
|
||||
{
|
||||
struct mbuf_vec *mv = mtomv(m);
|
||||
struct mbuf_iovec *iov;
|
||||
@ -160,7 +160,7 @@ m_iovappend(struct mbuf *m, uint8_t *cl, int size, int len, int offset)
|
||||
panic("invalid flags in %s", __func__);
|
||||
|
||||
if (mv->mv_count == 0)
|
||||
m->m_data = cl + offset;
|
||||
m->m_data = (caddr_t)(cl + offset);
|
||||
|
||||
iov = &mv->mv_vec[idx];
|
||||
iov->mi_flags = m_gettype(size);
|
||||
|
@ -41,8 +41,11 @@ __FBSDID("$FreeBSD$");
|
||||
#include <sys/sf_buf.h>
|
||||
|
||||
#include <machine/bus.h>
|
||||
#include <dev/cxgb/cxgb_osdep.h>
|
||||
#include <dev/cxgb/sys/mvec.h>
|
||||
#ifdef CONFIG_DEFINED
|
||||
#include <cxgb_include.h>
|
||||
#else
|
||||
#include <dev/cxgb/cxgb_include.h>
|
||||
#endif
|
||||
|
||||
#include <vm/vm.h>
|
||||
#include <vm/vm_page.h>
|
||||
@ -66,7 +69,7 @@ int
|
||||
_m_explode(struct mbuf *m)
|
||||
{
|
||||
int i, offset, type, first, len;
|
||||
uint8_t *cl;
|
||||
caddr_t cl;
|
||||
struct mbuf *m0, *head = NULL;
|
||||
struct mbuf_vec *mv;
|
||||
|
||||
@ -230,7 +233,7 @@ m_setiovec(struct mbuf_iovec *mi, struct mbuf *m, struct mbuf_ext *extvec, int *
|
||||
} else {
|
||||
KASSERT(m->m_len < 256, ("mbuf too large len=%d",
|
||||
m->m_len));
|
||||
mi->mi_base = (uint8_t *)m;
|
||||
mi->mi_base = (caddr_t)m;
|
||||
mi->mi_refcnt = NULL;
|
||||
mi->mi_offset =
|
||||
(m->m_data - (caddr_t)m);
|
||||
@ -332,7 +335,7 @@ mb_free_vec(struct mbuf *m)
|
||||
DPRINTF("count=%d len=%d\n", mv->mv_count, m->m_len);
|
||||
for (i = mv->mv_first; i < mv->mv_count; i++) {
|
||||
uma_zone_t zone = NULL;
|
||||
volatile int *refcnt = mv->mv_vec[i].mi_refcnt;
|
||||
volatile unsigned int *refcnt = mv->mv_vec[i].mi_refcnt;
|
||||
int type = mbuf_vec_get_type(mv, i);
|
||||
void *cl = mv->mv_vec[i].mi_base;
|
||||
|
||||
|
@ -1,483 +0,0 @@
|
||||
/**************************************************************************
|
||||
|
||||
Copyright (c) 2007, Chelsio Inc.
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions and the following disclaimer.
|
||||
|
||||
2. Neither the name of the Chelsio Corporation nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
$FreeBSD$
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
begin 644 t3fw-4.0.0.bin.gz
|
||||
M'XL("'+5*D8``W0S9G<M-"XP+C`N8FEN`.R\"UQ35]HOO+,32+*S0RX$#,@E
|
||||
M"0%V[E%;+ZVU:)W:5N<5V]IA:J=E3+#J:+4=6ZU:000:[A$1$R"`U"O>B&6L
|
||||
M%MMNT"(J;1%:JX9P4>NE"EYJ;S/*_IZU`];VG9G?>[[?^9WO?.>\T;7WVFNO
|
||||
MR[/6>B[_9ZVU2<5XV`4,D\H9AE!A&):*/87U87@6QL?0W8%Q,*P78T,-1+&I
|
||||
M4Z<FH><+&"?LES@O2<7IO9\/A[L*2ZFF,>SB*.S;45C_**QF%+9Y%(9CM!J_
|
||||
M-(J#8\VJ.`);3(68QEE-XQXRC1MO&C<Q[C$.Y&A2T59X81F'6<9)+>-4EG'6
|
||||
MP`L-(0V421R')8Z3)HY3);*ON#@F9SI#F4X2QS:HY$S'`U%ZU`95)D3:0YE3
|
||||
M**$]C#D5SIRBK5^K@N9Q4C$%;VP05,V1X?#_S5$*_C1%T!B2SWOBK5$7X=6;
|
||||
M$_HQ5'M+&--"6_%$/!4+NI^%-PG>WV1;IT^HUJFRU-F:96."VQYO^U,J)LM)
|
||||
M;IA=9HV;R%LVYCN-D;0Q?CGS01R1L7@"'YK:H-(8D]BJWZ='<\U!;"W>4,:[
|
||||
M025CO(04^^_??__^5_Q`3KO^;8;3HZ3,C\2_?!U[-Q`N8,%;_F6<H3$4_GF\
|
||||
M^4P@WGPF$!>NAGMO+'.B#>)9*I9&3L8%3+8"W2%D7<#D/ZE`>"!$0?PNND-0
|
||||
M7<!"E>@.82+$4=I$"$D0'X_N$&9`'*7-@)`,\:?0'<)+$$=I+T%(A7@*ND-8
|
||||
M!'&4M@C"4HC/1W<(!1!':05#<0?<G1!V#\5W#\6WP+U=A7'K`W%N?2"NR/K?
|
||||
M,YYJ"<13+8'XZ[S_K^*_YM&7M;',%S28*A7P13O$5P3H?;X&\FM[P>:@`K',
|
||||
MT8LJ[+F;D`YC_DH#Y/TRP$O--R&.[D=C[PYBF(1AD(T*@I`$(0/#(KH9!NO>
|
||||
M\_&-R?#\,&J4!J,(6:SH?2J&+67IP(09+-/_A,K$0.!@`@S]Q\00E($\;$$2
|
||||
M*HZ"P$MB'S$2`I=MBX<%L[VR8CT8HD)`,I\P#-,#H9?/H-I^POA,1BP0I&+M
|
||||
M*9\+KQB4>)//,(-<)AT>CT`8+A;+'+E9$^A';"I;MR`C&9I#.=C.,C>QK8'Q
|
||||
MR8+@#%`M4JDL3`8S"#5##@PS8E`&1]3&,JU*U!-4.X8Q-SB8#)7=#&$]P]Q`
|
||||
M:?^(93Z&,6VF&>9']'P/QO<,QOD'S,V)KECF6%<?AG1&HK0/>JNR!C`$C+T5
|
||||
MPE*H9P/D`7D_!G6T\OJ`G#[4-+?=:4BV91B2WX;@A+`M`]J6(`RBL@RB>C*`
|
||||
M9J@)Z.4P/QF2O=!EYD=X+X4X9DC>#^$C"NY0]J,:2)<9DC^$M,,9?3#N?0!J
|
||||
M>J&=/G;F,Z!/QX`_CO7&WL,$<+\#M`C\\(-[%-#MA'`=LJII=NQ:C2KLA3,0
|
||||
M$"^!/GD!=-`+4R'88YGC1DBS`E^F0C-J%?8'&#WN82ASD/D'`_SXTJ<J[$_Q
|
||||
M$#J!ET,A[V$5QGO^O@YE3K0^R.^<W^A8E11+NA\4,`;`3/?#<-IP4&*T*HJ#
|
||||
MW0\J3A*;-AQ0VF^?49Y?0NJO@I8#,C;CXJ_#]*X'0M104*BP9^#^-(S--*T*
|
||||
M^UWO+_([HP%"QM`=PO1_%LC`?9I=A3W9"^5+?RG/.ZK"K)5PA_>3X1T/QF_"
|
||||
M=;B#GGT<]+&J586-A?2'#D(^H,$,NE9O56':U2IL-(Q_]#(5%@ETAP*-<L@C
|
||||
M%4"`>L5`DPAL`+(SOUL4"$%`!Q]TT22P!P^#;>"U(1I&VP.TH+O]-__^9_Q`
|
||||
M)GH#]Y8VX$70=\=6_T^I^+]___W[W_`'_'XE8!G_V>^?I#\1E_%?J3>@E_^P
|
||||
M94@___3K]/\K`FN3ANX04D#_O?S`\__987B^$61"MGHH_CC<,AYX_@1N20\\
|
||||
M(U"A^LVS]#?/@M\\\W[SC/_FF8/PP%!\..V7WTNEG#^5XB^7<E\IQ9[XKW#V
|
||||
M;WXO.3E_<N(O.[FO.+'G_E^4KRS%HIT<3RE>5<JM+N4)2H.$I<%$*5_T7R2G
|
||||
M$@H[\2HG/]K)K7;R5CB#WG8&KW3R5_T7R>EBV_>7XMVEW)Y2'J\T**@T.+B4
|
||||
MSR\5"$J%PE*"*!7].UJZH+`3[W:*H/T>)Z_!&?0W9_`!)_\#I^"@4WC(27SH
|
||||
M%#7^:UI`)OZHCCI3*8]BN@GZ/[]'F$X=Y2Q1;`@+9>[A5ZREX=PX8IUUXPC"
|
||||
M&B@_6X%U@&\\2`S5-_LEK/-7SY78E[]Z_@G[ZI?G_Y%?D`*S,3__#Q?[_\UO
|
||||
MD32((\-3PBM.2=!*'(W1:@P?A3\]"GL*+172F.P&&7I#S&47#I4W1"-OD+13
|
||||
M\"'YSG:!+@>C"GCZW7=7;R?<&;H<#E4@T._^B7A&L7BGR)WA7NO.U.5PJ0*I
|
||||
MX@;&3\(4`TSX``,1^0`3.L!L4-&I]%+EP*!B8)#*#&2X!U>6)EPQ\`\4Y[&#
|
||||
MOTC*HZWR@1\S57]5XZG8HW12Z,#WZZSKK,M&)88/?!<V<#L[N6'VQE3%P,VL
|
||||
M).WO&>V4QT5)&+TT?.!ZPEP,_B]?\+5RX`K]>F(.!MU$]:$;6Z\*8@\\__9.
|
||||
MU^@(GD$30VFB==I@?3R^*A<G=N''&T,'3G=*C/5\<SU&G^(.$.;S4\^I1+V8
|
||||
MKR9MWV6V5E1>H%?C"03VYG:IXR'=Z*#T=P7IU4'!"W&HB!!-;_VH[0_G5#YK
|
||||
M5U**^`PJ,W+@B'E_%7UF32>>RBDW[??TM-M/N1)5)$UODI++9;O6Z,[G4`3Q
|
||||
M]CIX;]*=SXX9.&A?KZ5&<P0.18B#LV2MENZC.RDUK^H[@4,F=N#1`U[7+<]-
|
||||
M$L>H_1[37255H*0.>-Y]B+Z8OOPAY<"NXH>[>F,&ZBK75SF+5&6E@@&\JH0^
|
||||
MKQS85K71M4$B2)(X9%09/_U'@>493+(/M\3C:Y8'4:/$5+SFG>5!^E$2?;QZ
|
||||
M]?+Q^HDJ"\&A"$S\TWB!8(H]8ZUR8%/LP"9+SB2LQH&U%SQX!6+T^SWZW4K]
|
||||
M`4^>=?GV"18UKW!,T6@Z2WA,U-#F>ETYD,=C9*ZE#D/56Y[ET0/OEKT)77&]
|
||||
M0;B2@ATR`8-31!1<+6_QCM-Z%4G6R41U`EUMMO"X2+<M.RWY#5H%;CY00[#4
|
||||
MI!6_;F.61PW\13FPD-Y<*#5K8G:O!B)T^S.Q4SRL+I):BPMWXKH#F9`HN#BJ
|
||||
MF*ZZ64CG-C?X/?0[[B!S,\?<@EG4>*#_ML&G.R4F`K,-_ME`!.-Z/"5DJVWP
|
||||
M8;UQF2\I):2TH^:49)&4.&V-,R[;$!HZ,#,56Q@Y,/UH1LS`,\!'T()E=*:Y
|
||||
M#T?TCT4-AEP<5;BGHCUWCV-?@UNW3?QV+K=X;_4>G1K7$TF$&]?%XY\_GYLJ
|
||||
M7#!K_@:8]2G`,*F(86;0]:?K6S^@9V5YZ==YO&G\U;B]248OI=2XD<`$@NEI
|
||||
MQ2VZN1B46[#A(_WHJB7;<!NSS#S:T_"4_<8B&#;#C,%R.8S=>_MTMW/\]2Q/
|
||||
M_5%W.]N^_CFZB5X7.:"!>:F\4-XK8-"85_<!L<;1'OTBJ;%-:1SK29OU5I?3
|
||||
M3'`L!":\,5XBF6*_618S$*$<B*`N35KHC4S_(`C--UT@BE4L_ED4B`>N>@(K
|
||||
M2`T;D"T_-MUA,ZEY[\X5?BRBI\8.D*5]U;U9ADV77)=Y?EG05+ST/'VS^ANR
|
||||
M.BF8D4G\>-,]N'@NZE1D1PWIEKWGIDJR&SX2G!%19=FG))`\G-A1,YR(Y`I(
|
||||
M)%@2TYB7;,Q<MW1^R1]RM4:5Q*`*\;89M9+Z&5L:ZQL-VI"#?Z&<?+V3N\7A
|
||||
MK=.7<NL=5"D_+S1%*"V4SC\%NL=#]^9K]2J)LO^"OH&K4X44U^L:^&AXZJNT
|
||||
MML%%G9*A^2$OEFNUVA#::]!*Z'K;X+/1_2=I+Z6)*9+OV1/@`JR/AS5&QO0?
|
||||
ME7R"`T?<9X?<=I>SN+VHHX&I;D^_&F3NX)A/L_SW"<M_]V[DA7H4;EE%&+V_
|
||||
M0.8'5G@O/ZQ0D2NS#>Z$ENY=`;T33*F"@8,6.!1"X?3CZ^^K&?)C5C3@?V3_
|
||||
M3D-M54S_UB4'8-XQ4ZV'?MW>_I,%=$T+^8.L[B^Z_3ET$<L4<;K]V<K^:OOZ
|
||||
M2%`NMD10+IVN=D&Z+!AZ?2IGK+*_-+A8$1P\+;J_VI'E61_=7[7/$=M?A436
|
||||
M6:@7SI,&^W$T;24)5KG%:J2LH20CY3FDP?.D@GFX)!U'%6TH?,13ZACGVI@S
|
||||
M/KK?65:64.LIGI"P2%F]R?%P587+!0H.55A>:$W8YEG^]3AE?V9,?T;!F+S1
|
||||
M])UJ3U5ECL%8%DJ?T)?)Z1JHM:Q*7R83LVS#6R.3#"#.&<#-95(88E899@M:
|
||||
M1=0!4!:Y&@*-1W3_W*.TA1500VVFK@\G&W'#-C0CPHNC'/[JC'Q_;D]#8X5_
|
||||
ME9M7U&T^+88)(9F`0J@&PQG5_SQVBV<"U;((6Q6)FF!K$1S$J?NUT)Z,7-K1
|
||||
MW.!VTV_G!IF:.:86S*S&0S[&S:B:E(`.$:\+Z!"!7A5L4./S=_#F;^><DH@$
|
||||
MTUN+T41V)?FL*>2,`-DQ_>-TYZN6E,$T)5O.>VB__=938"]8:['W+=W<G*9L
|
||||
M=@X?-\[-YDX`#3&6?EW9;RR5:]4\U\U-W]%_%3PEX\/`WGK79%%'*_LM_!^%
|
||||
M@N7X)GI$OX4Z[]G4E&B5@M$@ETOY4_$1_0;JD@<BI<WO/IPEMR]]JMOJD?GI
|
||||
M].5A#1.*)E"CPZN.N5H*QYDG2DTM`E,;R5<J%N>J35W*@^ZX$H7CZH9VURG'
|
||||
MY77]K@ZJ)&S#EZ[.==?,UU4;OBJ4T0_1O5Y&(IGYEV7CZ(?X;PM)-\$?1_*Y
|
||||
MDX^/KG(==M>/:7V$O8]OS41WR$/)%^>)JJK,9;(J5U6%KM*J[`^*:PD=<?T'
|
||||
MG3HJL45NB8].U&#I[B`0?W-\M+EE!-42'G']7A`CL[0H8Z]?T[6$`?=96A3S
|
||||
MM[^*9FQN-E(:\X`IMK!B,J3?Q2;;8/;(ZUT1U\_1FX%%"J6[5@4,A^E\IFX]
|
||||
M+MZ#FRX-SW%]=49A?>Y^L!WUR';LYY@//&@['LNE*$WPVVMG-G5:6J+,+3'F
|
||||
M%C5=$GG].)VE:XF+N'Y:WZ+1MT1&7O]*UQ*M;XFE6D8JKW?2FZF6>.7U#N)#
|
||||
M7+`"IUJT@!]LS/0`OY`_(GZA78!/;,PXX!N=*AB,P'P7;_XFX!NP!*V%]Q6`
|
||||
MZ&.D#PTJ,OSZ3O)#V;8Z8VV.CB!7(]-RW%B;;6\Z8IA;Q>J$3PUS/4T%=N]'
|
||||
M.K5*F)%J4DT\QF#\21QBDG<O_]L)1)U0O%=FOAX5$C)9,L#U#L`]I$ZDWQWU
|
||||
M=<V:KZ-,ZGA+Y-V5OE#Q7E+2EXH))W'XD[PKA.].()83N0F4AB]TD,OSH9U*
|
||||
M^HQ>'6=6J[UU!#%3'Q^W\IJ\?C=POC$^3@Q"B+HZJ5-"M],WZ9)2.=VGO+YZ
|
||||
M8R@]-1X4T?NN>GJ=8+9,D(*[O)1J8IZ5E\7AW1@O8*1"!T?0/Y[OEX+J(8J3
|
||||
MB/(D?IV4LDIII[9@D'=UO.3&!!$C)=Q2B1L7N_%B@PFZR>`Z=;S8I!#J%(KK
|
||||
MRP6S<1ZH)CI+!=I*,%4FF(K3>7`I;2K6\]RRZJ/0(A05C$\*<D@)!RX$.6K1
|
||||
MJB;R'DHBIK+6ZUCQ&#JC^DCA:%=KU7%/LTZC:'K)6ZY/4&S\U'72?2)K?&E;
|
||||
M\2/5GQ4]6O5YX03/%WD/Q\_UZ%NDN6/C7U+J6F2.<?'S/%2+7`N&;:ILVU3+
|
||||
ME.SL4,O=9,N3V5GRXTOS$G)UV^OT"<&$FQ0*G]+%QZ<E+V$Y%[$MF6X;#.Z4
|
||||
M1%TW'*U17C>86=VFFYL):`?!BGG#:.<S0#N?Y7\!'/O9.X>XN9^[/X.Q)P(#
|
||||
M?^_32MDY5864OPI/"?YC@2Q?2K>#R2=@^OO'IW5/M=W;,L2$+R`F_!6F)KEC
|
||||
M<1AOX,8%[\(TEPPS)-@E>JF0F'Y\VV?)R%CR9N`I(F7B%BY+.<N>H[%E'TB-
|
||||
MZC@3P6L])O;@)L0#[1'7[II+JI9<@LI>TI=X[)M?T(<3].UC^X"=E=>^)P_+
|
||||
M=K3IF@$?2UF5]X2Q&=CY,8/:4C1/=&TL\*_=N\.B5DGJ66Z43/+^)"R>(&&$
|
||||
M(D8D$4PF'%RO0R"8O(.1_!T`)KZB'?%PNB^<BKPK_CLIV,R6`N;?(<R;(*DC
|
||||
M"A-T&K[83:ZL@+:R"FV>([ESW<V.-%>K)56ZX$?`"B<W':<T2HLFM`(FN_K$
|
||||
MFD:45A[165.AH-?&7CM)7RB,K`PS@B+NK&X7M,E"VO#*4U'7CNA2I89FCWXN
|
||||
MWW!8:6CQG-P7<ZT3#51!6+'"E,IU2TF_3+Q88.I2I7!^-FM"$Q.4W@%S0FCK
|
||||
MXXZ$8MU[#E>"@"$EDJ<LP`^S@M&`FA:I8JXUNZ7#M:1PMMB8HYV2)1M!);UV
|
||||
MM#>@'/S)*8*`+CF`^$=TPS;X$AOIMPT^5_$IO1Y$\';U<0\P[IKW84+&5(95
|
||||
M*,HC[,E[Z=Y`S=!S(+!:6JSP*('(/8M9&MMS%47*PHB]>\UV;D%"OFY/&]E(
|
||||
MBD1/52;DS3/$QPOKR/)Y,%#T;:%#0"4H;8-&L*?48:4K'*:#R.,BO3!9'\X'
|
||||
MD`].0_H9H'DM3,W*3HBL<(07C]C!@/&$,@%ZSJD,<F%*T-ZT/55Y$?F*@K"B
|
||||
M>;;!EP-L*MJ-^C>D"XE5IVOH6<!X-N8QQ+<(<JOC`##I=S,!332_]+$%KH<-
|
||||
M:O6J71;`K(#?C9IHY`0>Y_AJP`>\-OO?^8#`S6G[/H:!7B15G+::"5XB@8$T
|
||||
M1%][9KXK:/XF/!4OTZNU]F>YE%JS$C0A_AI0`,VW>EAUC5`D\2PK#YJPO-&K
|
||||
M-D..E07CZ=OVYE7`\;0K;QR=0[@FN&+W%XC!30L/`84NKA.8:W/6'(&\4\V@
|
||||
MSL]/,JC->:^*=HT%796HCJ7"Q?;]4_GU#RKD8]7\Y81H.<$73!8."\%R1W1B
|
||||
M.#\]PT*IXUW*Y?F)FG#%NTK'"$WD7?Z[)/YZ:EQX&,9%56A6<[B)$P3+"8U<
|
||||
M$2</RTUP)`YI=CR&=KJO..RNJ[GS'&D5W^@NB:A+Q$H0`]P(7$^O7Z=WI`+?
|
||||
M"_)`.T\0U4D!XTE`:[LF@!+>,#).'0MJF!NGX#ND&Z+6J5P1CEC!&)E@#*Z\
|
||||
M)@?U"Y$-D7$:D;W^\\1PI38\/#Y\1/9\>MG&Z_2LBG['PJP%KANE`Z".Z0S^
|
||||
M-(YD*H>7,IY.XC\_?L0U;O9(_FS\W8B-%[.C^$BU`QS%%=\."G:`,L<AGA7I
|
||||
MZBWM@R$+VCBDW@$309%$N7+C):@R7CXBH.1Y1W$)Z/G+6GEX00S,BDZM)1ME
|
||||
M>QKU^[/KW;OK]`>R*4V8+E[K=5`)8<>7%B84Z+;[30G!XC:2))\R@H0^F\)R
|
||||
MBGXWA^4Y+>![>BWTAFY(`-*31'_A2.9Q@K/&TZFBG/'Y(RLNYD<Y(D45N*N/
|
||||
M/Q7PLS1X*A[^[2G>%ISW$`[QTEXHEA41/#8IB'W':\0K+D%'@$#H"`'N<RLN
|
||||
M`3MUV<;\ONDS8[S13&0$Y"'H3W@*'^0?B%E0"CKML_EEYY&LI!#]MGO@V#2=
|
||||
M,<4;;<SG=)\9W5N.%2<>5FR2\_F3!<NYCFCO<HAMDNU:GKA:D>X`TW$'6(<*
|
||||
M%RQ?!_$K#CDP4*9LAT83S@=&L=W;"_)J#)>9P^4@K^&AOJ4IO":#/#3ZVW5F
|
||||
MN9R^;93+TG;_F/>J[=Z'G1)]N-0^:RN=D3O?%5K1[[Z>N\"QT#W@NN%8H)=+
|
||||
M7=+<A:[PG8?<BE450;E2K]L=3F<!*^C4L0&VT(='`-@%?@4+GJB.!Y[B)RIX
|
||||
MRV7"Y?BZ\#S%A@7TJ/*%\3#6-8(4CF0V)^B1\8`4Z&3!P^.!/6=+@^IP0792
|
||||
MT,,3UAE$LZ7$;#QH#![V[9L"5Q)$-O3FJ;)C!74R2(_\=E'HMXL@LK$O3P]L
|
||||
MQ:W#RR]"Q7IY1-##24&SI8`G@(<V7H(T8"1((V8CE`#,-,Q#Z]**0AWSWAO8
|
||||
M<9`*#P)I6I6/FZ]S1+M(1UA5FFL>")=NNQO$2R!XBHJ/=\2X$RI>!:XC#\GV
|
||||
M>'0=V:``!&Z![G1V]+>C;/^X'=!YQ!)V3@/9Q&Z!OB1GR78P19F6DFS[S=7T
|
||||
M>Z'?6DQJ))$BOXS7)A.WX:9GY'"MNA7S;:(_J>IFD6'3]YM^W/1#Y1WN`%YU
|
||||
M&[E()=E=2PV'58:R;%^27AL,+:40'*1;V0F%B84YY3Z*(]LN5+/S*AZ>U],U
|
||||
MCNWT+"I<:ALT(/-"S`ZLR0E`3D53^(\HO#M%Y1-T,ZRT5W@PL)IT(_I;;M2W
|
||||
M7./I20LW1Z9O#\*2'9BS@(A1++XJ"L0#5[H]WTJ7T&OI7C2?=R2O<"1%XP4#
|
||||
M4N%L#GTSJ'@\GY%*EN`ZN524G62L'"0+QP=E3W`8P#-$,^N7!OGQ$#\.?B:8
|
||||
MEZBK]P`(D@[\P&Z]6N5*RE;Q7%($-6?CE)H7]"F^<7*Q7N"054\552>951.A
|
||||
M[I!)24$#4JCMS7D"O3J6T"M2,1RN/+#7>U#-GB<MJHD"%RYY/(D(+*I,,ZO(
|
||||
MV*LMY(!LWX#I?+;X,Y'I$EJTN!GT26"]@F=CB$52@J;I;08"2UMZFEY*)].E
|
||||
M@&:*#/3:=5;A68[PW?&"Y5*=7,$M3I(4(U0+)-"W)7[HM#A[/'\V@#;H*L\O
|
||||
M%2_&Q;-Q4^6@N'@\P4CY#![$X)"96YT$Y%<E%:IX55*!7X8&80_NF0S#0+9*
|
||||
M81@2-01T`G0@=#WQ21YT%WK^8'>-ZEC2"-T-,JI5$!%_]N^ZFS?<W8YZ\1[4
|
||||
M86!/?U+1K!/G]]=YVTQ=TI`58UW0&EF<[#I;?2;WN>)GW?)JJ=M7?6[-.L+;
|
||||
M&/^2U+[F!QO35BAWR/84"JZ2NA<X*WS<8JF7\3Q7_:QM\"RRYW;K[X.LJ1@Q
|
||||
MB2.<Y'41N1,,JHG"&=2Q?;O'<%F\1Q5PP-8)Q@C6?!"K5\<;(^_^=5<X\2A)
|
||||
M>EGSB$_R4L+,"5P-`?1U6&%6UMN8#UF,2X(=!W@[#&GU:AQL.R&8?CSG%TPK
|
||||
ML#V(:?.M.H*W[`,8G[BTYLC(JT^;:JN6G`8Q'#36>NCO[/0/T5>?=(P'<&U?
|
||||
MRS&&!X.X1EU-`H'>'7#1I,A%P[I-M=D>I;W]=--1B]I<-/^<2C(PUJ2.]?56
|
||||
M1<QACB#C6SX"]`."$YQ'"Y6Y-G>G8^ZF,ZZ.XK3JLT6OYD54^0KFE7]5>2Y_
|
||||
M_JI=D"<Q]JJ.[BL,!^EG,6A5)WTA@$.OJI&<(QPJ',*AVV.N/L+B/&5Q!)T!
|
||||
M0,\E'0)YU!SF#T4C6F\@_+GWU_@S+H`_J9BKAJ&2-?IPY)_,80!W'0>_[@"8
|
||||
M&.'SML&C8!&0/A#.L@T>A.Y7*,"2$HT"W?YA2(]=T^W/MCN_25#S/'35$<%\
|
||||
M&;)D3>QBBZ?`BM:VMWF6'WM4>>4?>6,*1]-W8J[\6+V^REELV+2Q?!/BOQ*R
|
||||
M*BEX0.8IXRU&3-[4B[BTE%V0SM;O5NG1@I"3G3.$(ODIW*BTO4;;X-\Z)?;D
|
||||
MK)@K'8'NTS<#*#?"$_;+`(PH?+4HS!%`N47S]A1V]:[P<;S7'1'Y(RKG>5Y%
|
||||
MOMJNNH"C5IY0/!^<-1BEZOFV0048.%91"X.0`A7N!L<73.;?SJGR%2G"$-N]
|
||||
M78'7@GL/8%=^VWWL^BK2G4UO4&BG00#>_HF<SUY&N1`/\INA+.@-(R%/X?8D
|
||||
M;,$2M_#1A`06CR*O[-#55D5=V<*N'Q4:@!%OV;W9(*-DOZSN+`6&(AM>O&\L
|
||||
MR>8<Y=F;ZNA.\VBI8U+"*&&I-.OQA'B>8)Y,/`^/OO(W3WV9%[1'CK+L?7I^
|
||||
MV=^PHSQ>EE+0^AP&$`EL1D-0MRS$@<=<V15^I1@BKOUTIJLIYLK.,AIF0%OK
|
||||
M\31K9RBUVSQ']ND_#8;YT)9D:V=(M67910]7Z0O'>@QYX\J-N>-->DSX1X7;
|
||||
M1(T*-5LI[:@19NW$D)!I/%Y2@E6GC8_6RC$J/BI!^YA^5!B,!B&<+-Q)ZBJO
|
||||
MZ^)CUUP>(:Y)Q<A)',$D0P&'/#@A!,"0FX17%G6L\LJ[DK6I3306,HDCFN3]
|
||||
M*,0WP5QYUQRO(AO'TC0U:J1^5(0Q/LX8KP7,!JC)F*`4#42)F"@J7F.)-YOC
|
||||
M+2:50A^O%HN?,&D5,.B?)].CFIIAZ%.X:^E-@9$'-:'3!@,L`!<"S8(OR9]$
|
||||
MTRF",?0F>M1O7\9<>>QH.Q78,:C--#3A8@:WL$N)HHNC<OM=SN+^_!L-3'5_
|
||||
M^B&N8\#5#[Z#F-TML-T;!$E27K%@?3R=)F;D%=.N;NQ>I*$6>?XBW]"J)GC^
|
||||
M^;WN>D=O_OD&AZMWQ:$@XWF.\1*['MG-KD?>^P!TZ#E5U)7)T5?B\]6Q5Y)$
|
||||
M3XOV46^OFT;WB@[A!H(C_'A\2,B4$Y<MG]TS_3!IX>3(]&E!F!498IX2K<T%
|
||||
MXH%KYF9@.#.!<=DR:3=.V)C/NJTB#4FOIPA,HA'@C\M%KH"YMU%08<ZD8\[T
|
||||
M\EC=76GZIB"LUX'5%PACY9V2Q7\7!9X"U_=TAW?1?72&Z`HJ>S+'#$4O`2U%
|
||||
MB!8GRL&+E:,R;#QP96F!5KFNP/90L8TIH6\*AW8(#MO0"060*4H5//]=T#J.
|
||||
M!((#ZCWMV4HDB$BNYC"'Z/J8R_<*MH1>_JQ811$9U!8QG1G2QJ%[$[>0)G44
|
||||
M%Y1-;9SJ,?H6EYO$'1Q/#$B16MV"DGH%8SB0%'MY0`3FLXT3>[D?WL5<OEZY
|
||||
M!9[8;*]UA"\6@*7#O#QL0>0[%0(;,P"3"F2'7KX8<_FB1<VK_TA7$T75C)1(
|
||||
M9H(M%CIPM.$G?D+HE^GRTH7'.<`,IAJ%>XM0.$W@EK%/8<.1\$`DQ,V)OMQA
|
||||
MKHE!C+,E7)BKT&T)8Z\*]AJJJXF.OGPR4#=(;>Y6K@/JY12:8BZWB*,5(7Z.
|
||||
MV(\J<F_-U4=?;A8*9P:Y$2G4EACPY:@MT>PUJFB[F)&)!S@`%2PUJJKM(+&"
|
||||
M`1G[I!Z.:`(1[@`GKC:4+3:RV,C][BGH7A"#WA3O-&_1A!0IS%O4[%7EV,'>
|
||||
M8W,-8@<'FA:S34=<KC75JH4,)^)R3=`8&<`C\9XG73M@/N)J-2W%W)"GN>\I
|
||||
M8`*"Q\@`S)JW:8XB&R`6/QG,]B3Z<FE<'I?+`!6QQPJA_1#(!W.Y4\!P''70
|
||||
MD&Z;.DXU,?IR/C<N2<*^.S:I>B<`(B@3$I,$A%;MU*DFAE[.XKBE:$&P#IY@
|
||||
MV(03DG`V(>+RJXA>%'FR<(NKKI@J2N#Z86Q(^E;(X`0<&`5LTI9UD)R[D3M`
|
||||
M0EKLY3>XP"E^#OLF(2$T(4&1D!"6&(\[$@I-+AV`>EV"./3R0[K1[%8`UJT?
|
||||
M[;'7G$&0_T/9>W6FVIR#,]XY`B_:=;5@0$^XI:7K@9=I;_1EP\%*4QG&^SW8
|
||||
M"IE9'4ULQ^V]3U)0T"'C.@26S&S)3)$E)SLA/OK$VY__P:")T6FB5[E!^K'C
|
||||
MAT(OA_VKU8^.I<"K#LJB"5YQZRGZIO*RFFZ.ALO%?&G$Y1#1=-&!J>[Z*F^>
|
||||
MJKK!];?J#V(N*]T'08-5O1_LQBL/>1JC+X^(NLQ%(/1#$MRH_4BO,:_2K4:T
|
||||
MR/T*BQGXTY":1)'?_;+?#C*K'\U=D@E]O4.GAEZZ/N)R?-2E`;,JK#AAY*5O
|
||||
MXU4BK1K`OM`T2[M@"F0Z5DZM_!FMRQU++]B?__Z2+K!W45@3K_X*YHC<L0-M
|
||||
MWR3P`>S-WZ"'ONNA[SLY=/WQ@_]^[Y]2V>D^C.9!]_D?02\XQ,^D^!XI%D<(
|
||||
MKTZ`V7H[TZM3D2,OM9)NV2ZWN23GM<LUX%+9/RE77OJ9_C+FT@F/MZK>J"+*
|
||||
MWA>`.MA?I$(;\PTF%;_\@^H#IK\1"5H^VHTMR3:VJ8QEV3;FSU^F:M$065#S
|
||||
MM#=!&V9)X(><8?<"9FL7E$`7OU^P":YY\S=`MM$Z36Q:M5&G>G'!>GB,8S/T
|
||||
M1EXZ:QZMUN]A2GI-H]7&T7$-?M,V]3O'@XRC-<9M:H/V1=O@3]`M>CWQ$REP
|
||||
M3>`?X@IW<H0_`Z:)V.D0"*?IM&&"*^2.,]"DW;D&#:,'\T?NV2/^"/<DIOW'
|
||||
M`3.!A_Q'8+.K#M198+]V=R75G$/_?<5W0,AJ77.VO?JMD9<.1EXZI+RTCKX8
|
||||
M?6E=U7J/LUA5MJE\8UEIQ88`C,,Q<W,V?<9\765NR48V\5NK21N<$(]7H!V^
|
||||
M//`M9U8GVIB\3DD"FVP;?!PM*K)\318(+,TY2WZ$]DBVO6"Z(?K2X@IHAH(A
|
||||
MWX"VPTJ*5>`=59<6)IAAT#=YRLP;AP;=T)R-'-^6[`08CGM7D6_F]#G3EGZG
|
||||
MGZ$T3%3236!81*T!0_9Y]*7949=F@]_Z=?+"YV.-+]U+/\9NBM<7D#'(EGTK
|
||||
M"CP%KOE)>BA;-"U$,DU$/B=Z*IG7)B57XY6CHB[-:7"@/0@@R5KXA$/E>1@<
|
||||
M4]?HXH1MC"4AN#`I]M)?5IZ>QETEHK^,NO2(QUM9#SUQOX_@,3`/4DH-A0E&
|
||||
M%=]SP$$9_T:X/K"H2)V6+[^42#*R6D9S.[MA#3X@,O^0C3`FO)1?4K-OS+<A
|
||||
M)60->C-TI*(U8#.U-D;/`M>"I`KYJL_CZ/>-$Y7^Y*^34X*8?#GMK)#2?2;H
|
||||
M3?]X>\_+^4E%4AN3&%AD[DXMER&<C_%\R5_7Y,E2@J?13MH+>`#\JD08P7KZ
|
||||
M2.RE1XJ2]EE"BJ;Q^D7GVM,[<;W_)[K]S6O+J\-2L1AW#;5;BF4X7'(Z`[M9
|
||||
M4!WJVFQ/?4$'B,3/??/:<P=W%M?PSQ"2)6/W-4KFD=499YPHLY1_1G30@644
|
||||
MN&14+;8`;>=G[V_3A?-<X2N^>R5W<[$BK7K+^P.6W<K<L',WW_X.U]_[*6W)
|
||||
M#A/2$]S"*;[VR$OA,#66J3`CY5;]%*Y%@ZTZ%:2\)!/4<93??%?^,)J?T453
|
||||
M1`-DU93"A#T?>1)RIW;0.P^YIYZ29+\GR2&W?E]6DU.[\;W@Q7CZ'(YWL:>V
|
||||
M<(J-V>9M2URM="MLS#*T=Z]7A>E4X8IO/@9OP>Z<8E2)>)\+#7U:X4=CQ8VD
|
||||
MX1OMGCJ"F*;7AIVHR7^BF,J=4K\#6\]#^HJ1-.*&!'YQ@N0@N>+1$:S?"5(P
|
||||
M@+9<:@-G26CU*8FXCH3J`G7L:80*[35+\Y\HI(JGU._%;O&P@<B]?G$C7I%(
|
||||
M;Q[Y3=4'GT=\4V4"('I#ADXLU$7N:T0>5TFF93(NV(%390A.2BZ.*JKW].;6
|
||||
M._8WN-WU;^?*'5YHU56/#M;$XQJ"`^R#EK=W#A.!Q+.*]:5[K`:P1?39I#RI
|
||||
MPUH95A'NE@GLL\I'T)L%@FE!.\:[%/12$_0@52R>;F]_(VU6@5FE6'T93\5'
|
||||
M+'@"]/5SU4JDRSF6O/!\99%6IY(4R"A5B->MTTIV.^H=E#;$TLL]V.AE3+U\
|
||||
MRT7N;G]]FZF+,5WDIV#E\R?#[-Z@:W*U9I4DZIO%YE*N2162[S25\DD8`F>Y
|
||||
M-I6#+7@B-_>[=Y"3%)M/Z37!J\N"*-6+]K69HCK27K-NY#<K*D:,_.9YNK=`
|
||||
M1OO$;>-,*K(JC.R6[;I&[<\QM@6O`-O+66H$Y[5I8=&(PMLAW6//]N:!L^Z6
|
||||
M$PYR37YX96BU$GRV7G,X8,OT8F7:/F7A[8+0(GEEZ#O7H&P&.(.AA;(BN4-1
|
||||
MK;2H^`7*'8Q%R^])GC/82]0B7"A<."UMWYO1WUB!7<1M(N-G'`-=8J0W"!IE
|
||||
MT(^H;Q;L;H0+V<BI&&%CGM416"JF@Q9O%LA2>!/*M2"!?<4RLU9BT8:D8I).
|
||||
M"4O/3:.<D\(;13M[G,=+Z5GTZX[U64Z8%!XQK5S!L\^BPCFGE^:'I7W"27OM
|
||||
MQ8!/:01;>>0-NIV^8-8&Y]\Q:?D5B164(4%H2`@VWAPA?/%9DIQBU(H:VHQ:
|
||||
MDKHIT6OM`L'O*"U1]/W2@<?I4Y'?<$($+^?5<APR;#,/K`=6P]OAIXC!>C^8
|
||||
M3X%_+)TI%D\3^,>9M.&VP3<Z)72S$=FE9?F4C?'0G6SRG``MV"F>\F+_R(L#
|
||||
M>DU,U,7K@2-?X`3MO@[6>2!2>/67,U_Y='G]?SJ;`2ZUX`I.(5\HUT=7*S][
|
||||
M%OG5:$RXUXOD]*S\T+,U;ABG`J5)SIDSV!YU\4L$N1IENQMU^[.+E<*=(MV!
|
||||
M;-N]"RPV"8Z]>"/L8H=XABS\XD"A*D\C]N'X69)X1J1/P'65=UH?6E(%4RW>
|
||||
M=6*;>>6%%\[6GQRK)S@`M(2[QHM$4TXV4/?NQ>>`:Q/UBYL5B8Q(W:\<K3Q5
|
||||
MW8F55X&I#Y>K.MI/2:`"+EM!VB<?V1CZG%5D)K<-A+21=NL;(6/EK/L5/)4<
|
||||
M]KWFZZ"5LDG',M[*B]4M8GTOUC8)E:BIO%_9J_>N'M;37CJ#8)=I3^8;H.B!
|
||||
M83\0/*V:`EZ,'-DX-AZXUGYQF*EF"7O``<NS,87@&PJ'?,,#-N;084L@USDK
|
||||
MG2&<I&BJ#VDD1=/'ZOP"ND_(^GHGWAT:D/M'S9P%HL"2,!L/7/-5ML'=J*DK
|
||||
M@:9.L':&1Z>.N)@6?7'>D;4Z*U=O%>BTQ(K-\B/[5^V$D2LYE\HNF;-[H4UI
|
||||
MR3,!0.C;E0`B*>(?%I7(H%(`P!(T<L2,D+JE-6@5@@&!^7M0HQW#`)GC2SW^
|
||||
MP3!$Y+,0$6S>$$:\='^_E4,@G2B9GL:40*7UC2+1-*C-7O_IZ@_6TDUD)5H*
|
||||
M"LAWVQ_-5L&JO@A+N[+UWOWRV-\1C0%N!^B[(+,GL(6X8/WI`.X)@%:S2F14
|
||||
MA8D'A)8^+5"^K\WXC1:`K"_5_LE>(-+"$LD0EML(Q]X,X-CHBS$VQ@F@R7"8
|
||||
M"9!U\F^K/T`$!;9!5QU'0/A?]Q$9'Z`!T9>`0'LK*P.!==,E&U\Y\?S\4DU@
|
||||
MEQ/U(P+1+9C>FLGBU\U$^?`R"-UT3L5]%(>1.EXWM/;%%>MJ9*=KUFP2&(A[
|
||||
MH@J.88N,GF54*>@OQ6VX40MF=!NHA5\VM3E3[I]-$%#&96FS\A,)#JBN5,SX
|
||||
M^0NYUJ&3E=C@4/7X][2U=2)HNS]GC7K7BDY6\J?!2-6?H%-!(1B&SE8>S;5&
|
||||
M7CC#GJX\I*^MBK[PU9)M:,W5U.&)NM!A/S4:0!0Y*".O"]"1A!DX>R0A#<'-
|
||||
M]:_$7OB<?F_DA1.4FK>ILZ(=G&L"@-JI:F?LA2,'*\VW/=HRCOFZTOR#)VW6
|
||||
MRH,3Z,T`I,@]X\7B*?;VIV(OT#$7FLP_3%HX):;^&;09XD1'*HEA^62?`E>Z
|
||||
M)NK"O@<T4D>-\&FDD0*'(NEV(5MG6L\N&^/ME.C"L?DESQU\M'Y&,3KAJ`,+
|
||||
M6J?72K:XZ\&0AE`WN7DRK\-\DT_=X6X9,%]GS'?X<P9/Y$L7>,?2]#HMI9+$
|
||||
M7*BB'N):5"&%5LM#?.2L6BNUMD'O\,!6!XY$6NGU8)EM@V[::ALL?=<*XVL;
|
||||
M?`TX+?+"VJ/.F`L9R@N9QL#"5R8Z*BMD<$O._:.RE4-'9=U[0$];:D,LV\3`
|
||||
M.T=K`O#&-FCHE$1<6`HPAFZ*OK"4TL1@;>@XGKX#'=4B3N#ZTYG1%Q8(+X[:
|
||||
MTX\.6N:UYW8TU.E/8RO=W*)35>WHK-87@7.6?;0W#YVOY$Z/NO"G?SJ,@?,N
|
||||
M"01V\MG[>ZASF'G#O(S8[@&Q/NE]YX-KPU)]?RTWU6+EFHD?3:!3XG&+E@CQ
|
||||
M<TQ:!0#$%,X2&[-]2(18WE7C>`(.W'<\HRU%OV@9:G#.X,*`]`-]\@L/D8=E
|
||||
MM2?`W=?-X+Y3L1J<_9@+X^S.OU8Y#V[R3C>4<=*2]Y^UGEMJ9$_M\K\(G-K]
|
||||
M7=0%H_*"D6H9MBT!U1VM`(8Z^ROE3==8K`++,LR22C[@'7R,O(.`/A]R#O;8
|
||||
MF/>C+TB4%T+HS9B79YX;L^<D`$=D@#690Z>M$X;/']57W?SEQ!ROR(L.S/V9
|
||||
M/3"7!AZ:`O@"^MJUU)\$+D5]"GXE7_IOB&#/<:@4H`L1_%/,7ZNAO7J06FTP
|
||||
M03S1NL5(8##V=/OP^C@GG-7Q*G3>D@>6H+D!#('>*J.(N!6;QZS:;#TY"S36
|
||||
MDHUV>_+3\TN?'%8I<YA*-,?D]-9F5I).!<XHL7$4G&`JE.<_!U.!/&+62+BU
|
||||
M.P;`1-B8O:";:%31'.8KH%1/"!#G(JU50U_Y1;&'_7*>ZN1LP`P&3:SR_/<`
|
||||
M9'90@!A(\`,28O4),2MV1;?N1UEU1,9.G2XA1I<033MU";$=S@`M^CT_038;
|
||||
M<R:@_Z`WB03VVJ8D>AL:)C6NUP8+!$\$LR2TKDT$0Z>),6BB5WK%K74!.KF/
|
||||
M@:_69D^>9U3C)#G]^)%4["N8E`4;06?N!UP.J#RM_9/(\QLMM55F0I!^;::N
|
||||
MUF-W/AUU_N`F9\SY;(N:1Z\+G"&GLZO*JM=7;X*9-]5Z*&VPJ<MJ4..F;1Z2
|
||||
M/6\6.+=OQ>;G+A_2&9P2&Y,3?7[5T7KE^95#1]@""]E`\?!"=K&_ZF8!.I[;
|
||||
M9CPM7NV6YG;#E+O]HOMKZ?#XRT/;RP9HX5#"?1YX&Z5V+!T:+^.RP+[UG'L;
|
||||
M;(PHL#?#KOG>*P[P23#M/*W2IP9K"-5K6V$,OAIQ_H68\\^!VZI>L`6>OZ'^
|
||||
MC(24/:R;&NC$GX>P,7#L9[+MYRRU.?N?3D='+B/0>MSZT-+URO-/'ZQT.=-F
|
||||
M/?,;??]*[/FI,>=_]U_4]R9HP2_;[C=V9),S1,;3V;K4X/GKP\VI82<NT9D@
|
||||
M5I0]&&>09"&>84$.M#5L!Z##[DZ)P<YJ',O<&//<Z/2K'/IFH!O^Y*9>B7G"
|
||||
M'.:U0#EHJDO&/R&`WBSY`?I=8X&^W"R//I^L/!])'S':@RMON6Y2J43%=^CD
|
||||
M]NV"5&2>?^!1J8J5:%G]H.'."+2(59N-OB?8EFTA.(B6>^/3N@_;!INP)EYD
|
||||
M'V.8RT[Y&YEU?DP?2?6QJN.MX7EOK[B9V^[H:'#K3F-OYW+S3U6T&_^,D[MQ
|
||||
M(ZB.P36@-V@O*'".SX"^U^A#_D#?M[JY,5#5CC9D7][(A"J1JKE?)>V^Z:"+
|
||||
MFQL<+GK%ST&Z9HZN!8,ZZ?5#M3)_Z)1H6,)-M=FF+J5I6W;KBT@9@WUC9;:C
|
||||
M?DAN@_7L9T,K<SET#9U*7VWJ:#K*XR=%G.?2^^D[DID<T71.A52H%=AKGE\L
|
||||
MF(ZRKIUNJ,%6>]/?.816ZE;.BE^#(KGS#T7,_S!<1XC>]DKIXA5>45/%V][@
|
||||
MIH^;BJ@MV!KO`D,-GP`;\R&^['U<_]%/K5MLS!YTO$:-?_X%@#43@+5307\]
|
||||
MQ$_%U,<G!59N^[;]RY7;5%#E-=)<Z?QWT0<C:=4U-N:U-*8<KIT2>WH)_>>F
|
||||
MCPU;,!OC@#X2]EDEB:,QL.``K*AP7BKV5VAX9%_QT9K8OJ*(/F?`CJ/%@ELX
|
||||
M@)Q?%@L^JNS-^RCWDX:Z\H]6NH.H_2'4`3%2U$120%(?0&:<EX:4`5;\GY&9
|
||||
M/]5^2L0B,[J=!6:?%EDC^]X(0<#L0P!F47U+V"]?%AJ;/?4S[5_,]=W4JTAE
|
||||
MWP+VVY?R4`'Z<@@`6A`+T.:S\O@J;5/VH>]2-AT9T?>*BQ;X9<$`9M!&<\(;
|
||||
MGH1%RH2W/.%]?VI:D7Y)5.9,+!70YZO6ZRJE:;-6''RDRTF?`E,H/!/PIXIC
|
||||
M^IZ/[IN-]J2FQ/AOIO\X]%&,^`%_:OBS&+JFP*KL>R*]1=/P#^$]$=1Z*O%+
|
||||
M05F[!K"'1K9#8]%D2SX161+813IEW_A_FHZ4E,-*O[ZF"$1@/MU$MP,H!Y4V
|
||||
MAYEC&TSIE("?170'_"R;C5DPA/O^4#_#H36H)'I`?8T&K>3@HUOJZ@'^A>@R
|
||||
MN'D*K]N2P==E<;<PEKN,)8L_Y^Z,`NG\)N#-S73[.K3B$ML7JWN(2ZE"BJS4
|
||||
M0WRTX&@U)?!L@S.'IT[%(K]R+;U9C[#?.-H)V"^R+XCVQO8%Q_3Q"D(!JNUM
|
||||
M*Y('OHHQW\[4;V:_C/@!<0QQ<50N[7(6TT7-#4PUG7Z56]Q432/__&#`/_^B
|
||||
M.LPMRU-T.0$FA-/>%*P[5Y8?7AQF&]P%*/->*Y+'F#Y);.]ML*4C^N+`Q.DU
|
||||
ML:?K\4,!!SQ65YDQY(`_%$]D;#NQW;2R\^6SJ2?'Z=GOVH)WL"YN@;[_GF7;
|
||||
MKWWPX87<!WQP<+G`"3\+XW-6#_:XR=C`[:@?VG/<$8!(?[,Q!\]9@TWD=K_=
|
||||
M^HXNT,B0#YZI@U;*)HG'R:F_WUP.?OCJ83\\]5=^>&I!X+I53Z=RSPJHOV<(
|
||||
M*#*.X`C&C@\.GF)/G4Y!/3F3^/]!+NR+3+\\!.Q"[N^'#L,Z<2NY@]KJH(!4
|
||||
MM6:(5#ICV#E_';0`6CL'GAX?2-EN8^H`Q:S?JH?>Z5"!(3_]8453>Y"?%/]^
|
||||
MK.XC`3U+F,+ZZ8X`&0M/1:9_/>2GB]%W(;_RTQ,TT;;!+&@UY4$_'7W(,&Q+
|
||||
M64::PQ0-G5WH?5M76Q73^R:[X748(`?MM3L;*C;0WRE[EX'L4F48R*W$CYO*
|
||||
M.*R9\1BL`M;2>([7@\IFSU1@.X9%QF25ZJPR@S44<X_&#H^VM_].;U5$]U9C
|
||||
M=:-7?!(DKA`:&["1O9YY-4'B2J'^*">JMR*ZMV)7A>@0_IHW2'<>$QXBR<JH
|
||||
MAEWB-H'^:+[A:$$*YU,;L]%DE8_L+<3.C5[1$R2J$NDO8O/H(%&UR'B'`S@3
|
||||
M:K<Q7T7W/G&T_OY6O[$/%PUO]9/`]W[@>W]!#_"]/_TXU]'M\@/V%`UY.Y<>
|
||||
M^(;UM&K!<^3P,$U%J?.?G07]//AHKM:BDIA!M!D+.'0#]0-F;8C)R:V?X?53
|
||||
M3KZIE+O%014P5"E_SC]>6##K83HCTVY,E43VZHU:KB$U)%=ET/(!I;I5+GO`
|
||||
M:V'WP`WE=JT]A%;1ITQV26`46;S*?9D4I\C">Q\2/R8KUA2HQ7^2;#.0$T7H
|
||||
MO(N&/($;$SCV]K^&]H(T&G:?H6?I"8SWXGB"F++B?1MY'#^YPWCO7APX(_=Y
|
||||
M-ND!GDTJ"%SSU,0YP4ID'MO*U18-?OP6FDG`]\*7QI/DE+0O#MF8P[3SL,FC
|
||||
M]JC<&F$)6D19=>3K5&P+[VF<-)#!C0+16'GP`&FO64A!@SF3@A?B"_\<F?YJ
|
||||
M$$:SQPL#9QC8>.!Z6+?E0U"H&<30]LZ4WQ+ZSX1+=(ZLTQ^N*U<#=$`?6&>0
|
||||
M0QR>:V,*0(HRA$-.D]?&-'1*#H-,<6R,4?_93ZA((HRG>*(L7Z/LZ<M3`_9_
|
||||
M!&'_"DVY>L6NT`#RI]L/Z]QJM\JC0>ME@/=1N0M(W_7LQ4;QZ,W*GKWDX^!`
|
||||
MQ$3W[$++]_Z`6XU@S[!;7=!>00>0E+O][=R0W%,@=^YVM+H?CX,/"_RV"^%S
|
||||
MEL_D7=:#X])FO4>O/^.DPJ6IF/7S%\^I*B-\="%PGGCQK#G,G[IJCF_IK#FX
|
||||
MG;75F\VU&!CKD)!IYG#IN53[YF<#]KJ&M==-A58QNXJB[&F-Z5EK4(F*52&-
|
||||
M0K-7:_!JZ/4AC23=*ZH:G__Z#J8B5N1(=L4L1U\G&7U)RIXW(WH."WX2":X0
|
||||
M1;&N:"ISD7"`LP8=?1MSME[9L]2B(MV1U2/!2ZR.$C`"ZG:.[C!O!4(4E.YV
|
||||
MMK)GOGU]+)59%=LS;TD.)-HLMSVZ<)G]UHMZN?2T4Z<*JW,+V4W-U\KA=4%!
|
||||
MC+AX6EJ3]^`BL?`5\5/)/+=4^#3N_O/PUIQE'I;V[-C?X/>_*'N>C^V9C?3?
|
||||
MK_%[--+CYWZ#WPNB37(IU;Q(I^*'.,@]@>;YQ5:J9='*']"W4M$]CQK!ZK?)
|
||||
M]K3IFM%*Q"&1KB6;/6/X:RS_KHTI[)0`AA).LPW.KG]:V:.75,B$$0IW3$3/
|
||||
MTL"@4>%B&+.8GD6`?6R#)RLCZ`_UX:'LV;RE!1%Z>:AM,([V1O0`C(V)Z8DJ
|
||||
MC$(*JB1SK[]HY-"WJSUA0]^NEOWS;U<M'1S+:>P!.]UYM%W9(QC9(QSRY=CU
|
||||
M>'3NHN>[1GCDE5+[>W_X4\]N$B_2%D<
|
||||
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
|
||||
!````
|
||||
`
|
||||
end
|
@ -72,8 +72,8 @@ struct offload_id {
|
||||
unsigned long data;
|
||||
};
|
||||
|
||||
struct rtentry;
|
||||
struct ifnet;
|
||||
struct rt_entry;
|
||||
struct tom_info;
|
||||
struct sysctl_oid;
|
||||
struct socket;
|
||||
|
@ -4,22 +4,22 @@ CXGB = ${.CURDIR}/../../dev/cxgb
|
||||
.PATH: ${CXGB} ${CXGB}/common ${CXGB}/sys
|
||||
|
||||
KMOD= if_cxgb
|
||||
SRCS= cxgb_mc5.c cxgb_vsc8211.c cxgb_ael1002.c cxgb_mv88e1xxx.c
|
||||
SRCS= cxgb_mc5.c cxgb_vsc8211.c cxgb_vsc7323.c cxgb_ael1002.c cxgb_mv88e1xxx.c
|
||||
SRCS+= cxgb_xgmac.c cxgb_t3_hw.c cxgb_main.c cxgb_sge.c cxgb_lro.c
|
||||
SRCS+= cxgb_offload.c cxgb_l2t.c
|
||||
SRCS+= device_if.h bus_if.h pci_if.h
|
||||
SRCS+= uipc_mvec.c
|
||||
|
||||
CFLAGS+= -DCONFIG_CHELSIO_T3_CORE -g -DDEFAULT_JUMBO -DCONFIG_DEFINED
|
||||
CFLAGS+= -DCONFIG_CHELSIO_T3_CORE -g -DDEFAULT_JUMBO -DCONFIG_DEFINED -I${CXGB}
|
||||
|
||||
.if ${MACHINE_ARCH} != "ia64"
|
||||
# ld is broken on ia64
|
||||
t3fw-4.0.0.bin: ${CXGB}/t3fw-4.0.0.bin.gz.uu
|
||||
uudecode -p < ${CXGB}/t3fw-4.0.0.bin.gz.uu \
|
||||
t3fw-4.1.0.bin: ${CXGB}/t3fw-4.1.0.bin.gz.uu
|
||||
uudecode -p < ${CXGB}/t3fw-4.1.0.bin.gz.uu \
|
||||
| gzip -dc > ${.TARGET}
|
||||
|
||||
FIRMWS= t3fw-4.0.0.bin:t3fw400
|
||||
CLEANFILES+= t3fw-4.0.0.bin
|
||||
FIRMWS= t3fw-4.1.0.bin:t3fw410
|
||||
CLEANFILES+= t3fw-4.1.0.bin
|
||||
.endif
|
||||
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user