All of lore.kernel.org
 help / color / mirror / Atom feed
From: Sergei Shtylyov <sshtylyov@ru.mvista.com>
To: Masoud Sharbiani <masouds@google.com>
Cc: bzolnier@gmail.com, akpm@linux-foundation.org,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH] Fix pointer arithmetic in hpt3xx driver code (2nd attempt)
Date: Sat, 06 Sep 2008 02:27:31 +0400	[thread overview]
Message-ID: <48C1B253.4060805@ru.mvista.com> (raw)
In-Reply-To: <20080905210110.GE26371@google.com>

Hello.

Masoud Sharbiani wrote:

> Hi there, 
>   

   Er... I think the maintainer will have to remove this... :-)

> git commit 74811f355f4f69a187fa74892dcf2a684b84ce99 causes crash at
> module load (or boot) time on my machine with a hpt374 controller.
> Sergei says this is due to the pointer arithmatic. This patch fixes that
> and makes my machine boot again.
> cheers, 
> Masoud
>   

   And "cheers" too...

> Signed-Off-By: Masoud Sharbiani <masouds@google.com>
>   

Acked-by: Sergei Shtylyov <sshtylyov@ru.mvista.com>

> diff --git a/drivers/ide/pci/hpt366.c b/drivers/ide/pci/hpt366.c
> index eb107ee..4e04d0a 100644
> --- a/drivers/ide/pci/hpt366.c
> +++ b/drivers/ide/pci/hpt366.c
> @@ -613,6 +613,14 @@ static int check_in_drive_list(ide_drive_t *drive, const char **list)
>  	return 0;
>  }
>  
> +static struct hpt_info *hpt3xx_get_info(struct device *dev)
>   

   That also will do. Though 'struct pci_dev' seems preferrable as it's 
always pre-calculated by the callers and otherwise needed in them in 4 
cases out of 7.

> +{
> +	struct pci_dev *pci_dev = to_pci_dev(dev);
> +	struct ide_host *host	= pci_get_drvdata(pci_dev);
>   

   Could be just:

	struct ide_host *host	= pci_get_drvdata(to_pci_dev(dev));


> +	struct hpt_info *info	= (struct hpt_info *)host->host_priv;
>   

   No epmty line after declaration block again. :-)

