diff options
author | David S. Miller <davem@davemloft.net> | 2010-04-07 02:53:30 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-04-07 02:53:30 -0400 |
commit | 4a35ecf8bf1c4b039503fa554100fe85c761de76 (patch) | |
tree | 9b75f5d5636004d9a9aa496924377379be09aa1f /drivers/net/ixgbe | |
parent | b4d562e3c3553ac58c7120555c4e4aefbb090a2a (diff) | |
parent | fb9e2d887243499b8d28efcf80821c4f6a092395 (diff) |
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
Conflicts:
drivers/net/bonding/bond_main.c
drivers/net/via-velocity.c
drivers/net/wireless/iwlwifi/iwl-agn.c
Diffstat (limited to 'drivers/net/ixgbe')
-rw-r--r-- | drivers/net/ixgbe/ixgbe.h | 7 | ||||
-rw-r--r-- | drivers/net/ixgbe/ixgbe_ethtool.c | 21 | ||||
-rw-r--r-- | drivers/net/ixgbe/ixgbe_fcoe.c | 33 | ||||
-rw-r--r-- | drivers/net/ixgbe/ixgbe_main.c | 43 | ||||
-rw-r--r-- | drivers/net/ixgbe/ixgbe_type.h | 1 |
5 files changed, 82 insertions, 23 deletions
diff --git a/drivers/net/ixgbe/ixgbe.h b/drivers/net/ixgbe/ixgbe.h index 19e94ee155a2..79c35ae3718c 100644 --- a/drivers/net/ixgbe/ixgbe.h +++ b/drivers/net/ixgbe/ixgbe.h | |||
@@ -204,14 +204,17 @@ enum ixgbe_ring_f_enum { | |||
204 | #define IXGBE_MAX_FDIR_INDICES 64 | 204 | #define IXGBE_MAX_FDIR_INDICES 64 |
205 | #ifdef IXGBE_FCOE | 205 | #ifdef IXGBE_FCOE |
206 | #define IXGBE_MAX_FCOE_INDICES 8 | 206 | #define IXGBE_MAX_FCOE_INDICES 8 |
207 | #define MAX_RX_QUEUES (IXGBE_MAX_FDIR_INDICES + IXGBE_MAX_FCOE_INDICES) | ||
208 | #define MAX_TX_QUEUES (IXGBE_MAX_FDIR_INDICES + IXGBE_MAX_FCOE_INDICES) | ||
209 | #else | ||
210 | #define MAX_RX_QUEUES IXGBE_MAX_FDIR_INDICES | ||
211 | #define MAX_TX_QUEUES IXGBE_MAX_FDIR_INDICES | ||
207 | #endif /* IXGBE_FCOE */ | 212 | #endif /* IXGBE_FCOE */ |
208 | struct ixgbe_ring_feature { | 213 | struct ixgbe_ring_feature { |
209 | int indices; | 214 | int indices; |
210 | int mask; | 215 | int mask; |
211 | } ____cacheline_internodealigned_in_smp; | 216 | } ____cacheline_internodealigned_in_smp; |
212 | 217 | ||
213 | #define MAX_RX_QUEUES 128 | ||
214 | #define MAX_TX_QUEUES 128 | ||
215 | 218 | ||
216 | #define MAX_RX_PACKET_BUFFERS ((adapter->flags & IXGBE_FLAG_DCB_ENABLED) \ | 219 | #define MAX_RX_PACKET_BUFFERS ((adapter->flags & IXGBE_FLAG_DCB_ENABLED) \ |
217 | ? 8 : 1) | 220 | ? 8 : 1) |
diff --git a/drivers/net/ixgbe/ixgbe_ethtool.c b/drivers/net/ixgbe/ixgbe_ethtool.c index 7949a446e4c7..1959ef76c962 100644 --- a/drivers/net/ixgbe/ixgbe_ethtool.c +++ b/drivers/net/ixgbe/ixgbe_ethtool.c | |||
@@ -1853,6 +1853,26 @@ static void ixgbe_diag_test(struct net_device *netdev, | |||
1853 | if (ixgbe_link_test(adapter, &data[4])) | 1853 | if (ixgbe_link_test(adapter, &data[4])) |
1854 | eth_test->flags |= ETH_TEST_FL_FAILED; | 1854 | eth_test->flags |= ETH_TEST_FL_FAILED; |
1855 | 1855 | ||
1856 | if (adapter->flags & IXGBE_FLAG_SRIOV_ENABLED) { | ||
1857 | int i; | ||
1858 | for (i = 0; i < adapter->num_vfs; i++) { | ||
1859 | if (adapter->vfinfo[i].clear_to_send) { | ||
1860 | netdev_warn(netdev, "%s", | ||
1861 | "offline diagnostic is not " | ||
1862 | "supported when VFs are " | ||
1863 | "present\n"); | ||
1864 | data[0] = 1; | ||
1865 | data[1] = 1; | ||
1866 | data[2] = 1; | ||
1867 | data[3] = 1; | ||
1868 | eth_test->flags |= ETH_TEST_FL_FAILED; | ||
1869 | clear_bit(__IXGBE_TESTING, | ||
1870 | &adapter->state); | ||
1871 | goto skip_ol_tests; | ||
1872 | } | ||
1873 | } | ||
1874 | } | ||
1875 | |||
1856 | if (if_running) | 1876 | if (if_running) |
1857 | /* indicate we're in test mode */ | 1877 | /* indicate we're in test mode */ |
1858 | dev_close(netdev); | 1878 | dev_close(netdev); |
@@ -1908,6 +1928,7 @@ skip_loopback: | |||
1908 | 1928 | ||
1909 | clear_bit(__IXGBE_TESTING, &adapter->state); | 1929 | clear_bit(__IXGBE_TESTING, &adapter->state); |
1910 | } | 1930 | } |
1931 | skip_ol_tests: | ||
1911 | msleep_interruptible(4 * 1000); | 1932 | msleep_interruptible(4 * 1000); |
1912 | } | 1933 | } |
1913 | 1934 | ||
diff --git a/drivers/net/ixgbe/ixgbe_fcoe.c b/drivers/net/ixgbe/ixgbe_fcoe.c index 700cfc0aa1b9..9276d5965b0d 100644 --- a/drivers/net/ixgbe/ixgbe_fcoe.c +++ b/drivers/net/ixgbe/ixgbe_fcoe.c | |||
@@ -202,6 +202,15 @@ int ixgbe_fcoe_ddp_get(struct net_device *netdev, u16 xid, | |||
202 | addr = sg_dma_address(sg); | 202 | addr = sg_dma_address(sg); |
203 | len = sg_dma_len(sg); | 203 | len = sg_dma_len(sg); |
204 | while (len) { | 204 | while (len) { |
205 | /* max number of buffers allowed in one DDP context */ | ||
206 | if (j >= IXGBE_BUFFCNT_MAX) { | ||
207 | netif_err(adapter, drv, adapter->netdev, | ||
208 | "xid=%x:%d,%d,%d:addr=%llx " | ||
209 | "not enough descriptors\n", | ||
210 | xid, i, j, dmacount, (u64)addr); | ||
211 | goto out_noddp_free; | ||
212 | } | ||
213 | |||
205 | /* get the offset of length of current buffer */ | 214 | /* get the offset of length of current buffer */ |
206 | thisoff = addr & ((dma_addr_t)bufflen - 1); | 215 | thisoff = addr & ((dma_addr_t)bufflen - 1); |
207 | thislen = min((bufflen - thisoff), len); | 216 | thislen = min((bufflen - thisoff), len); |
@@ -227,20 +236,13 @@ int ixgbe_fcoe_ddp_get(struct net_device *netdev, u16 xid, | |||
227 | len -= thislen; | 236 | len -= thislen; |
228 | addr += thislen; | 237 | addr += thislen; |
229 | j++; | 238 | j++; |
230 | /* max number of buffers allowed in one DDP context */ | ||
231 | if (j > IXGBE_BUFFCNT_MAX) { | ||
232 | DPRINTK(DRV, ERR, "xid=%x:%d,%d,%d:addr=%llx " | ||
233 | "not enough descriptors\n", | ||
234 | xid, i, j, dmacount, (u64)addr); | ||
235 | goto out_noddp_free; | ||
236 | } | ||
237 | } | 239 | } |
238 | } | 240 | } |
239 | /* only the last buffer may have non-full bufflen */ | 241 | /* only the last buffer may have non-full bufflen */ |
240 | lastsize = thisoff + thislen; | 242 | lastsize = thisoff + thislen; |
241 | 243 | ||
242 | fcbuff = (IXGBE_FCBUFF_4KB << IXGBE_FCBUFF_BUFFSIZE_SHIFT); | 244 | fcbuff = (IXGBE_FCBUFF_4KB << IXGBE_FCBUFF_BUFFSIZE_SHIFT); |
243 | fcbuff |= (j << IXGBE_FCBUFF_BUFFCNT_SHIFT); | 245 | fcbuff |= ((j & 0xff) << IXGBE_FCBUFF_BUFFCNT_SHIFT); |
244 | fcbuff |= (firstoff << IXGBE_FCBUFF_OFFSET_SHIFT); | 246 | fcbuff |= (firstoff << IXGBE_FCBUFF_OFFSET_SHIFT); |
245 | fcbuff |= (IXGBE_FCBUFF_VALID); | 247 | fcbuff |= (IXGBE_FCBUFF_VALID); |
246 | 248 | ||
@@ -520,6 +522,9 @@ void ixgbe_configure_fcoe(struct ixgbe_adapter *adapter) | |||
520 | /* Enable L2 eth type filter for FCoE */ | 522 | /* Enable L2 eth type filter for FCoE */ |
521 | IXGBE_WRITE_REG(hw, IXGBE_ETQF(IXGBE_ETQF_FILTER_FCOE), | 523 | IXGBE_WRITE_REG(hw, IXGBE_ETQF(IXGBE_ETQF_FILTER_FCOE), |
522 | (ETH_P_FCOE | IXGBE_ETQF_FCOE | IXGBE_ETQF_FILTER_EN)); | 524 | (ETH_P_FCOE | IXGBE_ETQF_FCOE | IXGBE_ETQF_FILTER_EN)); |
525 | /* Enable L2 eth type filter for FIP */ | ||
526 | IXGBE_WRITE_REG(hw, IXGBE_ETQF(IXGBE_ETQF_FILTER_FIP), | ||
527 | (ETH_P_FIP | IXGBE_ETQF_FILTER_EN)); | ||
523 | if (adapter->ring_feature[RING_F_FCOE].indices) { | 528 | if (adapter->ring_feature[RING_F_FCOE].indices) { |
524 | /* Use multiple rx queues for FCoE by redirection table */ | 529 | /* Use multiple rx queues for FCoE by redirection table */ |
525 | for (i = 0; i < IXGBE_FCRETA_SIZE; i++) { | 530 | for (i = 0; i < IXGBE_FCRETA_SIZE; i++) { |
@@ -530,6 +535,12 @@ void ixgbe_configure_fcoe(struct ixgbe_adapter *adapter) | |||
530 | } | 535 | } |
531 | IXGBE_WRITE_REG(hw, IXGBE_FCRECTL, IXGBE_FCRECTL_ENA); | 536 | IXGBE_WRITE_REG(hw, IXGBE_FCRECTL, IXGBE_FCRECTL_ENA); |
532 | IXGBE_WRITE_REG(hw, IXGBE_ETQS(IXGBE_ETQF_FILTER_FCOE), 0); | 537 | IXGBE_WRITE_REG(hw, IXGBE_ETQS(IXGBE_ETQF_FILTER_FCOE), 0); |
538 | fcoe_i = f->mask; | ||
539 | fcoe_i &= IXGBE_FCRETA_ENTRY_MASK; | ||
540 | fcoe_q = adapter->rx_ring[fcoe_i]->reg_idx; | ||
541 | IXGBE_WRITE_REG(hw, IXGBE_ETQS(IXGBE_ETQF_FILTER_FIP), | ||
542 | IXGBE_ETQS_QUEUE_EN | | ||
543 | (fcoe_q << IXGBE_ETQS_RX_QUEUE_SHIFT)); | ||
533 | } else { | 544 | } else { |
534 | /* Use single rx queue for FCoE */ | 545 | /* Use single rx queue for FCoE */ |
535 | fcoe_i = f->mask; | 546 | fcoe_i = f->mask; |
@@ -539,6 +550,12 @@ void ixgbe_configure_fcoe(struct ixgbe_adapter *adapter) | |||
539 | IXGBE_ETQS_QUEUE_EN | | 550 | IXGBE_ETQS_QUEUE_EN | |
540 | (fcoe_q << IXGBE_ETQS_RX_QUEUE_SHIFT)); | 551 | (fcoe_q << IXGBE_ETQS_RX_QUEUE_SHIFT)); |
541 | } | 552 | } |
553 | /* send FIP frames to the first FCoE queue */ | ||
554 | fcoe_i = f->mask; | ||
555 | fcoe_q = adapter->rx_ring[fcoe_i]->reg_idx; | ||
556 | IXGBE_WRITE_REG(hw, IXGBE_ETQS(IXGBE_ETQF_FILTER_FIP), | ||
557 | IXGBE_ETQS_QUEUE_EN | | ||
558 | (fcoe_q << IXGBE_ETQS_RX_QUEUE_SHIFT)); | ||
542 | 559 | ||
543 | IXGBE_WRITE_REG(hw, IXGBE_FCRXCTRL, | 560 | IXGBE_WRITE_REG(hw, IXGBE_FCRXCTRL, |
544 | IXGBE_FCRXCTRL_FCOELLI | | 561 | IXGBE_FCRXCTRL_FCOELLI | |
diff --git a/drivers/net/ixgbe/ixgbe_main.c b/drivers/net/ixgbe/ixgbe_main.c index 6effa2ca157d..7216db218442 100644 --- a/drivers/net/ixgbe/ixgbe_main.c +++ b/drivers/net/ixgbe/ixgbe_main.c | |||
@@ -3036,6 +3036,14 @@ void ixgbe_reinit_locked(struct ixgbe_adapter *adapter) | |||
3036 | while (test_and_set_bit(__IXGBE_RESETTING, &adapter->state)) | 3036 | while (test_and_set_bit(__IXGBE_RESETTING, &adapter->state)) |
3037 | msleep(1); | 3037 | msleep(1); |
3038 | ixgbe_down(adapter); | 3038 | ixgbe_down(adapter); |
3039 | /* | ||
3040 | * If SR-IOV enabled then wait a bit before bringing the adapter | ||
3041 | * back up to give the VFs time to respond to the reset. The | ||
3042 | * two second wait is based upon the watchdog timer cycle in | ||
3043 | * the VF driver. | ||
3044 | */ | ||
3045 | if (adapter->flags & IXGBE_FLAG_SRIOV_ENABLED) | ||
3046 | msleep(2000); | ||
3039 | ixgbe_up(adapter); | 3047 | ixgbe_up(adapter); |
3040 | clear_bit(__IXGBE_RESETTING, &adapter->state); | 3048 | clear_bit(__IXGBE_RESETTING, &adapter->state); |
3041 | } | 3049 | } |
@@ -3216,13 +3224,15 @@ void ixgbe_down(struct ixgbe_adapter *adapter) | |||
3216 | 3224 | ||
3217 | /* disable receive for all VFs and wait one second */ | 3225 | /* disable receive for all VFs and wait one second */ |
3218 | if (adapter->num_vfs) { | 3226 | if (adapter->num_vfs) { |
3219 | for (i = 0 ; i < adapter->num_vfs; i++) | ||
3220 | adapter->vfinfo[i].clear_to_send = 0; | ||
3221 | |||
3222 | /* ping all the active vfs to let them know we are going down */ | 3227 | /* ping all the active vfs to let them know we are going down */ |
3223 | ixgbe_ping_all_vfs(adapter); | 3228 | ixgbe_ping_all_vfs(adapter); |
3229 | |||
3224 | /* Disable all VFTE/VFRE TX/RX */ | 3230 | /* Disable all VFTE/VFRE TX/RX */ |
3225 | ixgbe_disable_tx_rx(adapter); | 3231 | ixgbe_disable_tx_rx(adapter); |
3232 | |||
3233 | /* Mark all the VFs as inactive */ | ||
3234 | for (i = 0 ; i < adapter->num_vfs; i++) | ||
3235 | adapter->vfinfo[i].clear_to_send = 0; | ||
3226 | } | 3236 | } |
3227 | 3237 | ||
3228 | /* disable receives */ | 3238 | /* disable receives */ |
@@ -5618,7 +5628,8 @@ static u16 ixgbe_select_queue(struct net_device *dev, struct sk_buff *skb) | |||
5618 | 5628 | ||
5619 | #ifdef IXGBE_FCOE | 5629 | #ifdef IXGBE_FCOE |
5620 | if ((adapter->flags & IXGBE_FLAG_FCOE_ENABLED) && | 5630 | if ((adapter->flags & IXGBE_FLAG_FCOE_ENABLED) && |
5621 | (skb->protocol == htons(ETH_P_FCOE))) { | 5631 | ((skb->protocol == htons(ETH_P_FCOE)) || |
5632 | (skb->protocol == htons(ETH_P_FIP)))) { | ||
5622 | txq &= (adapter->ring_feature[RING_F_FCOE].indices - 1); | 5633 | txq &= (adapter->ring_feature[RING_F_FCOE].indices - 1); |
5623 | txq += adapter->ring_feature[RING_F_FCOE].mask; | 5634 | txq += adapter->ring_feature[RING_F_FCOE].mask; |
5624 | return txq; | 5635 | return txq; |
@@ -5665,18 +5676,25 @@ static netdev_tx_t ixgbe_xmit_frame(struct sk_buff *skb, | |||
5665 | 5676 | ||
5666 | tx_ring = adapter->tx_ring[skb->queue_mapping]; | 5677 | tx_ring = adapter->tx_ring[skb->queue_mapping]; |
5667 | 5678 | ||
5668 | if ((adapter->flags & IXGBE_FLAG_FCOE_ENABLED) && | ||
5669 | (skb->protocol == htons(ETH_P_FCOE))) { | ||
5670 | tx_flags |= IXGBE_TX_FLAGS_FCOE; | ||
5671 | #ifdef IXGBE_FCOE | 5679 | #ifdef IXGBE_FCOE |
5680 | if (adapter->flags & IXGBE_FLAG_FCOE_ENABLED) { | ||
5672 | #ifdef CONFIG_IXGBE_DCB | 5681 | #ifdef CONFIG_IXGBE_DCB |
5673 | tx_flags &= ~(IXGBE_TX_FLAGS_VLAN_PRIO_MASK | 5682 | /* for FCoE with DCB, we force the priority to what |
5674 | << IXGBE_TX_FLAGS_VLAN_SHIFT); | 5683 | * was specified by the switch */ |
5675 | tx_flags |= ((adapter->fcoe.up << 13) | 5684 | if ((skb->protocol == htons(ETH_P_FCOE)) || |
5676 | << IXGBE_TX_FLAGS_VLAN_SHIFT); | 5685 | (skb->protocol == htons(ETH_P_FIP))) { |
5677 | #endif | 5686 | tx_flags &= ~(IXGBE_TX_FLAGS_VLAN_PRIO_MASK |
5687 | << IXGBE_TX_FLAGS_VLAN_SHIFT); | ||
5688 | tx_flags |= ((adapter->fcoe.up << 13) | ||
5689 | << IXGBE_TX_FLAGS_VLAN_SHIFT); | ||
5690 | } | ||
5678 | #endif | 5691 | #endif |
5692 | /* flag for FCoE offloads */ | ||
5693 | if (skb->protocol == htons(ETH_P_FCOE)) | ||
5694 | tx_flags |= IXGBE_TX_FLAGS_FCOE; | ||
5679 | } | 5695 | } |
5696 | #endif | ||
5697 | |||
5680 | /* four things can cause us to need a context descriptor */ | 5698 | /* four things can cause us to need a context descriptor */ |
5681 | if (skb_is_gso(skb) || | 5699 | if (skb_is_gso(skb) || |
5682 | (skb->ip_summed == CHECKSUM_PARTIAL) || | 5700 | (skb->ip_summed == CHECKSUM_PARTIAL) || |
@@ -6031,7 +6049,6 @@ static int __devinit ixgbe_probe(struct pci_dev *pdev, | |||
6031 | indices += min_t(unsigned int, num_possible_cpus(), | 6049 | indices += min_t(unsigned int, num_possible_cpus(), |
6032 | IXGBE_MAX_FCOE_INDICES); | 6050 | IXGBE_MAX_FCOE_INDICES); |
6033 | #endif | 6051 | #endif |
6034 | indices = min_t(unsigned int, indices, MAX_TX_QUEUES); | ||
6035 | netdev = alloc_etherdev_mq(sizeof(struct ixgbe_adapter), indices); | 6052 | netdev = alloc_etherdev_mq(sizeof(struct ixgbe_adapter), indices); |
6036 | if (!netdev) { | 6053 | if (!netdev) { |
6037 | err = -ENOMEM; | 6054 | err = -ENOMEM; |
diff --git a/drivers/net/ixgbe/ixgbe_type.h b/drivers/net/ixgbe/ixgbe_type.h index c574d0a68f2a..aed4ed665648 100644 --- a/drivers/net/ixgbe/ixgbe_type.h +++ b/drivers/net/ixgbe/ixgbe_type.h | |||
@@ -1298,6 +1298,7 @@ | |||
1298 | #define IXGBE_ETQF_FILTER_BCN 1 | 1298 | #define IXGBE_ETQF_FILTER_BCN 1 |
1299 | #define IXGBE_ETQF_FILTER_FCOE 2 | 1299 | #define IXGBE_ETQF_FILTER_FCOE 2 |
1300 | #define IXGBE_ETQF_FILTER_1588 3 | 1300 | #define IXGBE_ETQF_FILTER_1588 3 |
1301 | #define IXGBE_ETQF_FILTER_FIP 4 | ||
1301 | /* VLAN Control Bit Masks */ | 1302 | /* VLAN Control Bit Masks */ |
1302 | #define IXGBE_VLNCTRL_VET 0x0000FFFF /* bits 0-15 */ | 1303 | #define IXGBE_VLNCTRL_VET 0x0000FFFF /* bits 0-15 */ |
1303 | #define IXGBE_VLNCTRL_CFI 0x10000000 /* bit 28 */ | 1304 | #define IXGBE_VLNCTRL_CFI 0x10000000 /* bit 28 */ |