Message ID | 20230502152908.701880-1-ahmed.zaki@intel.com |
---|---|
State | Accepted |
Delegated to: | Anthony Nguyen |
Headers | show |
Series | [net-next,v2] iavf: remove mask from iavf_irq_enable_queues() | expand |
Sorry, I accidentally sent this as v2. It is v1. Ahmed -----Original Message----- From: Zaki, Ahmed <ahmed.zaki@intel.com> Sent: Tuesday, May 2, 2023 9:29 AM To: intel-wired-lan@lists.osuosl.org Cc: Zaki, Ahmed <ahmed.zaki@intel.com> Subject: [PATCH net-next v2] iavf: remove mask from iavf_irq_enable_queues() Enable more than 32 IRQs by removing the u32 bit mask in iavf_irq_enable_queues(). There is no need for the mask as there are no callers that select individual IRQs through the bitmask. Also, if the PF allocates more than 32 IRQs, this mask will prevent us from using all of them. The comment in iavf_register.h is modified to show that the maximum number allowed for the IRQ index is 63 as per the iAVF standard 1.0 [1]. link: [1] https://www.intel.com/content/dam/www/public/us/en/documents/product-specifications/ethernet-adaptive-virtual-function-hardware-spec.pdf Signed-off-by: Ahmed Zaki <ahmed.zaki@intel.com> --- v2: modify comment in iavf_register.h and clarify commit message --- drivers/net/ethernet/intel/iavf/iavf.h | 2 +- drivers/net/ethernet/intel/iavf/iavf_main.c | 15 ++++++--------- drivers/net/ethernet/intel/iavf/iavf_register.h | 2 +- 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/drivers/net/ethernet/intel/iavf/iavf.h b/drivers/net/ethernet/intel/iavf/iavf.h index 9abaff1f2aff..39d0fe76a38f 100644 --- a/drivers/net/ethernet/intel/iavf/iavf.h +++ b/drivers/net/ethernet/intel/iavf/iavf.h @@ -525,7 +525,7 @@ void iavf_set_ethtool_ops(struct net_device *netdev); void iavf_update_stats(struct iavf_adapter *adapter); void iavf_reset_interrupt_capability(struct iavf_adapter *adapter); int iavf_init_interrupt_scheme(struct iavf_adapter *adapter); -void iavf_irq_enable_queues(struct iavf_adapter *adapter, u32 mask); +void iavf_irq_enable_queues(struct iavf_adapter *adapter); void iavf_free_all_tx_resources(struct iavf_adapter *adapter); void iavf_free_all_rx_resources(struct iavf_adapter *adapter); diff --git a/drivers/net/ethernet/intel/iavf/iavf_main.c b/drivers/net/ethernet/intel/iavf/iavf_main.c index 1ad0fe7f6dda..e18d7cacf99c 100644 --- a/drivers/net/ethernet/intel/iavf/iavf_main.c +++ b/drivers/net/ethernet/intel/iavf/iavf_main.c @@ -359,21 +359,18 @@ static void iavf_irq_disable(struct iavf_adapter *adapter) } /** - * iavf_irq_enable_queues - Enable interrupt for specified queues + * iavf_irq_enable_queues - Enable interrupt for all queues * @adapter: board private structure - * @mask: bitmap of queues to enable **/ -void iavf_irq_enable_queues(struct iavf_adapter *adapter, u32 mask) +void iavf_irq_enable_queues(struct iavf_adapter *adapter) { struct iavf_hw *hw = &adapter->hw; int i; for (i = 1; i < adapter->num_msix_vectors; i++) { - if (mask & BIT(i - 1)) { - wr32(hw, IAVF_VFINT_DYN_CTLN1(i - 1), - IAVF_VFINT_DYN_CTLN1_INTENA_MASK | - IAVF_VFINT_DYN_CTLN1_ITR_INDX_MASK); - } + wr32(hw, IAVF_VFINT_DYN_CTLN1(i - 1), + IAVF_VFINT_DYN_CTLN1_INTENA_MASK | + IAVF_VFINT_DYN_CTLN1_ITR_INDX_MASK); } } @@ -387,7 +384,7 @@ void iavf_irq_enable(struct iavf_adapter *adapter, bool flush) struct iavf_hw *hw = &adapter->hw; iavf_misc_irq_enable(adapter); - iavf_irq_enable_queues(adapter, ~0); + iavf_irq_enable_queues(adapter); if (flush) iavf_flush(hw); diff --git a/drivers/net/ethernet/intel/iavf/iavf_register.h b/drivers/net/ethernet/intel/iavf/iavf_register.h index bf793332fc9d..a19e88898a0b 100644 --- a/drivers/net/ethernet/intel/iavf/iavf_register.h +++ b/drivers/net/ethernet/intel/iavf/iavf_register.h @@ -40,7 +40,7 @@ #define IAVF_VFINT_DYN_CTL01_INTENA_MASK IAVF_MASK(0x1, IAVF_VFINT_DYN_CTL01_INTENA_SHIFT) #define IAVF_VFINT_DYN_CTL01_ITR_INDX_SHIFT 3 #define IAVF_VFINT_DYN_CTL01_ITR_INDX_MASK IAVF_MASK(0x3, IAVF_VFINT_DYN_CTL01_ITR_INDX_SHIFT) -#define IAVF_VFINT_DYN_CTLN1(_INTVF) (0x00003800 + ((_INTVF) * 4)) /* _i=0...15 */ /* Reset: VFR */ +#define IAVF_VFINT_DYN_CTLN1(_INTVF) (0x00003800 + ((_INTVF) * 4)) /* +_i=0...63 */ /* Reset: VFR */ #define IAVF_VFINT_DYN_CTLN1_INTENA_SHIFT 0 #define IAVF_VFINT_DYN_CTLN1_INTENA_MASK IAVF_MASK(0x1, IAVF_VFINT_DYN_CTLN1_INTENA_SHIFT) #define IAVF_VFINT_DYN_CTLN1_SWINT_TRIG_SHIFT 2 -- 2.34.1
> -----Original Message----- > From: Intel-wired-lan <intel-wired-lan-bounces@osuosl.org> On Behalf Of Zaki, > Ahmed > Sent: wtorek, 2 maja 2023 18:19 > To: intel-wired-lan@lists.osuosl.org > Subject: Re: [Intel-wired-lan] [PATCH net-next v2] iavf: remove mask from > iavf_irq_enable_queues() > > Sorry, I accidentally sent this as v2. It is v1. > > Ahmed > > -----Original Message----- > From: Zaki, Ahmed <ahmed.zaki@intel.com> > Sent: Tuesday, May 2, 2023 9:29 AM > To: intel-wired-lan@lists.osuosl.org > Cc: Zaki, Ahmed <ahmed.zaki@intel.com> > Subject: [PATCH net-next v2] iavf: remove mask from iavf_irq_enable_queues() > > Enable more than 32 IRQs by removing the u32 bit mask in > iavf_irq_enable_queues(). There is no need for the mask as there are no callers > that select individual IRQs through the bitmask. Also, if the PF allocates more > than 32 IRQs, this mask will prevent us from using all of them. > > The comment in iavf_register.h is modified to show that the maximum number > allowed for the IRQ index is 63 as per the iAVF standard 1.0 [1]. > > link: [1] > https://www.intel.com/content/dam/www/public/us/en/documents/product- > specifications/ethernet-adaptive-virtual-function-hardware-spec.pdf > Signed-off-by: Ahmed Zaki <ahmed.zaki@intel.com> > --- > v2: modify comment in iavf_register.h and clarify commit message > --- > drivers/net/ethernet/intel/iavf/iavf.h | 2 +- > drivers/net/ethernet/intel/iavf/iavf_main.c | 15 ++++++--------- > drivers/net/ethernet/intel/iavf/iavf_register.h | 2 +- > 3 files changed, 8 insertions(+), 11 deletions(-) > > diff --git a/drivers/net/ethernet/intel/iavf/iavf.h > b/drivers/net/ethernet/intel/iavf/iavf.h > index 9abaff1f2aff..39d0fe76a38f 100644 > --- a/drivers/net/ethernet/intel/iavf/iavf.h > +++ b/drivers/net/ethernet/intel/iavf/iavf.h > @@ -525,7 +525,7 @@ void iavf_set_ethtool_ops(struct net_device *netdev); > void iavf_update_stats(struct iavf_adapter *adapter); void > iavf_reset_interrupt_capability(struct iavf_adapter *adapter); int > iavf_init_interrupt_scheme(struct iavf_adapter *adapter); -void > iavf_irq_enable_queues(struct iavf_adapter *adapter, u32 mask); > +void iavf_irq_enable_queues(struct iavf_adapter *adapter); > void iavf_free_all_tx_resources(struct iavf_adapter *adapter); void > iavf_free_all_rx_resources(struct iavf_adapter *adapter); > > diff --git a/drivers/net/ethernet/intel/iavf/iavf_main.c > b/drivers/net/ethernet/intel/iavf/iavf_main.c > index 1ad0fe7f6dda..e18d7cacf99c 100644 > --- a/drivers/net/ethernet/intel/iavf/iavf_main.c > +++ b/drivers/net/ethernet/intel/iavf/iavf_main.c > @@ -359,21 +359,18 @@ static void iavf_irq_disable(struct iavf_adapter > *adapter) } > > /** > - * iavf_irq_enable_queues - Enable interrupt for specified queues > + * iavf_irq_enable_queues - Enable interrupt for all queues > * @adapter: board private structure > - * @mask: bitmap of queues to enable > **/ > -void iavf_irq_enable_queues(struct iavf_adapter *adapter, u32 mask) > +void iavf_irq_enable_queues(struct iavf_adapter *adapter) > { > struct iavf_hw *hw = &adapter->hw; > int i; > > for (i = 1; i < adapter->num_msix_vectors; i++) { > - if (mask & BIT(i - 1)) { > - wr32(hw, IAVF_VFINT_DYN_CTLN1(i - 1), > - IAVF_VFINT_DYN_CTLN1_INTENA_MASK | > - IAVF_VFINT_DYN_CTLN1_ITR_INDX_MASK); > - } > + wr32(hw, IAVF_VFINT_DYN_CTLN1(i - 1), > + IAVF_VFINT_DYN_CTLN1_INTENA_MASK | > + IAVF_VFINT_DYN_CTLN1_ITR_INDX_MASK); > } > } > > @@ -387,7 +384,7 @@ void iavf_irq_enable(struct iavf_adapter *adapter, bool > flush) > struct iavf_hw *hw = &adapter->hw; > > iavf_misc_irq_enable(adapter); > - iavf_irq_enable_queues(adapter, ~0); > + iavf_irq_enable_queues(adapter); > > if (flush) > iavf_flush(hw); > diff --git a/drivers/net/ethernet/intel/iavf/iavf_register.h > b/drivers/net/ethernet/intel/iavf/iavf_register.h > index bf793332fc9d..a19e88898a0b 100644 > --- a/drivers/net/ethernet/intel/iavf/iavf_register.h > +++ b/drivers/net/ethernet/intel/iavf/iavf_register.h > @@ -40,7 +40,7 @@ > #define IAVF_VFINT_DYN_CTL01_INTENA_MASK IAVF_MASK(0x1, > IAVF_VFINT_DYN_CTL01_INTENA_SHIFT) > #define IAVF_VFINT_DYN_CTL01_ITR_INDX_SHIFT 3 #define > IAVF_VFINT_DYN_CTL01_ITR_INDX_MASK IAVF_MASK(0x3, > IAVF_VFINT_DYN_CTL01_ITR_INDX_SHIFT) > -#define IAVF_VFINT_DYN_CTLN1(_INTVF) (0x00003800 + ((_INTVF) * 4)) /* > _i=0...15 */ /* Reset: VFR */ > +#define IAVF_VFINT_DYN_CTLN1(_INTVF) (0x00003800 + ((_INTVF) * 4)) /* > +_i=0...63 */ /* Reset: VFR */ > #define IAVF_VFINT_DYN_CTLN1_INTENA_SHIFT 0 #define > IAVF_VFINT_DYN_CTLN1_INTENA_MASK IAVF_MASK(0x1, > IAVF_VFINT_DYN_CTLN1_INTENA_SHIFT) > #define IAVF_VFINT_DYN_CTLN1_SWINT_TRIG_SHIFT 2 > -- > 2.34.1 Tested-by: Rafal Romanowski <rafal.romanowski@intel.com>
diff --git a/drivers/net/ethernet/intel/iavf/iavf.h b/drivers/net/ethernet/intel/iavf/iavf.h index 9abaff1f2aff..39d0fe76a38f 100644 --- a/drivers/net/ethernet/intel/iavf/iavf.h +++ b/drivers/net/ethernet/intel/iavf/iavf.h @@ -525,7 +525,7 @@ void iavf_set_ethtool_ops(struct net_device *netdev); void iavf_update_stats(struct iavf_adapter *adapter); void iavf_reset_interrupt_capability(struct iavf_adapter *adapter); int iavf_init_interrupt_scheme(struct iavf_adapter *adapter); -void iavf_irq_enable_queues(struct iavf_adapter *adapter, u32 mask); +void iavf_irq_enable_queues(struct iavf_adapter *adapter); void iavf_free_all_tx_resources(struct iavf_adapter *adapter); void iavf_free_all_rx_resources(struct iavf_adapter *adapter); diff --git a/drivers/net/ethernet/intel/iavf/iavf_main.c b/drivers/net/ethernet/intel/iavf/iavf_main.c index 1ad0fe7f6dda..e18d7cacf99c 100644 --- a/drivers/net/ethernet/intel/iavf/iavf_main.c +++ b/drivers/net/ethernet/intel/iavf/iavf_main.c @@ -359,21 +359,18 @@ static void iavf_irq_disable(struct iavf_adapter *adapter) } /** - * iavf_irq_enable_queues - Enable interrupt for specified queues + * iavf_irq_enable_queues - Enable interrupt for all queues * @adapter: board private structure - * @mask: bitmap of queues to enable **/ -void iavf_irq_enable_queues(struct iavf_adapter *adapter, u32 mask) +void iavf_irq_enable_queues(struct iavf_adapter *adapter) { struct iavf_hw *hw = &adapter->hw; int i; for (i = 1; i < adapter->num_msix_vectors; i++) { - if (mask & BIT(i - 1)) { - wr32(hw, IAVF_VFINT_DYN_CTLN1(i - 1), - IAVF_VFINT_DYN_CTLN1_INTENA_MASK | - IAVF_VFINT_DYN_CTLN1_ITR_INDX_MASK); - } + wr32(hw, IAVF_VFINT_DYN_CTLN1(i - 1), + IAVF_VFINT_DYN_CTLN1_INTENA_MASK | + IAVF_VFINT_DYN_CTLN1_ITR_INDX_MASK); } } @@ -387,7 +384,7 @@ void iavf_irq_enable(struct iavf_adapter *adapter, bool flush) struct iavf_hw *hw = &adapter->hw; iavf_misc_irq_enable(adapter); - iavf_irq_enable_queues(adapter, ~0); + iavf_irq_enable_queues(adapter); if (flush) iavf_flush(hw); diff --git a/drivers/net/ethernet/intel/iavf/iavf_register.h b/drivers/net/ethernet/intel/iavf/iavf_register.h index bf793332fc9d..a19e88898a0b 100644 --- a/drivers/net/ethernet/intel/iavf/iavf_register.h +++ b/drivers/net/ethernet/intel/iavf/iavf_register.h @@ -40,7 +40,7 @@ #define IAVF_VFINT_DYN_CTL01_INTENA_MASK IAVF_MASK(0x1, IAVF_VFINT_DYN_CTL01_INTENA_SHIFT) #define IAVF_VFINT_DYN_CTL01_ITR_INDX_SHIFT 3 #define IAVF_VFINT_DYN_CTL01_ITR_INDX_MASK IAVF_MASK(0x3, IAVF_VFINT_DYN_CTL01_ITR_INDX_SHIFT) -#define IAVF_VFINT_DYN_CTLN1(_INTVF) (0x00003800 + ((_INTVF) * 4)) /* _i=0...15 */ /* Reset: VFR */ +#define IAVF_VFINT_DYN_CTLN1(_INTVF) (0x00003800 + ((_INTVF) * 4)) /* _i=0...63 */ /* Reset: VFR */ #define IAVF_VFINT_DYN_CTLN1_INTENA_SHIFT 0 #define IAVF_VFINT_DYN_CTLN1_INTENA_MASK IAVF_MASK(0x1, IAVF_VFINT_DYN_CTLN1_INTENA_SHIFT) #define IAVF_VFINT_DYN_CTLN1_SWINT_TRIG_SHIFT 2
Enable more than 32 IRQs by removing the u32 bit mask in iavf_irq_enable_queues(). There is no need for the mask as there are no callers that select individual IRQs through the bitmask. Also, if the PF allocates more than 32 IRQs, this mask will prevent us from using all of them. The comment in iavf_register.h is modified to show that the maximum number allowed for the IRQ index is 63 as per the iAVF standard 1.0 [1]. link: [1] https://www.intel.com/content/dam/www/public/us/en/documents/product-specifications/ethernet-adaptive-virtual-function-hardware-spec.pdf Signed-off-by: Ahmed Zaki <ahmed.zaki@intel.com> --- v2: modify comment in iavf_register.h and clarify commit message --- drivers/net/ethernet/intel/iavf/iavf.h | 2 +- drivers/net/ethernet/intel/iavf/iavf_main.c | 15 ++++++--------- drivers/net/ethernet/intel/iavf/iavf_register.h | 2 +- 3 files changed, 8 insertions(+), 11 deletions(-)