diff options
author | David S. Miller <davem@davemloft.net> | 2012-08-31 16:03:33 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-08-31 16:03:33 -0400 |
commit | fcb118491bc8bc16c4eeb8142366bcbe17fe615d (patch) | |
tree | 8eb8aba6fe58519aea313820bb4b9c0859721cbd | |
parent | 80f0fd8a7f18af78dd26bf94230e89c3ae82d4ba (diff) | |
parent | dd1fe113e7532c7513ff03f832312d81628a23ff (diff) |
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/jkirsher/net-next
-rw-r--r-- | drivers/net/ethernet/intel/e1000e/82571.c | 4 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/e1000e/ethtool.c | 3 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/e1000e/netdev.c | 19 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/ixgbevf/ixgbevf.h | 4 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c | 160 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/ixgbevf/vf.c | 14 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/ixgbevf/vf.h | 1 |
7 files changed, 164 insertions, 41 deletions
diff --git a/drivers/net/ethernet/intel/e1000e/82571.c b/drivers/net/ethernet/intel/e1000e/82571.c index 080c89093feb..c98586408005 100644 --- a/drivers/net/ethernet/intel/e1000e/82571.c +++ b/drivers/net/ethernet/intel/e1000e/82571.c | |||
@@ -653,7 +653,7 @@ static void e1000_put_hw_semaphore_82574(struct e1000_hw *hw) | |||
653 | **/ | 653 | **/ |
654 | static s32 e1000_set_d0_lplu_state_82574(struct e1000_hw *hw, bool active) | 654 | static s32 e1000_set_d0_lplu_state_82574(struct e1000_hw *hw, bool active) |
655 | { | 655 | { |
656 | u16 data = er32(POEMB); | 656 | u32 data = er32(POEMB); |
657 | 657 | ||
658 | if (active) | 658 | if (active) |
659 | data |= E1000_PHY_CTRL_D0A_LPLU; | 659 | data |= E1000_PHY_CTRL_D0A_LPLU; |
@@ -677,7 +677,7 @@ static s32 e1000_set_d0_lplu_state_82574(struct e1000_hw *hw, bool active) | |||
677 | **/ | 677 | **/ |
678 | static s32 e1000_set_d3_lplu_state_82574(struct e1000_hw *hw, bool active) | 678 | static s32 e1000_set_d3_lplu_state_82574(struct e1000_hw *hw, bool active) |
679 | { | 679 | { |
680 | u16 data = er32(POEMB); | 680 | u32 data = er32(POEMB); |
681 | 681 | ||
682 | if (!active) { | 682 | if (!active) { |
683 | data &= ~E1000_PHY_CTRL_NOND0A_LPLU; | 683 | data &= ~E1000_PHY_CTRL_NOND0A_LPLU; |
diff --git a/drivers/net/ethernet/intel/e1000e/ethtool.c b/drivers/net/ethernet/intel/e1000e/ethtool.c index 2e76f06720fd..c11ac2756667 100644 --- a/drivers/net/ethernet/intel/e1000e/ethtool.c +++ b/drivers/net/ethernet/intel/e1000e/ethtool.c | |||
@@ -1942,7 +1942,8 @@ static int e1000_set_coalesce(struct net_device *netdev, | |||
1942 | return -EINVAL; | 1942 | return -EINVAL; |
1943 | 1943 | ||
1944 | if (ec->rx_coalesce_usecs == 4) { | 1944 | if (ec->rx_coalesce_usecs == 4) { |
1945 | adapter->itr = adapter->itr_setting = 4; | 1945 | adapter->itr_setting = 4; |
1946 | adapter->itr = adapter->itr_setting; | ||
1946 | } else if (ec->rx_coalesce_usecs <= 3) { | 1947 | } else if (ec->rx_coalesce_usecs <= 3) { |
1947 | adapter->itr = 20000; | 1948 | adapter->itr = 20000; |
1948 | adapter->itr_setting = ec->rx_coalesce_usecs; | 1949 | adapter->itr_setting = ec->rx_coalesce_usecs; |
diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c index d01a099475a1..121990cab144 100644 --- a/drivers/net/ethernet/intel/e1000e/netdev.c +++ b/drivers/net/ethernet/intel/e1000e/netdev.c | |||
@@ -56,7 +56,7 @@ | |||
56 | 56 | ||
57 | #define DRV_EXTRAVERSION "-k" | 57 | #define DRV_EXTRAVERSION "-k" |
58 | 58 | ||
59 | #define DRV_VERSION "2.0.0" DRV_EXTRAVERSION | 59 | #define DRV_VERSION "2.1.4" DRV_EXTRAVERSION |
60 | char e1000e_driver_name[] = "e1000e"; | 60 | char e1000e_driver_name[] = "e1000e"; |
61 | const char e1000e_driver_version[] = DRV_VERSION; | 61 | const char e1000e_driver_version[] = DRV_VERSION; |
62 | 62 | ||
@@ -3446,7 +3446,7 @@ void e1000e_reset(struct e1000_adapter *adapter) | |||
3446 | 3446 | ||
3447 | /* | 3447 | /* |
3448 | * if short on Rx space, Rx wins and must trump Tx | 3448 | * if short on Rx space, Rx wins and must trump Tx |
3449 | * adjustment or use Early Receive if available | 3449 | * adjustment |
3450 | */ | 3450 | */ |
3451 | if (pba < min_rx_space) | 3451 | if (pba < min_rx_space) |
3452 | pba = min_rx_space; | 3452 | pba = min_rx_space; |
@@ -3755,6 +3755,10 @@ static irqreturn_t e1000_intr_msi_test(int irq, void *data) | |||
3755 | e_dbg("icr is %08X\n", icr); | 3755 | e_dbg("icr is %08X\n", icr); |
3756 | if (icr & E1000_ICR_RXSEQ) { | 3756 | if (icr & E1000_ICR_RXSEQ) { |
3757 | adapter->flags &= ~FLAG_MSI_TEST_FAILED; | 3757 | adapter->flags &= ~FLAG_MSI_TEST_FAILED; |
3758 | /* | ||
3759 | * Force memory writes to complete before acknowledging the | ||
3760 | * interrupt is handled. | ||
3761 | */ | ||
3758 | wmb(); | 3762 | wmb(); |
3759 | } | 3763 | } |
3760 | 3764 | ||
@@ -3796,6 +3800,10 @@ static int e1000_test_msi_interrupt(struct e1000_adapter *adapter) | |||
3796 | goto msi_test_failed; | 3800 | goto msi_test_failed; |
3797 | } | 3801 | } |
3798 | 3802 | ||
3803 | /* | ||
3804 | * Force memory writes to complete before enabling and firing an | ||
3805 | * interrupt. | ||
3806 | */ | ||
3799 | wmb(); | 3807 | wmb(); |
3800 | 3808 | ||
3801 | e1000_irq_enable(adapter); | 3809 | e1000_irq_enable(adapter); |
@@ -3807,7 +3815,7 @@ static int e1000_test_msi_interrupt(struct e1000_adapter *adapter) | |||
3807 | 3815 | ||
3808 | e1000_irq_disable(adapter); | 3816 | e1000_irq_disable(adapter); |
3809 | 3817 | ||
3810 | rmb(); | 3818 | rmb(); /* read flags after interrupt has been fired */ |
3811 | 3819 | ||
3812 | if (adapter->flags & FLAG_MSI_TEST_FAILED) { | 3820 | if (adapter->flags & FLAG_MSI_TEST_FAILED) { |
3813 | adapter->int_mode = E1000E_INT_MODE_LEGACY; | 3821 | adapter->int_mode = E1000E_INT_MODE_LEGACY; |
@@ -4670,7 +4678,7 @@ static int e1000_tso(struct e1000_ring *tx_ring, struct sk_buff *skb) | |||
4670 | struct e1000_buffer *buffer_info; | 4678 | struct e1000_buffer *buffer_info; |
4671 | unsigned int i; | 4679 | unsigned int i; |
4672 | u32 cmd_length = 0; | 4680 | u32 cmd_length = 0; |
4673 | u16 ipcse = 0, tucse, mss; | 4681 | u16 ipcse = 0, mss; |
4674 | u8 ipcss, ipcso, tucss, tucso, hdr_len; | 4682 | u8 ipcss, ipcso, tucss, tucso, hdr_len; |
4675 | 4683 | ||
4676 | if (!skb_is_gso(skb)) | 4684 | if (!skb_is_gso(skb)) |
@@ -4704,7 +4712,6 @@ static int e1000_tso(struct e1000_ring *tx_ring, struct sk_buff *skb) | |||
4704 | ipcso = (void *)&(ip_hdr(skb)->check) - (void *)skb->data; | 4712 | ipcso = (void *)&(ip_hdr(skb)->check) - (void *)skb->data; |
4705 | tucss = skb_transport_offset(skb); | 4713 | tucss = skb_transport_offset(skb); |
4706 | tucso = (void *)&(tcp_hdr(skb)->check) - (void *)skb->data; | 4714 | tucso = (void *)&(tcp_hdr(skb)->check) - (void *)skb->data; |
4707 | tucse = 0; | ||
4708 | 4715 | ||
4709 | cmd_length |= (E1000_TXD_CMD_DEXT | E1000_TXD_CMD_TSE | | 4716 | cmd_length |= (E1000_TXD_CMD_DEXT | E1000_TXD_CMD_TSE | |
4710 | E1000_TXD_CMD_TCP | (skb->len - (hdr_len))); | 4717 | E1000_TXD_CMD_TCP | (skb->len - (hdr_len))); |
@@ -4718,7 +4725,7 @@ static int e1000_tso(struct e1000_ring *tx_ring, struct sk_buff *skb) | |||
4718 | context_desc->lower_setup.ip_fields.ipcse = cpu_to_le16(ipcse); | 4725 | context_desc->lower_setup.ip_fields.ipcse = cpu_to_le16(ipcse); |
4719 | context_desc->upper_setup.tcp_fields.tucss = tucss; | 4726 | context_desc->upper_setup.tcp_fields.tucss = tucss; |
4720 | context_desc->upper_setup.tcp_fields.tucso = tucso; | 4727 | context_desc->upper_setup.tcp_fields.tucso = tucso; |
4721 | context_desc->upper_setup.tcp_fields.tucse = cpu_to_le16(tucse); | 4728 | context_desc->upper_setup.tcp_fields.tucse = 0; |
4722 | context_desc->tcp_seg_setup.fields.mss = cpu_to_le16(mss); | 4729 | context_desc->tcp_seg_setup.fields.mss = cpu_to_le16(mss); |
4723 | context_desc->tcp_seg_setup.fields.hdr_len = hdr_len; | 4730 | context_desc->tcp_seg_setup.fields.hdr_len = hdr_len; |
4724 | context_desc->cmd_and_length = cpu_to_le32(cmd_length); | 4731 | context_desc->cmd_and_length = cpu_to_le32(cmd_length); |
diff --git a/drivers/net/ethernet/intel/ixgbevf/ixgbevf.h b/drivers/net/ethernet/intel/ixgbevf/ixgbevf.h index 98cadb0c4dab..eb26fda63c99 100644 --- a/drivers/net/ethernet/intel/ixgbevf/ixgbevf.h +++ b/drivers/net/ethernet/intel/ixgbevf/ixgbevf.h | |||
@@ -101,7 +101,9 @@ struct ixgbevf_ring { | |||
101 | 101 | ||
102 | /* Supported Rx Buffer Sizes */ | 102 | /* Supported Rx Buffer Sizes */ |
103 | #define IXGBEVF_RXBUFFER_256 256 /* Used for packet split */ | 103 | #define IXGBEVF_RXBUFFER_256 256 /* Used for packet split */ |
104 | #define IXGBEVF_RXBUFFER_2048 2048 | 104 | #define IXGBEVF_RXBUFFER_3K 3072 |
105 | #define IXGBEVF_RXBUFFER_7K 7168 | ||
106 | #define IXGBEVF_RXBUFFER_15K 15360 | ||
105 | #define IXGBEVF_MAX_RXBUFFER 16384 /* largest size for single descriptor */ | 107 | #define IXGBEVF_MAX_RXBUFFER 16384 /* largest size for single descriptor */ |
106 | 108 | ||
107 | #define IXGBEVF_RX_HDR_SIZE IXGBEVF_RXBUFFER_256 | 109 | #define IXGBEVF_RX_HDR_SIZE IXGBEVF_RXBUFFER_256 |
diff --git a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c index 60ef64587412..a5d9cc5bb257 100644 --- a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c +++ b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c | |||
@@ -1057,15 +1057,46 @@ static void ixgbevf_configure_srrctl(struct ixgbevf_adapter *adapter, int index) | |||
1057 | 1057 | ||
1058 | srrctl |= IXGBE_SRRCTL_DESCTYPE_ADV_ONEBUF; | 1058 | srrctl |= IXGBE_SRRCTL_DESCTYPE_ADV_ONEBUF; |
1059 | 1059 | ||
1060 | if (rx_ring->rx_buf_len == MAXIMUM_ETHERNET_VLAN_SIZE) | 1060 | srrctl |= ALIGN(rx_ring->rx_buf_len, 1024) >> |
1061 | srrctl |= IXGBEVF_RXBUFFER_2048 >> | 1061 | IXGBE_SRRCTL_BSIZEPKT_SHIFT; |
1062 | IXGBE_SRRCTL_BSIZEPKT_SHIFT; | 1062 | |
1063 | else | ||
1064 | srrctl |= rx_ring->rx_buf_len >> | ||
1065 | IXGBE_SRRCTL_BSIZEPKT_SHIFT; | ||
1066 | IXGBE_WRITE_REG(hw, IXGBE_VFSRRCTL(index), srrctl); | 1063 | IXGBE_WRITE_REG(hw, IXGBE_VFSRRCTL(index), srrctl); |
1067 | } | 1064 | } |
1068 | 1065 | ||
1066 | static void ixgbevf_set_rx_buffer_len(struct ixgbevf_adapter *adapter) | ||
1067 | { | ||
1068 | struct ixgbe_hw *hw = &adapter->hw; | ||
1069 | struct net_device *netdev = adapter->netdev; | ||
1070 | int max_frame = netdev->mtu + ETH_HLEN + ETH_FCS_LEN; | ||
1071 | int i; | ||
1072 | u16 rx_buf_len; | ||
1073 | |||
1074 | /* notify the PF of our intent to use this size of frame */ | ||
1075 | ixgbevf_rlpml_set_vf(hw, max_frame); | ||
1076 | |||
1077 | /* PF will allow an extra 4 bytes past for vlan tagged frames */ | ||
1078 | max_frame += VLAN_HLEN; | ||
1079 | |||
1080 | /* | ||
1081 | * Make best use of allocation by using all but 1K of a | ||
1082 | * power of 2 allocation that will be used for skb->head. | ||
1083 | */ | ||
1084 | if ((hw->mac.type == ixgbe_mac_X540_vf) && | ||
1085 | (max_frame <= MAXIMUM_ETHERNET_VLAN_SIZE)) | ||
1086 | rx_buf_len = MAXIMUM_ETHERNET_VLAN_SIZE; | ||
1087 | else if (max_frame <= IXGBEVF_RXBUFFER_3K) | ||
1088 | rx_buf_len = IXGBEVF_RXBUFFER_3K; | ||
1089 | else if (max_frame <= IXGBEVF_RXBUFFER_7K) | ||
1090 | rx_buf_len = IXGBEVF_RXBUFFER_7K; | ||
1091 | else if (max_frame <= IXGBEVF_RXBUFFER_15K) | ||
1092 | rx_buf_len = IXGBEVF_RXBUFFER_15K; | ||
1093 | else | ||
1094 | rx_buf_len = IXGBEVF_MAX_RXBUFFER; | ||
1095 | |||
1096 | for (i = 0; i < adapter->num_rx_queues; i++) | ||
1097 | adapter->rx_ring[i].rx_buf_len = rx_buf_len; | ||
1098 | } | ||
1099 | |||
1069 | /** | 1100 | /** |
1070 | * ixgbevf_configure_rx - Configure 82599 VF Receive Unit after Reset | 1101 | * ixgbevf_configure_rx - Configure 82599 VF Receive Unit after Reset |
1071 | * @adapter: board private structure | 1102 | * @adapter: board private structure |
@@ -1076,18 +1107,14 @@ static void ixgbevf_configure_rx(struct ixgbevf_adapter *adapter) | |||
1076 | { | 1107 | { |
1077 | u64 rdba; | 1108 | u64 rdba; |
1078 | struct ixgbe_hw *hw = &adapter->hw; | 1109 | struct ixgbe_hw *hw = &adapter->hw; |
1079 | struct net_device *netdev = adapter->netdev; | ||
1080 | int max_frame = netdev->mtu + ETH_HLEN + ETH_FCS_LEN; | ||
1081 | int i, j; | 1110 | int i, j; |
1082 | u32 rdlen; | 1111 | u32 rdlen; |
1083 | int rx_buf_len; | ||
1084 | 1112 | ||
1085 | /* PSRTYPE must be initialized in 82599 */ | 1113 | /* PSRTYPE must be initialized in 82599 */ |
1086 | IXGBE_WRITE_REG(hw, IXGBE_VFPSRTYPE, 0); | 1114 | IXGBE_WRITE_REG(hw, IXGBE_VFPSRTYPE, 0); |
1087 | if (netdev->mtu <= ETH_DATA_LEN) | 1115 | |
1088 | rx_buf_len = MAXIMUM_ETHERNET_VLAN_SIZE; | 1116 | /* set_rx_buffer_len must be called before ring initialization */ |
1089 | else | 1117 | ixgbevf_set_rx_buffer_len(adapter); |
1090 | rx_buf_len = ALIGN(max_frame, 1024); | ||
1091 | 1118 | ||
1092 | rdlen = adapter->rx_ring[0].count * sizeof(union ixgbe_adv_rx_desc); | 1119 | rdlen = adapter->rx_ring[0].count * sizeof(union ixgbe_adv_rx_desc); |
1093 | /* Setup the HW Rx Head and Tail Descriptor Pointers and | 1120 | /* Setup the HW Rx Head and Tail Descriptor Pointers and |
@@ -1103,7 +1130,6 @@ static void ixgbevf_configure_rx(struct ixgbevf_adapter *adapter) | |||
1103 | IXGBE_WRITE_REG(hw, IXGBE_VFRDT(j), 0); | 1130 | IXGBE_WRITE_REG(hw, IXGBE_VFRDT(j), 0); |
1104 | adapter->rx_ring[i].head = IXGBE_VFRDH(j); | 1131 | adapter->rx_ring[i].head = IXGBE_VFRDH(j); |
1105 | adapter->rx_ring[i].tail = IXGBE_VFRDT(j); | 1132 | adapter->rx_ring[i].tail = IXGBE_VFRDT(j); |
1106 | adapter->rx_ring[i].rx_buf_len = rx_buf_len; | ||
1107 | 1133 | ||
1108 | ixgbevf_configure_srrctl(adapter, j); | 1134 | ixgbevf_configure_srrctl(adapter, j); |
1109 | } | 1135 | } |
@@ -1315,7 +1341,6 @@ static void ixgbevf_up_complete(struct ixgbevf_adapter *adapter) | |||
1315 | int i, j = 0; | 1341 | int i, j = 0; |
1316 | int num_rx_rings = adapter->num_rx_queues; | 1342 | int num_rx_rings = adapter->num_rx_queues; |
1317 | u32 txdctl, rxdctl; | 1343 | u32 txdctl, rxdctl; |
1318 | u32 msg[2]; | ||
1319 | 1344 | ||
1320 | for (i = 0; i < adapter->num_tx_queues; i++) { | 1345 | for (i = 0; i < adapter->num_tx_queues; i++) { |
1321 | j = adapter->tx_ring[i].reg_idx; | 1346 | j = adapter->tx_ring[i].reg_idx; |
@@ -1356,10 +1381,6 @@ static void ixgbevf_up_complete(struct ixgbevf_adapter *adapter) | |||
1356 | hw->mac.ops.set_rar(hw, 0, hw->mac.perm_addr, 0); | 1381 | hw->mac.ops.set_rar(hw, 0, hw->mac.perm_addr, 0); |
1357 | } | 1382 | } |
1358 | 1383 | ||
1359 | msg[0] = IXGBE_VF_SET_LPE; | ||
1360 | msg[1] = netdev->mtu + ETH_HLEN + ETH_FCS_LEN; | ||
1361 | hw->mbx.ops.write_posted(hw, msg, 2); | ||
1362 | |||
1363 | spin_unlock(&adapter->mbx_lock); | 1384 | spin_unlock(&adapter->mbx_lock); |
1364 | 1385 | ||
1365 | clear_bit(__IXGBEVF_DOWN, &adapter->state); | 1386 | clear_bit(__IXGBEVF_DOWN, &adapter->state); |
@@ -1867,6 +1888,22 @@ err_set_interrupt: | |||
1867 | } | 1888 | } |
1868 | 1889 | ||
1869 | /** | 1890 | /** |
1891 | * ixgbevf_clear_interrupt_scheme - Clear the current interrupt scheme settings | ||
1892 | * @adapter: board private structure to clear interrupt scheme on | ||
1893 | * | ||
1894 | * We go through and clear interrupt specific resources and reset the structure | ||
1895 | * to pre-load conditions | ||
1896 | **/ | ||
1897 | static void ixgbevf_clear_interrupt_scheme(struct ixgbevf_adapter *adapter) | ||
1898 | { | ||
1899 | adapter->num_tx_queues = 0; | ||
1900 | adapter->num_rx_queues = 0; | ||
1901 | |||
1902 | ixgbevf_free_q_vectors(adapter); | ||
1903 | ixgbevf_reset_interrupt_capability(adapter); | ||
1904 | } | ||
1905 | |||
1906 | /** | ||
1870 | * ixgbevf_sw_init - Initialize general software structures | 1907 | * ixgbevf_sw_init - Initialize general software structures |
1871 | * (struct ixgbevf_adapter) | 1908 | * (struct ixgbevf_adapter) |
1872 | * @adapter: board private structure to initialize | 1909 | * @adapter: board private structure to initialize |
@@ -2860,10 +2897,8 @@ static int ixgbevf_set_mac(struct net_device *netdev, void *p) | |||
2860 | static int ixgbevf_change_mtu(struct net_device *netdev, int new_mtu) | 2897 | static int ixgbevf_change_mtu(struct net_device *netdev, int new_mtu) |
2861 | { | 2898 | { |
2862 | struct ixgbevf_adapter *adapter = netdev_priv(netdev); | 2899 | struct ixgbevf_adapter *adapter = netdev_priv(netdev); |
2863 | struct ixgbe_hw *hw = &adapter->hw; | ||
2864 | int max_frame = new_mtu + ETH_HLEN + ETH_FCS_LEN; | 2900 | int max_frame = new_mtu + ETH_HLEN + ETH_FCS_LEN; |
2865 | int max_possible_frame = MAXIMUM_ETHERNET_VLAN_SIZE; | 2901 | int max_possible_frame = MAXIMUM_ETHERNET_VLAN_SIZE; |
2866 | u32 msg[2]; | ||
2867 | 2902 | ||
2868 | if (adapter->hw.mac.type == ixgbe_mac_X540_vf) | 2903 | if (adapter->hw.mac.type == ixgbe_mac_X540_vf) |
2869 | max_possible_frame = IXGBE_MAX_JUMBO_FRAME_SIZE; | 2904 | max_possible_frame = IXGBE_MAX_JUMBO_FRAME_SIZE; |
@@ -2877,35 +2912,91 @@ static int ixgbevf_change_mtu(struct net_device *netdev, int new_mtu) | |||
2877 | /* must set new MTU before calling down or up */ | 2912 | /* must set new MTU before calling down or up */ |
2878 | netdev->mtu = new_mtu; | 2913 | netdev->mtu = new_mtu; |
2879 | 2914 | ||
2880 | if (!netif_running(netdev)) { | ||
2881 | msg[0] = IXGBE_VF_SET_LPE; | ||
2882 | msg[1] = max_frame; | ||
2883 | hw->mbx.ops.write_posted(hw, msg, 2); | ||
2884 | } | ||
2885 | |||
2886 | if (netif_running(netdev)) | 2915 | if (netif_running(netdev)) |
2887 | ixgbevf_reinit_locked(adapter); | 2916 | ixgbevf_reinit_locked(adapter); |
2888 | 2917 | ||
2889 | return 0; | 2918 | return 0; |
2890 | } | 2919 | } |
2891 | 2920 | ||
2892 | static void ixgbevf_shutdown(struct pci_dev *pdev) | 2921 | static int ixgbevf_suspend(struct pci_dev *pdev, pm_message_t state) |
2893 | { | 2922 | { |
2894 | struct net_device *netdev = pci_get_drvdata(pdev); | 2923 | struct net_device *netdev = pci_get_drvdata(pdev); |
2895 | struct ixgbevf_adapter *adapter = netdev_priv(netdev); | 2924 | struct ixgbevf_adapter *adapter = netdev_priv(netdev); |
2925 | #ifdef CONFIG_PM | ||
2926 | int retval = 0; | ||
2927 | #endif | ||
2896 | 2928 | ||
2897 | netif_device_detach(netdev); | 2929 | netif_device_detach(netdev); |
2898 | 2930 | ||
2899 | if (netif_running(netdev)) { | 2931 | if (netif_running(netdev)) { |
2932 | rtnl_lock(); | ||
2900 | ixgbevf_down(adapter); | 2933 | ixgbevf_down(adapter); |
2901 | ixgbevf_free_irq(adapter); | 2934 | ixgbevf_free_irq(adapter); |
2902 | ixgbevf_free_all_tx_resources(adapter); | 2935 | ixgbevf_free_all_tx_resources(adapter); |
2903 | ixgbevf_free_all_rx_resources(adapter); | 2936 | ixgbevf_free_all_rx_resources(adapter); |
2937 | rtnl_unlock(); | ||
2904 | } | 2938 | } |
2905 | 2939 | ||
2906 | pci_save_state(pdev); | 2940 | ixgbevf_clear_interrupt_scheme(adapter); |
2941 | |||
2942 | #ifdef CONFIG_PM | ||
2943 | retval = pci_save_state(pdev); | ||
2944 | if (retval) | ||
2945 | return retval; | ||
2907 | 2946 | ||
2947 | #endif | ||
2908 | pci_disable_device(pdev); | 2948 | pci_disable_device(pdev); |
2949 | |||
2950 | return 0; | ||
2951 | } | ||
2952 | |||
2953 | #ifdef CONFIG_PM | ||
2954 | static int ixgbevf_resume(struct pci_dev *pdev) | ||
2955 | { | ||
2956 | struct ixgbevf_adapter *adapter = pci_get_drvdata(pdev); | ||
2957 | struct net_device *netdev = adapter->netdev; | ||
2958 | u32 err; | ||
2959 | |||
2960 | pci_set_power_state(pdev, PCI_D0); | ||
2961 | pci_restore_state(pdev); | ||
2962 | /* | ||
2963 | * pci_restore_state clears dev->state_saved so call | ||
2964 | * pci_save_state to restore it. | ||
2965 | */ | ||
2966 | pci_save_state(pdev); | ||
2967 | |||
2968 | err = pci_enable_device_mem(pdev); | ||
2969 | if (err) { | ||
2970 | dev_err(&pdev->dev, "Cannot enable PCI device from suspend\n"); | ||
2971 | return err; | ||
2972 | } | ||
2973 | pci_set_master(pdev); | ||
2974 | |||
2975 | rtnl_lock(); | ||
2976 | err = ixgbevf_init_interrupt_scheme(adapter); | ||
2977 | rtnl_unlock(); | ||
2978 | if (err) { | ||
2979 | dev_err(&pdev->dev, "Cannot initialize interrupts\n"); | ||
2980 | return err; | ||
2981 | } | ||
2982 | |||
2983 | ixgbevf_reset(adapter); | ||
2984 | |||
2985 | if (netif_running(netdev)) { | ||
2986 | err = ixgbevf_open(netdev); | ||
2987 | if (err) | ||
2988 | return err; | ||
2989 | } | ||
2990 | |||
2991 | netif_device_attach(netdev); | ||
2992 | |||
2993 | return err; | ||
2994 | } | ||
2995 | |||
2996 | #endif /* CONFIG_PM */ | ||
2997 | static void ixgbevf_shutdown(struct pci_dev *pdev) | ||
2998 | { | ||
2999 | ixgbevf_suspend(pdev, PMSG_SUSPEND); | ||
2909 | } | 3000 | } |
2910 | 3001 | ||
2911 | static struct rtnl_link_stats64 *ixgbevf_get_stats(struct net_device *netdev, | 3002 | static struct rtnl_link_stats64 *ixgbevf_get_stats(struct net_device *netdev, |
@@ -2946,7 +3037,7 @@ static struct rtnl_link_stats64 *ixgbevf_get_stats(struct net_device *netdev, | |||
2946 | return stats; | 3037 | return stats; |
2947 | } | 3038 | } |
2948 | 3039 | ||
2949 | static const struct net_device_ops ixgbe_netdev_ops = { | 3040 | static const struct net_device_ops ixgbevf_netdev_ops = { |
2950 | .ndo_open = ixgbevf_open, | 3041 | .ndo_open = ixgbevf_open, |
2951 | .ndo_stop = ixgbevf_close, | 3042 | .ndo_stop = ixgbevf_close, |
2952 | .ndo_start_xmit = ixgbevf_xmit_frame, | 3043 | .ndo_start_xmit = ixgbevf_xmit_frame, |
@@ -2962,7 +3053,7 @@ static const struct net_device_ops ixgbe_netdev_ops = { | |||
2962 | 3053 | ||
2963 | static void ixgbevf_assign_netdev_ops(struct net_device *dev) | 3054 | static void ixgbevf_assign_netdev_ops(struct net_device *dev) |
2964 | { | 3055 | { |
2965 | dev->netdev_ops = &ixgbe_netdev_ops; | 3056 | dev->netdev_ops = &ixgbevf_netdev_ops; |
2966 | ixgbevf_set_ethtool_ops(dev); | 3057 | ixgbevf_set_ethtool_ops(dev); |
2967 | dev->watchdog_timeo = 5 * HZ; | 3058 | dev->watchdog_timeo = 5 * HZ; |
2968 | } | 3059 | } |
@@ -3131,6 +3222,7 @@ static int __devinit ixgbevf_probe(struct pci_dev *pdev, | |||
3131 | return 0; | 3222 | return 0; |
3132 | 3223 | ||
3133 | err_register: | 3224 | err_register: |
3225 | ixgbevf_clear_interrupt_scheme(adapter); | ||
3134 | err_sw_init: | 3226 | err_sw_init: |
3135 | ixgbevf_reset_interrupt_capability(adapter); | 3227 | ixgbevf_reset_interrupt_capability(adapter); |
3136 | iounmap(hw->hw_addr); | 3228 | iounmap(hw->hw_addr); |
@@ -3168,6 +3260,7 @@ static void __devexit ixgbevf_remove(struct pci_dev *pdev) | |||
3168 | if (netdev->reg_state == NETREG_REGISTERED) | 3260 | if (netdev->reg_state == NETREG_REGISTERED) |
3169 | unregister_netdev(netdev); | 3261 | unregister_netdev(netdev); |
3170 | 3262 | ||
3263 | ixgbevf_clear_interrupt_scheme(adapter); | ||
3171 | ixgbevf_reset_interrupt_capability(adapter); | 3264 | ixgbevf_reset_interrupt_capability(adapter); |
3172 | 3265 | ||
3173 | iounmap(adapter->hw.hw_addr); | 3266 | iounmap(adapter->hw.hw_addr); |
@@ -3267,6 +3360,11 @@ static struct pci_driver ixgbevf_driver = { | |||
3267 | .id_table = ixgbevf_pci_tbl, | 3360 | .id_table = ixgbevf_pci_tbl, |
3268 | .probe = ixgbevf_probe, | 3361 | .probe = ixgbevf_probe, |
3269 | .remove = __devexit_p(ixgbevf_remove), | 3362 | .remove = __devexit_p(ixgbevf_remove), |
3363 | #ifdef CONFIG_PM | ||
3364 | /* Power Management Hooks */ | ||
3365 | .suspend = ixgbevf_suspend, | ||
3366 | .resume = ixgbevf_resume, | ||
3367 | #endif | ||
3270 | .shutdown = ixgbevf_shutdown, | 3368 | .shutdown = ixgbevf_shutdown, |
3271 | .err_handler = &ixgbevf_err_handler | 3369 | .err_handler = &ixgbevf_err_handler |
3272 | }; | 3370 | }; |
diff --git a/drivers/net/ethernet/intel/ixgbevf/vf.c b/drivers/net/ethernet/intel/ixgbevf/vf.c index ec89b86f7ca4..3d555a10f592 100644 --- a/drivers/net/ethernet/intel/ixgbevf/vf.c +++ b/drivers/net/ethernet/intel/ixgbevf/vf.c | |||
@@ -419,6 +419,20 @@ static s32 ixgbevf_check_mac_link_vf(struct ixgbe_hw *hw, | |||
419 | return 0; | 419 | return 0; |
420 | } | 420 | } |
421 | 421 | ||
422 | /** | ||
423 | * ixgbevf_rlpml_set_vf - Set the maximum receive packet length | ||
424 | * @hw: pointer to the HW structure | ||
425 | * @max_size: value to assign to max frame size | ||
426 | **/ | ||
427 | void ixgbevf_rlpml_set_vf(struct ixgbe_hw *hw, u16 max_size) | ||
428 | { | ||
429 | u32 msgbuf[2]; | ||
430 | |||
431 | msgbuf[0] = IXGBE_VF_SET_LPE; | ||
432 | msgbuf[1] = max_size; | ||
433 | ixgbevf_write_msg_read_ack(hw, msgbuf, 2); | ||
434 | } | ||
435 | |||
422 | static const struct ixgbe_mac_operations ixgbevf_mac_ops = { | 436 | static const struct ixgbe_mac_operations ixgbevf_mac_ops = { |
423 | .init_hw = ixgbevf_init_hw_vf, | 437 | .init_hw = ixgbevf_init_hw_vf, |
424 | .reset_hw = ixgbevf_reset_hw_vf, | 438 | .reset_hw = ixgbevf_reset_hw_vf, |
diff --git a/drivers/net/ethernet/intel/ixgbevf/vf.h b/drivers/net/ethernet/intel/ixgbevf/vf.h index 25c951daee5d..07fd87688e35 100644 --- a/drivers/net/ethernet/intel/ixgbevf/vf.h +++ b/drivers/net/ethernet/intel/ixgbevf/vf.h | |||
@@ -170,5 +170,6 @@ struct ixgbevf_info { | |||
170 | const struct ixgbe_mac_operations *mac_ops; | 170 | const struct ixgbe_mac_operations *mac_ops; |
171 | }; | 171 | }; |
172 | 172 | ||
173 | void ixgbevf_rlpml_set_vf(struct ixgbe_hw *hw, u16 max_size); | ||
173 | #endif /* __IXGBE_VF_H__ */ | 174 | #endif /* __IXGBE_VF_H__ */ |
174 | 175 | ||