# where is "struct resource_list" defined ?



## liuwang (Nov 14, 2011)

Where is struct resource_list defined? Could not be found in /usr/src.


----------



## plamaiziere (Nov 14, 2011)

liuwang said:
			
		

> where is "struct resource_list" defined ?
> Could not be found in /usr/src.



This is a STAILQ of resource_list_entry, see queue(3).

http://fxr.watson.org/fxr/source/sys/bus.h?v=FREEBSD8;im=3#L246

Regards


----------



## liuwang (Nov 14, 2011)

plamaiziere,

Thanks.
<sys/queue.h> and <sys/bus.h> are included and won't resovle the compiling errors.

Sincerely,
Liu


----------



## SirDice (Nov 15, 2011)

Perhaps if you showed us the code and the exact error we may be able to help.


----------



## liuwang (Nov 15, 2011)

SirDice,

Thanks the help here.

The project is to port our PCIe controller card to FreeBSD from Linux. When porting Linux function pci_request_regions() to FreeBSD we met the compiling error 
	
	



```
error: dereferencing pointer to incomplete type
```
 at the c sentences of rl = &dinfo->resources; in the following code segment.

[cmd=]make depend[/cmd] has been launched in kernel level and doesn't help.

Local type casting has been tried and doesn't help either.

Looks we go astray the PCIe porting methodology in FreeBSD.

Sincerely,
Liu


```
/*----------------------------
 *
 * AOC_main.c
 *
 * x8 PCIe controller driver 
 ---------------------------*/
 
#include <sys/param.h>
#include <sys/module.h>
#include <sys/kernel.h>
#include <sys/systm.h>
#include <sys/errno.h>
#include <sys/conf.h>
#include <sys/uio.h>
#include <sys/malloc.h>
#include <sys/bus.h>
#include <sys/types.h>
#include <machine/bus.h>
#include <sys/rman.h>
#include <machine/resource.h>

#include <dev/pci/pcivar.h>
#include <dev/pci/pcireg.h>
#include <sys/queue.h>
#include <sys/bus.h>
#include <sys/pciio.h>
#include <dev/pci/pci_private.h>
#include <asm/atomic.h>
#include <bus_if.h>
#include <AOC.h>
#define VENDOR_ID  0x1b4b
#define MAX_REQUEST_NUMBER_PERFORMANCE	4096


struct AOC_softc
{
  device_t AOC_dev;
  struct cdev *AOC_cdev;
};

static int AOC_pci_request_regions( struct device *dev, const char *res_name )
{
  int i,j;
  int rid;
  int bar;
  struct resource_list_entry *rle;
  struct pci_devinfo *dinfo;
  struct resource_list *rl=NULL;

  for ( i = 0; i <= PCIR_MAX_BAR_0; i++ ) 
  {
    bar = PCIR_BAR( i );
    dinfo = dev->ivars;
    rl = &dinfo->resources;
    rle = resource_list_find( rl, SYS_RES_MEMORY, i );
    if( rle == NULL )
    {
      dinfo = device_get_ivars(dev);
      rl = &dinfo->resources;
      rle = resource_list_find( rl, SYS_RES_IOPORT, i );
    };
    if( rle == NULL )
    return (-ENODEV);
    rid = PCIR_BAR( i );
    if (bus_alloc_resource_any(dev, rle->type, &rid, RF_ACTIVE) == NULL)
    {
      for (j = 0; j <= PCIR_MAX_BAR_0; j++)
      {
        {
          bar = PCIR_BAR( bar );
          {
            dinfo = device_get_ivars( dev );
            rl = &dinfo->resources;
            rle = resource_list_find( rl, SYS_RES_MEMORY, j );
          };
          if ( rle == NULL )
          {
              dinfo = device_get_ivars( dev );
              rl = &dinfo->resources;
              rle = resource_list_find( rl, SYS_RES_IOPORT, i );
          };
        };
	if (rle == NULL)
	bus_release_resource(dev, rle->type, rle->rid, rle->res);
      };
      return (-EINVAL);
    };
  }
  return (0);
};

static int AOC_probe( device_t dev )
{
  device_printf( dev, "AOC Probe\nVendor ID : 0x%x\nDevice ID : 0x%x\n", pci_get_vendor( dev ), pci_get_device( dev ) );
  if ( pci_get_vendor( dev ) == VENDOR_ID )
  {
    printf( "AOC probe successful !\n" );
    device_set_desc( dev, "AOC");

    pci_enable_io( dev, SYS_RES_IOPORT );
    pci_enable_io( dev, SYS_RES_MEMORY );

    AOC_pci_request_regions(dev, "AOC");
    ...
    ...
};
```


----------



## wblock@ (Nov 15, 2011)

Please put code inside 
	
	



```
blocks so the formatting is preserved.

It's probably better to ask these questions on the mailing lists.  [url=http://lists.freebsd.org/mailman/listinfo/freebsd-drivers]freebsd-drivers[/url] might be the place to start.
```


----------



## liuwang (Nov 15, 2011)

*Re-format: Where is " resource_list " defined ?*

Wblock,

Thanks.
Will do.

Sincerely,
Liu



```
*----------------------------
*
* AOC_main.c
*
* x8 PCIe controller driver 
---------------------------*/

#include <sys/param.h>
#include <sys/module.h>
#include <sys/kernel.h>
#include <sys/systm.h>
#include <sys/errno.h>
#include <sys/conf.h>
#include <sys/uio.h>
#include <sys/malloc.h>
#include <sys/bus.h>
#include <sys/types.h>
#include <machine/bus.h>
#include <sys/rman.h>
#include <machine/resource.h>

#include <dev/pci/pcivar.h>
#include <dev/pci/pcireg.h>
#include <sys/queue.h>
#include <sys/bus.h>
#include <sys/pciio.h>
#include <dev/pci/pci_private.h>
#include <asm/atomic.h>
#include <bus_if.h>
#include <AOC.h>
#define VENDOR_ID 0x1b4b
#define MAX_REQUEST_NUMBER_PERFORMANCE 4096


struct AOC_softc
{
  device_t AOC_dev;
  struct cdev *AOC_cdev;
};

static int AOC_pci_request_regions( struct device *dev, const char *res_name )
{
  int i,j;
  int rid;
  int bar;
  struct resource_list_entry *rle;
  struct pci_devinfo *dinfo;
  struct resource_list *rl=NULL;

  for ( i = 0; i <= PCIR_MAX_BAR_0; i++ ) 
  {
    bar = PCIR_BAR( i );
    dinfo = dev->ivars;
    rl = &dinfo->resources;
    rle = resource_list_find( rl, SYS_RES_MEMORY, i );
    if( rle == NULL )
    {
      dinfo = device_get_ivars(dev);
      rl = &dinfo->resources;
      rle = resource_list_find( rl, SYS_RES_IOPORT, i );
    };
    if( rle == NULL )
    return (-ENODEV);
    rid = PCIR_BAR( i );
    if (bus_alloc_resource_any(dev, rle->type, &rid, RF_ACTIVE) == NULL)
    {
      for (j = 0; j <= PCIR_MAX_BAR_0; j++)
      {
        {
          bar = PCIR_BAR( bar );
          {
            dinfo = device_get_ivars( dev );
            rl = &dinfo->resources;
            rle = resource_list_find( rl, SYS_RES_MEMORY, j );
          };
          if ( rle == NULL )
          {
            dinfo = device_get_ivars( dev );
            rl = &dinfo->resources;
            rle = resource_list_find( rl, SYS_RES_IOPORT, i );
          };
        };
        if (rle == NULL)
        bus_release_resource(dev, rle->type, rle->rid, rle->res);
      };
      return (-EINVAL);
    };
  }
  return (0);
};

static int AOC_probe( device_t dev )
{
  device_printf( dev, "AOC Probe\nVendor ID : 0x%x\nDevice ID : 0x%x\n", pci_get_vendor( dev ), pci_get_device( dev ) );
  if ( pci_get_vendor( dev ) == VENDOR_ID )
  {
    printf( "AOC probe successful !\n" );
    device_set_desc( dev, "AOC");

    pci_enable_io( dev, SYS_RES_IOPORT );
    pci_enable_io( dev, SYS_RES_MEMORY );

    AOC_pci_request_regions(dev, "AOC");
    ...
    ...
};
```


----------



## DutchDaemon (Nov 16, 2011)

```
, not [file] ...
```


----------



## SirDice (Nov 16, 2011)

I am by no means a kernel hacker, not even a programmer actually..

But what happens if you change this:

```
struct resource_list_entry *rle;
  struct resource_list *rl=NULL;
{....snip.....}
    bar = PCIR_BAR( i );
    dinfo = dev->ivars;
    rl = [b]&[/b]dinfo->resources;
    rle = resource_list_find( rl, SYS_RES_MEMORY, i );
```

To this:

```
struct resource_list_entry *rle;
  struct resource_list *rl=NULL;
{....snip.....}
    bar = PCIR_BAR( i );
    dinfo = dev->ivars;
    rl = dinfo->resources;
    rle = resource_list_find( [b]&[/b]rl, SYS_RES_MEMORY, i );
```

Note the movement of the ampersand. Or just cut out that extra step, it doesn't seem to be used anywhere else anyway.


```
struct resource_list_entry *rle;
  struct resource_list *rl=NULL;
{....snip.....}
    bar = PCIR_BAR( i );
    dinfo = dev->ivars;
    rle = resource_list_find( &dinfo->resources, SYS_RES_MEMORY, i );
```


----------



## liuwang (Nov 16, 2011)

*BTW Mr. John-Mark Gurney [jmg@funkthat.com] is helping me out with the methodology in*

SirDice,

Thanks your looking into this.

All combination of & * . -> have been tried and won't help in resolving this.

BTW Mr. John-Mark Gurney [jmg@funkthat.com] is helping me out with the methodology in porting our PCIe controller card from Linux to FreeBSD. 

I am following his approach.

Sincerely,
Liu Wang


----------



## liuwang (Nov 16, 2011)

DutchDaemon,

By 
	
	



```
do you mean [cmd] ?
I could only see [cmd]&[file] options there.

Should we manually quote it with [code] &
```
 pair ?

Sincerely,
Liu


----------



## liuwang (Nov 16, 2011)

whoops ! It verified itself. I need to manually quote it with code&/code pair.

Sincerely,
Liu


----------



## SirDice (Nov 17, 2011)

liuwang said:
			
		

> BTW Mr. John-Mark Gurney [jmg@funkthat.com] is helping me out with the methodology in porting our PCIe controller card from Linux to FreeBSD.
> 
> I am following his approach.


Sounds like a plan :e

If you solve it, please share your solution. I'm sure other people might be interested.



> By
> 
> 
> 
> ...


----------



## liuwang (Nov 17, 2011)

SirDice,

Will do sir.

Sincerely,
Liu


----------

