if_ixl.c (6d011ad5) | if_ixl.c (d4683565) |
---|---|
1/****************************************************************************** 2 3 Copyright (c) 2013-2015, Intel Corporation 4 All rights reserved. 5 6 Redistribution and use in source and binary forms, with or without 7 modification, are permitted provided that the following conditions are met: 8 --- 34 unchanged lines hidden (view full) --- 43 44#ifdef RSS 45#include <net/rss_config.h> 46#endif 47 48/********************************************************************* 49 * Driver version 50 *********************************************************************/ | 1/****************************************************************************** 2 3 Copyright (c) 2013-2015, Intel Corporation 4 All rights reserved. 5 6 Redistribution and use in source and binary forms, with or without 7 modification, are permitted provided that the following conditions are met: 8 --- 34 unchanged lines hidden (view full) --- 43 44#ifdef RSS 45#include <net/rss_config.h> 46#endif 47 48/********************************************************************* 49 * Driver version 50 *********************************************************************/ |
51char ixl_driver_version[] = "1.4.24-k"; | 51char ixl_driver_version[] = "1.4.27-k"; |
52 53/********************************************************************* 54 * PCI Device ID Table 55 * 56 * Used by probe to select devices to load on 57 * Last field stores an index into ixl_strings 58 * Last entry must be all 0s 59 * --- 492 unchanged lines hidden (view full) --- 552 } 553 554 error = i40e_configure_lan_hmc(hw, I40E_HMC_MODEL_DIRECT_ONLY); 555 if (error) { 556 device_printf(dev, "configure_lan_hmc failed: %d\n", error); 557 goto err_mac_hmc; 558 } 559 | 52 53/********************************************************************* 54 * PCI Device ID Table 55 * 56 * Used by probe to select devices to load on 57 * Last field stores an index into ixl_strings 58 * Last entry must be all 0s 59 * --- 492 unchanged lines hidden (view full) --- 552 } 553 554 error = i40e_configure_lan_hmc(hw, I40E_HMC_MODEL_DIRECT_ONLY); 555 if (error) { 556 device_printf(dev, "configure_lan_hmc failed: %d\n", error); 557 goto err_mac_hmc; 558 } 559 |
560 /* Disable LLDP from the firmware */ 561 i40e_aq_stop_lldp(hw, TRUE, NULL); | 560 /* Disable LLDP from the firmware for certain NVM versions */ 561 if (((pf->hw.aq.fw_maj_ver == 4) && (pf->hw.aq.fw_min_ver < 3)) || 562 (pf->hw.aq.fw_maj_ver < 4)) 563 i40e_aq_stop_lldp(hw, TRUE, NULL); |
562 563 i40e_get_mac_addr(hw, hw->mac.addr); 564 error = i40e_validate_mac_addr(hw->mac.addr); 565 if (error) { 566 device_printf(dev, "validate_mac_addr failed: %d\n", error); 567 goto err_mac_hmc; 568 } 569 bcopy(hw->mac.addr, hw->mac.perm_addr, ETHER_ADDR_LEN); --- 2007 unchanged lines hidden (view full) --- 2577ixl_configure_queue_intr_msix(struct ixl_pf *pf) 2578{ 2579 struct i40e_hw *hw = &pf->hw; 2580 struct ixl_vsi *vsi = &pf->vsi; 2581 u32 reg; 2582 u16 vector = 1; 2583 2584 for (int i = 0; i < vsi->num_queues; i++, vector++) { | 564 565 i40e_get_mac_addr(hw, hw->mac.addr); 566 error = i40e_validate_mac_addr(hw->mac.addr); 567 if (error) { 568 device_printf(dev, "validate_mac_addr failed: %d\n", error); 569 goto err_mac_hmc; 570 } 571 bcopy(hw->mac.addr, hw->mac.perm_addr, ETHER_ADDR_LEN); --- 2007 unchanged lines hidden (view full) --- 2579ixl_configure_queue_intr_msix(struct ixl_pf *pf) 2580{ 2581 struct i40e_hw *hw = &pf->hw; 2582 struct ixl_vsi *vsi = &pf->vsi; 2583 u32 reg; 2584 u16 vector = 1; 2585 2586 for (int i = 0; i < vsi->num_queues; i++, vector++) { |
2585 wr32(hw, I40E_PFINT_DYN_CTLN(i), i); | 2587 wr32(hw, I40E_PFINT_DYN_CTLN(i), 0); 2588 /* First queue type is RX / 0 */ |
2586 wr32(hw, I40E_PFINT_LNKLSTN(i), i); 2587 2588 reg = I40E_QINT_RQCTL_CAUSE_ENA_MASK | 2589 (IXL_RX_ITR << I40E_QINT_RQCTL_ITR_INDX_SHIFT) | 2590 (vector << I40E_QINT_RQCTL_MSIX_INDX_SHIFT) | 2591 (i << I40E_QINT_RQCTL_NEXTQ_INDX_SHIFT) | 2592 (I40E_QUEUE_TYPE_TX << I40E_QINT_RQCTL_NEXTQ_TYPE_SHIFT); 2593 wr32(hw, I40E_QINT_RQCTL(i), reg); 2594 2595 reg = I40E_QINT_TQCTL_CAUSE_ENA_MASK | 2596 (IXL_TX_ITR << I40E_QINT_TQCTL_ITR_INDX_SHIFT) | 2597 (vector << I40E_QINT_TQCTL_MSIX_INDX_SHIFT) | | 2589 wr32(hw, I40E_PFINT_LNKLSTN(i), i); 2590 2591 reg = I40E_QINT_RQCTL_CAUSE_ENA_MASK | 2592 (IXL_RX_ITR << I40E_QINT_RQCTL_ITR_INDX_SHIFT) | 2593 (vector << I40E_QINT_RQCTL_MSIX_INDX_SHIFT) | 2594 (i << I40E_QINT_RQCTL_NEXTQ_INDX_SHIFT) | 2595 (I40E_QUEUE_TYPE_TX << I40E_QINT_RQCTL_NEXTQ_TYPE_SHIFT); 2596 wr32(hw, I40E_QINT_RQCTL(i), reg); 2597 2598 reg = I40E_QINT_TQCTL_CAUSE_ENA_MASK | 2599 (IXL_TX_ITR << I40E_QINT_TQCTL_ITR_INDX_SHIFT) | 2600 (vector << I40E_QINT_TQCTL_MSIX_INDX_SHIFT) | |
2598 ((i+1) << I40E_QINT_TQCTL_NEXTQ_INDX_SHIFT) | | 2601 (IXL_QUEUE_EOL << I40E_QINT_TQCTL_NEXTQ_INDX_SHIFT) | |
2599 (I40E_QUEUE_TYPE_RX << I40E_QINT_TQCTL_NEXTQ_TYPE_SHIFT); | 2602 (I40E_QUEUE_TYPE_RX << I40E_QINT_TQCTL_NEXTQ_TYPE_SHIFT); |
2600 if (i == (vsi->num_queues - 1)) 2601 reg |= (IXL_QUEUE_EOL 2602 << I40E_QINT_TQCTL_NEXTQ_INDX_SHIFT); | |
2603 wr32(hw, I40E_QINT_TQCTL(i), reg); 2604 } 2605} 2606 2607/* 2608 * Configure for MSI single vector operation 2609 */ 2610static void --- 1266 unchanged lines hidden (view full) --- 3877 3878#ifdef RSS 3879 /* Fetch the configured RSS key */ 3880 rss_getkey((uint8_t *) &rss_seed); 3881#endif 3882 3883 /* Fill out hash function seed */ 3884 for (i = 0; i < IXL_KEYSZ; i++) | 2603 wr32(hw, I40E_QINT_TQCTL(i), reg); 2604 } 2605} 2606 2607/* 2608 * Configure for MSI single vector operation 2609 */ 2610static void --- 1266 unchanged lines hidden (view full) --- 3877 3878#ifdef RSS 3879 /* Fetch the configured RSS key */ 3880 rss_getkey((uint8_t *) &rss_seed); 3881#endif 3882 3883 /* Fill out hash function seed */ 3884 for (i = 0; i < IXL_KEYSZ; i++) |
3885 wr32(hw, I40E_PFQF_HKEY(i), rss_seed[i]); | 3885 i40e_write_rx_ctl(hw, I40E_PFQF_HKEY(i), rss_seed[i]); |
3886 3887 /* Enable PCTYPES for RSS: */ 3888#ifdef RSS 3889 rss_hash_config = rss_gethashconfig(); 3890 if (rss_hash_config & RSS_HASHTYPE_RSS_IPV4) 3891 set_hena |= ((u64)1 << I40E_FILTER_PCTYPE_NONF_IPV4_OTHER); 3892 if (rss_hash_config & RSS_HASHTYPE_RSS_TCP_IPV4) 3893 set_hena |= ((u64)1 << I40E_FILTER_PCTYPE_NONF_IPV4_TCP); --- 16 unchanged lines hidden (view full) --- 3910 ((u64)1 << I40E_FILTER_PCTYPE_FRAG_IPV4) | 3911 ((u64)1 << I40E_FILTER_PCTYPE_NONF_IPV6_UDP) | 3912 ((u64)1 << I40E_FILTER_PCTYPE_NONF_IPV6_TCP) | 3913 ((u64)1 << I40E_FILTER_PCTYPE_NONF_IPV6_SCTP) | 3914 ((u64)1 << I40E_FILTER_PCTYPE_NONF_IPV6_OTHER) | 3915 ((u64)1 << I40E_FILTER_PCTYPE_FRAG_IPV6) | 3916 ((u64)1 << I40E_FILTER_PCTYPE_L2_PAYLOAD); 3917#endif | 3886 3887 /* Enable PCTYPES for RSS: */ 3888#ifdef RSS 3889 rss_hash_config = rss_gethashconfig(); 3890 if (rss_hash_config & RSS_HASHTYPE_RSS_IPV4) 3891 set_hena |= ((u64)1 << I40E_FILTER_PCTYPE_NONF_IPV4_OTHER); 3892 if (rss_hash_config & RSS_HASHTYPE_RSS_TCP_IPV4) 3893 set_hena |= ((u64)1 << I40E_FILTER_PCTYPE_NONF_IPV4_TCP); --- 16 unchanged lines hidden (view full) --- 3910 ((u64)1 << I40E_FILTER_PCTYPE_FRAG_IPV4) | 3911 ((u64)1 << I40E_FILTER_PCTYPE_NONF_IPV6_UDP) | 3912 ((u64)1 << I40E_FILTER_PCTYPE_NONF_IPV6_TCP) | 3913 ((u64)1 << I40E_FILTER_PCTYPE_NONF_IPV6_SCTP) | 3914 ((u64)1 << I40E_FILTER_PCTYPE_NONF_IPV6_OTHER) | 3915 ((u64)1 << I40E_FILTER_PCTYPE_FRAG_IPV6) | 3916 ((u64)1 << I40E_FILTER_PCTYPE_L2_PAYLOAD); 3917#endif |
3918 hena = (u64)rd32(hw, I40E_PFQF_HENA(0)) | 3919 ((u64)rd32(hw, I40E_PFQF_HENA(1)) << 32); | 3918 hena = (u64)i40e_read_rx_ctl(hw, I40E_PFQF_HENA(0)) | 3919 ((u64)i40e_read_rx_ctl(hw, I40E_PFQF_HENA(1)) << 32); |
3920 hena |= set_hena; | 3920 hena |= set_hena; |
3921 wr32(hw, I40E_PFQF_HENA(0), (u32)hena); 3922 wr32(hw, I40E_PFQF_HENA(1), (u32)(hena >> 32)); | 3921 i40e_write_rx_ctl(hw, I40E_PFQF_HENA(0), (u32)hena); 3922 i40e_write_rx_ctl(hw, I40E_PFQF_HENA(1), (u32)(hena >> 32)); |
3923 3924 /* Populate the LUT with max no. of queues in round robin fashion */ 3925 for (i = j = 0; i < pf->hw.func_caps.rss_table_size; i++, j++) { 3926 if (j == vsi->num_queues) 3927 j = 0; 3928#ifdef RSS 3929 /* 3930 * Fetch the RSS bucket id for the given indirection entry. --- 2180 unchanged lines hidden (view full) --- 6111 /* 6112 * Two queues are mapped in a single register, so we have to do some 6113 * gymnastics to convert the queue number into a register index and 6114 * shift. 6115 */ 6116 index = qnum / 2; 6117 shift = (qnum % 2) * I40E_VSILAN_QTABLE_QINDEX_1_SHIFT; 6118 | 3923 3924 /* Populate the LUT with max no. of queues in round robin fashion */ 3925 for (i = j = 0; i < pf->hw.func_caps.rss_table_size; i++, j++) { 3926 if (j == vsi->num_queues) 3927 j = 0; 3928#ifdef RSS 3929 /* 3930 * Fetch the RSS bucket id for the given indirection entry. --- 2180 unchanged lines hidden (view full) --- 6111 /* 6112 * Two queues are mapped in a single register, so we have to do some 6113 * gymnastics to convert the queue number into a register index and 6114 * shift. 6115 */ 6116 index = qnum / 2; 6117 shift = (qnum % 2) * I40E_VSILAN_QTABLE_QINDEX_1_SHIFT; 6118 |
6119 qtable = rd32(hw, I40E_VSILAN_QTABLE(index, vf->vsi.vsi_num)); | 6119 qtable = i40e_read_rx_ctl(hw, I40E_VSILAN_QTABLE(index, vf->vsi.vsi_num)); |
6120 qtable &= ~(I40E_VSILAN_QTABLE_QINDEX_0_MASK << shift); 6121 qtable |= val << shift; | 6120 qtable &= ~(I40E_VSILAN_QTABLE_QINDEX_0_MASK << shift); 6121 qtable |= val << shift; |
6122 wr32(hw, I40E_VSILAN_QTABLE(index, vf->vsi.vsi_num), qtable); | 6122 i40e_write_rx_ctl(hw, I40E_VSILAN_QTABLE(index, vf->vsi.vsi_num), qtable); |
6123} 6124 6125static void 6126ixl_vf_map_queues(struct ixl_pf *pf, struct ixl_vf *vf) 6127{ 6128 struct i40e_hw *hw; 6129 uint32_t qtable; 6130 int i; 6131 6132 hw = &pf->hw; 6133 6134 /* 6135 * Contiguous mappings aren't actually supported by the hardware, 6136 * so we have to use non-contiguous mappings. 6137 */ | 6123} 6124 6125static void 6126ixl_vf_map_queues(struct ixl_pf *pf, struct ixl_vf *vf) 6127{ 6128 struct i40e_hw *hw; 6129 uint32_t qtable; 6130 int i; 6131 6132 hw = &pf->hw; 6133 6134 /* 6135 * Contiguous mappings aren't actually supported by the hardware, 6136 * so we have to use non-contiguous mappings. 6137 */ |
6138 wr32(hw, I40E_VSILAN_QBASE(vf->vsi.vsi_num), | 6138 i40e_write_rx_ctl(hw, I40E_VSILAN_QBASE(vf->vsi.vsi_num), |
6139 I40E_VSILAN_QBASE_VSIQTABLE_ENA_MASK); 6140 6141 wr32(hw, I40E_VPLAN_MAPENA(vf->vf_num), 6142 I40E_VPLAN_MAPENA_TXRX_ENA_MASK); 6143 6144 for (i = 0; i < vf->vsi.num_queues; i++) { 6145 qtable = (vf->vsi.first_queue + i) << 6146 I40E_VPLAN_QTABLE_QINDEX_SHIFT; --- 1322 unchanged lines hidden --- | 6139 I40E_VSILAN_QBASE_VSIQTABLE_ENA_MASK); 6140 6141 wr32(hw, I40E_VPLAN_MAPENA(vf->vf_num), 6142 I40E_VPLAN_MAPENA_TXRX_ENA_MASK); 6143 6144 for (i = 0; i < vf->vsi.num_queues; i++) { 6145 qtable = (vf->vsi.first_queue + i) << 6146 I40E_VPLAN_QTABLE_QINDEX_SHIFT; --- 1322 unchanged lines hidden --- |