Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6: (1623 commits) netxen: update copyright netxen: fix tx timeout recovery netxen: fix file firmware leak netxen: improve pci memory access netxen: change firmware write size tg3: Fix return ring size breakage netxen: build fix for INET=n cdc-phonet: autoconfigure Phonet address Phonet: back-end for autoconfigured addresses Phonet: fix netlink address dump error handling ipv6: Add IFA_F_DADFAILED flag net: Add DEVTYPE support for Ethernet based devices mv643xx_eth.c: remove unused txq_set_wrr() ucc_geth: Fix hangs after switching from full to half duplex ucc_geth: Rearrange some code to avoid forward declarations phy/marvell: Make non-aneg speed/duplex forcing work for 88E1111 PHYs drivers/net/phy: introduce missing kfree drivers/net/wan: introduce missing kfree net: force bridge module(s) to be GPL Subject: [PATCH] appletalk: Fix skb leak when ipddp interface is not loaded ... Fixed up trivial conflicts: - arch/x86/include/asm/socket.h converted to <asm-generic/socket.h> in the x86 tree. The generic header has the same new #define's, so that works out fine. - drivers/net/tun.c fix conflict between89f56d1e9
("tun: reuse struct sock fields") that switched over to using 'tun->socket.sk' instead of the redundantly available (and thus removed) 'tun->sk', and2b980dbd
("lsm: Add hooks to the TUN driver") which added a new 'tun->sk' use. Noted in 'next' by Stephen Rothwell.
This commit is contained in:
@@ -276,6 +276,14 @@ static inline struct port_info *adap2pinfo(struct adapter *adap, int idx)
|
||||
return netdev_priv(adap->port[idx]);
|
||||
}
|
||||
|
||||
static inline int phy2portid(struct cphy *phy)
|
||||
{
|
||||
struct adapter *adap = phy->adapter;
|
||||
struct port_info *port0 = adap2pinfo(adap, 0);
|
||||
|
||||
return &port0->phy == phy ? 0 : 1;
|
||||
}
|
||||
|
||||
#define OFFLOAD_DEVMAP_BIT 15
|
||||
|
||||
#define tdev2adap(d) container_of(d, struct adapter, tdev)
|
||||
@@ -301,7 +309,7 @@ void t3_stop_sge_timers(struct adapter *adap);
|
||||
void t3_free_sge_resources(struct adapter *adap);
|
||||
void t3_sge_err_intr_handler(struct adapter *adapter);
|
||||
irq_handler_t t3_intr_handler(struct adapter *adap, int polling);
|
||||
int t3_eth_xmit(struct sk_buff *skb, struct net_device *dev);
|
||||
netdev_tx_t t3_eth_xmit(struct sk_buff *skb, struct net_device *dev);
|
||||
int t3_mgmt_tx(struct adapter *adap, struct sk_buff *skb);
|
||||
void t3_update_qset_coalesce(struct sge_qset *qs, const struct qset_params *p);
|
||||
int t3_sge_alloc_qset(struct adapter *adapter, unsigned int id, int nports,
|
||||
@@ -312,4 +320,6 @@ int t3_get_desc(const struct sge_qset *qs, unsigned int qnum, unsigned int idx,
|
||||
unsigned char *data);
|
||||
irqreturn_t t3_sge_intr_msix(int irq, void *cookie);
|
||||
|
||||
int t3_get_edc_fw(struct cphy *phy, int edc_idx, int size);
|
||||
|
||||
#endif /* __T3_ADAPTER_H__ */
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -271,7 +271,8 @@ int t3_aq100x_phy_prep(struct cphy *phy, struct adapter *adapter, int phy_addr,
|
||||
|
||||
cphy_init(phy, adapter, phy_addr, &aq100x_ops, mdio_ops,
|
||||
SUPPORTED_1000baseT_Full | SUPPORTED_10000baseT_Full |
|
||||
SUPPORTED_Autoneg | SUPPORTED_AUI, "1000/10GBASE-T");
|
||||
SUPPORTED_TP | SUPPORTED_Autoneg | SUPPORTED_AUI,
|
||||
"1000/10GBASE-T");
|
||||
|
||||
/*
|
||||
* The PHY has been out of reset ever since the system powered up. So
|
||||
@@ -316,11 +317,9 @@ int t3_aq100x_phy_prep(struct cphy *phy, struct adapter *adapter, int phy_addr,
|
||||
|
||||
/* Firmware version check. */
|
||||
t3_mdio_read(phy, MDIO_MMD_VEND1, AQ_FW_VERSION, &v);
|
||||
if (v != 30) {
|
||||
if (v != 101)
|
||||
CH_WARN(adapter, "PHY%d: unsupported firmware %d\n",
|
||||
phy_addr, v);
|
||||
return 0; /* allow t3_prep_adapter to succeed */
|
||||
}
|
||||
|
||||
/*
|
||||
* The PHY should start in really-low-power mode. Prepare it for normal
|
||||
|
@@ -566,6 +566,15 @@ struct cphy_ops {
|
||||
|
||||
u32 mmds;
|
||||
};
|
||||
enum {
|
||||
EDC_OPT_AEL2005 = 0,
|
||||
EDC_OPT_AEL2005_SIZE = 1084,
|
||||
EDC_TWX_AEL2005 = 1,
|
||||
EDC_TWX_AEL2005_SIZE = 1464,
|
||||
EDC_TWX_AEL2020 = 2,
|
||||
EDC_TWX_AEL2020_SIZE = 1628,
|
||||
EDC_MAX_SIZE = EDC_TWX_AEL2020_SIZE, /* Max cache size */
|
||||
};
|
||||
|
||||
/* A PHY instance */
|
||||
struct cphy {
|
||||
@@ -577,6 +586,7 @@ struct cphy {
|
||||
unsigned long fifo_errors; /* FIFO over/under-flows */
|
||||
const struct cphy_ops *ops; /* PHY operations */
|
||||
struct mdio_if_info mdio;
|
||||
u16 phy_cache[EDC_MAX_SIZE]; /* EDC cache */
|
||||
};
|
||||
|
||||
/* Convenience MDIO read/write wrappers */
|
||||
|
@@ -172,6 +172,23 @@ static void link_report(struct net_device *dev)
|
||||
}
|
||||
}
|
||||
|
||||
static void enable_tx_fifo_drain(struct adapter *adapter,
|
||||
struct port_info *pi)
|
||||
{
|
||||
t3_set_reg_field(adapter, A_XGM_TXFIFO_CFG + pi->mac.offset, 0,
|
||||
F_ENDROPPKT);
|
||||
t3_write_reg(adapter, A_XGM_RX_CTRL + pi->mac.offset, 0);
|
||||
t3_write_reg(adapter, A_XGM_TX_CTRL + pi->mac.offset, F_TXEN);
|
||||
t3_write_reg(adapter, A_XGM_RX_CTRL + pi->mac.offset, F_RXEN);
|
||||
}
|
||||
|
||||
static void disable_tx_fifo_drain(struct adapter *adapter,
|
||||
struct port_info *pi)
|
||||
{
|
||||
t3_set_reg_field(adapter, A_XGM_TXFIFO_CFG + pi->mac.offset,
|
||||
F_ENDROPPKT, 0);
|
||||
}
|
||||
|
||||
void t3_os_link_fault(struct adapter *adap, int port_id, int state)
|
||||
{
|
||||
struct net_device *dev = adap->port[port_id];
|
||||
@@ -185,6 +202,8 @@ void t3_os_link_fault(struct adapter *adap, int port_id, int state)
|
||||
|
||||
netif_carrier_on(dev);
|
||||
|
||||
disable_tx_fifo_drain(adap, pi);
|
||||
|
||||
/* Clear local faults */
|
||||
t3_xgm_intr_disable(adap, pi->port_id);
|
||||
t3_read_reg(adap, A_XGM_INT_STATUS +
|
||||
@@ -200,9 +219,12 @@ void t3_os_link_fault(struct adapter *adap, int port_id, int state)
|
||||
t3_xgm_intr_enable(adap, pi->port_id);
|
||||
|
||||
t3_mac_enable(mac, MAC_DIRECTION_TX);
|
||||
} else
|
||||
} else {
|
||||
netif_carrier_off(dev);
|
||||
|
||||
/* Flush TX FIFO */
|
||||
enable_tx_fifo_drain(adap, pi);
|
||||
}
|
||||
link_report(dev);
|
||||
}
|
||||
|
||||
@@ -232,6 +254,8 @@ void t3_os_link_changed(struct adapter *adapter, int port_id, int link_stat,
|
||||
|
||||
if (link_stat != netif_carrier_ok(dev)) {
|
||||
if (link_stat) {
|
||||
disable_tx_fifo_drain(adapter, pi);
|
||||
|
||||
t3_mac_enable(mac, MAC_DIRECTION_RX);
|
||||
|
||||
/* Clear local faults */
|
||||
@@ -263,6 +287,9 @@ void t3_os_link_changed(struct adapter *adapter, int port_id, int link_stat,
|
||||
t3_read_reg(adapter, A_XGM_INT_STATUS + pi->mac.offset);
|
||||
t3_mac_disable(mac, MAC_DIRECTION_RX);
|
||||
t3_link_start(&pi->phy, mac, &pi->link_config);
|
||||
|
||||
/* Flush TX FIFO */
|
||||
enable_tx_fifo_drain(adapter, pi);
|
||||
}
|
||||
|
||||
link_report(dev);
|
||||
@@ -443,6 +470,7 @@ static int init_tp_parity(struct adapter *adap)
|
||||
memset(req, 0, sizeof(*req));
|
||||
req->wr.wr_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD));
|
||||
OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_SMT_WRITE_REQ, i));
|
||||
req->mtu_idx = NMTUS - 1;
|
||||
req->iff = i;
|
||||
t3_mgmt_tx(adap, skb);
|
||||
if (skb == adap->nofail_skb) {
|
||||
@@ -963,6 +991,75 @@ static int bind_qsets(struct adapter *adap)
|
||||
|
||||
#define FW_FNAME "cxgb3/t3fw-%d.%d.%d.bin"
|
||||
#define TPSRAM_NAME "cxgb3/t3%c_psram-%d.%d.%d.bin"
|
||||
#define AEL2005_OPT_EDC_NAME "cxgb3/ael2005_opt_edc.bin"
|
||||
#define AEL2005_TWX_EDC_NAME "cxgb3/ael2005_twx_edc.bin"
|
||||
#define AEL2020_TWX_EDC_NAME "cxgb3/ael2020_twx_edc.bin"
|
||||
|
||||
static inline const char *get_edc_fw_name(int edc_idx)
|
||||
{
|
||||
const char *fw_name = NULL;
|
||||
|
||||
switch (edc_idx) {
|
||||
case EDC_OPT_AEL2005:
|
||||
fw_name = AEL2005_OPT_EDC_NAME;
|
||||
break;
|
||||
case EDC_TWX_AEL2005:
|
||||
fw_name = AEL2005_TWX_EDC_NAME;
|
||||
break;
|
||||
case EDC_TWX_AEL2020:
|
||||
fw_name = AEL2020_TWX_EDC_NAME;
|
||||
break;
|
||||
}
|
||||
return fw_name;
|
||||
}
|
||||
|
||||
int t3_get_edc_fw(struct cphy *phy, int edc_idx, int size)
|
||||
{
|
||||
struct adapter *adapter = phy->adapter;
|
||||
const struct firmware *fw;
|
||||
char buf[64];
|
||||
u32 csum;
|
||||
const __be32 *p;
|
||||
u16 *cache = phy->phy_cache;
|
||||
int i, ret;
|
||||
|
||||
snprintf(buf, sizeof(buf), get_edc_fw_name(edc_idx));
|
||||
|
||||
ret = request_firmware(&fw, buf, &adapter->pdev->dev);
|
||||
if (ret < 0) {
|
||||
dev_err(&adapter->pdev->dev,
|
||||
"could not upgrade firmware: unable to load %s\n",
|
||||
buf);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* check size, take checksum in account */
|
||||
if (fw->size > size + 4) {
|
||||
CH_ERR(adapter, "firmware image too large %u, expected %d\n",
|
||||
(unsigned int)fw->size, size + 4);
|
||||
ret = -EINVAL;
|
||||
}
|
||||
|
||||
/* compute checksum */
|
||||
p = (const __be32 *)fw->data;
|
||||
for (csum = 0, i = 0; i < fw->size / sizeof(csum); i++)
|
||||
csum += ntohl(p[i]);
|
||||
|
||||
if (csum != 0xffffffff) {
|
||||
CH_ERR(adapter, "corrupted firmware image, checksum %u\n",
|
||||
csum);
|
||||
ret = -EINVAL;
|
||||
}
|
||||
|
||||
for (i = 0; i < size / 4 ; i++) {
|
||||
*cache++ = (be32_to_cpu(p[i]) & 0xffff0000) >> 16;
|
||||
*cache++ = be32_to_cpu(p[i]) & 0xffff;
|
||||
}
|
||||
|
||||
release_firmware(fw);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int upgrade_fw(struct adapter *adap)
|
||||
{
|
||||
|
@@ -1216,7 +1216,7 @@ static inline void t3_stop_tx_queue(struct netdev_queue *txq,
|
||||
*
|
||||
* Add a packet to an SGE Tx queue. Runs with softirqs disabled.
|
||||
*/
|
||||
int t3_eth_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
netdev_tx_t t3_eth_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
{
|
||||
int qidx;
|
||||
unsigned int ndesc, pidx, credits, gen, compl;
|
||||
|
@@ -3465,7 +3465,7 @@ static void config_pcie(struct adapter *adap)
|
||||
{201, 321, 258, 450, 834, 1602}
|
||||
};
|
||||
|
||||
u16 val;
|
||||
u16 val, devid;
|
||||
unsigned int log2_width, pldsize;
|
||||
unsigned int fst_trn_rx, fst_trn_tx, acklat, rpllmt;
|
||||
|
||||
@@ -3473,6 +3473,17 @@ static void config_pcie(struct adapter *adap)
|
||||
adap->params.pci.pcie_cap_addr + PCI_EXP_DEVCTL,
|
||||
&val);
|
||||
pldsize = (val & PCI_EXP_DEVCTL_PAYLOAD) >> 5;
|
||||
|
||||
pci_read_config_word(adap->pdev, 0x2, &devid);
|
||||
if (devid == 0x37) {
|
||||
pci_write_config_word(adap->pdev,
|
||||
adap->params.pci.pcie_cap_addr +
|
||||
PCI_EXP_DEVCTL,
|
||||
val & ~PCI_EXP_DEVCTL_READRQ &
|
||||
~PCI_EXP_DEVCTL_PAYLOAD);
|
||||
pldsize = 0;
|
||||
}
|
||||
|
||||
pci_read_config_word(adap->pdev,
|
||||
adap->params.pci.pcie_cap_addr + PCI_EXP_LNKCTL,
|
||||
&val);
|
||||
@@ -3681,7 +3692,13 @@ static void mc7_prep(struct adapter *adapter, struct mc7 *mc7,
|
||||
|
||||
void mac_prep(struct cmac *mac, struct adapter *adapter, int index)
|
||||
{
|
||||
u16 devid;
|
||||
|
||||
mac->adapter = adapter;
|
||||
pci_read_config_word(adapter->pdev, 0x2, &devid);
|
||||
|
||||
if (devid == 0x37 && !adapter->params.vpd.xauicfg[1])
|
||||
index = 0;
|
||||
mac->offset = (XGMAC0_1_BASE_ADDR - XGMAC0_0_BASE_ADDR) * index;
|
||||
mac->nucast = 1;
|
||||
|
||||
|
@@ -447,11 +447,12 @@ int t3_mac_set_speed_duplex_fc(struct cmac *mac, int speed, int duplex, int fc)
|
||||
|
||||
val = t3_read_reg(adap, A_XGM_RXFIFO_CFG + oft);
|
||||
val &= ~V_RXFIFOPAUSEHWM(M_RXFIFOPAUSEHWM);
|
||||
if (fc & PAUSE_TX)
|
||||
val |= V_RXFIFOPAUSEHWM(rx_fifo_hwm(
|
||||
t3_read_reg(adap,
|
||||
A_XGM_RX_MAX_PKT_SIZE
|
||||
+ oft)) / 8);
|
||||
if (fc & PAUSE_TX) {
|
||||
u32 rx_max_pkt_size =
|
||||
G_RXMAXPKTSIZE(t3_read_reg(adap,
|
||||
A_XGM_RX_MAX_PKT_SIZE + oft));
|
||||
val |= V_RXFIFOPAUSEHWM(rx_fifo_hwm(rx_max_pkt_size) / 8);
|
||||
}
|
||||
t3_write_reg(adap, A_XGM_RXFIFO_CFG + oft, val);
|
||||
|
||||
t3_set_reg_field(adap, A_XGM_TX_CFG + oft, F_TXPAUSEEN,
|
||||
|
Reference in New Issue
Block a user