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. ====================
Unified · Split
| @@ -38,8 +38,8 @@ · 37 unmodified lines | ||
| 38 | 38 | |
| 39 | 39 | #define _QLCNIC_LINUX_MAJOR 5 |
| 40 | 40 | #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" | |
| 43 | 43 | #define QLCNIC_DRV_IDC_VER 0x01 |
| 44 | 44 | #define QLCNIC_DRIVER_VERSION ((_QLCNIC_LINUX_MAJOR << 16) |\ |
| 45 | 45 | (_QLCNIC_LINUX_MINOR << 8) | (_QLCNIC_LINUX_SUBVERSION)) |
| @@ -347,8 +347,14 @@ struct qlcnic_rx_buffer { · 301 unmodified lines | ||
| 347 | 347 | * Interrupt coalescing defaults. The defaults are for 1500 MTU. It is |
| 348 | 348 | * adjusted based on configured MTU. |
| 349 | 349 | */ |
| 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 | |
| 352 | 358 | |
| 353 | 359 | #define QLCNIC_INTR_DEFAULT 0x04 |
| 354 | 360 | #define QLCNIC_CONFIG_INTR_COALESCE 3 |
| @@ -359,6 +365,8 @@ struct qlcnic_nic_intr_coalesce { · 4 unmodified lines | ||
| 359 | 365 | u8 sts_ring_mask; |
| 360 | 366 | u16 rx_packets; |
| 361 | 367 | u16 rx_time_us; |
| 368 | + u16 tx_packets; | |
| 369 | + u16 tx_time_us; | |
| 362 | 370 | u16 flag; |
| 363 | 371 | u32 timer_out; |
| 364 | 372 | }; |
| @@ -511,13 +519,13 @@ struct qlcnic_host_sds_ring { · 146 unmodified lines | ||
| 511 | 519 | int irq; |
| 512 | 520 | |
| 513 | 521 | dma_addr_t phys_addr; |
| 514 | − char name[IFNAMSIZ+4]; | |
| 522 | + char name[IFNAMSIZ + 12]; | |
| 515 | 523 | } ____cacheline_internodealigned_in_smp; |
| 516 | 524 | |
| 517 | 525 | struct qlcnic_host_tx_ring { |
| 518 | 526 | int irq; |
| 519 | 527 | void __iomem *crb_intr_mask; |
| 520 | − char name[IFNAMSIZ+4]; | |
| 528 | + char name[IFNAMSIZ + 12]; | |
| 521 | 529 | u16 ctx_id; |
| 522 | 530 | u32 producer; |
| 523 | 531 | u32 sw_consumer; |
| @@ -1474,7 +1482,7 @@ void qlcnic_diag_free_res(struct net_device *netdev, int max_sds_rings); · 950 unmodified lines | ||
| 1474 | 1482 | int qlcnic_diag_alloc_res(struct net_device *netdev, int test); |
| 1475 | 1483 | netdev_tx_t qlcnic_xmit_frame(struct sk_buff *skb, struct net_device *netdev); |
| 1476 | 1484 | 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); | |
| 1478 | 1486 | void qlcnic_alloc_lb_filters_mem(struct qlcnic_adapter *adapter); |
| 1479 | 1487 | int qlcnic_enable_msix(struct qlcnic_adapter *, u32); |
| 1480 | 1488 | |
| @@ -1937,7 +1937,7 @@ int qlcnic_83xx_get_mac_address(struct qlcnic_adapter *adapter, u8 *mac) · 1936 unmodified lines | ||
| 1937 | 1937 | void qlcnic_83xx_config_intr_coal(struct qlcnic_adapter *adapter) |
| 1938 | 1938 | { |
| 1939 | 1939 | int err; |
| 1940 | − u32 temp; | |
| 1940 | + u16 temp; | |
| 1941 | 1941 | struct qlcnic_cmd_args cmd; |
| 1942 | 1942 | struct qlcnic_nic_intr_coalesce *coal = &adapter->ahw->coal; |
| 1943 | 1943 | |
| @@ -1945,10 +1945,18 @@ void qlcnic_83xx_config_intr_coal(struct qlcnic_adapter *adapter) · 1 unmodified line | ||
| 1945 | 1945 | return; |
| 1946 | 1946 | |
| 1947 | 1947 | 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 | + } | |
| 1949 | 1959 | cmd.req.arg[3] = coal->flag; |
| 1950 | − temp = coal->rx_time_us << 16; | |
| 1951 | − cmd.req.arg[2] = coal->rx_packets | temp; | |
| 1952 | 1960 | err = qlcnic_issue_cmd(adapter, &cmd); |
| 1953 | 1961 | if (err != QLCNIC_RCODE_SUCCESS) |
| 1954 | 1962 | dev_info(&adapter->pdev->dev, |
| @@ -2922,6 +2930,9 @@ static u64 *qlcnic_83xx_fill_stats(struct qlcnic_adapter *adapter, · 967 unmodified lines | ||
| 2922 | 2930 | /* fill in MAC rx frame stats */ |
| 2923 | 2931 | for (k += 6; k < 80; k += 2) |
| 2924 | 2932 | 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); | |
| 2925 | 2936 | break; |
| 2926 | 2937 | case QLC_83XX_STAT_RX: |
| 2927 | 2938 | for (k = 2; k < 8; k += 2) |
| @@ -381,7 +381,7 @@ enum qlcnic_83xx_states { · 380 unmodified lines | ||
| 381 | 381 | #define QLC_83XX_STAT_MAC 1 |
| 382 | 382 | #define QLC_83XX_TX_STAT_REGS 14 |
| 383 | 383 | #define QLC_83XX_RX_STAT_REGS 40 |
| 384 | −#define QLC_83XX_MAC_STAT_REGS 80 | |
| 384 | +#define QLC_83XX_MAC_STAT_REGS 94 | |
| 385 | 385 | |
| 386 | 386 | #define QLC_83XX_GET_FUNC_PRIVILEGE(VAL, FN) (0x3 & ((VAL) >> (FN * 2))) |
| 387 | 387 | #define QLC_83XX_SET_FUNC_OPMODE(VAL, FN) ((VAL) << (FN * 2)) |
| @@ -25,6 +25,17 @@ · 24 unmodified lines | ||
| 25 | 25 | #define QLC_83XX_OPCODE_TMPL_END 0x0080 |
| 26 | 26 | #define QLC_83XX_OPCODE_POLL_READ_LIST 0x0100 |
| 27 | 27 | |
| 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 | + | |
| 28 | 39 | static int qlcnic_83xx_init_default_driver(struct qlcnic_adapter *adapter); |
| 29 | 40 | static int qlcnic_83xx_check_heartbeat(struct qlcnic_adapter *p_dev); |
| 30 | 41 | 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 | ||
| 1374 | 1385 | qlcnic_83xx_unlock_driver(adapter); |
| 1375 | 1386 | } |
| 1376 | 1387 | |
| 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 | + | |
| 1377 | 1401 | static int qlcnic_83xx_check_heartbeat(struct qlcnic_adapter *p_dev) |
| 1378 | 1402 | { |
| 1379 | 1403 | u32 heartbeat, peg_status; |
| @@ -1395,6 +1419,7 @@ static int qlcnic_83xx_check_heartbeat(struct qlcnic_adapter *p_dev) · 15 unmodified lines | ||
| 1395 | 1419 | |
| 1396 | 1420 | if (ret) { |
| 1397 | 1421 | dev_err(&p_dev->pdev->dev, "firmware hang detected\n"); |
| 1422 | + qlcnic_83xx_take_eport_out_of_reset(p_dev); | |
| 1398 | 1423 | qlcnic_83xx_disable_pause_frames(p_dev); |
| 1399 | 1424 | peg_status = QLC_SHARED_REG_RD32(p_dev, |
| 1400 | 1425 | QLCNIC_PEG_HALT_STATUS1); |
| @@ -115,6 +115,13 @@ static const char qlcnic_83xx_mac_stats_strings[][ETH_GSTRING_LEN] = { · 114 unmodified lines | ||
| 115 | 115 | "mac_rx_dropped", |
| 116 | 116 | "mac_crc_error", |
| 117 | 117 | "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", | |
| 118 | 125 | }; |
| 119 | 126 | |
| 120 | 127 | #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 | ||
| 635 | 642 | channel->tx_count != channel->max_tx) |
| 636 | 643 | return -EINVAL; |
| 637 | 644 | |
| 638 | − err = qlcnic_validate_max_rss(channel->max_rx, channel->rx_count); | |
| 645 | + err = qlcnic_validate_max_rss(adapter, channel->rx_count); | |
| 639 | 646 | if (err) |
| 640 | 647 | return err; |
| 641 | 648 | |
| @@ -1296,6 +1303,9 @@ static int qlcnic_set_intr_coalesce(struct net_device *netdev, · 654 unmodified lines | ||
| 1296 | 1303 | struct ethtool_coalesce *ethcoal) |
| 1297 | 1304 | { |
| 1298 | 1305 | 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; | |
| 1299 | 1309 | |
| 1300 | 1310 | if (!test_bit(__QLCNIC_DEV_UP, &adapter->state)) |
| 1301 | 1311 | return -EINVAL; |
| @@ -1306,8 +1316,8 @@ static int qlcnic_set_intr_coalesce(struct net_device *netdev, · 4 unmodified lines | ||
| 1306 | 1316 | */ |
| 1307 | 1317 | if (ethcoal->rx_coalesce_usecs > 0xffff || |
| 1308 | 1318 | 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 || | |
| 1311 | 1321 | ethcoal->rx_coalesce_usecs_irq || |
| 1312 | 1322 | ethcoal->rx_max_coalesced_frames_irq || |
| 1313 | 1323 | ethcoal->tx_coalesce_usecs_irq || |
| @@ -1327,18 +1337,55 @@ static int qlcnic_set_intr_coalesce(struct net_device *netdev, · 13 unmodified lines | ||
| 1327 | 1337 | ethcoal->tx_max_coalesced_frames_high) |
| 1328 | 1338 | return -EINVAL; |
| 1329 | 1339 | |
| 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 | + } | |
| 1337 | 1378 | } 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 | + } | |
| 1342 | 1389 | } |
| 1343 | 1390 | |
| 1344 | 1391 | qlcnic_config_intr_coalesce(adapter); |
| @@ -1356,6 +1403,8 @@ static int qlcnic_get_intr_coalesce(struct net_device *netdev, · 11 unmodified lines | ||
| 1356 | 1403 | |
| 1357 | 1404 | ethcoal->rx_coalesce_usecs = adapter->ahw->coal.rx_time_us; |
| 1358 | 1405 | 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; | |
| 1359 | 1408 | |
| 1360 | 1409 | return 0; |
| 1361 | 1410 | } |
| @@ -156,25 +156,112 @@ static const u32 qlcnic_reg_tbl[] = { · 155 unmodified lines | ||
| 156 | 156 | }; |
| 157 | 157 | |
| 158 | 158 | 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" }, | |
| 178 | 265 | }; |
| 179 | 266 | |
| 180 | 267 | #define NUM_SUPPORTED_BOARDS ARRAY_SIZE(qlcnic_boards) |
| @@ -1287,7 +1374,7 @@ qlcnic_request_irq(struct qlcnic_adapter *adapter) · 1106 unmodified lines | ||
| 1287 | 1374 | irq_handler_t handler; |
| 1288 | 1375 | struct qlcnic_host_sds_ring *sds_ring; |
| 1289 | 1376 | struct qlcnic_host_tx_ring *tx_ring; |
| 1290 | − int err, ring; | |
| 1377 | + int err, ring, num_sds_rings; | |
| 1291 | 1378 | |
| 1292 | 1379 | unsigned long flags = 0; |
| 1293 | 1380 | struct net_device *netdev = adapter->netdev; |
| @@ -1318,10 +1405,20 @@ qlcnic_request_irq(struct qlcnic_adapter *adapter) · 24 unmodified lines | ||
| 1318 | 1405 | if (qlcnic_82xx_check(adapter) || |
| 1319 | 1406 | (qlcnic_83xx_check(adapter) && |
| 1320 | 1407 | (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++) { | |
| 1322 | 1410 | 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); | |
| 1325 | 1422 | err = request_irq(sds_ring->irq, handler, flags, |
| 1326 | 1423 | sds_ring->name, sds_ring); |
| 1327 | 1424 | if (err) |
| @@ -1335,9 +1432,8 @@ qlcnic_request_irq(struct qlcnic_adapter *adapter) · 7 unmodified lines | ||
| 1335 | 1432 | for (ring = 0; ring < adapter->max_drv_tx_rings; |
| 1336 | 1433 | ring++) { |
| 1337 | 1434 | 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); | |
| 1341 | 1437 | err = request_irq(tx_ring->irq, handler, flags, |
| 1342 | 1438 | tx_ring->name, tx_ring); |
| 1343 | 1439 | if (err) |
| @@ -1587,7 +1683,9 @@ out: · 243 unmodified lines | ||
| 1587 | 1683 | |
| 1588 | 1684 | static int qlcnic_alloc_adapter_resources(struct qlcnic_adapter *adapter) |
| 1589 | 1685 | { |
| 1686 | + struct qlcnic_hardware_context *ahw = adapter->ahw; | |
| 1590 | 1687 | int err = 0; |
| 1688 | + | |
| 1591 | 1689 | adapter->recv_ctx = kzalloc(sizeof(struct qlcnic_recv_context), |
| 1592 | 1690 | GFP_KERNEL); |
| 1593 | 1691 | if (!adapter->recv_ctx) { |
| @@ -1595,9 +1693,14 @@ static int qlcnic_alloc_adapter_resources(struct qlcnic_adapter *adapter) · 1 unmodified line | ||
| 1595 | 1693 | goto err_out; |
| 1596 | 1694 | } |
| 1597 | 1695 | /* 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 | + } | |
| 1601 | 1704 | /* clear stats */ |
| 1602 | 1705 | memset(&adapter->stats, 0, sizeof(adapter->stats)); |
| 1603 | 1706 | err_out: |
| @@ -3273,20 +3376,40 @@ qlcnicvf_start_firmware(struct qlcnic_adapter *adapter) · 1669 unmodified lines | ||
| 3273 | 3376 | return err; |
| 3274 | 3377 | } |
| 3275 | 3378 | |
| 3276 | −int qlcnic_validate_max_rss(u8 max_hw, u8 val) | |
| 3379 | +int qlcnic_validate_max_rss(struct qlcnic_adapter *adapter, | |
| 3380 | + __u32 val) | |
| 3277 | 3381 | { |
| 3382 | + struct net_device *netdev = adapter->netdev; | |
| 3383 | + u8 max_hw = adapter->ahw->max_rx_ques; | |
| 3278 | 3384 | u32 max_allowed; |
| 3279 | 3385 | |
| 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; | |
| 3283 | 3390 | } |
| 3284 | 3391 | |
| 3285 | 3392 | max_allowed = rounddown_pow_of_two(min_t(int, max_hw, |
| 3286 | 3393 | num_online_cpus())); |
| 3287 | 3394 | 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 | + | |
| 3290 | 3413 | return -EINVAL; |
| 3291 | 3414 | } |
| 3292 | 3415 | return 0; |