linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 2/3] pci: Remove users of pci_enable_device_bars()
@ 2007-12-20  4:28 Benjamin Herrenschmidt
  2007-12-21  2:59 ` patch pci-remove-users-of-pci_enable_device_bars.patch added to gregkh-2.6 tree gregkh
  2008-01-07 19:42 ` [PATCH 2/3] pci: Remove users of pci_enable_device_bars() Andrew Vasquez
  0 siblings, 2 replies; 6+ messages in thread
From: Benjamin Herrenschmidt @ 2007-12-20  4:28 UTC (permalink / raw)
  To: Greg Kroah-Hartman
  Cc: linux-pci, linux-kernel, ink, Alan Cox, james.smart,
	linux-driver, Bartlomiej Zolnierkiewicz

This patch converts users of pci_enable_device_bars() to the new
pci_enable_device_{io,mem} interface.

The new API fits nicely, except maybe for the QLA case where a bit of
code re-organization might be a good idea but I prefer sticking to the
simple patch as I don't have hardware to test on.

I'll also need some feedback on the cs5520 change.

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
---

 drivers/ata/pata_cs5520.c       |    2 +-
 drivers/i2c/busses/scx200_acb.c |    2 +-
 drivers/ide/pci/cs5520.c        |   10 ++++++++--
 drivers/ide/setup-pci.c         |    6 ++++--
 drivers/scsi/lpfc/lpfc_init.c   |    3 +--
 drivers/scsi/qla2xxx/qla_os.c   |   12 +++++++++---
 6 files changed, 24 insertions(+), 11 deletions(-)

--- linux-work.orig/drivers/ata/pata_cs5520.c	2007-12-18 09:37:55.000000000 +1100
+++ linux-work/drivers/ata/pata_cs5520.c	2007-12-18 09:39:03.000000000 +1100
@@ -229,7 +229,7 @@ static int __devinit cs5520_init_one(str
 		return -ENOMEM;
 
 	/* Perform set up for DMA */
-	if (pci_enable_device_bars(pdev, 1<<2)) {
+	if (pci_enable_device_io(pdev)) {
 		printk(KERN_ERR DRV_NAME ": unable to configure BAR2.\n");
 		return -ENODEV;
 	}
Index: linux-work/drivers/i2c/busses/scx200_acb.c
===================================================================
--- linux-work.orig/drivers/i2c/busses/scx200_acb.c	2007-12-18 09:37:55.000000000 +1100
+++ linux-work/drivers/i2c/busses/scx200_acb.c	2007-12-18 09:39:03.000000000 +1100
@@ -492,7 +492,7 @@ static __init int scx200_create_pci(cons
 	iface->pdev = pdev;
 	iface->bar = bar;
 
-	rc = pci_enable_device_bars(iface->pdev, 1 << iface->bar);
+	rc = pci_enable_device_io(iface->pdev);
 	if (rc)
 		goto errout_free;
 
Index: linux-work/drivers/ide/pci/cs5520.c
===================================================================
--- linux-work.orig/drivers/ide/pci/cs5520.c	2007-12-18 09:37:55.000000000 +1100
+++ linux-work/drivers/ide/pci/cs5520.c	2007-12-18 09:39:03.000000000 +1100
@@ -160,8 +160,14 @@ static int __devinit cs5520_init_one(str
 	ide_setup_pci_noise(dev, d);
 
 	/* We must not grab the entire device, it has 'ISA' space in its
-	   BARS too and we will freak out other bits of the kernel */
-	if (pci_enable_device_bars(dev, 1<<2)) {
+	 * BARS too and we will freak out other bits of the kernel
+	 *
+	 * pci_enable_device_bars() is going away. I replaced it with
+	 * IO only enable for now but I'll need confirmation this is
+	 * allright for that device. If not, it will need some kind of
+	 * quirk. --BenH.
+	 */
+	if (pci_enable_device_io(dev)) {
 		printk(KERN_WARNING "%s: Unable to enable 55x0.\n", d->name);
 		return -ENODEV;
 	}
Index: linux-work/drivers/ide/setup-pci.c
===================================================================
--- linux-work.orig/drivers/ide/setup-pci.c	2007-12-18 09:37:55.000000000 +1100
+++ linux-work/drivers/ide/setup-pci.c	2007-12-18 09:40:07.000000000 +1100
@@ -236,7 +236,9 @@ EXPORT_SYMBOL_GPL(ide_setup_pci_noise);
  *	@d: IDE port info
  *
  *	Enable the IDE PCI device. We attempt to enable the device in full
- *	but if that fails then we only need BAR4 so we will enable that.
+ *	but if that fails then we only need IO space. The PCI code should
+ *	have setup the proper resources for us already for controllers in
+ *	legacy mode.
  *	
  *	Returns zero on success or an error code
  */
@@ -246,7 +248,7 @@ static int ide_pci_enable(struct pci_dev
 	int ret;
 
 	if (pci_enable_device(dev)) {
-		ret = pci_enable_device_bars(dev, 1 << 4);
+		ret = pci_enable_device_io(dev);
 		if (ret < 0) {
 			printk(KERN_WARNING "%s: (ide_setup_pci_device:) "
 				"Could not enable device.\n", d->name);
Index: linux-work/drivers/scsi/lpfc/lpfc_init.c
===================================================================
--- linux-work.orig/drivers/scsi/lpfc/lpfc_init.c	2007-12-18 09:37:55.000000000 +1100
+++ linux-work/drivers/scsi/lpfc/lpfc_init.c	2007-12-18 09:39:03.000000000 +1100
@@ -2100,10 +2100,9 @@ static pci_ers_result_t lpfc_io_slot_res
 	struct Scsi_Host *shost = pci_get_drvdata(pdev);
 	struct lpfc_hba *phba = ((struct lpfc_vport *)shost->hostdata)->phba;
 	struct lpfc_sli *psli = &phba->sli;
-	int bars = pci_select_bars(pdev, IORESOURCE_MEM);
 
 	dev_printk(KERN_INFO, &pdev->dev, "recovering from a slot reset.\n");
-	if (pci_enable_device_bars(pdev, bars)) {
+	if (pci_enable_device_mem(pdev)) {
 		printk(KERN_ERR "lpfc: Cannot re-enable "
 			"PCI device after reset.\n");
 		return PCI_ERS_RESULT_DISCONNECT;
Index: linux-work/drivers/scsi/qla2xxx/qla_os.c
===================================================================
--- linux-work.orig/drivers/scsi/qla2xxx/qla_os.c	2007-12-18 09:37:55.000000000 +1100
+++ linux-work/drivers/scsi/qla2xxx/qla_os.c	2007-12-18 09:39:03.000000000 +1100
@@ -1583,7 +1583,7 @@ qla2x00_probe_one(struct pci_dev *pdev, 
 	char pci_info[30];
 	char fw_str[30];
 	struct scsi_host_template *sht;
-	int bars;
+	int bars, mem_only = 0;
 
 	bars = pci_select_bars(pdev, IORESOURCE_MEM | IORESOURCE_IO);
 	sht = &qla2x00_driver_template;
@@ -1594,10 +1594,16 @@ qla2x00_probe_one(struct pci_dev *pdev, 
 	    pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2532) {
 		bars = pci_select_bars(pdev, IORESOURCE_MEM);
 		sht = &qla24xx_driver_template;
+		mem_only = 1;
 	}
 
-	if (pci_enable_device_bars(pdev, bars))
-		goto probe_out;
+	if (mem_only) {
+		if (pci_enable_device_mem(pdev))
+			goto probe_out;
+	} else {
+		if (pci_enable_device(pdev))
+			goto probe_out;
+	}
 
 	if (pci_find_aer_capability(pdev))
 		if (pci_enable_pcie_error_reporting(pdev))

^ permalink raw reply	[flat|nested] 6+ messages in thread

* patch pci-remove-users-of-pci_enable_device_bars.patch added to gregkh-2.6 tree
  2007-12-20  4:28 [PATCH 2/3] pci: Remove users of pci_enable_device_bars() Benjamin Herrenschmidt
@ 2007-12-21  2:59 ` gregkh
  2008-01-07 19:42 ` [PATCH 2/3] pci: Remove users of pci_enable_device_bars() Andrew Vasquez
  1 sibling, 0 replies; 6+ messages in thread
From: gregkh @ 2007-12-21  2:59 UTC (permalink / raw)
  To: benh, alan, bzolnier, greg, gregkh, ink, james.smart,
	linux-driver, linux-kernel


This is a note to let you know that I've just added the patch titled

     Subject: PCI: Remove users of pci_enable_device_bars()

to my gregkh-2.6 tree.  Its filename is

     pci-remove-users-of-pci_enable_device_bars.patch

This tree can be found at 
    http://www.kernel.org/pub/linux/kernel/people/gregkh/gregkh-2.6/patches/


>From benh@ozlabs.org Wed Dec 19 20:30:44 2007
From: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Date: Thu, 20 Dec 2007 15:28:09 +1100
Subject: PCI: Remove users of pci_enable_device_bars()
To: Greg Kroah-Hartman <greg@kroah.com>
Cc: linux-pci@atrey.karlin.mff.cuni.cz, <linux-kernel@vger.kernel.org>, <ink@jurassic.park.msu.ru>, Alan Cox <alan@redhat.com>, <james.smart@emulex.com>, <linux-driver@qlogic.com>, Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Message-ID: <20071220042811.D312DDDEE6@ozlabs.org>


This patch converts users of pci_enable_device_bars() to the new
pci_enable_device_{io,mem} interface.

The new API fits nicely, except maybe for the QLA case where a bit of
code re-organization might be a good idea but I prefer sticking to the
simple patch as I don't have hardware to test on.

I'll also need some feedback on the cs5520 change.

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

---
 drivers/ata/pata_cs5520.c       |    2 +-
 drivers/i2c/busses/scx200_acb.c |    2 +-
 drivers/ide/pci/cs5520.c        |   10 ++++++++--
 drivers/ide/setup-pci.c         |    6 ++++--
 drivers/scsi/lpfc/lpfc_init.c   |    3 +--
 drivers/scsi/qla2xxx/qla_os.c   |   12 +++++++++---
 6 files changed, 24 insertions(+), 11 deletions(-)

--- a/drivers/ata/pata_cs5520.c
+++ b/drivers/ata/pata_cs5520.c
@@ -229,7 +229,7 @@ static int __devinit cs5520_init_one(str
 		return -ENOMEM;
 
 	/* Perform set up for DMA */
-	if (pci_enable_device_bars(pdev, 1<<2)) {
+	if (pci_enable_device_io(pdev)) {
 		printk(KERN_ERR DRV_NAME ": unable to configure BAR2.\n");
 		return -ENODEV;
 	}
--- a/drivers/i2c/busses/scx200_acb.c
+++ b/drivers/i2c/busses/scx200_acb.c
@@ -492,7 +492,7 @@ static __init int scx200_create_pci(cons
 	iface->pdev = pdev;
 	iface->bar = bar;
 
-	rc = pci_enable_device_bars(iface->pdev, 1 << iface->bar);
+	rc = pci_enable_device_io(iface->pdev);
 	if (rc)
 		goto errout_free;
 
--- a/drivers/ide/pci/cs5520.c
+++ b/drivers/ide/pci/cs5520.c
@@ -160,8 +160,14 @@ static int __devinit cs5520_init_one(str
 	ide_setup_pci_noise(dev, d);
 
 	/* We must not grab the entire device, it has 'ISA' space in its
-	   BARS too and we will freak out other bits of the kernel */
-	if (pci_enable_device_bars(dev, 1<<2)) {
+	 * BARS too and we will freak out other bits of the kernel
+	 *
+	 * pci_enable_device_bars() is going away. I replaced it with
+	 * IO only enable for now but I'll need confirmation this is
+	 * allright for that device. If not, it will need some kind of
+	 * quirk. --BenH.
+	 */
+	if (pci_enable_device_io(dev)) {
 		printk(KERN_WARNING "%s: Unable to enable 55x0.\n", d->name);
 		return -ENODEV;
 	}
--- a/drivers/ide/setup-pci.c
+++ b/drivers/ide/setup-pci.c
@@ -236,7 +236,9 @@ EXPORT_SYMBOL_GPL(ide_setup_pci_noise);
  *	@d: IDE port info
  *
  *	Enable the IDE PCI device. We attempt to enable the device in full
- *	but if that fails then we only need BAR4 so we will enable that.
+ *	but if that fails then we only need IO space. The PCI code should
+ *	have setup the proper resources for us already for controllers in
+ *	legacy mode.
  *	
  *	Returns zero on success or an error code
  */
@@ -246,7 +248,7 @@ static int ide_pci_enable(struct pci_dev
 	int ret;
 
 	if (pci_enable_device(dev)) {
-		ret = pci_enable_device_bars(dev, 1 << 4);
+		ret = pci_enable_device_io(dev);
 		if (ret < 0) {
 			printk(KERN_WARNING "%s: (ide_setup_pci_device:) "
 				"Could not enable device.\n", d->name);
--- a/drivers/scsi/lpfc/lpfc_init.c
+++ b/drivers/scsi/lpfc/lpfc_init.c
@@ -2100,10 +2100,9 @@ static pci_ers_result_t lpfc_io_slot_res
 	struct Scsi_Host *shost = pci_get_drvdata(pdev);
 	struct lpfc_hba *phba = ((struct lpfc_vport *)shost->hostdata)->phba;
 	struct lpfc_sli *psli = &phba->sli;
-	int bars = pci_select_bars(pdev, IORESOURCE_MEM);
 
 	dev_printk(KERN_INFO, &pdev->dev, "recovering from a slot reset.\n");
-	if (pci_enable_device_bars(pdev, bars)) {
+	if (pci_enable_device_mem(pdev)) {
 		printk(KERN_ERR "lpfc: Cannot re-enable "
 			"PCI device after reset.\n");
 		return PCI_ERS_RESULT_DISCONNECT;
--- a/drivers/scsi/qla2xxx/qla_os.c
+++ b/drivers/scsi/qla2xxx/qla_os.c
@@ -1583,7 +1583,7 @@ qla2x00_probe_one(struct pci_dev *pdev, 
 	char pci_info[30];
 	char fw_str[30];
 	struct scsi_host_template *sht;
-	int bars;
+	int bars, mem_only = 0;
 
 	bars = pci_select_bars(pdev, IORESOURCE_MEM | IORESOURCE_IO);
 	sht = &qla2x00_driver_template;
@@ -1594,10 +1594,16 @@ qla2x00_probe_one(struct pci_dev *pdev, 
 	    pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2532) {
 		bars = pci_select_bars(pdev, IORESOURCE_MEM);
 		sht = &qla24xx_driver_template;
+		mem_only = 1;
 	}
 
-	if (pci_enable_device_bars(pdev, bars))
-		goto probe_out;
+	if (mem_only) {
+		if (pci_enable_device_mem(pdev))
+			goto probe_out;
+	} else {
+		if (pci_enable_device(pdev))
+			goto probe_out;
+	}
 
 	if (pci_find_aer_capability(pdev))
 		if (pci_enable_pcie_error_reporting(pdev))


Patches currently in gregkh-2.6 which might be from benh@kernel.crashing.org are

bad/battery-class-driver.patch
driver/adb-convert-from-class_device-to-device.patch
driver/kobject-convert-hvc_console-to-use-kref-not-kobject.patch
driver/kobject-convert-hvcs-to-use-kref-not-kobject.patch
driver/kobject-convert-icom-to-use-kref-not-kobject.patch
pci/pci-fix-bus-resource-assignment-on-32-bits-with-64b-resources.patch
pci/pci-fix-warning-in-setup-res.c-on-32-bit-platforms-with-64-bit-resources.patch
pci/pci-add-pci_enable_device_-io-mem-intefaces.patch
pci/pci-remove-pci_enable_device_bars.patch
pci/pci-remove-users-of-pci_enable_device_bars.patch
usb/usb-remove-ohci-useless-masking-unmasking-of-wdh-interrupt.patch

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 2/3] pci: Remove users of pci_enable_device_bars()
  2007-12-20  4:28 [PATCH 2/3] pci: Remove users of pci_enable_device_bars() Benjamin Herrenschmidt
  2007-12-21  2:59 ` patch pci-remove-users-of-pci_enable_device_bars.patch added to gregkh-2.6 tree gregkh
@ 2008-01-07 19:42 ` Andrew Vasquez
  2008-01-07 20:48   ` Benjamin Herrenschmidt
  1 sibling, 1 reply; 6+ messages in thread
From: Andrew Vasquez @ 2008-01-07 19:42 UTC (permalink / raw)
  To: Benjamin Herrenschmidt, James Bottomley
  Cc: Greg Kroah-Hartman, linux-pci, linux-kernel, ink, Alan Cox,
	james.smart, linux-driver, Bartlomiej Zolnierkiewicz

On Thu, 20 Dec 2007, Benjamin Herrenschmidt wrote:

> This patch converts users of pci_enable_device_bars() to the new
> pci_enable_device_{io,mem} interface.
> 
> The new API fits nicely, except maybe for the QLA case where a bit of
> code re-organization might be a good idea but I prefer sticking to the
> simple patch as I don't have hardware to test on.

That's fine.  I take it these patches will be funneled via
gregkh/pci-2.6.git.  There's some qla2xxx updates which are queued for
post-2.6.24 consumption in jejb/scsi-misc-2.6.git which don't appear
to have any conflicts.

I do though have a series of patches which I'll hold off on submitting
to linux-scsi until these PCI changes are merged, as there's some
minor conflicts merging the three branches.  James B, will that be
fine?

The patches themselves appear to be working fine within several of our
test rings.  I hold off on some of the cleanup post-merge time...

Thanks,
Andrew Vasquez

> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
> ---
> 
>  drivers/ata/pata_cs5520.c       |    2 +-
>  drivers/i2c/busses/scx200_acb.c |    2 +-
>  drivers/ide/pci/cs5520.c        |   10 ++++++++--
>  drivers/ide/setup-pci.c         |    6 ++++--
>  drivers/scsi/lpfc/lpfc_init.c   |    3 +--
>  drivers/scsi/qla2xxx/qla_os.c   |   12 +++++++++---

Acked-by: Andrew Vasquez <andrew.vasquez@qlogic.com>

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 2/3] pci: Remove users of pci_enable_device_bars()
  2008-01-07 19:42 ` [PATCH 2/3] pci: Remove users of pci_enable_device_bars() Andrew Vasquez
@ 2008-01-07 20:48   ` Benjamin Herrenschmidt
  2008-02-01  0:14     ` Andrew Vasquez
  0 siblings, 1 reply; 6+ messages in thread
From: Benjamin Herrenschmidt @ 2008-01-07 20:48 UTC (permalink / raw)
  To: Andrew Vasquez
  Cc: James Bottomley, Greg Kroah-Hartman, linux-pci, linux-kernel,
	ink, Alan Cox, james.smart, linux-driver,
	Bartlomiej Zolnierkiewicz


On Mon, 2008-01-07 at 11:42 -0800, Andrew Vasquez wrote:
> That's fine.  I take it these patches will be funneled via
> gregkh/pci-2.6.git.  There's some qla2xxx updates which are queued for
> post-2.6.24 consumption in jejb/scsi-misc-2.6.git which don't appear
> to have any conflicts.
> 
> I do though have a series of patches which I'll hold off on submitting
> to linux-scsi until these PCI changes are merged, as there's some
> minor conflicts merging the three branches.  James B, will that be
> fine?
> 
> The patches themselves appear to be working fine within several of our
> test rings.  I hold off on some of the cleanup post-merge time...

Thanks for testing ! They should be queued with Greg indeed.

Cheers,
Ben.



^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 2/3] pci: Remove users of pci_enable_device_bars()
  2008-01-07 20:48   ` Benjamin Herrenschmidt
@ 2008-02-01  0:14     ` Andrew Vasquez
  2008-02-01  5:08       ` Greg KH
  0 siblings, 1 reply; 6+ messages in thread
From: Andrew Vasquez @ 2008-02-01  0:14 UTC (permalink / raw)
  To: Greg Kroah-Hartman
  Cc: James Bottomley, Benjamin Herrenschmidt, linux-pci, linux-kernel,
	ink, Alan Cox, james.smart, linux-driver,
	Bartlomiej Zolnierkiewicz

On Tue, 08 Jan 2008, Benjamin Herrenschmidt wrote:

> On Mon, 2008-01-07 at 11:42 -0800, Andrew Vasquez wrote:
> > That's fine.  I take it these patches will be funneled via
> > gregkh/pci-2.6.git.  There's some qla2xxx updates which are queued for
> > post-2.6.24 consumption in jejb/scsi-misc-2.6.git which don't appear
> > to have any conflicts.
> > 
> > I do though have a series of patches which I'll hold off on submitting
> > to linux-scsi until these PCI changes are merged, as there's some
> > minor conflicts merging the three branches.  James B, will that be
> > fine?
> > 
> > The patches themselves appear to be working fine within several of our
> > test rings.  I hold off on some of the cleanup post-merge time...
> 
> Thanks for testing ! They should be queued with Greg indeed.

Just curious, this patch-set hasn't made it upstream to linux-2.6.git,
will the work be deferred to 2.6.26??

--
av

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 2/3] pci: Remove users of pci_enable_device_bars()
  2008-02-01  0:14     ` Andrew Vasquez
@ 2008-02-01  5:08       ` Greg KH
  0 siblings, 0 replies; 6+ messages in thread
From: Greg KH @ 2008-02-01  5:08 UTC (permalink / raw)
  To: Andrew Vasquez
  Cc: James Bottomley, Benjamin Herrenschmidt, linux-pci, linux-kernel,
	ink, Alan Cox, james.smart, linux-driver,
	Bartlomiej Zolnierkiewicz

On Thu, Jan 31, 2008 at 04:14:45PM -0800, Andrew Vasquez wrote:
> On Tue, 08 Jan 2008, Benjamin Herrenschmidt wrote:
> 
> > On Mon, 2008-01-07 at 11:42 -0800, Andrew Vasquez wrote:
> > > That's fine.  I take it these patches will be funneled via
> > > gregkh/pci-2.6.git.  There's some qla2xxx updates which are queued for
> > > post-2.6.24 consumption in jejb/scsi-misc-2.6.git which don't appear
> > > to have any conflicts.
> > > 
> > > I do though have a series of patches which I'll hold off on submitting
> > > to linux-scsi until these PCI changes are merged, as there's some
> > > minor conflicts merging the three branches.  James B, will that be
> > > fine?
> > > 
> > > The patches themselves appear to be working fine within several of our
> > > test rings.  I hold off on some of the cleanup post-merge time...
> > 
> > Thanks for testing ! They should be queued with Greg indeed.
> 
> Just curious, this patch-set hasn't made it upstream to linux-2.6.git,
> will the work be deferred to 2.6.26??

It's less than one week into the merge window, and people are getting
worried, sheesh :)

Yes, this is queued up to go to Linus, been busy working on other issues
at the moment, don't worry, I'll make the window.  Hopefully get them
all out tomorrow...

thanks,

greg k-h

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2008-02-01  5:09 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2007-12-20  4:28 [PATCH 2/3] pci: Remove users of pci_enable_device_bars() Benjamin Herrenschmidt
2007-12-21  2:59 ` patch pci-remove-users-of-pci_enable_device_bars.patch added to gregkh-2.6 tree gregkh
2008-01-07 19:42 ` [PATCH 2/3] pci: Remove users of pci_enable_device_bars() Andrew Vasquez
2008-01-07 20:48   ` Benjamin Herrenschmidt
2008-02-01  0:14     ` Andrew Vasquez
2008-02-01  5:08       ` Greg KH

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).