Commit 4da44fdf authored by David S. Miller's avatar David S. Miller

Merge branch 'cxgb4-next'

Hariprasad Shenai says:

====================
Free VI, flush sge ec and some other misc. fixes

This patch series adds the following.
Free VI interface during remove, flush SGE ec routine, rename
t4_link_start to t4_link_l1cfg since it only does l1 configuration, set
mac addr from when we can't contact firmware for debug purpose, set pcie
completion timeout and use fw interface to access TP_PIO_XXX registers

This patch series has been created against net-next tree and includes
patches on cxgb4 driver.

We have included all the maintainers of respective drivers. Kindly review
the change and let us know in case of any review comments.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents bb62f791 c1e9af0c
...@@ -46,6 +46,7 @@ ...@@ -46,6 +46,7 @@
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/timer.h> #include <linux/timer.h>
#include <linux/vmalloc.h> #include <linux/vmalloc.h>
#include <linux/etherdevice.h>
#include <asm/io.h> #include <asm/io.h>
#include "cxgb4_uld.h" #include "cxgb4_uld.h"
...@@ -57,6 +58,7 @@ enum { ...@@ -57,6 +58,7 @@ enum {
EC_LEN = 16, /* E/C length */ EC_LEN = 16, /* E/C length */
ID_LEN = 16, /* ID length */ ID_LEN = 16, /* ID length */
PN_LEN = 16, /* Part Number length */ PN_LEN = 16, /* Part Number length */
MACADDR_LEN = 12, /* MAC Address length */
}; };
enum { enum {
...@@ -280,6 +282,7 @@ struct vpd_params { ...@@ -280,6 +282,7 @@ struct vpd_params {
u8 sn[SERNUM_LEN + 1]; u8 sn[SERNUM_LEN + 1];
u8 id[ID_LEN + 1]; u8 id[ID_LEN + 1];
u8 pn[PN_LEN + 1]; u8 pn[PN_LEN + 1];
u8 na[MACADDR_LEN + 1];
}; };
struct pci_params { struct pci_params {
...@@ -945,6 +948,22 @@ static inline void t4_write_reg64(struct adapter *adap, u32 reg_addr, u64 val) ...@@ -945,6 +948,22 @@ static inline void t4_write_reg64(struct adapter *adap, u32 reg_addr, u64 val)
writeq(val, adap->regs + reg_addr); writeq(val, adap->regs + reg_addr);
} }
/**
* t4_set_hw_addr - store a port's MAC address in SW
* @adapter: the adapter
* @port_idx: the port index
* @hw_addr: the Ethernet address
*
* Store the Ethernet address of the given port in SW. Called by the common
* code when it retrieves a port's Ethernet address from EEPROM.
*/
static inline void t4_set_hw_addr(struct adapter *adapter, int port_idx,
u8 hw_addr[])
{
ether_addr_copy(adapter->port[port_idx]->dev_addr, hw_addr);
ether_addr_copy(adapter->port[port_idx]->perm_addr, hw_addr);
}
/** /**
* netdev2pinfo - return the port_info structure associated with a net_device * netdev2pinfo - return the port_info structure associated with a net_device
* @dev: the netdev * @dev: the netdev
...@@ -1229,7 +1248,7 @@ void t4_intr_disable(struct adapter *adapter); ...@@ -1229,7 +1248,7 @@ void t4_intr_disable(struct adapter *adapter);
int t4_slow_intr_handler(struct adapter *adapter); int t4_slow_intr_handler(struct adapter *adapter);
int t4_wait_dev_ready(void __iomem *regs); int t4_wait_dev_ready(void __iomem *regs);
int t4_link_start(struct adapter *adap, unsigned int mbox, unsigned int port, int t4_link_l1cfg(struct adapter *adap, unsigned int mbox, unsigned int port,
struct link_config *lc); struct link_config *lc);
int t4_restart_aneg(struct adapter *adap, unsigned int mbox, unsigned int port); int t4_restart_aneg(struct adapter *adap, unsigned int mbox, unsigned int port);
...@@ -1251,7 +1270,8 @@ unsigned int t4_get_regs_len(struct adapter *adapter); ...@@ -1251,7 +1270,8 @@ unsigned int t4_get_regs_len(struct adapter *adapter);
void t4_get_regs(struct adapter *adap, void *buf, size_t buf_size); void t4_get_regs(struct adapter *adap, void *buf, size_t buf_size);
int t4_seeprom_wp(struct adapter *adapter, bool enable); int t4_seeprom_wp(struct adapter *adapter, bool enable);
int get_vpd_params(struct adapter *adapter, struct vpd_params *p); int t4_get_raw_vpd_params(struct adapter *adapter, struct vpd_params *p);
int t4_get_vpd_params(struct adapter *adapter, struct vpd_params *p);
int t4_read_flash(struct adapter *adapter, unsigned int addr, int t4_read_flash(struct adapter *adapter, unsigned int addr,
unsigned int nwords, u32 *data, int byte_oriented); unsigned int nwords, u32 *data, int byte_oriented);
int t4_load_fw(struct adapter *adapter, const u8 *fw_data, unsigned int size); int t4_load_fw(struct adapter *adapter, const u8 *fw_data, unsigned int size);
...@@ -1378,6 +1398,9 @@ int t4_cfg_pfvf(struct adapter *adap, unsigned int mbox, unsigned int pf, ...@@ -1378,6 +1398,9 @@ int t4_cfg_pfvf(struct adapter *adap, unsigned int mbox, unsigned int pf,
int t4_alloc_vi(struct adapter *adap, unsigned int mbox, unsigned int port, int t4_alloc_vi(struct adapter *adap, unsigned int mbox, unsigned int port,
unsigned int pf, unsigned int vf, unsigned int nmac, u8 *mac, unsigned int pf, unsigned int vf, unsigned int nmac, u8 *mac,
unsigned int *rss_size); unsigned int *rss_size);
int t4_free_vi(struct adapter *adap, unsigned int mbox,
unsigned int pf, unsigned int vf,
unsigned int viid);
int t4_set_rxmode(struct adapter *adap, unsigned int mbox, unsigned int viid, int t4_set_rxmode(struct adapter *adap, unsigned int mbox, unsigned int viid,
int mtu, int promisc, int all_multi, int bcast, int vlanex, int mtu, int promisc, int all_multi, int bcast, int vlanex,
bool sleep_ok); bool sleep_ok);
...@@ -1407,6 +1430,7 @@ int t4_ctrl_eq_free(struct adapter *adap, unsigned int mbox, unsigned int pf, ...@@ -1407,6 +1430,7 @@ int t4_ctrl_eq_free(struct adapter *adap, unsigned int mbox, unsigned int pf,
unsigned int vf, unsigned int eqid); unsigned int vf, unsigned int eqid);
int t4_ofld_eq_free(struct adapter *adap, unsigned int mbox, unsigned int pf, int t4_ofld_eq_free(struct adapter *adap, unsigned int mbox, unsigned int pf,
unsigned int vf, unsigned int eqid); unsigned int vf, unsigned int eqid);
int t4_sge_ctxt_flush(struct adapter *adap, unsigned int mbox);
int t4_handle_fw_rpl(struct adapter *adap, const __be64 *rpl); int t4_handle_fw_rpl(struct adapter *adap, const __be64 *rpl);
void t4_db_full(struct adapter *adapter); void t4_db_full(struct adapter *adapter);
void t4_db_dropped(struct adapter *adapter); void t4_db_dropped(struct adapter *adapter);
......
...@@ -646,7 +646,7 @@ static int set_settings(struct net_device *dev, struct ethtool_cmd *cmd) ...@@ -646,7 +646,7 @@ static int set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
lc->autoneg = cmd->autoneg; lc->autoneg = cmd->autoneg;
if (netif_running(dev)) if (netif_running(dev))
return t4_link_start(p->adapter, p->adapter->pf, p->tx_chan, return t4_link_l1cfg(p->adapter, p->adapter->pf, p->tx_chan,
lc); lc);
return 0; return 0;
} }
...@@ -679,7 +679,7 @@ static int set_pauseparam(struct net_device *dev, ...@@ -679,7 +679,7 @@ static int set_pauseparam(struct net_device *dev,
if (epause->tx_pause) if (epause->tx_pause)
lc->requested_fc |= PAUSE_TX; lc->requested_fc |= PAUSE_TX;
if (netif_running(dev)) if (netif_running(dev))
return t4_link_start(p->adapter, p->adapter->pf, p->tx_chan, return t4_link_l1cfg(p->adapter, p->adapter->pf, p->tx_chan,
lc); lc);
return 0; return 0;
} }
......
...@@ -481,7 +481,7 @@ static int link_start(struct net_device *dev) ...@@ -481,7 +481,7 @@ static int link_start(struct net_device *dev)
} }
} }
if (ret == 0) if (ret == 0)
ret = t4_link_start(pi->adapter, mb, pi->tx_chan, ret = t4_link_l1cfg(pi->adapter, mb, pi->tx_chan,
&pi->link_cfg); &pi->link_cfg);
if (ret == 0) { if (ret == 0) {
local_bh_disable(); local_bh_disable();
...@@ -2007,11 +2007,8 @@ EXPORT_SYMBOL(cxgb4_iscsi_init); ...@@ -2007,11 +2007,8 @@ EXPORT_SYMBOL(cxgb4_iscsi_init);
int cxgb4_flush_eq_cache(struct net_device *dev) int cxgb4_flush_eq_cache(struct net_device *dev)
{ {
struct adapter *adap = netdev2adap(dev); struct adapter *adap = netdev2adap(dev);
int ret;
ret = t4_fwaddrspace_write(adap, adap->mbox, return t4_sge_ctxt_flush(adap, adap->mbox);
0xe1000000 + SGE_CTXT_CMD_A, 0x20000000);
return ret;
} }
EXPORT_SYMBOL(cxgb4_flush_eq_cache); EXPORT_SYMBOL(cxgb4_flush_eq_cache);
...@@ -3715,7 +3712,7 @@ static int adap_init0(struct adapter *adap) ...@@ -3715,7 +3712,7 @@ static int adap_init0(struct adapter *adap)
* the firmware. On the other hand, we need these fairly early on * the firmware. On the other hand, we need these fairly early on
* so we do this right after getting ahold of the firmware. * so we do this right after getting ahold of the firmware.
*/ */
ret = get_vpd_params(adap, &adap->params.vpd); ret = t4_get_vpd_params(adap, &adap->params.vpd);
if (ret < 0) if (ret < 0)
goto bye; goto bye;
...@@ -4071,8 +4068,8 @@ static int adap_init0(struct adapter *adap) ...@@ -4071,8 +4068,8 @@ static int adap_init0(struct adapter *adap)
adap->params.b_wnd); adap->params.b_wnd);
} }
t4_init_sge_params(adap); t4_init_sge_params(adap);
t4_init_tp_params(adap);
adap->flags |= FW_OK; adap->flags |= FW_OK;
t4_init_tp_params(adap);
return 0; return 0;
/* /*
...@@ -4538,6 +4535,11 @@ static void free_some_resources(struct adapter *adapter) ...@@ -4538,6 +4535,11 @@ static void free_some_resources(struct adapter *adapter)
for_each_port(adapter, i) for_each_port(adapter, i)
if (adapter->port[i]) { if (adapter->port[i]) {
struct port_info *pi = adap2pinfo(adapter, i);
if (pi->viid != 0)
t4_free_vi(adapter, adapter->mbox, adapter->pf,
0, pi->viid);
kfree(adap2pinfo(adapter, i)->rss); kfree(adap2pinfo(adapter, i)->rss);
free_netdev(adapter->port[i]); free_netdev(adapter->port[i]);
} }
...@@ -4733,10 +4735,25 @@ static int init_one(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -4733,10 +4735,25 @@ static int init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
err = t4_port_init(adapter, func, func, 0); err = t4_port_init(adapter, func, func, 0);
if (err) if (err)
goto out_free_dev; goto out_free_dev;
} else if (adapter->params.nports == 1) {
/* If we don't have a connection to the firmware -- possibly
* because of an error -- grab the raw VPD parameters so we
* can set the proper MAC Address on the debug network
* interface that we've created.
*/
u8 hw_addr[ETH_ALEN];
u8 *na = adapter->params.vpd.na;
err = t4_get_raw_vpd_params(adapter, &adapter->params.vpd);
if (!err) {
for (i = 0; i < ETH_ALEN; i++)
hw_addr[i] = (hex2val(na[2 * i + 0]) * 16 +
hex2val(na[2 * i + 1]));
t4_set_hw_addr(adapter, 0, hw_addr);
}
} }
/* /* Configure queues and allocate tables now, they can be needed as
* Configure queues and allocate tables now, they can be needed as
* soon as the first register_netdev completes. * soon as the first register_netdev completes.
*/ */
cfg_queues(adapter); cfg_queues(adapter);
......
This diff is collapsed.
...@@ -772,7 +772,7 @@ struct fw_ldst_cmd { ...@@ -772,7 +772,7 @@ struct fw_ldst_cmd {
} addrval; } addrval;
struct fw_ldst_idctxt { struct fw_ldst_idctxt {
__be32 physid; __be32 physid;
__be32 msg_pkd; __be32 msg_ctxtflush;
__be32 ctxt_data7; __be32 ctxt_data7;
__be32 ctxt_data6; __be32 ctxt_data6;
__be32 ctxt_data5; __be32 ctxt_data5;
...@@ -834,6 +834,10 @@ struct fw_ldst_cmd { ...@@ -834,6 +834,10 @@ struct fw_ldst_cmd {
#define FW_LDST_CMD_MSG_S 31 #define FW_LDST_CMD_MSG_S 31
#define FW_LDST_CMD_MSG_V(x) ((x) << FW_LDST_CMD_MSG_S) #define FW_LDST_CMD_MSG_V(x) ((x) << FW_LDST_CMD_MSG_S)
#define FW_LDST_CMD_CTXTFLUSH_S 30
#define FW_LDST_CMD_CTXTFLUSH_V(x) ((x) << FW_LDST_CMD_CTXTFLUSH_S)
#define FW_LDST_CMD_CTXTFLUSH_F FW_LDST_CMD_CTXTFLUSH_V(1U)
#define FW_LDST_CMD_PADDR_S 8 #define FW_LDST_CMD_PADDR_S 8
#define FW_LDST_CMD_PADDR_V(x) ((x) << FW_LDST_CMD_PADDR_S) #define FW_LDST_CMD_PADDR_V(x) ((x) << FW_LDST_CMD_PADDR_S)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment