Commit 204cd4f4 authored by David S. Miller's avatar David S. Miller

Merge branch 'qlcnic'

Jitendra Kalsaria says:

====================
This set of patches has following updates:
* Enhanced channel configuration logs by adding logs for various cases.
* Take EPORT out of reset before disabling pause frame generation in the
  adapter.
* Add eSwitch statistics support in ethtool stats.
* Enable interrupt coalescing for 83xx adapter.
* Rename IRQ description.
* Added PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_834X and PCI_DEVICE_ID_QLOGIC_824X
  for the patch "qlcnic: Add identifying string for 83xx adapter" as per Francois comment.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 01f27fc0 f6689d92
...@@ -38,8 +38,8 @@ ...@@ -38,8 +38,8 @@
#define _QLCNIC_LINUX_MAJOR 5 #define _QLCNIC_LINUX_MAJOR 5
#define _QLCNIC_LINUX_MINOR 2 #define _QLCNIC_LINUX_MINOR 2
#define _QLCNIC_LINUX_SUBVERSION 41 #define _QLCNIC_LINUX_SUBVERSION 42
#define QLCNIC_LINUX_VERSIONID "5.2.41" #define QLCNIC_LINUX_VERSIONID "5.2.42"
#define QLCNIC_DRV_IDC_VER 0x01 #define QLCNIC_DRV_IDC_VER 0x01
#define QLCNIC_DRIVER_VERSION ((_QLCNIC_LINUX_MAJOR << 16) |\ #define QLCNIC_DRIVER_VERSION ((_QLCNIC_LINUX_MAJOR << 16) |\
(_QLCNIC_LINUX_MINOR << 8) | (_QLCNIC_LINUX_SUBVERSION)) (_QLCNIC_LINUX_MINOR << 8) | (_QLCNIC_LINUX_SUBVERSION))
...@@ -347,8 +347,14 @@ struct qlcnic_rx_buffer { ...@@ -347,8 +347,14 @@ struct qlcnic_rx_buffer {
* Interrupt coalescing defaults. The defaults are for 1500 MTU. It is * Interrupt coalescing defaults. The defaults are for 1500 MTU. It is
* adjusted based on configured MTU. * adjusted based on configured MTU.
*/ */
#define QLCNIC_DEFAULT_INTR_COALESCE_RX_TIME_US 3 #define QLCNIC_INTR_COAL_TYPE_RX 1
#define QLCNIC_DEFAULT_INTR_COALESCE_RX_PACKETS 256 #define QLCNIC_INTR_COAL_TYPE_TX 2
#define QLCNIC_DEF_INTR_COALESCE_RX_TIME_US 3
#define QLCNIC_DEF_INTR_COALESCE_RX_PACKETS 256
#define QLCNIC_DEF_INTR_COALESCE_TX_TIME_US 64
#define QLCNIC_DEF_INTR_COALESCE_TX_PACKETS 64
#define QLCNIC_INTR_DEFAULT 0x04 #define QLCNIC_INTR_DEFAULT 0x04
#define QLCNIC_CONFIG_INTR_COALESCE 3 #define QLCNIC_CONFIG_INTR_COALESCE 3
...@@ -359,6 +365,8 @@ struct qlcnic_nic_intr_coalesce { ...@@ -359,6 +365,8 @@ struct qlcnic_nic_intr_coalesce {
u8 sts_ring_mask; u8 sts_ring_mask;
u16 rx_packets; u16 rx_packets;
u16 rx_time_us; u16 rx_time_us;
u16 tx_packets;
u16 tx_time_us;
u16 flag; u16 flag;
u32 timer_out; u32 timer_out;
}; };
...@@ -511,13 +519,13 @@ struct qlcnic_host_sds_ring { ...@@ -511,13 +519,13 @@ struct qlcnic_host_sds_ring {
int irq; int irq;
dma_addr_t phys_addr; dma_addr_t phys_addr;
char name[IFNAMSIZ+4]; char name[IFNAMSIZ + 12];
} ____cacheline_internodealigned_in_smp; } ____cacheline_internodealigned_in_smp;
struct qlcnic_host_tx_ring { struct qlcnic_host_tx_ring {
int irq; int irq;
void __iomem *crb_intr_mask; void __iomem *crb_intr_mask;
char name[IFNAMSIZ+4]; char name[IFNAMSIZ + 12];
u16 ctx_id; u16 ctx_id;
u32 producer; u32 producer;
u32 sw_consumer; u32 sw_consumer;
...@@ -1474,7 +1482,7 @@ void qlcnic_diag_free_res(struct net_device *netdev, int max_sds_rings); ...@@ -1474,7 +1482,7 @@ void qlcnic_diag_free_res(struct net_device *netdev, int max_sds_rings);
int qlcnic_diag_alloc_res(struct net_device *netdev, int test); int qlcnic_diag_alloc_res(struct net_device *netdev, int test);
netdev_tx_t qlcnic_xmit_frame(struct sk_buff *skb, struct net_device *netdev); netdev_tx_t qlcnic_xmit_frame(struct sk_buff *skb, struct net_device *netdev);
int qlcnic_set_max_rss(struct qlcnic_adapter *, u8, size_t); int qlcnic_set_max_rss(struct qlcnic_adapter *, u8, size_t);
int qlcnic_validate_max_rss(u8, u8); int qlcnic_validate_max_rss(struct qlcnic_adapter *, __u32);
void qlcnic_alloc_lb_filters_mem(struct qlcnic_adapter *adapter); void qlcnic_alloc_lb_filters_mem(struct qlcnic_adapter *adapter);
int qlcnic_enable_msix(struct qlcnic_adapter *, u32); int qlcnic_enable_msix(struct qlcnic_adapter *, u32);
......
...@@ -1937,7 +1937,7 @@ int qlcnic_83xx_get_mac_address(struct qlcnic_adapter *adapter, u8 *mac) ...@@ -1937,7 +1937,7 @@ int qlcnic_83xx_get_mac_address(struct qlcnic_adapter *adapter, u8 *mac)
void qlcnic_83xx_config_intr_coal(struct qlcnic_adapter *adapter) void qlcnic_83xx_config_intr_coal(struct qlcnic_adapter *adapter)
{ {
int err; int err;
u32 temp; u16 temp;
struct qlcnic_cmd_args cmd; struct qlcnic_cmd_args cmd;
struct qlcnic_nic_intr_coalesce *coal = &adapter->ahw->coal; struct qlcnic_nic_intr_coalesce *coal = &adapter->ahw->coal;
...@@ -1945,10 +1945,18 @@ void qlcnic_83xx_config_intr_coal(struct qlcnic_adapter *adapter) ...@@ -1945,10 +1945,18 @@ void qlcnic_83xx_config_intr_coal(struct qlcnic_adapter *adapter)
return; return;
qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_CONFIG_INTR_COAL); qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_CONFIG_INTR_COAL);
cmd.req.arg[1] = 1 | (adapter->recv_ctx->context_id << 16); if (coal->type == QLCNIC_INTR_COAL_TYPE_RX) {
temp = adapter->recv_ctx->context_id;
cmd.req.arg[1] = QLCNIC_INTR_COAL_TYPE_RX | temp << 16;
temp = coal->rx_time_us;
cmd.req.arg[2] = coal->rx_packets | temp << 16;
} else if (coal->type == QLCNIC_INTR_COAL_TYPE_TX) {
temp = adapter->tx_ring->ctx_id;
cmd.req.arg[1] = QLCNIC_INTR_COAL_TYPE_TX | temp << 16;
temp = coal->tx_time_us;
cmd.req.arg[2] = coal->tx_packets | temp << 16;
}
cmd.req.arg[3] = coal->flag; cmd.req.arg[3] = coal->flag;
temp = coal->rx_time_us << 16;
cmd.req.arg[2] = coal->rx_packets | temp;
err = qlcnic_issue_cmd(adapter, &cmd); err = qlcnic_issue_cmd(adapter, &cmd);
if (err != QLCNIC_RCODE_SUCCESS) if (err != QLCNIC_RCODE_SUCCESS)
dev_info(&adapter->pdev->dev, dev_info(&adapter->pdev->dev,
...@@ -2922,6 +2930,9 @@ static u64 *qlcnic_83xx_fill_stats(struct qlcnic_adapter *adapter, ...@@ -2922,6 +2930,9 @@ static u64 *qlcnic_83xx_fill_stats(struct qlcnic_adapter *adapter,
/* fill in MAC rx frame stats */ /* fill in MAC rx frame stats */
for (k += 6; k < 80; k += 2) for (k += 6; k < 80; k += 2)
data = qlcnic_83xx_copy_stats(cmd, data, k); data = qlcnic_83xx_copy_stats(cmd, data, k);
/* fill in eSwitch stats */
for (; k < total_regs; k += 2)
data = qlcnic_83xx_copy_stats(cmd, data, k);
break; break;
case QLC_83XX_STAT_RX: case QLC_83XX_STAT_RX:
for (k = 2; k < 8; k += 2) for (k = 2; k < 8; k += 2)
......
...@@ -381,7 +381,7 @@ enum qlcnic_83xx_states { ...@@ -381,7 +381,7 @@ enum qlcnic_83xx_states {
#define QLC_83XX_STAT_MAC 1 #define QLC_83XX_STAT_MAC 1
#define QLC_83XX_TX_STAT_REGS 14 #define QLC_83XX_TX_STAT_REGS 14
#define QLC_83XX_RX_STAT_REGS 40 #define QLC_83XX_RX_STAT_REGS 40
#define QLC_83XX_MAC_STAT_REGS 80 #define QLC_83XX_MAC_STAT_REGS 94
#define QLC_83XX_GET_FUNC_PRIVILEGE(VAL, FN) (0x3 & ((VAL) >> (FN * 2))) #define QLC_83XX_GET_FUNC_PRIVILEGE(VAL, FN) (0x3 & ((VAL) >> (FN * 2)))
#define QLC_83XX_SET_FUNC_OPMODE(VAL, FN) ((VAL) << (FN * 2)) #define QLC_83XX_SET_FUNC_OPMODE(VAL, FN) ((VAL) << (FN * 2))
......
...@@ -25,6 +25,17 @@ ...@@ -25,6 +25,17 @@
#define QLC_83XX_OPCODE_TMPL_END 0x0080 #define QLC_83XX_OPCODE_TMPL_END 0x0080
#define QLC_83XX_OPCODE_POLL_READ_LIST 0x0100 #define QLC_83XX_OPCODE_POLL_READ_LIST 0x0100
/* EPORT control registers */
#define QLC_83XX_RESET_CONTROL 0x28084E50
#define QLC_83XX_RESET_REG 0x28084E60
#define QLC_83XX_RESET_PORT0 0x28084E70
#define QLC_83XX_RESET_PORT1 0x28084E80
#define QLC_83XX_RESET_PORT2 0x28084E90
#define QLC_83XX_RESET_PORT3 0x28084EA0
#define QLC_83XX_RESET_SRESHIM 0x28084EB0
#define QLC_83XX_RESET_EPGSHIM 0x28084EC0
#define QLC_83XX_RESET_ETHERPCS 0x28084ED0
static int qlcnic_83xx_init_default_driver(struct qlcnic_adapter *adapter); static int qlcnic_83xx_init_default_driver(struct qlcnic_adapter *adapter);
static int qlcnic_83xx_check_heartbeat(struct qlcnic_adapter *p_dev); static int qlcnic_83xx_check_heartbeat(struct qlcnic_adapter *p_dev);
static int qlcnic_83xx_restart_hw(struct qlcnic_adapter *adapter); static int qlcnic_83xx_restart_hw(struct qlcnic_adapter *adapter);
...@@ -1374,6 +1385,19 @@ static void qlcnic_83xx_disable_pause_frames(struct qlcnic_adapter *adapter) ...@@ -1374,6 +1385,19 @@ static void qlcnic_83xx_disable_pause_frames(struct qlcnic_adapter *adapter)
qlcnic_83xx_unlock_driver(adapter); qlcnic_83xx_unlock_driver(adapter);
} }
static void qlcnic_83xx_take_eport_out_of_reset(struct qlcnic_adapter *adapter)
{
QLCWR32(adapter, QLC_83XX_RESET_REG, 0);
QLCWR32(adapter, QLC_83XX_RESET_PORT0, 0);
QLCWR32(adapter, QLC_83XX_RESET_PORT1, 0);
QLCWR32(adapter, QLC_83XX_RESET_PORT2, 0);
QLCWR32(adapter, QLC_83XX_RESET_PORT3, 0);
QLCWR32(adapter, QLC_83XX_RESET_SRESHIM, 0);
QLCWR32(adapter, QLC_83XX_RESET_EPGSHIM, 0);
QLCWR32(adapter, QLC_83XX_RESET_ETHERPCS, 0);
QLCWR32(adapter, QLC_83XX_RESET_CONTROL, 1);
}
static int qlcnic_83xx_check_heartbeat(struct qlcnic_adapter *p_dev) static int qlcnic_83xx_check_heartbeat(struct qlcnic_adapter *p_dev)
{ {
u32 heartbeat, peg_status; u32 heartbeat, peg_status;
...@@ -1395,6 +1419,7 @@ static int qlcnic_83xx_check_heartbeat(struct qlcnic_adapter *p_dev) ...@@ -1395,6 +1419,7 @@ static int qlcnic_83xx_check_heartbeat(struct qlcnic_adapter *p_dev)
if (ret) { if (ret) {
dev_err(&p_dev->pdev->dev, "firmware hang detected\n"); dev_err(&p_dev->pdev->dev, "firmware hang detected\n");
qlcnic_83xx_take_eport_out_of_reset(p_dev);
qlcnic_83xx_disable_pause_frames(p_dev); qlcnic_83xx_disable_pause_frames(p_dev);
peg_status = QLC_SHARED_REG_RD32(p_dev, peg_status = QLC_SHARED_REG_RD32(p_dev,
QLCNIC_PEG_HALT_STATUS1); QLCNIC_PEG_HALT_STATUS1);
......
...@@ -115,6 +115,13 @@ static const char qlcnic_83xx_mac_stats_strings[][ETH_GSTRING_LEN] = { ...@@ -115,6 +115,13 @@ static const char qlcnic_83xx_mac_stats_strings[][ETH_GSTRING_LEN] = {
"mac_rx_dropped", "mac_rx_dropped",
"mac_crc_error", "mac_crc_error",
"mac_align_error", "mac_align_error",
"eswitch_frames",
"eswitch_bytes",
"eswitch_multicast_frames",
"eswitch_broadcast_frames",
"eswitch_unicast_frames",
"eswitch_error_free_frames",
"eswitch_error_free_bytes",
}; };
#define QLCNIC_STATS_LEN ARRAY_SIZE(qlcnic_gstrings_stats) #define QLCNIC_STATS_LEN ARRAY_SIZE(qlcnic_gstrings_stats)
...@@ -635,7 +642,7 @@ static int qlcnic_set_channels(struct net_device *dev, ...@@ -635,7 +642,7 @@ static int qlcnic_set_channels(struct net_device *dev,
channel->tx_count != channel->max_tx) channel->tx_count != channel->max_tx)
return -EINVAL; return -EINVAL;
err = qlcnic_validate_max_rss(channel->max_rx, channel->rx_count); err = qlcnic_validate_max_rss(adapter, channel->rx_count);
if (err) if (err)
return err; return err;
...@@ -1296,6 +1303,9 @@ static int qlcnic_set_intr_coalesce(struct net_device *netdev, ...@@ -1296,6 +1303,9 @@ static int qlcnic_set_intr_coalesce(struct net_device *netdev,
struct ethtool_coalesce *ethcoal) struct ethtool_coalesce *ethcoal)
{ {
struct qlcnic_adapter *adapter = netdev_priv(netdev); struct qlcnic_adapter *adapter = netdev_priv(netdev);
struct qlcnic_nic_intr_coalesce *coal;
u32 rx_coalesce_usecs, rx_max_frames;
u32 tx_coalesce_usecs, tx_max_frames;
if (!test_bit(__QLCNIC_DEV_UP, &adapter->state)) if (!test_bit(__QLCNIC_DEV_UP, &adapter->state))
return -EINVAL; return -EINVAL;
...@@ -1306,8 +1316,8 @@ static int qlcnic_set_intr_coalesce(struct net_device *netdev, ...@@ -1306,8 +1316,8 @@ static int qlcnic_set_intr_coalesce(struct net_device *netdev,
*/ */
if (ethcoal->rx_coalesce_usecs > 0xffff || if (ethcoal->rx_coalesce_usecs > 0xffff ||
ethcoal->rx_max_coalesced_frames > 0xffff || ethcoal->rx_max_coalesced_frames > 0xffff ||
ethcoal->tx_coalesce_usecs || ethcoal->tx_coalesce_usecs > 0xffff ||
ethcoal->tx_max_coalesced_frames || ethcoal->tx_max_coalesced_frames > 0xffff ||
ethcoal->rx_coalesce_usecs_irq || ethcoal->rx_coalesce_usecs_irq ||
ethcoal->rx_max_coalesced_frames_irq || ethcoal->rx_max_coalesced_frames_irq ||
ethcoal->tx_coalesce_usecs_irq || ethcoal->tx_coalesce_usecs_irq ||
...@@ -1327,18 +1337,55 @@ static int qlcnic_set_intr_coalesce(struct net_device *netdev, ...@@ -1327,18 +1337,55 @@ static int qlcnic_set_intr_coalesce(struct net_device *netdev,
ethcoal->tx_max_coalesced_frames_high) ethcoal->tx_max_coalesced_frames_high)
return -EINVAL; return -EINVAL;
if (!ethcoal->rx_coalesce_usecs || coal = &adapter->ahw->coal;
!ethcoal->rx_max_coalesced_frames) {
adapter->ahw->coal.flag = QLCNIC_INTR_DEFAULT; if (qlcnic_83xx_check(adapter)) {
adapter->ahw->coal.rx_time_us = if (!ethcoal->tx_coalesce_usecs ||
QLCNIC_DEFAULT_INTR_COALESCE_RX_TIME_US; !ethcoal->tx_max_coalesced_frames ||
adapter->ahw->coal.rx_packets = !ethcoal->rx_coalesce_usecs ||
QLCNIC_DEFAULT_INTR_COALESCE_RX_PACKETS; !ethcoal->rx_max_coalesced_frames) {
coal->flag = QLCNIC_INTR_DEFAULT;
coal->type = QLCNIC_INTR_COAL_TYPE_RX;
coal->rx_time_us = QLCNIC_DEF_INTR_COALESCE_RX_TIME_US;
coal->rx_packets = QLCNIC_DEF_INTR_COALESCE_RX_PACKETS;
coal->tx_time_us = QLCNIC_DEF_INTR_COALESCE_TX_TIME_US;
coal->tx_packets = QLCNIC_DEF_INTR_COALESCE_TX_PACKETS;
} else {
tx_coalesce_usecs = ethcoal->tx_coalesce_usecs;
tx_max_frames = ethcoal->tx_max_coalesced_frames;
rx_coalesce_usecs = ethcoal->rx_coalesce_usecs;
rx_max_frames = ethcoal->rx_max_coalesced_frames;
coal->flag = 0;
if ((coal->rx_time_us == rx_coalesce_usecs) &&
(coal->rx_packets == rx_max_frames)) {
coal->type = QLCNIC_INTR_COAL_TYPE_TX;
coal->tx_time_us = tx_coalesce_usecs;
coal->tx_packets = tx_max_frames;
} else if ((coal->tx_time_us == tx_coalesce_usecs) &&
(coal->tx_packets == tx_max_frames)) {
coal->type = QLCNIC_INTR_COAL_TYPE_RX;
coal->rx_time_us = rx_coalesce_usecs;
coal->rx_packets = rx_max_frames;
} else {
coal->type = QLCNIC_INTR_COAL_TYPE_RX;
coal->rx_time_us = rx_coalesce_usecs;
coal->rx_packets = rx_max_frames;
coal->tx_time_us = tx_coalesce_usecs;
coal->tx_packets = tx_max_frames;
}
}
} else { } else {
adapter->ahw->coal.flag = 0; if (!ethcoal->rx_coalesce_usecs ||
adapter->ahw->coal.rx_time_us = ethcoal->rx_coalesce_usecs; !ethcoal->rx_max_coalesced_frames) {
adapter->ahw->coal.rx_packets = coal->flag = QLCNIC_INTR_DEFAULT;
ethcoal->rx_max_coalesced_frames; coal->rx_time_us = QLCNIC_DEF_INTR_COALESCE_RX_TIME_US;
coal->rx_packets = QLCNIC_DEF_INTR_COALESCE_RX_PACKETS;
} else {
coal->flag = 0;
coal->rx_time_us = ethcoal->rx_coalesce_usecs;
coal->rx_packets = ethcoal->rx_max_coalesced_frames;
}
} }
qlcnic_config_intr_coalesce(adapter); qlcnic_config_intr_coalesce(adapter);
...@@ -1356,6 +1403,8 @@ static int qlcnic_get_intr_coalesce(struct net_device *netdev, ...@@ -1356,6 +1403,8 @@ static int qlcnic_get_intr_coalesce(struct net_device *netdev,
ethcoal->rx_coalesce_usecs = adapter->ahw->coal.rx_time_us; ethcoal->rx_coalesce_usecs = adapter->ahw->coal.rx_time_us;
ethcoal->rx_max_coalesced_frames = adapter->ahw->coal.rx_packets; ethcoal->rx_max_coalesced_frames = adapter->ahw->coal.rx_packets;
ethcoal->tx_coalesce_usecs = adapter->ahw->coal.tx_time_us;
ethcoal->tx_max_coalesced_frames = adapter->ahw->coal.tx_packets;
return 0; return 0;
} }
......
...@@ -156,25 +156,112 @@ static const u32 qlcnic_reg_tbl[] = { ...@@ -156,25 +156,112 @@ static const u32 qlcnic_reg_tbl[] = {
}; };
static const struct qlcnic_board_info qlcnic_boards[] = { static const struct qlcnic_board_info qlcnic_boards[] = {
{0x1077, 0x8020, 0x1077, 0x203, { PCI_VENDOR_ID_QLOGIC,
"8200 Series Single Port 10GbE Converged Network Adapter" PCI_DEVICE_ID_QLOGIC_QLE834X,
"(TCP/IP Networking)"}, PCI_VENDOR_ID_QLOGIC,
{0x1077, 0x8020, 0x1077, 0x207, 0x24e,
"8200 Series Dual Port 10GbE Converged Network Adapter" "8300 Series Dual Port 10GbE Converged Network Adapter "
"(TCP/IP Networking)"}, "(TCP/IP Networking)" },
{0x1077, 0x8020, 0x1077, 0x20b, { PCI_VENDOR_ID_QLOGIC,
"3200 Series Dual Port 10Gb Intelligent Ethernet Adapter"}, PCI_DEVICE_ID_QLOGIC_QLE834X,
{0x1077, 0x8020, 0x1077, 0x20c, PCI_VENDOR_ID_QLOGIC,
"3200 Series Quad Port 1Gb Intelligent Ethernet Adapter"}, 0x243,
{0x1077, 0x8020, 0x1077, 0x20f, "8300 Series Single Port 10GbE Converged Network Adapter "
"3200 Series Single Port 10Gb Intelligent Ethernet Adapter"}, "(TCP/IP Networking)" },
{0x1077, 0x8020, 0x103c, 0x3733, { PCI_VENDOR_ID_QLOGIC,
"NC523SFP 10Gb 2-port Server Adapter"}, PCI_DEVICE_ID_QLOGIC_QLE834X,
{0x1077, 0x8020, 0x103c, 0x3346, PCI_VENDOR_ID_QLOGIC,
"CN1000Q Dual Port Converged Network Adapter"}, 0x24a,
{0x1077, 0x8020, 0x1077, 0x210, "8300 Series Dual Port 10GbE Converged Network Adapter "
"QME8242-k 10GbE Dual Port Mezzanine Card"}, "(TCP/IP Networking)" },
{0x1077, 0x8020, 0x0, 0x0, "cLOM8214 1/10GbE Controller"}, { PCI_VENDOR_ID_QLOGIC,
PCI_DEVICE_ID_QLOGIC_QLE834X,
PCI_VENDOR_ID_QLOGIC,
0x246,
"8300 Series Dual Port 10GbE Converged Network Adapter "
"(TCP/IP Networking)" },
{ PCI_VENDOR_ID_QLOGIC,
PCI_DEVICE_ID_QLOGIC_QLE834X,
PCI_VENDOR_ID_QLOGIC,
0x252,
"8300 Series Dual Port 10GbE Converged Network Adapter "
"(TCP/IP Networking)" },
{ PCI_VENDOR_ID_QLOGIC,
PCI_DEVICE_ID_QLOGIC_QLE834X,
PCI_VENDOR_ID_QLOGIC,
0x26e,
"8300 Series Dual Port 10GbE Converged Network Adapter "
"(TCP/IP Networking)" },
{ PCI_VENDOR_ID_QLOGIC,
PCI_DEVICE_ID_QLOGIC_QLE834X,
PCI_VENDOR_ID_QLOGIC,
0x260,
"8300 Series Dual Port 10GbE Converged Network Adapter "
"(TCP/IP Networking)" },
{ PCI_VENDOR_ID_QLOGIC,
PCI_DEVICE_ID_QLOGIC_QLE834X,
PCI_VENDOR_ID_QLOGIC,
0x266,
"8300 Series Single Port 10GbE Converged Network Adapter "
"(TCP/IP Networking)" },
{ PCI_VENDOR_ID_QLOGIC,
PCI_DEVICE_ID_QLOGIC_QLE834X,
PCI_VENDOR_ID_QLOGIC,
0x269,
"8300 Series Dual Port 10GbE Converged Network Adapter "
"(TCP/IP Networking)" },
{ PCI_VENDOR_ID_QLOGIC,
PCI_DEVICE_ID_QLOGIC_QLE834X,
PCI_VENDOR_ID_QLOGIC,
0x271,
"8300 Series Dual Port 10GbE Converged Network Adapter "
"(TCP/IP Networking)" },
{ PCI_VENDOR_ID_QLOGIC,
PCI_DEVICE_ID_QLOGIC_QLE834X,
0x0, 0x0, "8300 Series 1/10GbE Controller" },
{ PCI_VENDOR_ID_QLOGIC,
PCI_DEVICE_ID_QLOGIC_QLE824X,
PCI_VENDOR_ID_QLOGIC,
0x203,
"8200 Series Single Port 10GbE Converged Network Adapter"
"(TCP/IP Networking)" },
{ PCI_VENDOR_ID_QLOGIC,
PCI_DEVICE_ID_QLOGIC_QLE824X,
PCI_VENDOR_ID_QLOGIC,
0x207,
"8200 Series Dual Port 10GbE Converged Network Adapter"
"(TCP/IP Networking)" },
{ PCI_VENDOR_ID_QLOGIC,
PCI_DEVICE_ID_QLOGIC_QLE824X,
PCI_VENDOR_ID_QLOGIC,
0x20b,
"3200 Series Dual Port 10Gb Intelligent Ethernet Adapter" },
{ PCI_VENDOR_ID_QLOGIC,
PCI_DEVICE_ID_QLOGIC_QLE824X,
PCI_VENDOR_ID_QLOGIC,
0x20c,
"3200 Series Quad Port 1Gb Intelligent Ethernet Adapter" },
{ PCI_VENDOR_ID_QLOGIC,
PCI_DEVICE_ID_QLOGIC_QLE824X,
PCI_VENDOR_ID_QLOGIC,
0x20f,
"3200 Series Single Port 10Gb Intelligent Ethernet Adapter" },
{ PCI_VENDOR_ID_QLOGIC,
PCI_DEVICE_ID_QLOGIC_QLE824X,
0x103c, 0x3733,
"NC523SFP 10Gb 2-port Server Adapter" },
{ PCI_VENDOR_ID_QLOGIC,
PCI_DEVICE_ID_QLOGIC_QLE824X,
0x103c, 0x3346,
"CN1000Q Dual Port Converged Network Adapter" },
{ PCI_VENDOR_ID_QLOGIC,
PCI_DEVICE_ID_QLOGIC_QLE824X,
PCI_VENDOR_ID_QLOGIC,
0x210,
"QME8242-k 10GbE Dual Port Mezzanine Card" },
{ PCI_VENDOR_ID_QLOGIC,
PCI_DEVICE_ID_QLOGIC_QLE824X,
0x0, 0x0, "cLOM8214 1/10GbE Controller" },
}; };
#define NUM_SUPPORTED_BOARDS ARRAY_SIZE(qlcnic_boards) #define NUM_SUPPORTED_BOARDS ARRAY_SIZE(qlcnic_boards)
...@@ -1287,7 +1374,7 @@ qlcnic_request_irq(struct qlcnic_adapter *adapter) ...@@ -1287,7 +1374,7 @@ qlcnic_request_irq(struct qlcnic_adapter *adapter)
irq_handler_t handler; irq_handler_t handler;
struct qlcnic_host_sds_ring *sds_ring; struct qlcnic_host_sds_ring *sds_ring;
struct qlcnic_host_tx_ring *tx_ring; struct qlcnic_host_tx_ring *tx_ring;
int err, ring; int err, ring, num_sds_rings;
unsigned long flags = 0; unsigned long flags = 0;
struct net_device *netdev = adapter->netdev; struct net_device *netdev = adapter->netdev;
...@@ -1318,10 +1405,20 @@ qlcnic_request_irq(struct qlcnic_adapter *adapter) ...@@ -1318,10 +1405,20 @@ qlcnic_request_irq(struct qlcnic_adapter *adapter)
if (qlcnic_82xx_check(adapter) || if (qlcnic_82xx_check(adapter) ||
(qlcnic_83xx_check(adapter) && (qlcnic_83xx_check(adapter) &&
(adapter->flags & QLCNIC_MSIX_ENABLED))) { (adapter->flags & QLCNIC_MSIX_ENABLED))) {
for (ring = 0; ring < adapter->max_sds_rings; ring++) { num_sds_rings = adapter->max_sds_rings;
for (ring = 0; ring < num_sds_rings; ring++) {
sds_ring = &recv_ctx->sds_rings[ring]; sds_ring = &recv_ctx->sds_rings[ring];
snprintf(sds_ring->name, sizeof(int) + IFNAMSIZ, if (qlcnic_82xx_check(adapter) &&
"%s[%d]", netdev->name, ring); (ring == (num_sds_rings - 1)))
snprintf(sds_ring->name,
sizeof(sds_ring->name),
"qlcnic-%s[Tx0+Rx%d]",
netdev->name, ring);
else
snprintf(sds_ring->name,
sizeof(sds_ring->name),
"qlcnic-%s[Rx%d]",
netdev->name, ring);
err = request_irq(sds_ring->irq, handler, flags, err = request_irq(sds_ring->irq, handler, flags,
sds_ring->name, sds_ring); sds_ring->name, sds_ring);
if (err) if (err)
...@@ -1335,9 +1432,8 @@ qlcnic_request_irq(struct qlcnic_adapter *adapter) ...@@ -1335,9 +1432,8 @@ qlcnic_request_irq(struct qlcnic_adapter *adapter)
for (ring = 0; ring < adapter->max_drv_tx_rings; for (ring = 0; ring < adapter->max_drv_tx_rings;
ring++) { ring++) {
tx_ring = &adapter->tx_ring[ring]; tx_ring = &adapter->tx_ring[ring];
snprintf(tx_ring->name, sizeof(int) + IFNAMSIZ, snprintf(tx_ring->name, sizeof(tx_ring->name),
"%s[%d]", netdev->name, "qlcnic-%s[Tx%d]", netdev->name, ring);
adapter->max_sds_rings + ring);
err = request_irq(tx_ring->irq, handler, flags, err = request_irq(tx_ring->irq, handler, flags,
tx_ring->name, tx_ring); tx_ring->name, tx_ring);
if (err) if (err)
...@@ -1587,7 +1683,9 @@ void qlcnic_diag_free_res(struct net_device *netdev, int max_sds_rings) ...@@ -1587,7 +1683,9 @@ void qlcnic_diag_free_res(struct net_device *netdev, int max_sds_rings)
static int qlcnic_alloc_adapter_resources(struct qlcnic_adapter *adapter) static int qlcnic_alloc_adapter_resources(struct qlcnic_adapter *adapter)
{ {
struct qlcnic_hardware_context *ahw = adapter->ahw;
int err = 0; int err = 0;
adapter->recv_ctx = kzalloc(sizeof(struct qlcnic_recv_context), adapter->recv_ctx = kzalloc(sizeof(struct qlcnic_recv_context),
GFP_KERNEL); GFP_KERNEL);
if (!adapter->recv_ctx) { if (!adapter->recv_ctx) {
...@@ -1595,9 +1693,14 @@ static int qlcnic_alloc_adapter_resources(struct qlcnic_adapter *adapter) ...@@ -1595,9 +1693,14 @@ static int qlcnic_alloc_adapter_resources(struct qlcnic_adapter *adapter)
goto err_out; goto err_out;
} }
/* Initialize interrupt coalesce parameters */ /* Initialize interrupt coalesce parameters */
adapter->ahw->coal.flag = QLCNIC_INTR_DEFAULT; ahw->coal.flag = QLCNIC_INTR_DEFAULT;
adapter->ahw->coal.rx_time_us = QLCNIC_DEFAULT_INTR_COALESCE_RX_TIME_US; ahw->coal.type = QLCNIC_INTR_COAL_TYPE_RX;
adapter->ahw->coal.rx_packets = QLCNIC_DEFAULT_INTR_COALESCE_RX_PACKETS; ahw->coal.rx_time_us = QLCNIC_DEF_INTR_COALESCE_RX_TIME_US;
ahw->coal.rx_packets = QLCNIC_DEF_INTR_COALESCE_RX_PACKETS;
if (qlcnic_83xx_check(adapter)) {
ahw->coal.tx_time_us = QLCNIC_DEF_INTR_COALESCE_TX_TIME_US;
ahw->coal.tx_packets = QLCNIC_DEF_INTR_COALESCE_TX_PACKETS;
}
/* clear stats */ /* clear stats */
memset(&adapter->stats, 0, sizeof(adapter->stats)); memset(&adapter->stats, 0, sizeof(adapter->stats));
err_out: err_out:
...@@ -3273,20 +3376,40 @@ qlcnicvf_start_firmware(struct qlcnic_adapter *adapter) ...@@ -3273,20 +3376,40 @@ qlcnicvf_start_firmware(struct qlcnic_adapter *adapter)
return err; return err;
} }
int qlcnic_validate_max_rss(u8 max_hw, u8 val) int qlcnic_validate_max_rss(struct qlcnic_adapter *adapter,
__u32 val)
{ {
struct net_device *netdev = adapter->netdev;
u8 max_hw = adapter->ahw->max_rx_ques;
u32 max_allowed; u32 max_allowed;
if (max_hw > QLC_MAX_SDS_RINGS) { if (val > QLC_MAX_SDS_RINGS) {
max_hw = QLC_MAX_SDS_RINGS; netdev_err(netdev, "RSS value should not be higher than %u\n",
pr_info("max rss reset to %d\n", QLC_MAX_SDS_RINGS); QLC_MAX_SDS_RINGS);
return -EINVAL;
} }
max_allowed = rounddown_pow_of_two(min_t(int, max_hw, max_allowed = rounddown_pow_of_two(min_t(int, max_hw,
num_online_cpus())); num_online_cpus()));
if ((val > max_allowed) || (val < 2) || !is_power_of_2(val)) { if ((val > max_allowed) || (val < 2) || !is_power_of_2(val)) {
pr_info("rss_ring valid range [2 - %x] in powers of 2\n", if (!is_power_of_2(val))
max_allowed); netdev_err(netdev, "RSS value should be a power of 2\n");
if (val < 2)
netdev_err(netdev, "RSS value should not be lower than 2\n");
if (val > max_hw)
netdev_err(netdev,
"RSS value should not be higher than[%u], the max RSS rings supported by the adapter\n",
max_hw);
if (val > num_online_cpus())
netdev_err(netdev,
"RSS value should not be higher than[%u], number of online CPUs in the system\n",
num_online_cpus());
netdev_err(netdev, "Unable to configure %u RSS rings\n", val);
return -EINVAL; return -EINVAL;
} }
return 0; return 0;
......
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