> +	return dev == host->dev[1] ? info + 1 : info;
> +}
> +
>  /*
>   * The Marvell bridge chips used on the HighPoint SATA cards do not seem
>   * to support the UltraDMA modes 1, 2, and 3 as well as any MWDMA modes...
> @@ -621,9 +629,7 @@ static int check_in_drive_list(ide_drive_t *drive, const char **list)
>  static u8 hpt3xx_udma_filter(ide_drive_t *drive)
>  {
>  	ide_hwif_t *hwif	= HWIF(drive);
> -	struct pci_dev *dev	= to_pci_dev(hwif->dev);
> -	struct ide_host *host	= pci_get_drvdata(dev);
> -	struct hpt_info *info	= host->host_priv + (hwif->dev == host->dev[1]);
> +	struct hpt_info *info	= hpt3xx_get_info(hwif->dev);
>  	u8 mask 		= hwif->ultra_mask;
>  
>  	switch (info->chip_type) {
> @@ -662,9 +668,7 @@ static u8 hpt3xx_udma_filter(ide_drive_t *drive)
>  static u8 hpt3xx_mdma_filter(ide_drive_t *drive)
>  {
>  	ide_hwif_t *hwif	= HWIF(drive);
> -	struct pci_dev *dev	= to_pci_dev(hwif->dev);
> -	struct ide_host *host	= pci_get_drvdata(dev);
> -	struct hpt_info *info	= host->host_priv + (hwif->dev == host->dev[1]);
> +	struct hpt_info *info	= hpt3xx_get_info(hwif->dev);
>  
>  	switch (info->chip_type) {
>  	case HPT372 :
> @@ -700,8 +704,7 @@ static void hpt3xx_set_mode(ide_drive_t *drive, const u8 speed)
>  {
>  	ide_hwif_t *hwif	= drive->hwif;
>  	struct pci_dev *dev	= to_pci_dev(hwif->dev);
> -	struct ide_host *host	= pci_get_drvdata(dev);
> -	struct hpt_info *info	= host->host_priv + (hwif->dev == host->dev[1]);
> +	struct hpt_info *info	= hpt3xx_get_info(hwif->dev);
>  	struct hpt_timings *t	= info->timings;
>  	u8  itr_addr		= 0x40 + (drive->dn * 4);
>  	u32 old_itr		= 0;
> @@ -743,9 +746,8 @@ static void hpt3xx_quirkproc(ide_drive_t *drive)
>  static void hpt3xx_maskproc(ide_drive_t *drive, int mask)
>  {
>  	ide_hwif_t *hwif	= HWIF(drive);
> -	struct pci_dev	*dev	= to_pci_dev(hwif->dev);
> -	struct ide_host *host	= pci_get_drvdata(dev);
> -	struct hpt_info *info	= host->host_priv + (hwif->dev == host->dev[1]);
> +	struct pci_dev  *dev    = to_pci_dev(hwif->dev);
> +	struct hpt_info *info	= hpt3xx_get_info(hwif->dev);
>  
>  	if (drive->quirk_list) {
>  		if (info->chip_type >= HPT370) {
> @@ -973,8 +975,7 @@ static int __devinit hpt37x_calibrate_dpll(struct pci_dev *dev, u16 f_low, u16 f
>  static unsigned int __devinit init_chipset_hpt366(struct pci_dev *dev)
>  {
>  	unsigned long io_base	= pci_resource_start(dev, 4);
> -	struct ide_host *host	= pci_get_drvdata(dev);
> -	struct hpt_info *info	= host->host_priv + (&dev->dev == host->dev[1]);
> +	struct hpt_info *info	= hpt3xx_get_info(&dev->dev);
>  	const char *name	= DRV_NAME;
>  	u8 pci_clk,  dpll_clk	= 0;	/* PCI and DPLL clock in MHz */
>  	u8 chip_type;
> @@ -1217,8 +1218,7 @@ static unsigned int __devinit init_chipset_hpt366(struct pci_dev *dev)
>  static u8 hpt3xx_cable_detect(ide_hwif_t *hwif)
>  {
>  	struct pci_dev	*dev	= to_pci_dev(hwif->dev);
> -	struct ide_host *host	= pci_get_drvdata(dev);
> -	struct hpt_info *info	= host->host_priv + (hwif->dev == host->dev[1]);
> +	struct hpt_info *info	= hpt3xx_get_info(hwif->dev);
>  	u8 chip_type		= info->chip_type;
>  	u8 scr1 = 0, ata66	= hwif->channel ? 0x01 : 0x02;
>  
> @@ -1262,8 +1262,7 @@ static u8 hpt3xx_cable_detect(ide_hwif_t *hwif)
>  static void __devinit init_hwif_hpt366(ide_hwif_t *hwif)
>  {
>  	struct pci_dev *dev	= to_pci_dev(hwif->dev);
> -	struct ide_host *host	= pci_get_drvdata(dev);
> -	struct hpt_info *info	= host->host_priv + (hwif->dev == host->dev[1]);
> +	struct hpt_info *info	= hpt3xx_get_info(hwif->dev);
>  	int serialize		= HPT_SERIALIZE_IO;
>  	u8  chip_type		= info->chip_type;
>  	u8  new_mcr, old_mcr	= 0;
>   

MBR, Sergei



      reply	other threads:[~2008-09-05 22:27 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-09-05 21:01 [PATCH] Fix pointer arithmetic in hpt3xx driver code (2nd attempt) Masoud Sharbiani
2008-09-05 22:27 ` Sergei Shtylyov [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=48C1B253.4060805@ru.mvista.com \
    --to=sshtylyov@ru.mvista.com \
    --cc=akpm@linux-foundation.org \
    --cc=bzolnier@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=masouds@google.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.