ixgbe: cleanup ixgbe_get_drvinfo to be extra careful with buffer boundaries
Subsystems (2)
PATCH 1/20 ixgbe: cleanup ixgbe_get_drvinfo to be extra careful with buffer boundaries
From: Don Skidmore <[email protected]>
Make the code in ixgbe_get_drvinfo more protected against buffer overflow boundaries by using snprintf and sizeof with snprintf.
---
drivers/net/ixgbe/ixgbe_ethtool.c | 23 +++++++++++++---------- 1 files changed, 13 insertions(+), 10 deletions(-)
drivers/net/ixgbe/ixgbe_ethtool.c +13 -10
@@ -820,16 +820,19 @@ static void ixgbe_get_drvinfo(struct net_device *netdev,struct ixgbe_adapter *adapter =netdev_priv (netdev);char firmware_version[32 ]; -strncpy (drvinfo->driver, ixgbe_driver_name,32 ); -strncpy (drvinfo->version, ixgbe_driver_version,32 ); - -sprintf (firmware_version,"%d.%d-%d" , - (adapter->eeprom_version &0xF000 ) >>12 , - (adapter->eeprom_version &0x0FF0 ) >>4 , - adapter->eeprom_version &0x000F ); - -strncpy (drvinfo->fw_version, firmware_version,32 ); -strncpy (drvinfo->bus_info,pci_name (adapter->pdev),32 ); +strncpy (drvinfo->driver, ixgbe_driver_name,sizeof (drvinfo->driver)); +strncpy (drvinfo->version, ixgbe_driver_version, +sizeof (drvinfo->version)); + +snprintf (firmware_version,sizeof (firmware_version),"%d.%d-%d" , + (adapter->eeprom_version &0xF000 ) >>12 , + (adapter->eeprom_version &0x0FF0 ) >>4 , + adapter->eeprom_version &0x000F ); + +strncpy (drvinfo->fw_version, firmware_version, +sizeof (drvinfo->fw_version)); +strncpy (drvinfo->bus_info,pci_name (adapter->pdev), +sizeof (drvinfo->bus_info)); drvinfo->n_stats =IXGBE_STATS_LEN ; drvinfo->testinfo_len =IXGBE_TEST_LEN ; drvinfo->regdump_len =ixgbe_get_regs_len (netdev);
PATCH 2/20 ixgbe: remove redundant DMA alignment code
From: Alexander Duyck <[email protected]>
This patch removes the redundant DMA alignment code from the Rx buffer allocation path. This code is no longer necessary since all x86 buffers are now DMA aligned due to recent changes to NET_IP_ALIGN and NET_SKB_PAD.
It also moves the setting of the Rx queue value into the allocation path since it is more likely that the queue mapping will still be in the cache at the time of allocation.
---
drivers/net/ixgbe/ixgbe_main.c | 24 ++++++++++++------------ 1 files changed, 12 insertions(+), 12 deletions(-)
drivers/net/ixgbe/ixgbe_main.c +12 -12
@@ -955,7 +955,6 @@ static void ixgbe_receive_skb(struct ixgbe_q_vector *q_vector,bool is_vlan = (status &IXGBE_RXD_STAT_VP );u16 tag =le16_to_cpu (rx_desc->wb.upper.vlan); -skb_record_rx_queue (skb, ring->queue_index);if (!(adapter->flags &IXGBE_FLAG_IN_NETPOLL )) {if (adapter->vlgrp && is_vlan && (tag &VLAN_VID_MASK ))vlan_gro_receive (napi, adapter->vlgrp, tag, skb);
@@ -1037,10 +1036,12 @@ static void ixgbe_alloc_rx_buffers(struct ixgbe_adapter *adapter, struct ixgbe_ring *rx_ring, int cleaned_count) { +struct net_device *netdev = adapter->netdev;struct pci_dev *pdev = adapter->pdev;union ixgbe_adv_rx_desc *rx_desc;struct ixgbe_rx_buffer *bi;unsigned int i; +unsigned int bufsz = rx_ring->rx_buf_len; i = rx_ring->next_to_use; bi = &rx_ring->rx_buffer_info[i];
@@ -1051,7 +1052,7 @@ static void ixgbe_alloc_rx_buffers(struct ixgbe_adapter *adapter,if (!bi->page_dma && (rx_ring->flags &IXGBE_RING_RX_PS_ENABLED )) {if (!bi->page) { - bi->page =alloc_page (GFP_ATOMIC ); + bi->page =netdev_alloc_page (netdev);if (!bi->page) { adapter->alloc_rx_page_failed++; goto no_buffers;
@@ -1069,22 +1070,21 @@ static void ixgbe_alloc_rx_buffers(struct ixgbe_adapter *adapter, }if (!bi->skb) { -struct sk_buff *skb; -/* netdev_alloc_skb reserves 32 bytes up front!! */ -uint bufsz = rx_ring->rx_buf_len +SMP_CACHE_BYTES ; - skb =netdev_alloc_skb (adapter->netdev, bufsz); +struct sk_buff *skb =netdev_alloc_skb_ip_align (netdev, + bufsz); + bi->skb = skb;if (!skb) { adapter->alloc_rx_buff_failed++; goto no_buffers; } +/* initialize queue mapping */ +skb_record_rx_queue (skb, rx_ring->queue_index); + } -/* advance the data pointer to the next cache line */ -skb_reserve (skb, (PTR_ALIGN (skb->data,SMP_CACHE_BYTES ) - - skb->data)); - - bi->skb = skb; - bi->dma =dma_map_single (&pdev->dev, skb->data, +if (!bi->dma) { + bi->dma =dma_map_single (&pdev->dev, + bi->skb->data, rx_ring->rx_buf_len,DMA_FROM_DEVICE ); }
Re: [net-next-2.6 PATCH 02/20] ixgbe: remove redundant DMA alignment code
From: Jeff Kirsher <[email protected]>
Date: Thu, 19 Aug 2010 16:33:41 -0700
Quoted 11 lines
From: Alexander Duyck <[email protected]>
This patch removes the redundant DMA alignment code from the Rx buffer allocation path. This code is no longer necessary since all x86 buffers are now DMA aligned due to recent changes to
NET_IP_ALIGNandNET_SKB_PAD.It also moves the setting of the Rx queue value into the allocation path since it is more likely that the queue mapping will still be in the cache at the time of allocation.
Signed-off-by Alexander Duyck <[email protected]>Signed-off-by Jeff Kirsher <[email protected]>
Applied.
PATCH 3/20 ixgbe: move setting of GSO size for 82598 into ixgbe_configure_dcb
In reply to Jeff KirsherFrom: Alexander Duyck <[email protected]>
We are unnecessarily modifying the GSO size for all HW when we don't need to. The code can be simplified by moving the check for DCB and the adjustment of the GSO size for 82598 into ixgbe_configure_dcb.
---
drivers/net/ixgbe/ixgbe_main.c | 21 ++++++++++----------- 1 files changed, 10 insertions(+), 11 deletions(-)
drivers/net/ixgbe/ixgbe_main.c +10 -11
@@ -3157,6 +3157,15 @@ static void ixgbe_configure_dcb(struct ixgbe_adapter *adapter)u32 txdctl;int i, j; +if (!(adapter->flags &IXGBE_FLAG_DCB_ENABLED )) { +if (hw->mac.type == ixgbe_mac_82598EB) +netif_set_gso_max_size (adapter->netdev,65536 ); +return ; + } + +if (hw->mac.type == ixgbe_mac_82598EB) +netif_set_gso_max_size (adapter->netdev,32768 ); +ixgbe_dcb_check_config (&adapter->dcb_cfg);ixgbe_dcb_calculate_tc_credits (&adapter->dcb_cfg,DCB_TX_CONFIG );ixgbe_dcb_calculate_tc_credits (&adapter->dcb_cfg,DCB_RX_CONFIG );
@@ -3188,17 +3197,7 @@ static void ixgbe_configure(struct ixgbe_adapter *adapter)ixgbe_restore_vlan (adapter);#ifdef CONFIG_IXGBE_DCB -if (adapter->flags &IXGBE_FLAG_DCB_ENABLED ) { -if (hw->mac.type == ixgbe_mac_82598EB) -netif_set_gso_max_size (netdev,32768 ); -else -netif_set_gso_max_size (netdev,65536 ); -ixgbe_configure_dcb (adapter); - }else { -netif_set_gso_max_size (netdev,65536 ); - } -#else -netif_set_gso_max_size (netdev,65536 ); +ixgbe_configure_dcb (adapter);#endif #ifdef IXGBE_FCOE
Re: [net-next-2.6 PATCH 03/20] ixgbe: move setting of GSO size for 82598 into ixgbe_configure_dcb
From: Jeff Kirsher <[email protected]>
Date: Thu, 19 Aug 2010 16:34:04 -0700
Quoted 8 lines
From: Alexander Duyck <[email protected]>
We are unnecessarily modifying the GSO size for all HW when we don't need to. The code can be simplified by moving the check for DCB and the adjustment of the GSO size for 82598 into
ixgbe_configure_dcb.Signed-off-by Alexander Duyck <[email protected]>Signed-off-by Jeff Kirsher <[email protected]>
Applied.
PATCH 4/20 ixgbe: combine two modifications of TXDCTL into one
In reply to Jeff KirsherFrom: Alexander Duyck <[email protected]>
In ixgbe_up_complete we were doing a read-modify-write of TXDCTL followed by another one just a few lines further down. Instead of performing two separate read-modify-writes it would make more sense to combine the two into one.
---
drivers/net/ixgbe/ixgbe_main.c | 18 ++++++------------ 1 files changed, 6 insertions(+), 12 deletions(-)
drivers/net/ixgbe/ixgbe_main.c +6 -12
@@ -3411,6 +3411,12 @@ static int ixgbe_up_complete(struct ixgbe_adapter *adapter)IXGBE_WRITE_REG (hw,IXGBE_MHADD , mhadd); } +if (hw->mac.type == ixgbe_mac_82599EB) { +/* DMATXCTL.EN must be set after all Tx queue config is done */ + dmatxctl =IXGBE_READ_REG (hw,IXGBE_DMATXCTL ); + dmatxctl |=IXGBE_DMATXCTL_TE ; +IXGBE_WRITE_REG (hw,IXGBE_DMATXCTL , dmatxctl); + }for (i =0 ; i < adapter->num_tx_queues; i++) { j = adapter->tx_ring[i]->reg_idx; txdctl =IXGBE_READ_REG (hw,IXGBE_TXDCTL (j));
@@ -3421,18 +3427,6 @@ static int ixgbe_up_complete(struct ixgbe_adapter *adapter)/* enable WTHRESH=8 descriptors, to encourage burst writeback */ txdctl |= (8 <<16 ); } -IXGBE_WRITE_REG (hw,IXGBE_TXDCTL (j), txdctl); - } - -if (hw->mac.type == ixgbe_mac_82599EB) { -/* DMATXCTL.EN must be set after all Tx queue config is done */ - dmatxctl =IXGBE_READ_REG (hw,IXGBE_DMATXCTL ); - dmatxctl |=IXGBE_DMATXCTL_TE ; -IXGBE_WRITE_REG (hw,IXGBE_DMATXCTL , dmatxctl); - } -for (i =0 ; i < adapter->num_tx_queues; i++) { - j = adapter->tx_ring[i]->reg_idx; - txdctl =IXGBE_READ_REG (hw,IXGBE_TXDCTL (j)); txdctl |=IXGBE_TXDCTL_ENABLE ;IXGBE_WRITE_REG (hw,IXGBE_TXDCTL (j), txdctl);if (hw->mac.type == ixgbe_mac_82599EB) {
Re: [net-next-2.6 PATCH 04/20] ixgbe: combine two modifications of TXDCTL into one
From: Jeff Kirsher <[email protected]>
Date: Thu, 19 Aug 2010 16:34:27 -0700
Quoted 9 lines
From: Alexander Duyck <[email protected]>
In
ixgbe_up_completewe were doing a read-modify-write of TXDCTL followed by another one just a few lines further down. Instead of performing two separate read-modify-writes it would make more sense to combine the two into one.Signed-off-by Alexander Duyck <[email protected]>Signed-off-by Jeff Kirsher <[email protected]>
Applied.
PATCH 5/20 ixgbe: move configuration of the MTQC register into it's own function
In reply to Jeff KirsherFrom: Alexander Duyck <[email protected]>
This patch moves the configuration of the MTQC register into it's own function call similar to ixgbe_setup_mrqc.
---
drivers/net/ixgbe/ixgbe_main.c | 73 ++++++++++++++++++++++------------------ 1 files changed, 40 insertions(+), 33 deletions(-)
drivers/net/ixgbe/ixgbe_main.c +40 -33
@@ -2424,6 +2424,45 @@ static void ixgbe_configure_msi_and_legacy(struct ixgbe_adapter *adapter)e_info (hw,"Legacy interrupt IVAR setup done\n" ); } +static void ixgbe_setup_mtqc (struct ixgbe_adapter *adapter) +{ +struct ixgbe_hw *hw = &adapter->hw; +u32 rttdcs; +u32 mask; + +if (hw->mac.type == ixgbe_mac_82598EB) +return ; + +/* disable the arbiter while setting MTQC */ + rttdcs =IXGBE_READ_REG (hw,IXGBE_RTTDCS ); + rttdcs |=IXGBE_RTTDCS_ARBDIS ; +IXGBE_WRITE_REG (hw,IXGBE_RTTDCS , rttdcs); + +/* set transmit pool layout */ + mask = (IXGBE_FLAG_SRIOV_ENABLED |IXGBE_FLAG_DCB_ENABLED ); +switch (adapter->flags & mask) { + +case (IXGBE_FLAG_SRIOV_ENABLED ): +IXGBE_WRITE_REG (hw,IXGBE_MTQC , + (IXGBE_MTQC_VT_ENA |IXGBE_MTQC_64VF )); +break ; + +case (IXGBE_FLAG_DCB_ENABLED ): +/* We enable 8 traffic classes, DCB only */ +IXGBE_WRITE_REG (hw,IXGBE_MTQC , + (IXGBE_MTQC_RT_ENA |IXGBE_MTQC_8TC_8TQ )); +break ; + +default : +IXGBE_WRITE_REG (hw,IXGBE_MTQC ,IXGBE_MTQC_64Q_1PB ); +break ; + } + +/* re-enable the arbiter */ + rttdcs &= ~IXGBE_RTTDCS_ARBDIS ; +IXGBE_WRITE_REG (hw,IXGBE_RTTDCS , rttdcs); +} +/** * ixgbe_configure_tx - Configure 8259x Transmit Unit after Reset * @adapter: board private structure
@@ -2475,39 +2514,7 @@ static void ixgbe_configure_tx(struct ixgbe_adapter *adapter) } } -if (hw->mac.type == ixgbe_mac_82599EB) { -u32 rttdcs; -u32 mask; - -/* disable the arbiter while setting MTQC */ - rttdcs =IXGBE_READ_REG (hw,IXGBE_RTTDCS ); - rttdcs |=IXGBE_RTTDCS_ARBDIS ; -IXGBE_WRITE_REG (hw,IXGBE_RTTDCS , rttdcs); - -/* set transmit pool layout */ - mask = (IXGBE_FLAG_SRIOV_ENABLED |IXGBE_FLAG_DCB_ENABLED ); -switch (adapter->flags & mask) { - -case (IXGBE_FLAG_SRIOV_ENABLED ): -IXGBE_WRITE_REG (hw,IXGBE_MTQC , - (IXGBE_MTQC_VT_ENA |IXGBE_MTQC_64VF )); -break ; - -case (IXGBE_FLAG_DCB_ENABLED ): -/* We enable 8 traffic classes, DCB only */ -IXGBE_WRITE_REG (hw,IXGBE_MTQC , - (IXGBE_MTQC_RT_ENA |IXGBE_MTQC_8TC_8TQ )); -break ; - -default : -IXGBE_WRITE_REG (hw,IXGBE_MTQC ,IXGBE_MTQC_64Q_1PB ); -break ; - } - -/* re-eable the arbiter */ - rttdcs &= ~IXGBE_RTTDCS_ARBDIS ; -IXGBE_WRITE_REG (hw,IXGBE_RTTDCS , rttdcs); - } +ixgbe_setup_mtqc (adapter); }#define IXGBE_SRRCTL_BSIZEHDRSIZE_SHIFT 2
Re: [net-next-2.6 PATCH 05/20] ixgbe: move configuration of the MTQC register into it's own function
From: Jeff Kirsher <[email protected]>
Date: Thu, 19 Aug 2010 16:34:50 -0700
Quoted 7 lines
From: Alexander Duyck <[email protected]>
This patch moves the configuration of the MTQC register into it's own function call similar to
ixgbe_setup_mrqc.Signed-off-by Alexander Duyck <[email protected]>Signed-off-by Jeff Kirsher <[email protected]>
Applied.
PATCH 6/20 ixgbe: move Tx ring configuration into a separate function
In reply to Jeff KirsherFrom: Alexander Duyck <[email protected]>
This patch moves the Tx ring configuration into a separate function. In addition the function drops the setting of the head writeback RO bit since head writeback is no longer used within ixgbe.
---
drivers/net/ixgbe/ixgbe_main.c | 69 +++++++++++++++++----------------------- 1 files changed, 29 insertions(+), 40 deletions(-)
drivers/net/ixgbe/ixgbe_main.c +29 -40
@@ -2424,6 +2424,32 @@ static void ixgbe_configure_msi_and_legacy(struct ixgbe_adapter *adapter)e_info (hw,"Legacy interrupt IVAR setup done\n" ); } +/** +* ixgbe_configure_tx_ring - Configure 8259x Tx ring after Reset +* @adapter: board private structure +* @ring: structure containing ring specific data +* +* Configure the Tx descriptor ring after a reset. +**/ +static void ixgbe_configure_tx_ring (struct ixgbe_adapter *adapter, +struct ixgbe_ring *ring) +{ +struct ixgbe_hw *hw = &adapter->hw; +u64 tdba = ring->dma; +u16 reg_idx = ring->reg_idx; + +IXGBE_WRITE_REG (hw,IXGBE_TDBAL (reg_idx), + (tdba &DMA_BIT_MASK (32 ))); +IXGBE_WRITE_REG (hw,IXGBE_TDBAH (reg_idx), (tdba >>32 )); +IXGBE_WRITE_REG (hw,IXGBE_TDLEN (reg_idx), + ring->count *sizeof (union ixgbe_adv_tx_desc )); +IXGBE_WRITE_REG (hw,IXGBE_TDH (reg_idx),0 ); +IXGBE_WRITE_REG (hw,IXGBE_TDT (reg_idx),0 ); + ring->head =IXGBE_TDH (reg_idx); + ring->tail =IXGBE_TDT (reg_idx); + +} +static void ixgbe_setup_mtqc (struct ixgbe_adapter *adapter) {struct ixgbe_hw *hw = &adapter->hw;
@@ -2471,48 +2497,11 @@ static void ixgbe_setup_mtqc(struct ixgbe_adapter *adapter)**/ static void ixgbe_configure_tx (struct ixgbe_adapter *adapter) { -u64 tdba; -struct ixgbe_hw *hw = &adapter->hw; -u32 i, j, tdlen, txctrl; +u32 i;/* Setup the HW Tx Head and Tail descriptor pointers */ -for (i =0 ; i < adapter->num_tx_queues; i++) { -struct ixgbe_ring *ring = adapter->tx_ring[i]; - j = ring->reg_idx; - tdba = ring->dma; - tdlen = ring->count *sizeof (union ixgbe_adv_tx_desc ); -IXGBE_WRITE_REG (hw,IXGBE_TDBAL (j), - (tdba &DMA_BIT_MASK (32 ))); -IXGBE_WRITE_REG (hw,IXGBE_TDBAH (j), (tdba >>32 )); -IXGBE_WRITE_REG (hw,IXGBE_TDLEN (j), tdlen); -IXGBE_WRITE_REG (hw,IXGBE_TDH (j),0 ); -IXGBE_WRITE_REG (hw,IXGBE_TDT (j),0 ); - adapter->tx_ring[i]->head =IXGBE_TDH (j); - adapter->tx_ring[i]->tail =IXGBE_TDT (j); -/* -* Disable Tx Head Writeback RO bit, since this hoses -* bookkeeping if things aren't delivered in order. -*/ -switch (hw->mac.type) { -case ixgbe_mac_82598EB: - txctrl =IXGBE_READ_REG (hw,IXGBE_DCA_TXCTRL (j)); -break ; -case ixgbe_mac_82599EB: -default : - txctrl =IXGBE_READ_REG (hw,IXGBE_DCA_TXCTRL_82599 (j)); -break ; - } - txctrl &= ~IXGBE_DCA_TXCTRL_TX_WB_RO_EN ; -switch (hw->mac.type) { -case ixgbe_mac_82598EB: -IXGBE_WRITE_REG (hw,IXGBE_DCA_TXCTRL (j), txctrl); -break ; -case ixgbe_mac_82599EB: -default : -IXGBE_WRITE_REG (hw,IXGBE_DCA_TXCTRL_82599 (j), txctrl); -break ; - } - } +for (i =0 ; i < adapter->num_tx_queues; i++) +ixgbe_configure_tx_ring (adapter, adapter->tx_ring[i]);ixgbe_setup_mtqc (adapter); }
Re: [net-next-2.6 PATCH 06/20] ixgbe: move Tx ring configuration into a separate function
From: Jeff Kirsher <[email protected]>
Date: Thu, 19 Aug 2010 16:35:12 -0700
Quoted 8 lines
From: Alexander Duyck <[email protected]>
This patch moves the Tx ring configuration into a separate function. In addition the function drops the setting of the head writeback RO bit since head writeback is no longer used within ixgbe.
Signed-off-by Alexander Duyck <[email protected]>Signed-off-by Jeff Kirsher <[email protected]>
Applied.
PATCH 7/20 ixgbe: consolidate all setting of MRQC into one function
In reply to Jeff KirsherFrom: Alexander Duyck <[email protected]>
This change simplifies the configuration of MRQC by consolidating the setting of it into one function. As such the register is no longer set in multiple places which should make any future changes easier to work with. In addition we can combine RSS related register writes into the call since enabling all of those bits without enabling RSS itself in MRQC should have no effect.
---
drivers/net/ixgbe/ixgbe_main.c | 100 +++++++++++++++++----------------------- 1 files changed, 43 insertions(+), 57 deletions(-)
drivers/net/ixgbe/ixgbe_main.c +43 -57
@@ -2545,20 +2545,46 @@ static void ixgbe_configure_srrctl(struct ixgbe_adapter *adapter,IXGBE_WRITE_REG (&adapter->hw,IXGBE_SRRCTL (index), srrctl); } -static u32 ixgbe_setup_mrqc (struct ixgbe_adapter *adapter) +static void ixgbe_setup_mrqc (struct ixgbe_adapter *adapter) { -u32 mrqc =0 ; +struct ixgbe_hw *hw = &adapter->hw; +static const u32 seed[10 ] = {0xE291D73D ,0x1805EC6C ,0x2A94B30D , +0xA54F2BEC ,0xEA49AF7C ,0xE214AD3D ,0xB855AABE , +0x6A3E67EA ,0x14364D17 ,0x3BED200D }; +u32 mrqc =0 , reta =0 ; +u32 rxcsum; +int i, j;int mask; -if (!(adapter->hw.mac.type == ixgbe_mac_82599EB)) -return mrqc; +/* Fill out hash function seeds */ +for (i =0 ; i <10 ; i++) +IXGBE_WRITE_REG (hw,IXGBE_RSSRK (i), seed[i]); + +/* Fill out redirection table */ +for (i =0 , j =0 ; i <128 ; i++, j++) { +if (j == adapter->ring_feature[RING_F_RSS ].indices) + j =0 ; +/* reta = 4-byte sliding window of +* 0x00..(indices-1)(indices-1)00..etc. */ + reta = (reta <<8 ) | (j *0x11 ); +if ((i &3 ) ==3 ) +IXGBE_WRITE_REG (hw,IXGBE_RETA (i >>2 ), reta); + } + +/* Disable indicating checksum in descriptor, enables RSS hash */ + rxcsum =IXGBE_READ_REG (hw,IXGBE_RXCSUM ); + rxcsum |=IXGBE_RXCSUM_PCSD ; +IXGBE_WRITE_REG (hw,IXGBE_RXCSUM , rxcsum); - mask = adapter->flags & (IXGBE_FLAG_RSS_ENABLED +if (adapter->hw.mac.type == ixgbe_mac_82598EB) + mask = adapter->flags &IXGBE_FLAG_RSS_ENABLED ; +else + mask = adapter->flags & (IXGBE_FLAG_RSS_ENABLED #ifdef CONFIG_IXGBE_DCB - |IXGBE_FLAG_DCB_ENABLED + |IXGBE_FLAG_DCB_ENABLED #endif - |IXGBE_FLAG_SRIOV_ENABLED - ); + |IXGBE_FLAG_SRIOV_ENABLED + );switch (mask) {case (IXGBE_FLAG_RSS_ENABLED ):
@@ -2576,7 +2602,13 @@ static u32 ixgbe_setup_mrqc(struct ixgbe_adapter *adapter)break ; } -return mrqc; +/* Perform hash on these packet types */ + mrqc |=IXGBE_MRQC_RSS_FIELD_IPV4 + |IXGBE_MRQC_RSS_FIELD_IPV4_TCP + |IXGBE_MRQC_RSS_FIELD_IPV6 + |IXGBE_MRQC_RSS_FIELD_IPV6_TCP ; + +IXGBE_WRITE_REG (hw,IXGBE_MRQC , mrqc); }/**
@@ -2637,12 +2669,8 @@ static void ixgbe_configure_rx(struct ixgbe_adapter *adapter)struct net_device *netdev = adapter->netdev;int max_frame = netdev->mtu +ETH_HLEN +ETH_FCS_LEN ;int i, j; -u32 rdlen, rxctrl, rxcsum; -static const u32 seed[10 ] = {0xE291D73D ,0x1805EC6C ,0x2A94B30D , -0xA54F2BEC ,0xEA49AF7C ,0xE214AD3D ,0xB855AABE , -0x6A3E67EA ,0x14364D17 ,0x3BED200D }; +u32 rdlen, rxctrl;u32 fctrl, hlreg0; -u32 reta =0 , mrqc =0 ;u32 rdrxctl;int rx_buf_len;
@@ -2774,33 +2802,7 @@ static void ixgbe_configure_rx(struct ixgbe_adapter *adapter) }/* Program MRQC for the distribution of queues */ - mrqc =ixgbe_setup_mrqc (adapter); - -if (adapter->flags &IXGBE_FLAG_RSS_ENABLED ) { -/* Fill out redirection table */ -for (i =0 , j =0 ; i <128 ; i++, j++) { -if (j == adapter->ring_feature[RING_F_RSS ].indices) - j =0 ; -/* reta = 4-byte sliding window of -* 0x00..(indices-1)(indices-1)00..etc. */ - reta = (reta <<8 ) | (j *0x11 ); -if ((i &3 ) ==3 ) -IXGBE_WRITE_REG (hw,IXGBE_RETA (i >>2 ), reta); - } - -/* Fill out hash function seeds */ -for (i =0 ; i <10 ; i++) -IXGBE_WRITE_REG (hw,IXGBE_RSSRK (i), seed[i]); - -if (hw->mac.type == ixgbe_mac_82598EB) - mrqc |=IXGBE_MRQC_RSSEN ; -/* Perform hash on these packet types */ - mrqc |=IXGBE_MRQC_RSS_FIELD_IPV4 - |IXGBE_MRQC_RSS_FIELD_IPV4_TCP - |IXGBE_MRQC_RSS_FIELD_IPV6 - |IXGBE_MRQC_RSS_FIELD_IPV6_TCP ; - } -IXGBE_WRITE_REG (hw,IXGBE_MRQC , mrqc); +ixgbe_setup_mrqc (adapter);if (adapter->num_vfs) {u32 reg;
@@ -2816,22 +2818,6 @@ static void ixgbe_configure_rx(struct ixgbe_adapter *adapter)IXGBE_WRITE_REG (hw,IXGBE_GCR_EXT , reg); } - rxcsum =IXGBE_READ_REG (hw,IXGBE_RXCSUM ); - -if (adapter->flags &IXGBE_FLAG_RSS_ENABLED || - adapter->flags &IXGBE_FLAG_RX_CSUM_ENABLED ) { -/* Disable indicating checksum in descriptor, enables -* RSS hash */ - rxcsum |=IXGBE_RXCSUM_PCSD ; - } -if (!(rxcsum &IXGBE_RXCSUM_PCSD )) { -/* Enable IPv4 payload checksum for UDP fragments -* if PCSD is not set */ - rxcsum |=IXGBE_RXCSUM_IPPCSE ; - } - -IXGBE_WRITE_REG (hw,IXGBE_RXCSUM , rxcsum); -if (hw->mac.type == ixgbe_mac_82599EB) { rdrxctl =IXGBE_READ_REG (hw,IXGBE_RDRXCTL ); rdrxctl |=IXGBE_RDRXCTL_CRCSTRIP ;
Re: [net-next-2.6 PATCH 07/20] ixgbe: consolidate all setting of MRQC into one function
From: Jeff Kirsher <[email protected]>
Date: Thu, 19 Aug 2010 16:35:41 -0700
Quoted 11 lines
From: Alexander Duyck <[email protected]>
This change simplifies the configuration of MRQC by consolidating the setting of it into one function. As such the register is no longer set in multiple places which should make any future changes easier to work with. In addition we can combine RSS related register writes into the call since enabling all of those bits without enabling RSS itself in MRQC should have no effect.
Signed-off-by Alexander Duyck <[email protected]>Signed-off-by Jeff Kirsher <[email protected]>
Applied.
PATCH 8/20 ixgbe: pull ring configuration into it's own function
In reply to Jeff KirsherFrom: Alexander Duyck <[email protected]>
These changes add ixgbe_configure_rx_ring which is used to setup the base function pointers for the ring.
---
drivers/net/ixgbe/ixgbe_main.c | 33 ++++++++++++++++++++------------- 1 files changed, 20 insertions(+), 13 deletions(-)
drivers/net/ixgbe/ixgbe_main.c +20 -13
@@ -2655,6 +2655,23 @@ static void ixgbe_configure_rscctl(struct ixgbe_adapter *adapter, int index)IXGBE_WRITE_REG (hw,IXGBE_RSCCTL (j), rscctrl); } +static void ixgbe_configure_rx_ring (struct ixgbe_adapter *adapter, +struct ixgbe_ring *ring) +{ +struct ixgbe_hw *hw = &adapter->hw; +u64 rdba = ring->dma; +u16 reg_idx = ring->reg_idx; + +IXGBE_WRITE_REG (hw,IXGBE_RDBAL (reg_idx), (rdba &DMA_BIT_MASK (32 ))); +IXGBE_WRITE_REG (hw,IXGBE_RDBAH (reg_idx), (rdba >>32 )); +IXGBE_WRITE_REG (hw,IXGBE_RDLEN (reg_idx), + ring->count *sizeof (union ixgbe_adv_rx_desc )); +IXGBE_WRITE_REG (hw,IXGBE_RDH (reg_idx),0 ); +IXGBE_WRITE_REG (hw,IXGBE_RDT (reg_idx),0 ); + ring->head =IXGBE_RDH (reg_idx); + ring->tail =IXGBE_RDT (reg_idx); +} +/** * ixgbe_configure_rx - Configure 8259x Receive Unit after Reset * @adapter: board private structure
@@ -2663,13 +2680,12 @@ static void ixgbe_configure_rscctl(struct ixgbe_adapter *adapter, int index)**/ static void ixgbe_configure_rx (struct ixgbe_adapter *adapter) { -u64 rdba;struct ixgbe_hw *hw = &adapter->hw;struct ixgbe_ring *rx_ring;struct net_device *netdev = adapter->netdev;int max_frame = netdev->mtu +ETH_HLEN +ETH_FCS_LEN ; -int i, j; -u32 rdlen, rxctrl; +int i; +u32 rxctrl;u32 fctrl, hlreg0;u32 rdrxctl;int rx_buf_len;
@@ -2718,7 +2734,6 @@ static void ixgbe_configure_rx(struct ixgbe_adapter *adapter)#endif IXGBE_WRITE_REG (hw,IXGBE_HLREG0 , hlreg0); - rdlen = adapter->rx_ring[0 ]->count *sizeof (union ixgbe_adv_rx_desc );/* disable receives while setting up the descriptors */ rxctrl =IXGBE_READ_REG (hw,IXGBE_RXCTRL );IXGBE_WRITE_REG (hw,IXGBE_RXCTRL , rxctrl & ~IXGBE_RXCTRL_RXEN );
@@ -2729,15 +2744,6 @@ static void ixgbe_configure_rx(struct ixgbe_adapter *adapter)*/ for (i =0 ; i < adapter->num_rx_queues; i++) { rx_ring = adapter->rx_ring[i]; - rdba = rx_ring->dma; - j = rx_ring->reg_idx; -IXGBE_WRITE_REG (hw,IXGBE_RDBAL (j), (rdba &DMA_BIT_MASK (32 ))); -IXGBE_WRITE_REG (hw,IXGBE_RDBAH (j), (rdba >>32 )); -IXGBE_WRITE_REG (hw,IXGBE_RDLEN (j), rdlen); -IXGBE_WRITE_REG (hw,IXGBE_RDH (j),0 ); -IXGBE_WRITE_REG (hw,IXGBE_RDT (j),0 ); - rx_ring->head =IXGBE_RDH (j); - rx_ring->tail =IXGBE_RDT (j); rx_ring->rx_buf_len = rx_buf_len;if (adapter->flags &IXGBE_FLAG_RX_PS_ENABLED )
@@ -2758,6 +2764,7 @@ static void ixgbe_configure_rx(struct ixgbe_adapter *adapter) }#endif /* IXGBE_FCOE */ +ixgbe_configure_rx_ring (adapter, rx_ring);ixgbe_configure_srrctl (adapter, rx_ring); }
Re: [net-next-2.6 PATCH 08/20] ixgbe: pull ring configuration into it's own function
From: Jeff Kirsher <[email protected]>
Date: Thu, 19 Aug 2010 16:36:05 -0700
Quoted 7 lines
From: Alexander Duyck <[email protected]>
These changes add
ixgbe_configure_rx_ringwhich is used to setup the base function pointers for the ring.Signed-off-by Alexander Duyck <[email protected]>Signed-off-by Jeff Kirsher <[email protected]>
Applied.
PATCH 9/20 ixgbe: pull PSRTYPE configuration into a separate function
In reply to Jeff KirsherFrom: Alexander Duyck <[email protected]>
The configuration of PSRTYPE was being done conditionally on if packet split is enabled or not. It can be configured always since it will not have any effect when packet split is not enabled.
---
drivers/net/ixgbe/ixgbe_main.c | 36 +++++++++++++++++++++++++----------- 1 files changed, 25 insertions(+), 11 deletions(-)
drivers/net/ixgbe/ixgbe_main.c +25 -11
@@ -2672,6 +2672,29 @@ static void ixgbe_configure_rx_ring(struct ixgbe_adapter *adapter, ring->tail =IXGBE_RDT (reg_idx); } +static void ixgbe_setup_psrtype (struct ixgbe_adapter *adapter) +{ +struct ixgbe_hw *hw = &adapter->hw; +int p; + +/* PSRTYPE must be initialized in non 82598 adapters */ +u32 psrtype =IXGBE_PSRTYPE_TCPHDR | +IXGBE_PSRTYPE_UDPHDR | +IXGBE_PSRTYPE_IPV4HDR | +IXGBE_PSRTYPE_L2HDR | +IXGBE_PSRTYPE_IPV6HDR ; + +if (hw->mac.type == ixgbe_mac_82598EB) +return ; + +if (adapter->flags &IXGBE_FLAG_RSS_ENABLED ) + psrtype |= (adapter->num_rx_queues_per_pool <<29 ); + +for (p =0 ; p < adapter->num_rx_pools; p++) +IXGBE_WRITE_REG (hw,IXGBE_PSRTYPE (adapter->num_vfs + p), + psrtype); +} +/** * ixgbe_configure_rx - Configure 8259x Receive Unit after Reset * @adapter: board private structure
@@ -2690,6 +2713,8 @@ static void ixgbe_configure_rx(struct ixgbe_adapter *adapter)u32 rdrxctl;int rx_buf_len; +ixgbe_setup_psrtype (adapter); +/* Decide whether to use packet split mode or not */ /* Do not use packet split if we're in SR-IOV Mode */ if (!adapter->num_vfs)
@@ -2698,17 +2723,6 @@ static void ixgbe_configure_rx(struct ixgbe_adapter *adapter)/* Set the RX buffer length according to the mode */ if (adapter->flags &IXGBE_FLAG_RX_PS_ENABLED ) { rx_buf_len =IXGBE_RX_HDR_SIZE ; -if (hw->mac.type == ixgbe_mac_82599EB) { -/* PSRTYPE must be initialized in 82599 */ -u32 psrtype =IXGBE_PSRTYPE_TCPHDR | -IXGBE_PSRTYPE_UDPHDR | -IXGBE_PSRTYPE_IPV4HDR | -IXGBE_PSRTYPE_IPV6HDR | -IXGBE_PSRTYPE_L2HDR ; -IXGBE_WRITE_REG (hw, -IXGBE_PSRTYPE (adapter->num_vfs), - psrtype); - } }else {if (!(adapter->flags2 &IXGBE_FLAG2_RSC_ENABLED ) && (netdev->mtu <=ETH_DATA_LEN ))
Re: [net-next-2.6 PATCH 09/20] ixgbe: pull PSRTYPE configuration into a separate function
From: Jeff Kirsher <[email protected]>
Date: Thu, 19 Aug 2010 16:36:27 -0700
Quoted 8 lines
From: Alexander Duyck <[email protected]>
The configuration of PSRTYPE was being done conditionally on if packet split is enabled or not. It can be configured always since it will not have any effect when packet split is not enabled.
Signed-off-by Alexander Duyck <[email protected]>Signed-off-by Jeff Kirsher <[email protected]>
Applied.
PATCH 10/20 ixgbe: combine accesses to FCTRL register into ixgbe_set_rx_mode
In reply to Jeff KirsherFrom: Alexander Duyck <[email protected]>
We are accessing the FCTRL register in multiple spots in the init path and we can simplify things by combining the configuration all into ixgbe_set_rx_mode.
---
drivers/net/ixgbe/ixgbe_main.c | 13 ++++++------- 1 files changed, 6 insertions(+), 7 deletions(-)
drivers/net/ixgbe/ixgbe_main.c +6 -7
@@ -2709,7 +2709,7 @@ static void ixgbe_configure_rx(struct ixgbe_adapter *adapter)int max_frame = netdev->mtu +ETH_HLEN +ETH_FCS_LEN ;int i;u32 rxctrl; -u32 fctrl, hlreg0; +u32 hlreg0;u32 rdrxctl;int rx_buf_len;
@@ -2731,12 +2731,6 @@ static void ixgbe_configure_rx(struct ixgbe_adapter *adapter) rx_buf_len =ALIGN (max_frame,1024 ); } - fctrl =IXGBE_READ_REG (&adapter->hw,IXGBE_FCTRL ); - fctrl |=IXGBE_FCTRL_BAM ; - fctrl |=IXGBE_FCTRL_DPF ;/* discard pause frames when FC enabled */ - fctrl |=IXGBE_FCTRL_PMCF ; -IXGBE_WRITE_REG (&adapter->hw,IXGBE_FCTRL , fctrl); - hlreg0 =IXGBE_READ_REG (hw,IXGBE_HLREG0 );if (adapter->netdev->mtu <=ETH_DATA_LEN ) hlreg0 &= ~IXGBE_HLREG0_JUMBOEN ;
@@ -3055,6 +3049,11 @@ void ixgbe_set_rx_mode(struct net_device *netdev) fctrl =IXGBE_READ_REG (hw,IXGBE_FCTRL ); +/* set all bits that we expect to always be set */ + fctrl |=IXGBE_FCTRL_BAM ; + fctrl |=IXGBE_FCTRL_DPF ;/* discard pause frames when FC enabled */ + fctrl |=IXGBE_FCTRL_PMCF ; +/* clear the bits we are changing the status of */ fctrl &= ~(IXGBE_FCTRL_UPE |IXGBE_FCTRL_MPE );
Re: [net-next-2.6 PATCH 10/20] ixgbe: combine accesses to FCTRL register into ixgbe_set_rx_mode
From: Jeff Kirsher <[email protected]>
Date: Thu, 19 Aug 2010 16:36:49 -0700
Quoted 8 lines
From: Alexander Duyck <[email protected]>
We are accessing the FCTRL register in multiple spots in the init path and we can simplify things by combining the configuration all into
ixgbe_set_rx_mode.Signed-off-by Alexander Duyck <[email protected]>Signed-off-by Jeff Kirsher <[email protected]>
Applied.
PATCH 11/20 ixgbe: bump PS header size to 512 bytes
In reply to Jeff KirsherFrom: Alexander Duyck <[email protected]>
Bump the header size for packet split to 512 bytes since this makes the best use of the 1k buffer that is allocated for any skb 512 bytes or smaller.
---
drivers/net/ixgbe/ixgbe.h | 13 +++++++++---- 1 files changed, 9 insertions(+), 4 deletions(-)
drivers/net/ixgbe/ixgbe.h +9 -4
@@ -69,15 +69,20 @@#define IXGBE_MAX_FCPAUSE 0xFFFF/* Supported Rx Buffer Sizes */ -#define IXGBE_RXBUFFER_64 64/* Used for packet split */ -#define IXGBE_RXBUFFER_128 128/* Used for packet split */ -#define IXGBE_RXBUFFER_256 256/* Used for packet split */ +#define IXGBE_RXBUFFER_512 512/* Used for packet split */ #define IXGBE_RXBUFFER_2048 2048#define IXGBE_RXBUFFER_4096 4096#define IXGBE_RXBUFFER_8192 8192#define IXGBE_MAX_RXBUFFER 16384/* largest size for a single descriptor */ -#define IXGBE_RX_HDR_SIZE IXGBE_RXBUFFER_256 +/* +* NOTE: netdev_alloc_skb reserves up to 64 bytes, NET_IP_ALIGN mans we +* reserve 2 more, and skb_shared_info adds an additional 384 bytes more, +* this adds up to 512 bytes of extra data meaning the smallest allocation +* we could have is 1K. +* i.e. RXBUFFER_512 --> size-1024 slab +*/ +#define IXGBE_RX_HDR_SIZE IXGBE_RXBUFFER_512#define MAXIMUM_ETHERNET_VLAN_SIZE (ETH_FRAME_LEN + ETH_FCS_LEN + VLAN_HLEN)
Re: [net-next-2.6 PATCH 11/20] ixgbe: bump PS header size to 512 bytes
From: Jeff Kirsher <[email protected]>
Date: Thu, 19 Aug 2010 16:37:21 -0700
Quoted 8 lines
From: Alexander Duyck <[email protected]>
Bump the header size for packet split to 512 bytes since this makes the best use of the 1k buffer that is allocated for any skb 512 bytes or smaller.
Signed-off-by Alexander Duyck <[email protected]>Signed-off-by Jeff Kirsher <[email protected]>
Applied.
PATCH 12/20 ixgbe: remove redundant configuration of vmolr, rename generic variable
In reply to Jeff KirsherFrom: Alexander Duyck <[email protected]>
The vmolr is configured already in ixgbe_set_rx_mode for the PF so there is no need to set it again in ixgbe_configure_rx.
Instead of using the variable name reg, it is easier to just rename it to gcr_ext to reflect the register contents that the variable holds.
---
drivers/net/ixgbe/ixgbe_main.c | 11 ++++------- 1 files changed, 4 insertions(+), 7 deletions(-)
drivers/net/ixgbe/ixgbe_main.c +4 -7
@@ -2709,7 +2709,7 @@ static void ixgbe_configure_rx(struct ixgbe_adapter *adapter)int max_frame = netdev->mtu +ETH_HLEN +ETH_FCS_LEN ;int i;u32 rxctrl; -u32 hlreg0; +u32 hlreg0, gcr_ext;u32 rdrxctl;int rx_buf_len;
@@ -2813,24 +2813,21 @@ static void ixgbe_configure_rx(struct ixgbe_adapter *adapter)IXGBE_WRITE_REG (hw,IXGBE_VFRE (reg_offset), (1 << vf_shift));IXGBE_WRITE_REG (hw,IXGBE_VFTE (reg_offset), (1 << vf_shift));IXGBE_WRITE_REG (hw,IXGBE_PFDTXGSWC ,IXGBE_PFDTXGSWC_VT_LBEN ); -ixgbe_set_vmolr (hw, adapter->num_vfs, true); }/* Program MRQC for the distribution of queues */ ixgbe_setup_mrqc (adapter);if (adapter->num_vfs) { -u32 reg; -/* Map PF MAC address in RAR Entry 0 to first pool * following VFs */ hw->mac.ops.set_vmdq (hw,0 , adapter->num_vfs);/* Set up VF register offsets for selected VT Mode, i.e. * 64 VFs for SR-IOV */ - reg =IXGBE_READ_REG (hw,IXGBE_GCR_EXT ); - reg |=IXGBE_GCR_EXT_SRIOV ; -IXGBE_WRITE_REG (hw,IXGBE_GCR_EXT , reg); + gcr_ext =IXGBE_READ_REG (hw,IXGBE_GCR_EXT ); + gcr_ext |=IXGBE_GCR_EXT_SRIOV ; +IXGBE_WRITE_REG (hw,IXGBE_GCR_EXT , gcr_ext); }if (hw->mac.type == ixgbe_mac_82599EB) {
Re: [net-next-2.6 PATCH 12/20] ixgbe: remove redundant configuration of vmolr, rename generic variable
From: Jeff Kirsher <[email protected]>
Date: Thu, 19 Aug 2010 16:37:48 -0700
Quoted 10 lines
From: Alexander Duyck <[email protected]>
The vmolr is configured already in
ixgbe_set_rx_modefor the PF so there is no need to set it again inixgbe_configure_rx.Instead of using the variable name reg, it is easier to just rename it to
gcr_extto reflect the register contents that the variable holds.Signed-off-by Alexander Duyck <[email protected]>Signed-off-by Jeff Kirsher <[email protected]>
Applied.
PATCH 13/20 ixgbe: Move max frame size and Rx buffer length configuration into a function
In reply to Jeff KirsherFrom: Alexander Duyck <[email protected]>
This change consolidates all of the Rx max frame size and Rx buffer length configuration into a single function.
---
drivers/net/ixgbe/ixgbe_main.c | 108 ++++++++++++++++++++++------------------ 1 files changed, 60 insertions(+), 48 deletions(-)
drivers/net/ixgbe/ixgbe_main.c +60 -48
@@ -2695,25 +2695,15 @@ static void ixgbe_setup_psrtype(struct ixgbe_adapter *adapter) psrtype); } -/** -* ixgbe_configure_rx - Configure 8259x Receive Unit after Reset -* @adapter: board private structure -* -* Configure the Rx unit of the MAC after a reset. -**/ -static void ixgbe_configure_rx (struct ixgbe_adapter *adapter) +static void ixgbe_set_rx_buffer_len (struct ixgbe_adapter *adapter) {struct ixgbe_hw *hw = &adapter->hw; -struct ixgbe_ring *rx_ring;struct net_device *netdev = adapter->netdev;int max_frame = netdev->mtu +ETH_HLEN +ETH_FCS_LEN ; -int i; -u32 rxctrl; -u32 hlreg0, gcr_ext; -u32 rdrxctl;int rx_buf_len; - -ixgbe_setup_psrtype (adapter); +struct ixgbe_ring *rx_ring; +int i; +u32 mhadd, hlreg0;/* Decide whether to use packet split mode or not */ /* Do not use packet split if we're in SR-IOV Mode */
@@ -2728,23 +2718,28 @@ static void ixgbe_configure_rx(struct ixgbe_adapter *adapter) (netdev->mtu <= ETH_DATA_LEN)) rx_buf_len =MAXIMUM_ETHERNET_VLAN_SIZE ; else - rx_buf_len =ALIGN (max_frame,1024 ); + rx_buf_len =ALIGN (max_frame +VLAN_HLEN ,1024 ); } - hlreg0 =IXGBE_READ_REG (hw,IXGBE_HLREG0 ); -if (adapter->netdev->mtu <=ETH_DATA_LEN ) - hlreg0 &= ~IXGBE_HLREG0_JUMBOEN ; -else - hlreg0 |=IXGBE_HLREG0_JUMBOEN ;#ifdef IXGBE_FCOE -if (netdev->features &NETIF_F_FCOE_MTU ) - hlreg0 |=IXGBE_HLREG0_JUMBOEN ; -#endif -IXGBE_WRITE_REG (hw,IXGBE_HLREG0 , hlreg0); +/* adjust max frame to be able to do baby jumbo for FCoE */ +if ((adapter->flags &IXGBE_FLAG_FCOE_ENABLED ) && + (max_frame <IXGBE_FCOE_JUMBO_FRAME_SIZE )) + max_frame =IXGBE_FCOE_JUMBO_FRAME_SIZE ; -/* disable receives while setting up the descriptors */ - rxctrl =IXGBE_READ_REG (hw,IXGBE_RXCTRL ); -IXGBE_WRITE_REG (hw,IXGBE_RXCTRL , rxctrl & ~IXGBE_RXCTRL_RXEN ); +#endif /* IXGBE_FCOE */ + mhadd =IXGBE_READ_REG (hw,IXGBE_MHADD ); +if (max_frame != (mhadd >>IXGBE_MHADD_MFS_SHIFT )) { + mhadd &= ~IXGBE_MHADD_MFS_MASK ; + mhadd |= max_frame <<IXGBE_MHADD_MFS_SHIFT ; + +IXGBE_WRITE_REG (hw,IXGBE_MHADD , mhadd); + } + + hlreg0 =IXGBE_READ_REG (hw,IXGBE_HLREG0 ); +/* set jumbo enable since MHADD.MFS is keeping size locked at max_frame */ + hlreg0 |=IXGBE_HLREG0_JUMBOEN ; +IXGBE_WRITE_REG (hw,IXGBE_HLREG0 , hlreg0);/* * Setup the HW Rx Head and Tail Descriptor Pointers and
@@ -2760,7 +2755,8 @@ static void ixgbe_configure_rx(struct ixgbe_adapter *adapter) rx_ring->flags &= ~IXGBE_RING_RX_PS_ENABLED ;#ifdef IXGBE_FCOE -if (netdev->features &NETIF_F_FCOE_MTU ) { +if (netdev->features &NETIF_F_FCOE_MTU ) + {struct ixgbe_ring_feature *f; f = &adapter->ring_feature[RING_F_FCOE ];if ((i >= f->mask) && (i < f->mask + f->indices)) {
@@ -2770,8 +2766,41 @@ static void ixgbe_configure_rx(struct ixgbe_adapter *adapter) IXGBE_FCOE_JUMBO_FRAME_SIZE; } } -#endif /* IXGBE_FCOE */ + } + +} + +/** +* ixgbe_configure_rx - Configure 8259x Receive Unit after Reset +* @adapter: board private structure +* +* Configure the Rx unit of the MAC after a reset. +**/ +static void ixgbe_configure_rx (struct ixgbe_adapter *adapter) +{ +struct ixgbe_hw *hw = &adapter->hw; +struct ixgbe_ring *rx_ring; +int i; +u32 rxctrl; +u32 gcr_ext; +u32 rdrxctl; + +/* disable receives while setting up the descriptors */ + rxctrl =IXGBE_READ_REG (hw,IXGBE_RXCTRL ); +IXGBE_WRITE_REG (hw,IXGBE_RXCTRL , rxctrl & ~IXGBE_RXCTRL_RXEN ); + +ixgbe_setup_psrtype (adapter); + +/* set_rx_buffer_len must be called before ring initialization */ +ixgbe_set_rx_buffer_len (adapter); + +/* +* Setup the HW Rx Head and Tail Descriptor Pointers and +* the Base and Length of the Rx Descriptor Ring +*/ +for (i =0 ; i < adapter->num_rx_queues; i++) { + rx_ring = adapter->rx_ring[i];ixgbe_configure_rx_ring (adapter, rx_ring);ixgbe_configure_srrctl (adapter, rx_ring); }
@@ -3322,13 +3351,11 @@ static inline void ixgbe_rx_desc_queue_enable(struct ixgbe_adapter *adapter,static int ixgbe_up_complete (struct ixgbe_adapter *adapter) { -struct net_device *netdev = adapter->netdev;struct ixgbe_hw *hw = &adapter->hw;int i, j =0 ;int num_rx_rings = adapter->num_rx_queues;int err; -int max_frame = netdev->mtu +ETH_HLEN +ETH_FCS_LEN ; -u32 txdctl, rxdctl, mhadd; +u32 txdctl, rxdctl;u32 dmatxctl;u32 gpie;u32 ctrl_ext;
@@ -3395,21 +3422,6 @@ static int ixgbe_up_complete(struct ixgbe_adapter *adapter)IXGBE_WRITE_REG (hw,IXGBE_GPIE , gpie); } -#ifdef IXGBE_FCOE -/* adjust max frame to be able to do baby jumbo for FCoE */ -if ((netdev->features &NETIF_F_FCOE_MTU ) && - (max_frame <IXGBE_FCOE_JUMBO_FRAME_SIZE )) - max_frame =IXGBE_FCOE_JUMBO_FRAME_SIZE ; - -#endif /* IXGBE_FCOE */ - mhadd =IXGBE_READ_REG (hw,IXGBE_MHADD ); -if (max_frame != (mhadd >>IXGBE_MHADD_MFS_SHIFT )) { - mhadd &= ~IXGBE_MHADD_MFS_MASK ; - mhadd |= max_frame <<IXGBE_MHADD_MFS_SHIFT ; - -IXGBE_WRITE_REG (hw,IXGBE_MHADD , mhadd); - } -if (hw->mac.type == ixgbe_mac_82599EB) {/* DMATXCTL.EN must be set after all Tx queue config is done */ dmatxctl =IXGBE_READ_REG (hw,IXGBE_DMATXCTL );
@@ -3522,7 +3534,7 @@ static int ixgbe_up_complete(struct ixgbe_adapter *adapter) &(adapter->tx_ring[i]->reinit_state));/* enable transmits */ -netif_tx_start_all_queues (netdev); +netif_tx_start_all_queues (adapter->netdev);/* bring the link up in the watchdog, this could race with our first * link up interrupt but shouldn't be a problem */
Re: [net-next-2.6 PATCH 13/20] ixgbe: Move max frame size and Rx buffer length configuration into a function
From: Jeff Kirsher <[email protected]>
Date: Thu, 19 Aug 2010 16:38:11 -0700
Quoted 7 lines
From: Alexander Duyck <[email protected]>
This change consolidates all of the Rx max frame size and Rx buffer length configuration into a single function.
Signed-off-by Alexander Duyck <[email protected]>Signed-off-by Jeff Kirsher <[email protected]>
Applied.
PATCH 14/20 ixgbe: move all Rx DMA control register writes to one central location
In reply to Jeff KirsherFrom: Alexander Duyck <[email protected]>
This change moves all of the Rx DMA control register writes to one central location. This should help to avoid accidentally overwriting existing settings.
---
drivers/net/ixgbe/ixgbe_main.c | 91 +++++++++++++++++++++------------------- drivers/net/ixgbe/ixgbe_type.h | 2 + 2 files changed, 50 insertions(+), 43 deletions(-)
drivers/net/ixgbe/ixgbe_main.c +48 -43
@@ -2616,25 +2616,26 @@ static void ixgbe_setup_mrqc(struct ixgbe_adapter *adapter)* @adapter: address of board private structure * @index: index of ring to set **/ -static void ixgbe_configure_rscctl (struct ixgbe_adapter *adapter,int index) +static void ixgbe_configure_rscctl (struct ixgbe_adapter *adapter, +struct ixgbe_ring *ring) { -struct ixgbe_ring *rx_ring;struct ixgbe_hw *hw = &adapter->hw; -int j;u32 rscctrl;int rx_buf_len; +u16 reg_idx = ring->reg_idx; + +if (!(adapter->flags2 &IXGBE_FLAG2_RSC_ENABLED )) +return ; - rx_ring = adapter->rx_ring[index]; - j = rx_ring->reg_idx; - rx_buf_len = rx_ring->rx_buf_len; - rscctrl =IXGBE_READ_REG (hw,IXGBE_RSCCTL (j)); + rx_buf_len = ring->rx_buf_len; + rscctrl =IXGBE_READ_REG (hw,IXGBE_RSCCTL (reg_idx)); rscctrl |=IXGBE_RSCCTL_RSCEN ;/* * we must limit the number of descriptors so that the * total size of max desc * buf_len is not greater * than 65535 */ -if (rx_ring->flags &IXGBE_RING_RX_PS_ENABLED ) { +if (ring->flags &IXGBE_RING_RX_PS_ENABLED ) {#if (MAX_SKB_FRAGS >16 ) rscctrl |=IXGBE_RSCCTL_MAXDESC_16 ;#elif (MAX_SKB_FRAGS >8 )
@@ -2652,7 +2653,7 @@ static void ixgbe_configure_rscctl(struct ixgbe_adapter *adapter, int index)else rscctrl |=IXGBE_RSCCTL_MAXDESC_4 ; } -IXGBE_WRITE_REG (hw,IXGBE_RSCCTL (j), rscctrl); +IXGBE_WRITE_REG (hw,IXGBE_RSCCTL (reg_idx), rscctrl); } static void ixgbe_configure_rx_ring(struct ixgbe_adapter *adapter,
@@ -2771,6 +2772,42 @@ static void ixgbe_set_rx_buffer_len(struct ixgbe_adapter *adapter) } +static void ixgbe_setup_rdrxctl (struct ixgbe_adapter *adapter) +{ +struct ixgbe_hw *hw = &adapter->hw; +u32 rdrxctl =IXGBE_READ_REG (hw,IXGBE_RDRXCTL ); + +switch (hw->mac.type) { +case ixgbe_mac_82598EB: +/* +* For VMDq support of different descriptor types or +* buffer sizes through the use of multiple SRRCTL +* registers, RDRXCTL.MVMEN must be set to 1 +* +* also, the manual doesn't mention it clearly but DCA hints +* will only use queue 0's tags unless this bit is set. Side +* effects of setting this bit are only that SRRCTL must be +* fully programmed [0..15] +*/ + rdrxctl |=IXGBE_RDRXCTL_MVMEN ; +break ; +case ixgbe_mac_82599EB: +/* Disable RSC for ACK packets */ +IXGBE_WRITE_REG (hw,IXGBE_RSCDBU , + (IXGBE_RSCDBU_RSCACKDIS |IXGBE_READ_REG (hw,IXGBE_RSCDBU ))); + rdrxctl &= ~IXGBE_RDRXCTL_RSCFRSTSIZE ; +/* hardware requires some bits to be set by default */ + rdrxctl |= (IXGBE_RDRXCTL_RSCACKC |IXGBE_RDRXCTL_FCOE_WRFIX ); + rdrxctl |=IXGBE_RDRXCTL_CRCSTRIP ; +break ; +default : +/* We should do nothing since we don't know this hardware */ +return ; + } + +IXGBE_WRITE_REG (hw,IXGBE_RDRXCTL , rdrxctl); +} +/** * ixgbe_configure_rx - Configure 8259x Receive Unit after Reset * @adapter: board private structure
@@ -2784,13 +2821,13 @@ static void ixgbe_configure_rx(struct ixgbe_adapter *adapter)int i;u32 rxctrl;u32 gcr_ext; -u32 rdrxctl;/* disable receives while setting up the descriptors */ rxctrl =IXGBE_READ_REG (hw,IXGBE_RXCTRL );IXGBE_WRITE_REG (hw,IXGBE_RXCTRL , rxctrl & ~IXGBE_RXCTRL_RXEN );ixgbe_setup_psrtype (adapter); +ixgbe_setup_rdrxctl (adapter);/* set_rx_buffer_len must be called before ring initialization */ ixgbe_set_rx_buffer_len (adapter);
@@ -2803,22 +2840,7 @@ static void ixgbe_configure_rx(struct ixgbe_adapter *adapter) rx_ring = adapter->rx_ring[i];ixgbe_configure_rx_ring (adapter, rx_ring);ixgbe_configure_srrctl (adapter, rx_ring); - } - -if (hw->mac.type == ixgbe_mac_82598EB) { -/* -* For VMDq support of different descriptor types or -* buffer sizes through the use of multiple SRRCTL -* registers, RDRXCTL.MVMEN must be set to 1 -* -* also, the manual doesn't mention it clearly but DCA hints -* will only use queue 0's tags unless this bit is set. Side -* effects of setting this bit are only that SRRCTL must be -* fully programmed [0..15] -*/ - rdrxctl =IXGBE_READ_REG (hw,IXGBE_RDRXCTL ); - rdrxctl |=IXGBE_RDRXCTL_MVMEN ; -IXGBE_WRITE_REG (hw,IXGBE_RDRXCTL , rdrxctl); +ixgbe_configure_rscctl (adapter, rx_ring); }if (adapter->flags &IXGBE_FLAG_SRIOV_ENABLED ) {
@@ -2858,23 +2880,6 @@ static void ixgbe_configure_rx(struct ixgbe_adapter *adapter) gcr_ext |=IXGBE_GCR_EXT_SRIOV ;IXGBE_WRITE_REG (hw,IXGBE_GCR_EXT , gcr_ext); } - -if (hw->mac.type == ixgbe_mac_82599EB) { - rdrxctl =IXGBE_READ_REG (hw,IXGBE_RDRXCTL ); - rdrxctl |=IXGBE_RDRXCTL_CRCSTRIP ; - rdrxctl &= ~IXGBE_RDRXCTL_RSCFRSTSIZE ; -IXGBE_WRITE_REG (hw,IXGBE_RDRXCTL , rdrxctl); - } - -if (adapter->flags2 &IXGBE_FLAG2_RSC_ENABLED ) { -/* Enable 82599 HW-RSC */ -for (i =0 ; i < adapter->num_rx_queues; i++) -ixgbe_configure_rscctl (adapter, i); - -/* Disable RSC for ACK packets */ -IXGBE_WRITE_REG (hw,IXGBE_RSCDBU , - (IXGBE_RSCDBU_RSCACKDIS |IXGBE_READ_REG (hw,IXGBE_RSCDBU ))); - } }static void ixgbe_vlan_rx_add_vid (struct net_device *netdev,u16 vid)
drivers/net/ixgbe/ixgbe_type.h +2 -0
@@ -871,6 +871,8 @@#define IXGBE_RDRXCTL_MVMEN 0x00000020#define IXGBE_RDRXCTL_DMAIDONE 0x00000008/* DMA init cycle done */ #define IXGBE_RDRXCTL_AGGDIS 0x00010000/* Aggregation disable */ +#define IXGBE_RDRXCTL_RSCACKC 0x02000000/* must set 1 when RSC enabled */ +#define IXGBE_RDRXCTL_FCOE_WRFIX 0x04000000/* must set 1 when RSC enabled */ /* RQTC Bit Masks and Shifts */ #define IXGBE_RQTC_SHIFT_TC (_i) ((_i) * 4)
Re: [net-next-2.6 PATCH 14/20] ixgbe: move all Rx DMA control register writes to one central location
From: Jeff Kirsher <[email protected]>
Date: Thu, 19 Aug 2010 16:38:34 -0700
Quoted 8 lines
From: Alexander Duyck <[email protected]>
This change moves all of the Rx DMA control register writes to one central location. This should help to avoid accidentally overwriting existing settings.
Signed-off-by Alexander Duyck <[email protected]>Signed-off-by Jeff Kirsher <[email protected]>
Applied.
PATCH 15/20 ixgbe: Move virtualization config into a separate function
In reply to Jeff KirsherFrom: Alexander Duyck <[email protected]>
This change moves the configuration that was done in configure_rx into a separate virtualization configuration function.
---
drivers/net/ixgbe/ixgbe_main.c | 84 ++++++++++++++++++++++------------------ 1 files changed, 46 insertions(+), 38 deletions(-)
drivers/net/ixgbe/ixgbe_main.c +46 -38
@@ -2696,6 +2696,48 @@ static void ixgbe_setup_psrtype(struct ixgbe_adapter *adapter) psrtype); } +static void ixgbe_configure_virtualization (struct ixgbe_adapter *adapter) +{ +struct ixgbe_hw *hw = &adapter->hw; +u32 gcr_ext; +u32 vt_reg_bits; +u32 reg_offset, vf_shift; +u32 vmdctl; + +if (!(adapter->flags &IXGBE_FLAG_SRIOV_ENABLED )) +return ; + + vmdctl =IXGBE_READ_REG (hw,IXGBE_VT_CTL ); + vt_reg_bits =IXGBE_VMD_CTL_VMDQ_EN |IXGBE_VT_CTL_REPLEN ; + vt_reg_bits |= (adapter->num_vfs <<IXGBE_VT_CTL_POOL_SHIFT ); +IXGBE_WRITE_REG (hw,IXGBE_VT_CTL , vmdctl | vt_reg_bits); + + vf_shift = adapter->num_vfs %32 ; + reg_offset = (adapter->num_vfs >32 ) ?1 :0 ; + +/* Enable only the PF's pool for Tx/Rx */ +IXGBE_WRITE_REG (hw,IXGBE_VFRE (reg_offset), (1 << vf_shift)); +IXGBE_WRITE_REG (hw,IXGBE_VFRE (reg_offset ^1 ),0 ); +IXGBE_WRITE_REG (hw,IXGBE_VFTE (reg_offset), (1 << vf_shift)); +IXGBE_WRITE_REG (hw,IXGBE_VFTE (reg_offset ^1 ),0 ); +IXGBE_WRITE_REG (hw,IXGBE_PFDTXGSWC ,IXGBE_PFDTXGSWC_VT_LBEN ); + +/* Map PF MAC address in RAR Entry 0 to first pool following VFs */ + hw->mac.ops.set_vmdq (hw,0 , adapter->num_vfs); + +/* +* Set up VF register offsets for selected VT Mode, +* i.e. 32 or 64 VFs for SR-IOV +*/ + gcr_ext =IXGBE_READ_REG (hw,IXGBE_GCR_EXT ); + gcr_ext |=IXGBE_GCR_EXT_MSIX_EN ; + gcr_ext |=IXGBE_GCR_EXT_VT_MODE_64 ; +IXGBE_WRITE_REG (hw,IXGBE_GCR_EXT , gcr_ext); + +/* enable Tx loopback for VF/PF communication */ +IXGBE_WRITE_REG (hw,IXGBE_PFDTXGSWC ,IXGBE_PFDTXGSWC_VT_LBEN ); +} +static void ixgbe_set_rx_buffer_len (struct ixgbe_adapter *adapter) {struct ixgbe_hw *hw = &adapter->hw;
@@ -2820,7 +2862,6 @@ static void ixgbe_configure_rx(struct ixgbe_adapter *adapter)struct ixgbe_ring *rx_ring;int i;u32 rxctrl; -u32 gcr_ext;/* disable receives while setting up the descriptors */ rxctrl =IXGBE_READ_REG (hw,IXGBE_RXCTRL );
@@ -2829,6 +2870,10 @@ static void ixgbe_configure_rx(struct ixgbe_adapter *adapter)ixgbe_setup_psrtype (adapter);ixgbe_setup_rdrxctl (adapter); +/* Program MRQC for the distribution of queues */ +ixgbe_setup_mrqc (adapter); +ixgbe_configure_virtualization (adapter); +/* set_rx_buffer_len must be called before ring initialization */ ixgbe_set_rx_buffer_len (adapter);
@@ -2843,43 +2888,6 @@ static void ixgbe_configure_rx(struct ixgbe_adapter *adapter)ixgbe_configure_rscctl (adapter, rx_ring); } -if (adapter->flags &IXGBE_FLAG_SRIOV_ENABLED ) { -u32 vt_reg_bits; -u32 reg_offset, vf_shift; -u32 vmdctl =IXGBE_READ_REG (hw,IXGBE_VT_CTL ); - vt_reg_bits =IXGBE_VMD_CTL_VMDQ_EN - |IXGBE_VT_CTL_REPLEN ; - vt_reg_bits |= (adapter->num_vfs << -IXGBE_VT_CTL_POOL_SHIFT ); -IXGBE_WRITE_REG (hw,IXGBE_VT_CTL , vmdctl | vt_reg_bits); -IXGBE_WRITE_REG (hw,IXGBE_MRQC ,0 ); - - vf_shift = adapter->num_vfs %32 ; - reg_offset = adapter->num_vfs /32 ; -IXGBE_WRITE_REG (hw,IXGBE_VFRE (0 ),0 ); -IXGBE_WRITE_REG (hw,IXGBE_VFRE (1 ),0 ); -IXGBE_WRITE_REG (hw,IXGBE_VFTE (0 ),0 ); -IXGBE_WRITE_REG (hw,IXGBE_VFTE (1 ),0 ); -/* Enable only the PF's pool for Tx/Rx */ -IXGBE_WRITE_REG (hw,IXGBE_VFRE (reg_offset), (1 << vf_shift)); -IXGBE_WRITE_REG (hw,IXGBE_VFTE (reg_offset), (1 << vf_shift)); -IXGBE_WRITE_REG (hw,IXGBE_PFDTXGSWC ,IXGBE_PFDTXGSWC_VT_LBEN ); - } - -/* Program MRQC for the distribution of queues */ -ixgbe_setup_mrqc (adapter); - -if (adapter->num_vfs) { -/* Map PF MAC address in RAR Entry 0 to first pool -* following VFs */ - hw->mac.ops.set_vmdq (hw,0 , adapter->num_vfs); - -/* Set up VF register offsets for selected VT Mode, i.e. -* 64 VFs for SR-IOV */ - gcr_ext =IXGBE_READ_REG (hw,IXGBE_GCR_EXT ); - gcr_ext |=IXGBE_GCR_EXT_SRIOV ; -IXGBE_WRITE_REG (hw,IXGBE_GCR_EXT , gcr_ext); - } }static void ixgbe_vlan_rx_add_vid (struct net_device *netdev,u16 vid)
Re: [net-next-2.6 PATCH 15/20] ixgbe: Move virtualization config into a separate function
From: Jeff Kirsher <[email protected]>
Date: Thu, 19 Aug 2010 16:38:57 -0700
Quoted 7 lines
From: Alexander Duyck <[email protected]>
This change moves the configuration that was done in
configure_rxinto a separate virtualization configuration function.Signed-off-by Alexander Duyck <[email protected]>Signed-off-by Jeff Kirsher <[email protected]>
Applied.
PATCH 16/20 ixgbe: move all GPIE register config into a single function
In reply to Jeff KirsherFrom: Alexander Duyck <[email protected]>
This change moves all GPIE register configuration into a single function. The advantage of this is that we can avoid a number of unnecessary read/modify/write cycles on the register.
---
drivers/net/ixgbe/ixgbe_main.c | 72 +++++++++++++++++----------------------- 1 files changed, 30 insertions(+), 42 deletions(-)
drivers/net/ixgbe/ixgbe_main.c +30 -42
@@ -3362,38 +3362,15 @@ static inline void ixgbe_rx_desc_queue_enable(struct ixgbe_adapter *adapter, (adapter->rx_ring[rxr]->count - 1)); } -static int ixgbe_up_complete (struct ixgbe_adapter *adapter) +static void ixgbe_setup_gpie (struct ixgbe_adapter *adapter) {struct ixgbe_hw *hw = &adapter->hw; -int i, j =0 ; -int num_rx_rings = adapter->num_rx_queues; -int err; -u32 txdctl, rxdctl; -u32 dmatxctl; -u32 gpie; -u32 ctrl_ext; - -ixgbe_get_hw_control (adapter); - -if ((adapter->flags &IXGBE_FLAG_MSIX_ENABLED ) || - (adapter->flags &IXGBE_FLAG_MSI_ENABLED )) { -if (adapter->flags &IXGBE_FLAG_MSIX_ENABLED ) { - gpie = (IXGBE_GPIE_MSIX_MODE |IXGBE_GPIE_EIAME | -IXGBE_GPIE_PBA_SUPPORT |IXGBE_GPIE_OCD ); - }else { -/* MSI only */ - gpie =0 ; - } -if (adapter->flags &IXGBE_FLAG_SRIOV_ENABLED ) { - gpie &= ~IXGBE_GPIE_VTMODE_MASK ; - gpie |=IXGBE_GPIE_VTMODE_64 ; - } -/* XXX: to interrupt immediately for EICS writes, enable this */ -/* gpie |= IXGBE_GPIE_EIMEN; */ -IXGBE_WRITE_REG (hw,IXGBE_GPIE , gpie); - } +u32 gpie =0 ;if (adapter->flags &IXGBE_FLAG_MSIX_ENABLED ) { + gpie =IXGBE_GPIE_MSIX_MODE |IXGBE_GPIE_PBA_SUPPORT | +IXGBE_GPIE_OCD ; + gpie |=IXGBE_GPIE_EIAME ;/* * use EIAM to auto-mask when MSI-X interrupt is asserted * this saves a register write for every interrupt
@@ -3414,26 +3391,37 @@ static int ixgbe_up_complete(struct ixgbe_adapter *adapter)IXGBE_WRITE_REG (hw,IXGBE_EIAM ,IXGBE_EICS_RTX_QUEUE ); } -/* Enable Thermal over heat sensor interrupt */ -if (adapter->flags2 &IXGBE_FLAG2_TEMP_SENSOR_CAPABLE ) { - gpie =IXGBE_READ_REG (hw,IXGBE_GPIE ); - gpie |=IXGBE_SDP0_GPIEN ; -IXGBE_WRITE_REG (hw,IXGBE_GPIE , gpie); +/* XXX: to interrupt immediately for EICS writes, enable this */ +/* gpie |= IXGBE_GPIE_EIMEN; */ + +if (adapter->flags &IXGBE_FLAG_SRIOV_ENABLED ) { + gpie &= ~IXGBE_GPIE_VTMODE_MASK ; + gpie |=IXGBE_GPIE_VTMODE_64 ; } -/* Enable fan failure interrupt if media type is copper */ -if (adapter->flags &IXGBE_FLAG_FAN_FAIL_CAPABLE ) { - gpie =IXGBE_READ_REG (hw,IXGBE_GPIE ); +/* Enable fan failure interrupt */ +if (adapter->flags &IXGBE_FLAG_FAN_FAIL_CAPABLE ) gpie |=IXGBE_SDP1_GPIEN ; -IXGBE_WRITE_REG (hw,IXGBE_GPIE , gpie); - } -if (hw->mac.type == ixgbe_mac_82599EB) { - gpie =IXGBE_READ_REG (hw,IXGBE_GPIE ); +if (hw->mac.type == ixgbe_mac_82599EB) gpie |=IXGBE_SDP1_GPIEN ; gpie |=IXGBE_SDP2_GPIEN ; -IXGBE_WRITE_REG (hw,IXGBE_GPIE , gpie); - } + +IXGBE_WRITE_REG (hw,IXGBE_GPIE , gpie); +} + +static int ixgbe_up_complete (struct ixgbe_adapter *adapter) +{ +struct ixgbe_hw *hw = &adapter->hw; +int i, j =0 ; +int num_rx_rings = adapter->num_rx_queues; +int err; +u32 txdctl, rxdctl; +u32 dmatxctl; +u32 ctrl_ext; + +ixgbe_get_hw_control (adapter); +ixgbe_setup_gpie (adapter);if (hw->mac.type == ixgbe_mac_82599EB) {/* DMATXCTL.EN must be set after all Tx queue config is done */
Re: [net-next-2.6 PATCH 16/20] ixgbe: move all GPIE register config into a single function
From: Jeff Kirsher <[email protected]>
Date: Thu, 19 Aug 2010 16:39:20 -0700
Quoted 8 lines
From: Alexander Duyck <[email protected]>
This change moves all GPIE register configuration into a single function. The advantage of this is that we can avoid a number of unnecessary read/modify/write cycles on the register.
Signed-off-by Alexander Duyck <[email protected]>Signed-off-by Jeff Kirsher <[email protected]>
Applied.
PATCH 17/20 ixgbe: pull all Tx init into ixgbe_configure_tx
In reply to Jeff KirsherFrom: Alexander Duyck <[email protected]>
The Tx init was spread out over ixgbe_configure, ixgbe_configure_tx, and ixgbe_up_complete. This change combines all of that into the ixgbe_configure_tx function in order to simplify the Tx init path.
---
drivers/net/ixgbe/ixgbe_main.c | 91 +++++++++++++++++++++++----------------- 1 files changed, 52 insertions(+), 39 deletions(-)
drivers/net/ixgbe/ixgbe_main.c +52 -39
@@ -2436,8 +2436,16 @@ static void ixgbe_configure_msi_and_legacy(struct ixgbe_adapter *adapter) {struct ixgbe_hw *hw = &adapter->hw;u64 tdba = ring->dma; +int wait_loop =10 ; +u32 txdctl;u16 reg_idx = ring->reg_idx; +/* disable queue to avoid issues while updating state */ + txdctl =IXGBE_READ_REG (hw,IXGBE_TXDCTL (reg_idx)); +IXGBE_WRITE_REG (hw,IXGBE_TXDCTL (reg_idx), + txdctl & ~IXGBE_TXDCTL_ENABLE ); +IXGBE_WRITE_FLUSH (hw); +IXGBE_WRITE_REG (hw,IXGBE_TDBAL (reg_idx), (tdba &DMA_BIT_MASK (32 )));IXGBE_WRITE_REG (hw,IXGBE_TDBAH (reg_idx), (tdba >>32 ));
@@ -2448,6 +2456,38 @@ static void ixgbe_configure_msi_and_legacy(struct ixgbe_adapter *adapter) ring->head =IXGBE_TDH (reg_idx); ring->tail =IXGBE_TDT (reg_idx); +/* configure fetching thresholds */ +if (adapter->rx_itr_setting ==0 ) { +/* cannot set wthresh when itr==0 */ + txdctl &= ~0x007F0000 ; + }else { +/* enable WTHRESH=8 descriptors, to encourage burst writeback */ + txdctl |= (8 <<16 ); + } +if (adapter->flags &IXGBE_FLAG_DCB_ENABLED ) { +/* PThresh workaround for Tx hang with DFP enabled. */ + txdctl |=32 ; + } + +/* reinitialize flowdirector state */ +set_bit (__IXGBE_FDIR_INIT_DONE, &ring->reinit_state); + +/* enable queue */ + txdctl |=IXGBE_TXDCTL_ENABLE ; +IXGBE_WRITE_REG (hw,IXGBE_TXDCTL (reg_idx), txdctl); + +/* TXDCTL.EN will return 0 on 82598 if link is down, so skip it */ +if (hw->mac.type == ixgbe_mac_82598EB && + !(IXGBE_READ_REG (hw,IXGBE_LINKS ) &IXGBE_LINKS_UP )) +return ; + +/* poll to verify queue is enabled */ +do { +msleep (1 ); + txdctl =IXGBE_READ_REG (hw,IXGBE_TXDCTL (reg_idx)); + }while (--wait_loop && !(txdctl &IXGBE_TXDCTL_ENABLE )); +if (!wait_loop) +e_err (drv,"Could not enable Tx Queue %d\n" , reg_idx); }static void ixgbe_setup_mtqc (struct ixgbe_adapter *adapter)
@@ -2497,13 +2537,22 @@ static void ixgbe_setup_mtqc(struct ixgbe_adapter *adapter)**/ static void ixgbe_configure_tx (struct ixgbe_adapter *adapter) { +struct ixgbe_hw *hw = &adapter->hw; +u32 dmatxctl;u32 i; +ixgbe_setup_mtqc (adapter); + +if (hw->mac.type != ixgbe_mac_82598EB) { +/* DMATXCTL.EN must be before Tx queues are enabled */ + dmatxctl =IXGBE_READ_REG (hw,IXGBE_DMATXCTL ); + dmatxctl |=IXGBE_DMATXCTL_TE ; +IXGBE_WRITE_REG (hw,IXGBE_DMATXCTL , dmatxctl); + } +/* Setup the HW Tx Head and Tail descriptor pointers */ for (i =0 ; i < adapter->num_tx_queues; i++)ixgbe_configure_tx_ring (adapter, adapter->tx_ring[i]); - -ixgbe_setup_mtqc (adapter); }#define IXGBE_SRRCTL_BSIZEHDRSIZE_SHIFT 2
@@ -3416,44 +3465,12 @@ static int ixgbe_up_complete(struct ixgbe_adapter *adapter)int i, j =0 ;int num_rx_rings = adapter->num_rx_queues;int err; -u32 txdctl, rxdctl; -u32 dmatxctl; +u32 rxdctl;u32 ctrl_ext;ixgbe_get_hw_control (adapter);ixgbe_setup_gpie (adapter); -if (hw->mac.type == ixgbe_mac_82599EB) { -/* DMATXCTL.EN must be set after all Tx queue config is done */ - dmatxctl =IXGBE_READ_REG (hw,IXGBE_DMATXCTL ); - dmatxctl |=IXGBE_DMATXCTL_TE ; -IXGBE_WRITE_REG (hw,IXGBE_DMATXCTL , dmatxctl); - } -for (i =0 ; i < adapter->num_tx_queues; i++) { - j = adapter->tx_ring[i]->reg_idx; - txdctl =IXGBE_READ_REG (hw,IXGBE_TXDCTL (j)); -if (adapter->rx_itr_setting ==0 ) { -/* cannot set wthresh when itr==0 */ - txdctl &= ~0x007F0000 ; - }else { -/* enable WTHRESH=8 descriptors, to encourage burst writeback */ - txdctl |= (8 <<16 ); - } - txdctl |=IXGBE_TXDCTL_ENABLE ; -IXGBE_WRITE_REG (hw,IXGBE_TXDCTL (j), txdctl); -if (hw->mac.type == ixgbe_mac_82599EB) { -int wait_loop =10 ; -/* poll for Tx Enable ready */ -do { -msleep (1 ); - txdctl =IXGBE_READ_REG (hw,IXGBE_TXDCTL (j)); - }while (--wait_loop && - !(txdctl &IXGBE_TXDCTL_ENABLE )); -if (!wait_loop) -e_err (drv,"Could not enable Tx Queue %d\n" , j); - } - } -for (i =0 ; i < num_rx_rings; i++) { j = adapter->rx_ring[i]->reg_idx; rxdctl =IXGBE_READ_REG (hw,IXGBE_RXDCTL (j));
@@ -3530,10 +3547,6 @@ static int ixgbe_up_complete(struct ixgbe_adapter *adapter)e_err (probe,"link_config FAILED %d\n" , err); } -for (i =0 ; i < adapter->num_tx_queues; i++) -set_bit (__IXGBE_FDIR_INIT_DONE, - &(adapter->tx_ring[i]->reinit_state)); -/* enable transmits */ netif_tx_start_all_queues (adapter->netdev);
Re: [net-next-2.6 PATCH 17/20] ixgbe: pull all Tx init into ixgbe_configure_tx
From: Jeff Kirsher <[email protected]>
Date: Thu, 19 Aug 2010 16:39:43 -0700
Quoted 8 lines
From: Alexander Duyck <[email protected]>
The Tx init was spread out over
ixgbe_configure,ixgbe_configure_tx, andixgbe_up_complete. This change combines all of that into theixgbe_configure_txfunction in order to simplify the Tx init path.Signed-off-by Alexander Duyck <[email protected]>Signed-off-by Jeff Kirsher <[email protected]>
Applied.
PATCH 18/20 ixgbe: combine Rx into into ixgbe_configure_rx
In reply to Jeff KirsherFrom: Alexander Duyck <[email protected]>
The Rx init is currently split over ixgbe_configure, ixgbe_configure_rx, and ixgbe_up_complete. Instead of leaving it split over 3 function it is easier to consolidate them all into ixgbe_configure_rx.
---
drivers/net/ixgbe/ixgbe_main.c | 152 +++++++++++++++++++++++++--------------- 1 files changed, 95 insertions(+), 57 deletions(-)
drivers/net/ixgbe/ixgbe_main.c +95 -57
@@ -2574,6 +2574,8 @@ static void ixgbe_configure_srrctl(struct ixgbe_adapter *adapter, srrctl &= ~IXGBE_SRRCTL_BSIZEHDR_MASK ; srrctl &= ~IXGBE_SRRCTL_BSIZEPKT_MASK ; +if (adapter->num_vfs) + srrctl |=IXGBE_SRRCTL_DROP_EN ; srrctl |= (IXGBE_RX_HDR_SIZE <<IXGBE_SRRCTL_BSIZEHDRSIZE_SHIFT ) &IXGBE_SRRCTL_BSIZEHDR_MASK ;
@@ -2705,13 +2707,72 @@ static void ixgbe_configure_rscctl(struct ixgbe_adapter *adapter,IXGBE_WRITE_REG (hw,IXGBE_RSCCTL (reg_idx), rscctrl); } +/** +* ixgbe_set_uta - Set unicast filter table address +* @adapter: board private structure +* +* The unicast table address is a register array of 32-bit registers. +* The table is meant to be used in a way similar to how the MTA is used +* however due to certain limitations in the hardware it is necessary to +* set all the hash bits to 1 and use the VMOLR ROPE bit as a promiscuous +* enable bit to allow vlan tag stripping when promiscuous mode is enabled +**/ +static void ixgbe_set_uta (struct ixgbe_adapter *adapter) +{ +struct ixgbe_hw *hw = &adapter->hw; +int i; + +/* The UTA table only exists on 82599 hardware and newer */ +if (hw->mac.type < ixgbe_mac_82599EB) +return ; + +/* we only need to do this if VMDq is enabled */ +if (!(adapter->flags &IXGBE_FLAG_SRIOV_ENABLED )) +return ; + +for (i =0 ; i <128 ; i++) +IXGBE_WRITE_REG (hw,IXGBE_UTA (i), ~0 ); +} + +#define IXGBE_MAX_RX_DESC_POLL 10 +static void ixgbe_rx_desc_queue_enable (struct ixgbe_adapter *adapter, +struct ixgbe_ring *ring) +{ +struct ixgbe_hw *hw = &adapter->hw; +int reg_idx = ring->reg_idx; +int wait_loop =IXGBE_MAX_RX_DESC_POLL ; +u32 rxdctl; + +/* RXDCTL.EN will return 0 on 82598 if link is down, so skip it */ +if (hw->mac.type == ixgbe_mac_82598EB && + !(IXGBE_READ_REG (hw,IXGBE_LINKS ) &IXGBE_LINKS_UP )) +return ; + +do { +msleep (1 ); + rxdctl =IXGBE_READ_REG (hw,IXGBE_RXDCTL (reg_idx)); + }while (--wait_loop && !(rxdctl &IXGBE_RXDCTL_ENABLE )); + +if (!wait_loop) { +e_err (drv,"RXDCTL.ENABLE on Rx queue %d not set within " +"the polling period\n" , reg_idx); + } +} +static void ixgbe_configure_rx_ring (struct ixgbe_adapter *adapter,struct ixgbe_ring *ring) {struct ixgbe_hw *hw = &adapter->hw;u64 rdba = ring->dma; +u32 rxdctl;u16 reg_idx = ring->reg_idx; +/* disable queue to avoid issues while updating state */ + rxdctl =IXGBE_READ_REG (hw,IXGBE_RXDCTL (reg_idx)); +IXGBE_WRITE_REG (hw,IXGBE_RXDCTL (reg_idx), + rxdctl & ~IXGBE_RXDCTL_ENABLE ); +IXGBE_WRITE_FLUSH (hw); +IXGBE_WRITE_REG (hw,IXGBE_RDBAL (reg_idx), (rdba &DMA_BIT_MASK (32 )));IXGBE_WRITE_REG (hw,IXGBE_RDBAH (reg_idx), (rdba >>32 )); IXGBE_WRITE_REG(hw, IXGBE_RDLEN(reg_idx),
@@ -2720,6 +2781,28 @@ static void ixgbe_configure_rx_ring(struct ixgbe_adapter *adapter,IXGBE_WRITE_REG (hw,IXGBE_RDT (reg_idx),0 ); ring->head =IXGBE_RDH (reg_idx); ring->tail =IXGBE_RDT (reg_idx); + +ixgbe_configure_srrctl (adapter, ring); +ixgbe_configure_rscctl (adapter, ring); + +if (hw->mac.type == ixgbe_mac_82598EB) { +/* +* enable cache line friendly hardware writes: +* PTHRESH=32 descriptors (half the internal cache), +* this also removes ugly rx_no_buffer_count increment +* HTHRESH=4 descriptors (to minimize latency on fetch) +* WTHRESH=8 burst writeback up to two cache lines +*/ + rxdctl &= ~0x3FFFFF ; + rxdctl |=0x080420 ; + } + +/* enable receive descriptor ring */ + rxdctl |=IXGBE_RXDCTL_ENABLE ; +IXGBE_WRITE_REG (hw,IXGBE_RXDCTL (reg_idx), rxdctl); + +ixgbe_rx_desc_queue_enable (adapter, ring); +ixgbe_alloc_rx_buffers (adapter, ring,IXGBE_DESC_UNUSED (ring)); }static void ixgbe_setup_psrtype (struct ixgbe_adapter *adapter)
@@ -2908,7 +2991,6 @@ static void ixgbe_setup_rdrxctl(struct ixgbe_adapter *adapter)static void ixgbe_configure_rx (struct ixgbe_adapter *adapter) {struct ixgbe_hw *hw = &adapter->hw; -struct ixgbe_ring *rx_ring;int i;u32 rxctrl;
@@ -2919,10 +3001,12 @@ static void ixgbe_configure_rx(struct ixgbe_adapter *adapter)ixgbe_setup_psrtype (adapter);ixgbe_setup_rdrxctl (adapter); -/* Program MRQC for the distribution of queues */ +/* Program registers for the distribution of queues */ ixgbe_setup_mrqc (adapter);ixgbe_configure_virtualization (adapter); +ixgbe_set_uta (adapter); +/* set_rx_buffer_len must be called before ring initialization */ ixgbe_set_rx_buffer_len (adapter);
@@ -2930,13 +3014,16 @@ static void ixgbe_configure_rx(struct ixgbe_adapter *adapter)* Setup the HW Rx Head and Tail Descriptor Pointers and * the Base and Length of the Rx Descriptor Ring */ -for (i =0 ; i < adapter->num_rx_queues; i++) { - rx_ring = adapter->rx_ring[i]; -ixgbe_configure_rx_ring (adapter, rx_ring); -ixgbe_configure_srrctl (adapter, rx_ring); -ixgbe_configure_rscctl (adapter, rx_ring); - } +for (i =0 ; i < adapter->num_rx_queues; i++) +ixgbe_configure_rx_ring (adapter, adapter->rx_ring[i]); +/* disable drop enable for 82598 parts */ +if (hw->mac.type == ixgbe_mac_82598EB) + rxctrl |=IXGBE_RXCTRL_DMBYPS ; + +/* enable all receives */ + rxctrl |=IXGBE_RXCTRL_RXEN ; + hw->mac.ops.enable_rx_dma (hw, rxctrl); }static void ixgbe_vlan_rx_add_vid (struct net_device *netdev,u16 vid)
@@ -3306,9 +3393,6 @@ static void ixgbe_configure(struct ixgbe_adapter *adapter)ixgbe_configure_tx (adapter);ixgbe_configure_rx (adapter); -for (i =0 ; i < adapter->num_rx_queues; i++) -ixgbe_alloc_rx_buffers (adapter, adapter->rx_ring[i], - (adapter->rx_ring[i]->count -1 )); }static inline bool ixgbe_is_sfp (struct ixgbe_hw *hw)
@@ -3389,28 +3473,6 @@ link_cfg_out:return ret; } -#define IXGBE_MAX_RX_DESC_POLL 10 -static inline void ixgbe_rx_desc_queue_enable (struct ixgbe_adapter *adapter, -int rxr) -{ -int j = adapter->rx_ring[rxr]->reg_idx; -int k; - -for (k =0 ; k <IXGBE_MAX_RX_DESC_POLL ; k++) { -if (IXGBE_READ_REG (&adapter->hw, -IXGBE_RXDCTL (j)) &IXGBE_RXDCTL_ENABLE ) -break ; -else -msleep (1 ); - } -if (k >=IXGBE_MAX_RX_DESC_POLL ) { -e_err (drv,"RXDCTL.ENABLE on Rx queue %d not set within " -"the polling period\n" , rxr); - } -ixgbe_release_rx_desc (&adapter->hw, adapter->rx_ring[rxr], - (adapter->rx_ring[rxr]->count -1 )); -} -static void ixgbe_setup_gpie (struct ixgbe_adapter *adapter) {struct ixgbe_hw *hw = &adapter->hw;
@@ -3462,35 +3524,12 @@ static void ixgbe_setup_gpie(struct ixgbe_adapter *adapter)static int ixgbe_up_complete (struct ixgbe_adapter *adapter) {struct ixgbe_hw *hw = &adapter->hw; -int i, j =0 ; -int num_rx_rings = adapter->num_rx_queues;int err; -u32 rxdctl;u32 ctrl_ext;ixgbe_get_hw_control (adapter);ixgbe_setup_gpie (adapter); -for (i =0 ; i < num_rx_rings; i++) { - j = adapter->rx_ring[i]->reg_idx; - rxdctl =IXGBE_READ_REG (hw,IXGBE_RXDCTL (j)); -/* enable PTHRESH=32 descriptors (half the internal cache) -* and HTHRESH=0 descriptors (to minimize latency on fetch), -* this also removes a pesky rx_no_buffer_count increment */ - rxdctl |=0x0020 ; - rxdctl |=IXGBE_RXDCTL_ENABLE ; -IXGBE_WRITE_REG (hw,IXGBE_RXDCTL (j), rxdctl); -if (hw->mac.type == ixgbe_mac_82599EB) -ixgbe_rx_desc_queue_enable (adapter, i); - } -/* enable all receives */ - rxdctl =IXGBE_READ_REG (hw,IXGBE_RXCTRL ); -if (hw->mac.type == ixgbe_mac_82598EB) - rxdctl |= (IXGBE_RXCTRL_DMBYPS |IXGBE_RXCTRL_RXEN ); -else - rxdctl |=IXGBE_RXCTRL_RXEN ; - hw->mac.ops.enable_rx_dma (hw, rxdctl); -if (adapter->flags &IXGBE_FLAG_MSIX_ENABLED )ixgbe_configure_msix (adapter);else
@@ -3505,7 +3544,6 @@ static int ixgbe_up_complete(struct ixgbe_adapter *adapter)/* clear any pending interrupts, may auto mask */ IXGBE_READ_REG (hw,IXGBE_EICR ); -ixgbe_irq_enable (adapter);/*
Re: [net-next-2.6 PATCH 18/20] ixgbe: combine Rx into into ixgbe_configure_rx
From: Jeff Kirsher <[email protected]>
Date: Thu, 19 Aug 2010 16:40:06 -0700
Quoted 8 lines
From: Alexander Duyck <[email protected]>
The Rx init is currently split over
ixgbe_configure,ixgbe_configure_rx, andixgbe_up_complete. Instead of leaving it split over 3 function it is easier to consolidate them all intoixgbe_configure_rx.Signed-off-by Alexander Duyck <[email protected]>Signed-off-by Jeff Kirsher <[email protected]>
Applied.
PATCH 19/20 ixgbe: update all DESC_ADV macros to accept a ring pointer
In reply to Jeff KirsherFrom: Alexander Duyck <[email protected]>
All of the DESC_ADV macros are currently needing the pointers to be de-referenced before accessing the ring. Instead of having to add all of the asterisks it is easier to just update the macro to expect a pointer to the ring.
---
drivers/net/ixgbe/ixgbe.h | 6 +++--- drivers/net/ixgbe/ixgbe_ethtool.c | 4 ++-- drivers/net/ixgbe/ixgbe_fcoe.c | 2 +- drivers/net/ixgbe/ixgbe_main.c | 24 ++++++++++++------------ 4 files changed, 18 insertions(+), 18 deletions(-)
drivers/net/ixgbe/ixgbe.h +3 -3
@@ -256,11 +256,11 @@ struct ixgbe_q_vector { (R)->next_to_clean - (R)->next_to_use - 1)#define IXGBE_RX_DESC_ADV (R , i) \ - (&(((union ixgbe_adv_rx_desc *)((R).desc))[i])) + (&(((union ixgbe_adv_rx_desc *)((R)->desc))[i]))#define IXGBE_TX_DESC_ADV (R , i) \ - (&(((union ixgbe_adv_tx_desc *)((R).desc))[i])) + (&(((union ixgbe_adv_tx_desc *)((R)->desc))[i]))#define IXGBE_TX_CTXTDESC_ADV (R , i) \ - (&(((struct ixgbe_adv_tx_context_desc *)((R).desc))[i])) + (&(((struct ixgbe_adv_tx_context_desc *)((R)->desc))[i]))#define IXGBE_MAX_JUMBO_FRAME_SIZE 16128#ifdef IXGBE_FCOE
drivers/net/ixgbe/ixgbe_ethtool.c +2 -2
@@ -1560,7 +1560,7 @@ static int ixgbe_setup_desc_rings(struct ixgbe_adapter *adapter)IXGBE_WRITE_REG (&adapter->hw,IXGBE_TXDCTL (0 ), reg_data);for (i =0 ; i < tx_ring->count; i++) { -union ixgbe_adv_tx_desc *desc =IXGBE_TX_DESC_ADV (*tx_ring, i); +union ixgbe_adv_tx_desc *desc =IXGBE_TX_DESC_ADV (tx_ring, i);struct sk_buff *skb;unsigned int size =1024 ;
@@ -1661,7 +1661,7 @@ static int ixgbe_setup_desc_rings(struct ixgbe_adapter *adapter)for (i =0 ; i < rx_ring->count; i++) {union ixgbe_adv_rx_desc *rx_desc = -IXGBE_RX_DESC_ADV (*rx_ring, i); +IXGBE_RX_DESC_ADV (rx_ring, i);struct sk_buff *skb; skb =alloc_skb (IXGBE_RXBUFFER_2048 +NET_IP_ALIGN ,GFP_KERNEL );
drivers/net/ixgbe/ixgbe_fcoe.c +1 -1
@@ -471,7 +471,7 @@ int ixgbe_fso(struct ixgbe_adapter *adapter,/* write context desc */ i = tx_ring->next_to_use; - context_desc =IXGBE_TX_CTXTDESC_ADV (*tx_ring, i); + context_desc =IXGBE_TX_CTXTDESC_ADV (tx_ring, i); context_desc->vlan_macip_lens =cpu_to_le32 (vlan_macip_lens); context_desc->seqnum_seed =cpu_to_le32 (fcoe_sof_eof); context_desc->type_tucmd_mlhl =cpu_to_le32 (type_tucmd);
drivers/net/ixgbe/ixgbe_main.c +12 -12
@@ -385,7 +385,7 @@ static void ixgbe_dump(struct ixgbe_adapter *adapter) "leng ntw timestamp bi->skb\n");for (i =0 ; tx_ring->desc && (i < tx_ring->count); i++) { - tx_desc =IXGBE_TX_DESC_ADV (*tx_ring, i); + tx_desc =IXGBE_TX_DESC_ADV (tx_ring, i); tx_buffer_info = &tx_ring->tx_buffer_info[i]; u0 = (struct my_u0 *)tx_desc; printk(KERN_INFO "T [0x%03X] %016llX %016llX %016llX"
@@ -466,7 +466,7 @@ rx_ring_summary:for (i =0 ; i < rx_ring->count; i++) { rx_buffer_info = &rx_ring->rx_buffer_info[i]; - rx_desc =IXGBE_RX_DESC_ADV (*rx_ring, i); + rx_desc =IXGBE_RX_DESC_ADV (rx_ring, i); u0 = (struct my_u0 *)rx_desc; staterr =le32_to_cpu (rx_desc->wb.upper.status_error);if (staterr &IXGBE_RXD_STAT_DD ) {
@@ -695,7 +695,7 @@ static inline bool ixgbe_check_tx_hang(struct ixgbe_adapter *adapter, ixgbe_tx_xon_state(adapter, tx_ring)) {/* detected Tx unit hang */ union ixgbe_adv_tx_desc *tx_desc; - tx_desc =IXGBE_TX_DESC_ADV (*tx_ring, eop); + tx_desc =IXGBE_TX_DESC_ADV (tx_ring, eop);e_err (drv,"Detected Tx Unit Hang\n" " Tx Queue <%d>\n" " TDH, TDT <%x>, <%x>\n"
@@ -743,7 +743,7 @@ static bool ixgbe_clean_tx_irq(struct ixgbe_q_vector *q_vector, i = tx_ring->next_to_clean; eop = tx_ring->tx_buffer_info[i].next_to_watch; - eop_desc =IXGBE_TX_DESC_ADV (*tx_ring, eop); + eop_desc =IXGBE_TX_DESC_ADV (tx_ring, eop);while ((eop_desc->wb.status &cpu_to_le32 (IXGBE_TXD_STAT_DD )) && (count < tx_ring->work_limit)) {
@@ -751,7 +751,7 @@ static bool ixgbe_clean_tx_irq(struct ixgbe_q_vector *q_vector,rmb ();/* read buffer_info after eop_desc */ for ( ; !cleaned; count++) {struct sk_buff *skb; - tx_desc =IXGBE_TX_DESC_ADV (*tx_ring, i); + tx_desc =IXGBE_TX_DESC_ADV (tx_ring, i); tx_buffer_info = &tx_ring->tx_buffer_info[i]; cleaned = (i == eop); skb = tx_buffer_info->skb;
@@ -791,7 +791,7 @@ static bool ixgbe_clean_tx_irq(struct ixgbe_q_vector *q_vector, } eop = tx_ring->tx_buffer_info[i].next_to_watch; - eop_desc =IXGBE_TX_DESC_ADV (*tx_ring, eop); + eop_desc =IXGBE_TX_DESC_ADV (tx_ring, eop); } tx_ring->next_to_clean = i;
@@ -1047,7 +1047,7 @@ static void ixgbe_alloc_rx_buffers(struct ixgbe_adapter *adapter, bi = &rx_ring->rx_buffer_info[i];while (cleaned_count--) { - rx_desc =IXGBE_RX_DESC_ADV (*rx_ring, i); + rx_desc =IXGBE_RX_DESC_ADV (rx_ring, i);if (!bi->page_dma && (rx_ring->flags &IXGBE_RING_RX_PS_ENABLED )) {
@@ -1188,7 +1188,7 @@ static bool ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector,#endif /* IXGBE_FCOE */ i = rx_ring->next_to_clean; - rx_desc =IXGBE_RX_DESC_ADV (*rx_ring, i); + rx_desc =IXGBE_RX_DESC_ADV (rx_ring, i); staterr =le32_to_cpu (rx_desc->wb.upper.status_error); rx_buffer_info = &rx_ring->rx_buffer_info[i];
@@ -1263,7 +1263,7 @@ static bool ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector,if (i == rx_ring->count) i =0 ; - next_rxd =IXGBE_RX_DESC_ADV (*rx_ring, i); + next_rxd =IXGBE_RX_DESC_ADV (rx_ring, i);prefetch (next_rxd); cleaned_count++;
@@ -5813,7 +5813,7 @@ static int ixgbe_tso(struct ixgbe_adapter *adapter, i = tx_ring->next_to_use; tx_buffer_info = &tx_ring->tx_buffer_info[i]; - context_desc =IXGBE_TX_CTXTDESC_ADV (*tx_ring, i); + context_desc =IXGBE_TX_CTXTDESC_ADV (tx_ring, i);/* VLAN MACLEN IPLEN */ if (tx_flags &IXGBE_TX_FLAGS_VLAN )
@@ -5872,7 +5872,7 @@ static bool ixgbe_tx_csum(struct ixgbe_adapter *adapter, (tx_flags & IXGBE_TX_FLAGS_VLAN)) { i = tx_ring->next_to_use; tx_buffer_info = &tx_ring->tx_buffer_info[i]; - context_desc =IXGBE_TX_CTXTDESC_ADV (*tx_ring, i); + context_desc =IXGBE_TX_CTXTDESC_ADV (tx_ring, i);if (tx_flags &IXGBE_TX_FLAGS_VLAN ) vlan_macip_lens |=
@@ -6101,7 +6101,7 @@ static void ixgbe_tx_queue(struct ixgbe_adapter *adapter, i = tx_ring->next_to_use;while (count--) { tx_buffer_info = &tx_ring->tx_buffer_info[i]; - tx_desc =IXGBE_TX_DESC_ADV (*tx_ring, i); + tx_desc =IXGBE_TX_DESC_ADV (tx_ring, i); tx_desc->read.buffer_addr =cpu_to_le64 (tx_buffer_info->dma); tx_desc->read.cmd_type_len =cpu_to_le32 (cmd_type_len | tx_buffer_info->length);
Re: [net-next-2.6 PATCH 19/20] ixgbe: update all DESC_ADV macros to accept a ring pointer
From: Jeff Kirsher <[email protected]>
Date: Thu, 19 Aug 2010 16:40:31 -0700
Quoted 9 lines
From: Alexander Duyck <[email protected]>
All of the
DESC_ADVmacros are currently needing the pointers to be de-referenced before accessing the ring. Instead of having to add all of the asterisks it is easier to just update the macro to expect a pointer to the ring.Signed-off-by Alexander Duyck <[email protected]>Signed-off-by Jeff Kirsher <[email protected]>
Applied.
PATCH 20/20 ixgbe: rewrite ethtool test to use standard config functions
In reply to Jeff KirsherFrom: Alexander Duyck <[email protected]>
This change makes it so that the ethtool loopback test uses the standard ring configuration and allocation functions. As a result the loopback test will be much more effective at testing core driver functionality.
---
drivers/net/ixgbe/ixgbe.h | 11 + drivers/net/ixgbe/ixgbe_ethtool.c | 362 +++++++++++++------------------------ drivers/net/ixgbe/ixgbe_main.c | 49 +++-- 3 files changed, 169 insertions(+), 253 deletions(-)
drivers/net/ixgbe/ixgbe.h +11 -0
@@ -453,9 +453,20 @@ extern int ixgbe_setup_rx_resources(struct ixgbe_adapter *, struct ixgbe_ring *)extern int ixgbe_setup_tx_resources (struct ixgbe_adapter *,struct ixgbe_ring *);extern void ixgbe_free_rx_resources (struct ixgbe_adapter *,struct ixgbe_ring *);extern void ixgbe_free_tx_resources (struct ixgbe_adapter *,struct ixgbe_ring *); +extern void ixgbe_configure_rx_ring (struct ixgbe_adapter *,struct ixgbe_ring *); +extern void ixgbe_configure_tx_ring (struct ixgbe_adapter *,struct ixgbe_ring *);extern void ixgbe_update_stats (struct ixgbe_adapter *adapter);extern int ixgbe_init_interrupt_scheme (struct ixgbe_adapter *adapter);extern void ixgbe_clear_interrupt_scheme (struct ixgbe_adapter *adapter); +extern netdev_tx_t ixgbe_xmit_frame_ring (struct sk_buff *, +struct net_device *, +struct ixgbe_adapter *, +struct ixgbe_ring *); +extern void ixgbe_unmap_and_free_tx_resource (struct ixgbe_adapter *, +struct ixgbe_tx_buffer *); +extern void ixgbe_alloc_rx_buffers (struct ixgbe_adapter *adapter, +struct ixgbe_ring *rx_ring, +int cleaned_count);extern void ixgbe_write_eitr (struct ixgbe_q_vector *);extern int ethtool_ioctl (struct ifreq *ifr);extern s32 ixgbe_reinit_fdir_tables_82599 (struct ixgbe_hw *hw);
drivers/net/ixgbe/ixgbe_ethtool.c +127 -235
456 lines not on this page · raw message
drivers/net/ixgbe/ixgbe_main.c +31 -18
112 lines not on this page · raw message
Re: [net-next-2.6 PATCH 20/20] ixgbe: rewrite ethtool test to use standard config functions
From: Jeff Kirsher <[email protected]>
Date: Thu, 19 Aug 2010 16:40:54 -0700
Quoted 8 lines
From: Alexander Duyck <[email protected]>
This change makes it so that the ethtool loopback test uses the standard ring configuration and allocation functions. As a result the loopback test will be much more effective at testing core driver functionality.
Signed-off-by Alexander Duyck <[email protected]>Signed-off-by Jeff Kirsher <[email protected]>
Applied.
From: Jeff Kirsher <[email protected]>
Date: Thu, 19 Aug 2010 16:33:16 -0700
Quoted 7 lines
From: Don Skidmore <[email protected]>
Make the code in
ixgbe_get_drvinfomore protected against buffer overflow boundaries by using snprintf and sizeof with snprintf.Signed-off-by Don Skidmore <[email protected]>Signed-off-by Jeff Kirsher <[email protected]>
Applied.