[PATCH 10/15] ps3stor_lib: Add support for multiple regions

Geert Uytterhoeven geert at linux-m68k.org
Tue Aug 2 06:35:07 EST 2011


On Mon, Aug 1, 2011 at 22:03, Andre Heider <a.heider at gmail.com> wrote:
> Users (ps3disk, ps3flash and ps3rom) retain the old behavior. That is:
> they still only provide access to the first accessible region.
>
> Signed-off-by: Andre Heider <a.heider at gmail.com>
> ---
>  arch/powerpc/include/asm/ps3stor.h |    4 ++--
>  drivers/block/ps3disk.c            |   15 +++++++++++++--
>  drivers/char/ps3flash.c            |   23 +++++++++++++++++------
>  drivers/ps3/ps3stor_lib.c          |   25 ++++++++++++-------------
>  drivers/scsi/ps3rom.c              |   11 +++++++----
>  5 files changed, 51 insertions(+), 27 deletions(-)
>
> diff --git a/arch/powerpc/include/asm/ps3stor.h b/arch/powerpc/include/asm/ps3stor.h
> index d51e53c..9871c05 100644
> --- a/arch/powerpc/include/asm/ps3stor.h
> +++ b/arch/powerpc/include/asm/ps3stor.h
> @@ -51,7 +51,6 @@ struct ps3_storage_device {
>
>        unsigned int num_regions;
>        unsigned long accessible_regions;
> -       unsigned int region_idx;                /* first accessible region */
>        struct ps3_storage_region regions[0];   /* Must be last */
>  };
>
> @@ -63,7 +62,8 @@ static inline struct ps3_storage_device *to_ps3_storage_device(struct device *de
>  extern int ps3stor_setup(struct ps3_storage_device *dev,
>                         irq_handler_t handler);
>  extern void ps3stor_teardown(struct ps3_storage_device *dev);
> -extern u64 ps3stor_read_write_sectors(struct ps3_storage_device *dev, u64 lpar,
> +extern u64 ps3stor_read_write_sectors(struct ps3_storage_device *dev,
> +                                     unsigned int region_idx, u64 lpar,
>                                      u64 start_sector, u64 sectors,
>                                      int write);
>  extern u64 ps3stor_send_command(struct ps3_storage_device *dev, u64 cmd,
> diff --git a/drivers/block/ps3disk.c b/drivers/block/ps3disk.c
> index 8e1ce2e..96e00ff 100644
> --- a/drivers/block/ps3disk.c
> +++ b/drivers/block/ps3disk.c
> @@ -42,6 +42,7 @@ struct ps3disk_private {
>        spinlock_t lock;                /* Request queue spinlock */
>        struct request_queue *queue;
>        struct gendisk *gendisk;
> +       unsigned int region_idx;        /* first accessible region */
>        unsigned int blocking_factor;
>        struct request *req;
>        u64 raw_capacity;
> @@ -125,7 +126,7 @@ static int ps3disk_submit_request_sg(struct ps3_storage_device *dev,
>        int write = rq_data_dir(req), res;
>        const char *op = write ? "write" : "read";
>        u64 start_sector, sectors;
> -       unsigned int region_id = dev->regions[dev->region_idx].id;
> +       unsigned int region_id = dev->regions[priv->region_idx].id;
>
>  #ifdef DEBUG
>        unsigned int n = 0;
> @@ -408,6 +409,7 @@ static int __devinit ps3disk_probe(struct ps3_system_bus_device *_dev)
>        unsigned int devidx;
>        struct request_queue *queue;
>        struct gendisk *gendisk;
> +       unsigned int region_idx;
>
>        if (dev->blk_size < 512) {
>                dev_err(&dev->sbd.core,
> @@ -482,6 +484,14 @@ static int __devinit ps3disk_probe(struct ps3_system_bus_device *_dev)
>        }
>
>        priv->gendisk = gendisk;
> +
> +       /* find first accessible region */
> +       for (region_idx = 0; region_idx < dev->num_regions; region_idx++)
> +               if (test_bit(region_idx, &dev->accessible_regions)) {
> +                       priv->region_idx = region_idx;
> +                       break;
> +               }
> +

Why not

priv->region_idx = __ffs(dev->accessible_regions);

like the original code in ps3stor_probe_access() used? Cfr. the code
you removed:

> diff --git a/drivers/ps3/ps3stor_lib.c b/drivers/ps3/ps3stor_lib.c
> index af0afa1..5bbc023 100644
> --- a/drivers/ps3/ps3stor_lib.c
> +++ b/drivers/ps3/ps3stor_lib.c
> @@ -124,15 +128,8 @@ static int ps3stor_probe_access(struct ps3_storage_device *dev)
>        n = hweight_long(dev->accessible_regions);
>        if (n > 1)
>                dev_info(&dev->sbd.core,
> -                        "%s:%u: %lu accessible regions found. Only the first "
> -                        "one will be used\n",
> +                        "%s:%u: %lu accessible regions found\n",
>                         __func__, __LINE__, n);
> -       dev->region_idx = __ffs(dev->accessible_regions);
> -       dev_info(&dev->sbd.core,
> -                "First accessible region has index %u start %llu size %llu\n",
> -                dev->region_idx, dev->regions[dev->region_idx].start,
> -                dev->regions[dev->region_idx].size);
> -
>        return 0;
>  }
>

Same in the other drivers.

Gr{oetje,eeting}s,

                        Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert at linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
                                -- Linus Torvalds


More information about the Linuxppc-dev mailing list