History

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. ====================

David S. Miller committed 13 years ago

Commit 204cd4f2 parents 01f27fc f6689d96 files · +277 −61Browse files

Unified · Split

6 files
  1. drivers/net/ethernet/qlogic/qlcnic/qlcnic.h +15 −7
  2. drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c +15 −4
  3. drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h +1 −1
  4. drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c +25 −0
  5. drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c +63 −14
  6. drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c +158 −35
drivers/net/ethernet/qlogic/qlcnic/qlcnic.h+15−7
@@ -38,8 +38,8 @@ · 37 unmodified lines
3838
3939 #define _QLCNIC_LINUX_MAJOR 5
4040 #define _QLCNIC_LINUX_MINOR 2
41−#define _QLCNIC_LINUX_SUBVERSION 41
42−#define QLCNIC_LINUX_VERSIONID "5.2.41"
41+#define _QLCNIC_LINUX_SUBVERSION 42
42+#define QLCNIC_LINUX_VERSIONID "5.2.42"
4343 #define QLCNIC_DRV_IDC_VER 0x01
4444 #define QLCNIC_DRIVER_VERSION ((_QLCNIC_LINUX_MAJOR << 16) |\
4545 (_QLCNIC_LINUX_MINOR << 8) | (_QLCNIC_LINUX_SUBVERSION))
@@ -347,8 +347,14 @@ struct qlcnic_rx_buffer { · 301 unmodified lines
347347 * Interrupt coalescing defaults. The defaults are for 1500 MTU. It is
348348 * adjusted based on configured MTU.
349349 */
350−#define QLCNIC_DEFAULT_INTR_COALESCE_RX_TIME_US 3
351−#define QLCNIC_DEFAULT_INTR_COALESCE_RX_PACKETS 256
350+#define QLCNIC_INTR_COAL_TYPE_RX 1
351+#define QLCNIC_INTR_COAL_TYPE_TX 2
352+
353+#define QLCNIC_DEF_INTR_COALESCE_RX_TIME_US 3
354+#define QLCNIC_DEF_INTR_COALESCE_RX_PACKETS 256
355+
356+#define QLCNIC_DEF_INTR_COALESCE_TX_TIME_US 64
357+#define QLCNIC_DEF_INTR_COALESCE_TX_PACKETS 64
352358
353359 #define QLCNIC_INTR_DEFAULT 0x04
354360 #define QLCNIC_CONFIG_INTR_COALESCE 3
@@ -359,6 +365,8 @@ struct qlcnic_nic_intr_coalesce { · 4 unmodified lines
359365 u8 sts_ring_mask;
360366 u16 rx_packets;
361367 u16 rx_time_us;
368+ u16 tx_packets;
369+ u16 tx_time_us;
362370 u16 flag;
363371 u32 timer_out;
364372 };
@@ -511,13 +519,13 @@ struct qlcnic_host_sds_ring { · 146 unmodified lines
511519 int irq;
512520
513521 dma_addr_t phys_addr;
514− char name[IFNAMSIZ+4];
522+ char name[IFNAMSIZ + 12];
515523 } ____cacheline_internodealigned_in_smp;
516524
517525 struct qlcnic_host_tx_ring {
518526 int irq;
519527 void __iomem *crb_intr_mask;
520− char name[IFNAMSIZ+4];
528+ char name[IFNAMSIZ + 12];
521529 u16 ctx_id;
522530 u32 producer;
523531 u32 sw_consumer;
@@ -1474,7 +1482,7 @@ void qlcnic_diag_free_res(struct net_device *netdev, int max_sds_rings); · 950 unmodified lines
14741482 int qlcnic_diag_alloc_res(struct net_device *netdev, int test);
14751483 netdev_tx_t qlcnic_xmit_frame(struct sk_buff *skb, struct net_device *netdev);
14761484 int qlcnic_set_max_rss(struct qlcnic_adapter *, u8, size_t);
1477−int qlcnic_validate_max_rss(u8, u8);
1485+int qlcnic_validate_max_rss(struct qlcnic_adapter *, __u32);
14781486 void qlcnic_alloc_lb_filters_mem(struct qlcnic_adapter *adapter);
14791487 int qlcnic_enable_msix(struct qlcnic_adapter *, u32);
14801488
drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c+15−4
@@ -1937,7 +1937,7 @@ int qlcnic_83xx_get_mac_address(struct qlcnic_adapter *adapter, u8 *mac) · 1936 unmodified lines
19371937 void qlcnic_83xx_config_intr_coal(struct qlcnic_adapter *adapter)
19381938 {
19391939 int err;
1940− u32 temp;
1940+ u16 temp;
19411941 struct qlcnic_cmd_args cmd;
19421942 struct qlcnic_nic_intr_coalesce *coal = &adapter->ahw->coal;
19431943
@@ -1945,10 +1945,18 @@ void qlcnic_83xx_config_intr_coal(struct qlcnic_adapter *adapter) · 1 unmodified line
19451945 return;
19461946
19471947 qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_CONFIG_INTR_COAL);
1948− cmd.req.arg[1] = 1 | (adapter->recv_ctx->context_id << 16);
1948+ if (coal->type == QLCNIC_INTR_COAL_TYPE_RX) {
1949+ temp = adapter->recv_ctx->context_id;
1950+ cmd.req.arg[1] = QLCNIC_INTR_COAL_TYPE_RX | temp << 16;
1951+ temp = coal->rx_time_us;
1952+ cmd.req.arg[2] = coal->rx_packets | temp << 16;
1953+ } else if (coal->type == QLCNIC_INTR_COAL_TYPE_TX) {
1954+ temp = adapter->tx_ring->ctx_id;
1955+ cmd.req.arg[1] = QLCNIC_INTR_COAL_TYPE_TX | temp << 16;
1956+ temp = coal->tx_time_us;
1957+ cmd.req.arg[2] = coal->tx_packets | temp << 16;
1958+ }
19491959 cmd.req.arg[3] = coal->flag;
1950− temp = coal->rx_time_us << 16;
1951− cmd.req.arg[2] = coal->rx_packets | temp;
19521960 err = qlcnic_issue_cmd(adapter, &cmd);
19531961 if (err != QLCNIC_RCODE_SUCCESS)
19541962 dev_info(&adapter->pdev->dev,
@@ -2922,6 +2930,9 @@ static u64 *qlcnic_83xx_fill_stats(struct qlcnic_adapter *adapter, · 967 unmodified lines
29222930 /* fill in MAC rx frame stats */
29232931 for (k += 6; k < 80; k += 2)
29242932 data = qlcnic_83xx_copy_stats(cmd, data, k);
2933+ /* fill in eSwitch stats */
2934+ for (; k < total_regs; k += 2)
2935+ data = qlcnic_83xx_copy_stats(cmd, data, k);
29252936 break;
29262937 case QLC_83XX_STAT_RX:
29272938 for (k = 2; k < 8; k += 2)
drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h+1−1
@@ -381,7 +381,7 @@ enum qlcnic_83xx_states { · 380 unmodified lines
381381 #define QLC_83XX_STAT_MAC 1
382382 #define QLC_83XX_TX_STAT_REGS 14
383383 #define QLC_83XX_RX_STAT_REGS 40
384−#define QLC_83XX_MAC_STAT_REGS 80
384+#define QLC_83XX_MAC_STAT_REGS 94
385385
386386 #define QLC_83XX_GET_FUNC_PRIVILEGE(VAL, FN) (0x3 & ((VAL) >> (FN * 2)))
387387 #define QLC_83XX_SET_FUNC_OPMODE(VAL, FN) ((VAL) << (FN * 2))
drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c+25−0
@@ -25,6 +25,17 @@ · 24 unmodified lines
2525 #define QLC_83XX_OPCODE_TMPL_END 0x0080
2626 #define QLC_83XX_OPCODE_POLL_READ_LIST 0x0100
2727
28+/* EPORT control registers */
29+#define QLC_83XX_RESET_CONTROL 0x28084E50
30+#define QLC_83XX_RESET_REG 0x28084E60
31+#define QLC_83XX_RESET_PORT0 0x28084E70
32+#define QLC_83XX_RESET_PORT1 0x28084E80
33+#define QLC_83XX_RESET_PORT2 0x28084E90
34+#define QLC_83XX_RESET_PORT3 0x28084EA0
35+#define QLC_83XX_RESET_SRESHIM 0x28084EB0
36+#define QLC_83XX_RESET_EPGSHIM 0x28084EC0
37+#define QLC_83XX_RESET_ETHERPCS 0x28084ED0
38+
2839 static int qlcnic_83xx_init_default_driver(struct qlcnic_adapter *adapter);
2940 static int qlcnic_83xx_check_heartbeat(struct qlcnic_adapter *p_dev);
3041 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) · 1343 unmodified lines
13741385 qlcnic_83xx_unlock_driver(adapter);
13751386 }
13761387
1388+static void qlcnic_83xx_take_eport_out_of_reset(struct qlcnic_adapter *adapter)
1389+{
1390+ QLCWR32(adapter, QLC_83XX_RESET_REG, 0);
1391+ QLCWR32(adapter, QLC_83XX_RESET_PORT0, 0);
1392+ QLCWR32(adapter, QLC_83XX_RESET_PORT1, 0);
1393+ QLCWR32(adapter, QLC_83XX_RESET_PORT2, 0);
1394+ QLCWR32(adapter, QLC_83XX_RESET_PORT3, 0);
1395+ QLCWR32(adapter, QLC_83XX_RESET_SRESHIM, 0);
1396+ QLCWR32(adapter, QLC_83XX_RESET_EPGSHIM, 0);
1397+ QLCWR32(adapter, QLC_83XX_RESET_ETHERPCS, 0);
1398+ QLCWR32(adapter, QLC_83XX_RESET_CONTROL, 1);
1399+}
1400+
13771401 static int qlcnic_83xx_check_heartbeat(struct qlcnic_adapter *p_dev)
13781402 {
13791403 u32 heartbeat, peg_status;
@@ -1395,6 +1419,7 @@ static int qlcnic_83xx_check_heartbeat(struct qlcnic_adapter *p_dev) · 15 unmodified lines
13951419
13961420 if (ret) {
13971421 dev_err(&p_dev->pdev->dev, "firmware hang detected\n");
1422+ qlcnic_83xx_take_eport_out_of_reset(p_dev);
13981423 qlcnic_83xx_disable_pause_frames(p_dev);
13991424 peg_status = QLC_SHARED_REG_RD32(p_dev,
14001425 QLCNIC_PEG_HALT_STATUS1);
drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c+63−14
@@ -115,6 +115,13 @@ static const char qlcnic_83xx_mac_stats_strings[][ETH_GSTRING_LEN] = { · 114 unmodified lines
115115 "mac_rx_dropped",
116116 "mac_crc_error",
117117 "mac_align_error",
118+ "eswitch_frames",
119+ "eswitch_bytes",
120+ "eswitch_multicast_frames",
121+ "eswitch_broadcast_frames",
122+ "eswitch_unicast_frames",
123+ "eswitch_error_free_frames",
124+ "eswitch_error_free_bytes",
118125 };
119126
120127 #define QLCNIC_STATS_LEN ARRAY_SIZE(qlcnic_gstrings_stats)
@@ -635,7 +642,7 @@ static int qlcnic_set_channels(struct net_device *dev, · 514 unmodified lines
635642 channel->tx_count != channel->max_tx)
636643 return -EINVAL;
637644
638− err = qlcnic_validate_max_rss(channel->max_rx, channel->rx_count);
645+ err = qlcnic_validate_max_rss(adapter, channel->rx_count);
639646 if (err)
640647 return err;
641648
@@ -1296,6 +1303,9 @@ static int qlcnic_set_intr_coalesce(struct net_device *netdev, · 654 unmodified lines
12961303 struct ethtool_coalesce *ethcoal)
12971304 {
12981305 struct qlcnic_adapter *adapter = netdev_priv(netdev);
1306+ struct qlcnic_nic_intr_coalesce *coal;
1307+ u32 rx_coalesce_usecs, rx_max_frames;
1308+ u32 tx_coalesce_usecs, tx_max_frames;
12991309
13001310 if (!test_bit(__QLCNIC_DEV_UP, &adapter->state))
13011311 return -EINVAL;
@@ -1306,8 +1316,8 @@ static int qlcnic_set_intr_coalesce(struct net_device *netdev, · 4 unmodified lines
13061316 */
13071317 if (ethcoal->rx_coalesce_usecs > 0xffff ||
13081318 ethcoal->rx_max_coalesced_frames > 0xffff ||
1309− ethcoal->tx_coalesce_usecs ||
1310− ethcoal->tx_max_coalesced_frames ||
1319+ ethcoal->tx_coalesce_usecs > 0xffff ||
1320+ ethcoal->tx_max_coalesced_frames > 0xffff ||
13111321 ethcoal->rx_coalesce_usecs_irq ||
13121322 ethcoal->rx_max_coalesced_frames_irq ||
13131323 ethcoal->tx_coalesce_usecs_irq ||
@@ -1327,18 +1337,55 @@ static int qlcnic_set_intr_coalesce(struct net_device *netdev, · 13 unmodified lines
13271337 ethcoal->tx_max_coalesced_frames_high)
13281338 return -EINVAL;
13291339
1330− if (!ethcoal->rx_coalesce_usecs ||
1331− !ethcoal->rx_max_coalesced_frames) {
1332− adapter->ahw->coal.flag = QLCNIC_INTR_DEFAULT;
1333− adapter->ahw->coal.rx_time_us =
1334− QLCNIC_DEFAULT_INTR_COALESCE_RX_TIME_US;
1335− adapter->ahw->coal.rx_packets =
1336− QLCNIC_DEFAULT_INTR_COALESCE_RX_PACKETS;
1340+ coal = &adapter->ahw->coal;
1341+
1342+ if (qlcnic_83xx_check(adapter)) {
1343+ if (!ethcoal->tx_coalesce_usecs ||
1344+ !ethcoal->tx_max_coalesced_frames ||
1345+ !ethcoal->rx_coalesce_usecs ||
1346+ !ethcoal->rx_max_coalesced_frames) {
1347+ coal->flag = QLCNIC_INTR_DEFAULT;
1348+ coal->type = QLCNIC_INTR_COAL_TYPE_RX;
1349+ coal->rx_time_us = QLCNIC_DEF_INTR_COALESCE_RX_TIME_US;
1350+ coal->rx_packets = QLCNIC_DEF_INTR_COALESCE_RX_PACKETS;
1351+ coal->tx_time_us = QLCNIC_DEF_INTR_COALESCE_TX_TIME_US;
1352+ coal->tx_packets = QLCNIC_DEF_INTR_COALESCE_TX_PACKETS;
1353+ } else {
1354+ tx_coalesce_usecs = ethcoal->tx_coalesce_usecs;
1355+ tx_max_frames = ethcoal->tx_max_coalesced_frames;
1356+ rx_coalesce_usecs = ethcoal->rx_coalesce_usecs;
1357+ rx_max_frames = ethcoal->rx_max_coalesced_frames;
1358+ coal->flag = 0;
1359+
1360+ if ((coal->rx_time_us == rx_coalesce_usecs) &&
1361+ (coal->rx_packets == rx_max_frames)) {
1362+ coal->type = QLCNIC_INTR_COAL_TYPE_TX;
1363+ coal->tx_time_us = tx_coalesce_usecs;
1364+ coal->tx_packets = tx_max_frames;
1365+ } else if ((coal->tx_time_us == tx_coalesce_usecs) &&
1366+ (coal->tx_packets == tx_max_frames)) {
1367+ coal->type = QLCNIC_INTR_COAL_TYPE_RX;
1368+ coal->rx_time_us = rx_coalesce_usecs;
1369+ coal->rx_packets = rx_max_frames;
1370+ } else {
1371+ coal->type = QLCNIC_INTR_COAL_TYPE_RX;
1372+ coal->rx_time_us = rx_coalesce_usecs;
1373+ coal->rx_packets = rx_max_frames;
1374+ coal->tx_time_us = tx_coalesce_usecs;
1375+ coal->tx_packets = tx_max_frames;
1376+ }
1377+ }
13371378 } else {
1338− adapter->ahw->coal.flag = 0;
1339− adapter->ahw->coal.rx_time_us = ethcoal->rx_coalesce_usecs;
1340− adapter->ahw->coal.rx_packets =
1341− ethcoal->rx_max_coalesced_frames;
1379+ if (!ethcoal->rx_coalesce_usecs ||
1380+ !ethcoal->rx_max_coalesced_frames) {
1381+ coal->flag = QLCNIC_INTR_DEFAULT;
1382+ coal->rx_time_us = QLCNIC_DEF_INTR_COALESCE_RX_TIME_US;
1383+ coal->rx_packets = QLCNIC_DEF_INTR_COALESCE_RX_PACKETS;
1384+ } else {
1385+ coal->flag = 0;
1386+ coal->rx_time_us = ethcoal->rx_coalesce_usecs;
1387+ coal->rx_packets = ethcoal->rx_max_coalesced_frames;
1388+ }
13421389 }
13431390
13441391 qlcnic_config_intr_coalesce(adapter);
@@ -1356,6 +1403,8 @@ static int qlcnic_get_intr_coalesce(struct net_device *netdev, · 11 unmodified lines
13561403
13571404 ethcoal->rx_coalesce_usecs = adapter->ahw->coal.rx_time_us;
13581405 ethcoal->rx_max_coalesced_frames = adapter->ahw->coal.rx_packets;
1406+ ethcoal->tx_coalesce_usecs = adapter->ahw->coal.tx_time_us;
1407+ ethcoal->tx_max_coalesced_frames = adapter->ahw->coal.tx_packets;
13591408
13601409 return 0;
13611410 }
drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c+158−35
@@ -156,25 +156,112 @@ static const u32 qlcnic_reg_tbl[] = { · 155 unmodified lines
156156 };
157157
158158 static const struct qlcnic_board_info qlcnic_boards[] = {
159− {0x1077, 0x8020, 0x1077, 0x203,
160− "8200 Series Single Port 10GbE Converged Network Adapter"
161− "(TCP/IP Networking)"},
162− {0x1077, 0x8020, 0x1077, 0x207,
163− "8200 Series Dual Port 10GbE Converged Network Adapter"
164− "(TCP/IP Networking)"},
165− {0x1077, 0x8020, 0x1077, 0x20b,
166− "3200 Series Dual Port 10Gb Intelligent Ethernet Adapter"},
167− {0x1077, 0x8020, 0x1077, 0x20c,
168− "3200 Series Quad Port 1Gb Intelligent Ethernet Adapter"},
169− {0x1077, 0x8020, 0x1077, 0x20f,
170− "3200 Series Single Port 10Gb Intelligent Ethernet Adapter"},
171− {0x1077, 0x8020, 0x103c, 0x3733,
172− "NC523SFP 10Gb 2-port Server Adapter"},
173− {0x1077, 0x8020, 0x103c, 0x3346,
174− "CN1000Q Dual Port Converged Network Adapter"},
175− {0x1077, 0x8020, 0x1077, 0x210,
176− "QME8242-k 10GbE Dual Port Mezzanine Card"},
177− {0x1077, 0x8020, 0x0, 0x0, "cLOM8214 1/10GbE Controller"},
159+ { PCI_VENDOR_ID_QLOGIC,
160+ PCI_DEVICE_ID_QLOGIC_QLE834X,
161+ PCI_VENDOR_ID_QLOGIC,
162+ 0x24e,
163+ "8300 Series Dual Port 10GbE Converged Network Adapter "
164+ "(TCP/IP Networking)" },
165+ { PCI_VENDOR_ID_QLOGIC,
166+ PCI_DEVICE_ID_QLOGIC_QLE834X,
167+ PCI_VENDOR_ID_QLOGIC,
168+ 0x243,
169+ "8300 Series Single Port 10GbE Converged Network Adapter "
170+ "(TCP/IP Networking)" },
171+ { PCI_VENDOR_ID_QLOGIC,
172+ PCI_DEVICE_ID_QLOGIC_QLE834X,
173+ PCI_VENDOR_ID_QLOGIC,
174+ 0x24a,
175+ "8300 Series Dual Port 10GbE Converged Network Adapter "
176+ "(TCP/IP Networking)" },
177+ { PCI_VENDOR_ID_QLOGIC,
178+ PCI_DEVICE_ID_QLOGIC_QLE834X,
179+ PCI_VENDOR_ID_QLOGIC,
180+ 0x246,
181+ "8300 Series Dual Port 10GbE Converged Network Adapter "
182+ "(TCP/IP Networking)" },
183+ { PCI_VENDOR_ID_QLOGIC,
184+ PCI_DEVICE_ID_QLOGIC_QLE834X,
185+ PCI_VENDOR_ID_QLOGIC,
186+ 0x252,
187+ "8300 Series Dual Port 10GbE Converged Network Adapter "
188+ "(TCP/IP Networking)" },
189+ { PCI_VENDOR_ID_QLOGIC,
190+ PCI_DEVICE_ID_QLOGIC_QLE834X,
191+ PCI_VENDOR_ID_QLOGIC,
192+ 0x26e,
193+ "8300 Series Dual Port 10GbE Converged Network Adapter "
194+ "(TCP/IP Networking)" },
195+ { PCI_VENDOR_ID_QLOGIC,
196+ PCI_DEVICE_ID_QLOGIC_QLE834X,
197+ PCI_VENDOR_ID_QLOGIC,
198+ 0x260,
199+ "8300 Series Dual Port 10GbE Converged Network Adapter "
200+ "(TCP/IP Networking)" },
201+ { PCI_VENDOR_ID_QLOGIC,
202+ PCI_DEVICE_ID_QLOGIC_QLE834X,
203+ PCI_VENDOR_ID_QLOGIC,
204+ 0x266,
205+ "8300 Series Single Port 10GbE Converged Network Adapter "
206+ "(TCP/IP Networking)" },
207+ { PCI_VENDOR_ID_QLOGIC,
208+ PCI_DEVICE_ID_QLOGIC_QLE834X,
209+ PCI_VENDOR_ID_QLOGIC,
210+ 0x269,
211+ "8300 Series Dual Port 10GbE Converged Network Adapter "
212+ "(TCP/IP Networking)" },
213+ { PCI_VENDOR_ID_QLOGIC,
214+ PCI_DEVICE_ID_QLOGIC_QLE834X,
215+ PCI_VENDOR_ID_QLOGIC,
216+ 0x271,
217+ "8300 Series Dual Port 10GbE Converged Network Adapter "
218+ "(TCP/IP Networking)" },
219+ { PCI_VENDOR_ID_QLOGIC,
220+ PCI_DEVICE_ID_QLOGIC_QLE834X,
221+ 0x0, 0x0, "8300 Series 1/10GbE Controller" },
222+ { PCI_VENDOR_ID_QLOGIC,
223+ PCI_DEVICE_ID_QLOGIC_QLE824X,
224+ PCI_VENDOR_ID_QLOGIC,
225+ 0x203,
226+ "8200 Series Single Port 10GbE Converged Network Adapter"
227+ "(TCP/IP Networking)" },
228+ { PCI_VENDOR_ID_QLOGIC,
229+ PCI_DEVICE_ID_QLOGIC_QLE824X,
230+ PCI_VENDOR_ID_QLOGIC,
231+ 0x207,
232+ "8200 Series Dual Port 10GbE Converged Network Adapter"
233+ "(TCP/IP Networking)" },
234+ { PCI_VENDOR_ID_QLOGIC,
235+ PCI_DEVICE_ID_QLOGIC_QLE824X,
236+ PCI_VENDOR_ID_QLOGIC,
237+ 0x20b,
238+ "3200 Series Dual Port 10Gb Intelligent Ethernet Adapter" },
239+ { PCI_VENDOR_ID_QLOGIC,
240+ PCI_DEVICE_ID_QLOGIC_QLE824X,
241+ PCI_VENDOR_ID_QLOGIC,
242+ 0x20c,
243+ "3200 Series Quad Port 1Gb Intelligent Ethernet Adapter" },
244+ { PCI_VENDOR_ID_QLOGIC,
245+ PCI_DEVICE_ID_QLOGIC_QLE824X,
246+ PCI_VENDOR_ID_QLOGIC,
247+ 0x20f,
248+ "3200 Series Single Port 10Gb Intelligent Ethernet Adapter" },
249+ { PCI_VENDOR_ID_QLOGIC,
250+ PCI_DEVICE_ID_QLOGIC_QLE824X,
251+ 0x103c, 0x3733,
252+ "NC523SFP 10Gb 2-port Server Adapter" },
253+ { PCI_VENDOR_ID_QLOGIC,
254+ PCI_DEVICE_ID_QLOGIC_QLE824X,
255+ 0x103c, 0x3346,
256+ "CN1000Q Dual Port Converged Network Adapter" },
257+ { PCI_VENDOR_ID_QLOGIC,
258+ PCI_DEVICE_ID_QLOGIC_QLE824X,
259+ PCI_VENDOR_ID_QLOGIC,
260+ 0x210,
261+ "QME8242-k 10GbE Dual Port Mezzanine Card" },
262+ { PCI_VENDOR_ID_QLOGIC,
263+ PCI_DEVICE_ID_QLOGIC_QLE824X,
264+ 0x0, 0x0, "cLOM8214 1/10GbE Controller" },
178265 };
179266
180267 #define NUM_SUPPORTED_BOARDS ARRAY_SIZE(qlcnic_boards)
@@ -1287,7 +1374,7 @@ qlcnic_request_irq(struct qlcnic_adapter *adapter) · 1106 unmodified lines
12871374 irq_handler_t handler;
12881375 struct qlcnic_host_sds_ring *sds_ring;
12891376 struct qlcnic_host_tx_ring *tx_ring;
1290− int err, ring;
1377+ int err, ring, num_sds_rings;
12911378
12921379 unsigned long flags = 0;
12931380 struct net_device *netdev = adapter->netdev;
@@ -1318,10 +1405,20 @@ qlcnic_request_irq(struct qlcnic_adapter *adapter) · 24 unmodified lines
13181405 if (qlcnic_82xx_check(adapter) ||
13191406 (qlcnic_83xx_check(adapter) &&
13201407 (adapter->flags & QLCNIC_MSIX_ENABLED))) {
1321− for (ring = 0; ring < adapter->max_sds_rings; ring++) {
1408+ num_sds_rings = adapter->max_sds_rings;
1409+ for (ring = 0; ring < num_sds_rings; ring++) {
13221410 sds_ring = &recv_ctx->sds_rings[ring];
1323− snprintf(sds_ring->name, sizeof(int) + IFNAMSIZ,
1324− "%s[%d]", netdev->name, ring);
1411+ if (qlcnic_82xx_check(adapter) &&
1412+ (ring == (num_sds_rings - 1)))
1413+ snprintf(sds_ring->name,
1414+ sizeof(sds_ring->name),
1415+ "qlcnic-%s[Tx0+Rx%d]",
1416+ netdev->name, ring);
1417+ else
1418+ snprintf(sds_ring->name,
1419+ sizeof(sds_ring->name),
1420+ "qlcnic-%s[Rx%d]",
1421+ netdev->name, ring);
13251422 err = request_irq(sds_ring->irq, handler, flags,
13261423 sds_ring->name, sds_ring);
13271424 if (err)
@@ -1335,9 +1432,8 @@ qlcnic_request_irq(struct qlcnic_adapter *adapter) · 7 unmodified lines
13351432 for (ring = 0; ring < adapter->max_drv_tx_rings;
13361433 ring++) {
13371434 tx_ring = &adapter->tx_ring[ring];
1338− snprintf(tx_ring->name, sizeof(int) + IFNAMSIZ,
1339− "%s[%d]", netdev->name,
1340− adapter->max_sds_rings + ring);
1435+ snprintf(tx_ring->name, sizeof(tx_ring->name),
1436+ "qlcnic-%s[Tx%d]", netdev->name, ring);
13411437 err = request_irq(tx_ring->irq, handler, flags,
13421438 tx_ring->name, tx_ring);
13431439 if (err)
@@ -1587,7 +1683,9 @@ out: · 243 unmodified lines
15871683
15881684 static int qlcnic_alloc_adapter_resources(struct qlcnic_adapter *adapter)
15891685 {
1686+ struct qlcnic_hardware_context *ahw = adapter->ahw;
15901687 int err = 0;
1688+
15911689 adapter->recv_ctx = kzalloc(sizeof(struct qlcnic_recv_context),
15921690 GFP_KERNEL);
15931691 if (!adapter->recv_ctx) {
@@ -1595,9 +1693,14 @@ static int qlcnic_alloc_adapter_resources(struct qlcnic_adapter *adapter) · 1 unmodified line
15951693 goto err_out;
15961694 }
15971695 /* Initialize interrupt coalesce parameters */
1598− adapter->ahw->coal.flag = QLCNIC_INTR_DEFAULT;
1599− adapter->ahw->coal.rx_time_us = QLCNIC_DEFAULT_INTR_COALESCE_RX_TIME_US;
1600− adapter->ahw->coal.rx_packets = QLCNIC_DEFAULT_INTR_COALESCE_RX_PACKETS;
1696+ ahw->coal.flag = QLCNIC_INTR_DEFAULT;
1697+ ahw->coal.type = QLCNIC_INTR_COAL_TYPE_RX;
1698+ ahw->coal.rx_time_us = QLCNIC_DEF_INTR_COALESCE_RX_TIME_US;
1699+ ahw->coal.rx_packets = QLCNIC_DEF_INTR_COALESCE_RX_PACKETS;
1700+ if (qlcnic_83xx_check(adapter)) {
1701+ ahw->coal.tx_time_us = QLCNIC_DEF_INTR_COALESCE_TX_TIME_US;
1702+ ahw->coal.tx_packets = QLCNIC_DEF_INTR_COALESCE_TX_PACKETS;
1703+ }
16011704 /* clear stats */
16021705 memset(&adapter->stats, 0, sizeof(adapter->stats));
16031706 err_out:
@@ -3273,20 +3376,40 @@ qlcnicvf_start_firmware(struct qlcnic_adapter *adapter) · 1669 unmodified lines
32733376 return err;
32743377 }
32753378
3276−int qlcnic_validate_max_rss(u8 max_hw, u8 val)
3379+int qlcnic_validate_max_rss(struct qlcnic_adapter *adapter,
3380+ __u32 val)
32773381 {
3382+ struct net_device *netdev = adapter->netdev;
3383+ u8 max_hw = adapter->ahw->max_rx_ques;
32783384 u32 max_allowed;
32793385
3280− if (max_hw > QLC_MAX_SDS_RINGS) {
3281− max_hw = QLC_MAX_SDS_RINGS;
3282− pr_info("max rss reset to %d\n", QLC_MAX_SDS_RINGS);
3386+ if (val > QLC_MAX_SDS_RINGS) {
3387+ netdev_err(netdev, "RSS value should not be higher than %u\n",
3388+ QLC_MAX_SDS_RINGS);
3389+ return -EINVAL;
32833390 }
32843391
32853392 max_allowed = rounddown_pow_of_two(min_t(int, max_hw,
32863393 num_online_cpus()));
32873394 if ((val > max_allowed) || (val < 2) || !is_power_of_2(val)) {
3288− pr_info("rss_ring valid range [2 - %x] in powers of 2\n",
3289− max_allowed);
3395+ if (!is_power_of_2(val))
3396+ netdev_err(netdev, "RSS value should be a power of 2\n");
3397+
3398+ if (val < 2)
3399+ netdev_err(netdev, "RSS value should not be lower than 2\n");
3400+
3401+ if (val > max_hw)
3402+ netdev_err(netdev,
3403+ "RSS value should not be higher than[%u], the max RSS rings supported by the adapter\n",
3404+ max_hw);
3405+
3406+ if (val > num_online_cpus())
3407+ netdev_err(netdev,
3408+ "RSS value should not be higher than[%u], number of online CPUs in the system\n",
3409+ num_online_cpus());
3410+
3411+ netdev_err(netdev, "Unable to configure %u RSS rings\n", val);
3412+
32903413 return -EINVAL;
32913414 }
32923415 return 0;

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t