Re: [PATCH 7/7] Staging: rts5208: helper function to manage delink states

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Sun, Jun 14, 2015 at 03:48:53PM +0200, Fabio Falzoi wrote:
> Use a helper function to manage delink states
> 
> Signed-off-by: Fabio Falzoi <fabio.falzoi84@xxxxxxxxx>
> ---
>  drivers/staging/rts5208/rtsx_chip.c | 141 ++++++++++++++++++------------------
>  1 file changed, 72 insertions(+), 69 deletions(-)
> 
> diff --git a/drivers/staging/rts5208/rtsx_chip.c b/drivers/staging/rts5208/rtsx_chip.c
> index 298163a..d6fb6cd 100644
> --- a/drivers/staging/rts5208/rtsx_chip.c
> +++ b/drivers/staging/rts5208/rtsx_chip.c
> @@ -1318,6 +1318,77 @@ static void rtsx_manage_1lun_mode(struct rtsx_chip *chip)
>  #endif
>  }
>  
> +static void rtsx_delink_stage1(struct rtsx_chip *chip, int enter_L1,
> +			       int stage3_cnt)
> +{
> +	u8 val;
> +
> +	rtsx_set_stat(chip, RTSX_STAT_DELINK);
> +
> +	if (chip->asic_code && CHECK_PID(chip, 0x5208))
> +		rtsx_set_phy_reg_bit(chip, 0x1C, 2);
> +
> +	if (chip->card_exist)
> +		dev_dbg(rtsx_dev(chip), "False card inserted, do force delink\n");
> +	else
> +		dev_dbg(rtsx_dev(chip), "No card inserted, do delink\n");
> +
> +	if (enter_L1)
> +		rtsx_write_register(chip, HOST_SLEEP_STATE, 0x03, 1);
> +
> +	if (chip->card_exist)
> +		val = 0x03;

This should be 0x02.  Please fix it in another patch.


> +	else
> +		val = 0x0A;
> +
> +	rtsx_write_register(chip, CHANGE_LINK_STATE, val, val);
> +
> +	if (enter_L1)
> +		rtsx_enter_L1(chip);
> +
> +	if (chip->card_exist)
> +		chip->auto_delink_cnt = stage3_cnt + 1;
> +}
> +
> +static void rtsx_delink_stage(struct rtsx_chip *chip)
> +{
> +	int delink_stage1_cnt, delink_stage2_cnt, delink_stage3_cnt;
> +	int enter_L1;
> +
> +	if (!chip->auto_delink_en || !chip->auto_delink_allowed ||
> +	    chip->card_ready || chip->card_ejected || chip->sd_io) {
> +		chip->auto_delink_cnt = 0;
> +		return;
> +	}
> +
> +	enter_L1 = chip->auto_delink_in_L1 &&
> +		(chip->aspm_l0s_l1_en || chip->ss_en);
> +
> +	delink_stage1_cnt = chip->delink_stage1_step;
> +	delink_stage2_cnt = delink_stage1_cnt + chip->delink_stage2_step;
> +	delink_stage3_cnt = delink_stage2_cnt + chip->delink_stage3_step;
> +
> +	if (chip->auto_delink_cnt > delink_stage3_cnt)
> +		return;
> +
> +	if (chip->auto_delink_cnt == delink_stage1_cnt)
> +		rtsx_delink_stage1(chip, enter_L1, delink_stage3_cnt);
> +
> +	if (chip->auto_delink_cnt == delink_stage2_cnt) {
> +		dev_dbg(rtsx_dev(chip), "Try to do force delink\n");
> +
> +		if (enter_L1)
> +			rtsx_exit_L1(chip);
> +
> +		if (chip->asic_code && CHECK_PID(chip, 0x5208))
> +			rtsx_set_phy_reg_bit(chip, 0x1C, 2);
> +
> +		rtsx_write_register(chip, CHANGE_LINK_STATE, 0x0A, 0x0A);
> +	}
> +
> +	chip->auto_delink_cnt++;


You didn't introduce this, but I'm not positive the
chip->auto_delink_cnt value is correct.  It feels like
rtsx_delink_stage1() increments it; fine; but then if it's
not equal to delink_stage2_cnt should we increment it again?

It's fine if you don't know the answer, I was just wondering if maybe
someone on the CC list knows.

regards,
dan carpenter


> +}
> +
>  void rtsx_polling_func(struct rtsx_chip *chip)
>  {
>  	if (rtsx_chk_stat(chip, RTSX_STAT_SUSPEND))
> @@ -1372,75 +1443,7 @@ void rtsx_polling_func(struct rtsx_chip *chip)
>  		rtsx_manage_1lun_mode(chip);
>  
>  delink_stage:
> -	if (chip->auto_delink_en && chip->auto_delink_allowed &&
> -	    !chip->card_ready && !chip->card_ejected && !chip->sd_io) {
> -		int enter_L1 = chip->auto_delink_in_L1 && (
> -			chip->aspm_l0s_l1_en || chip->ss_en);
> -		int delink_stage1_cnt = chip->delink_stage1_step;
> -		int delink_stage2_cnt = delink_stage1_cnt +
> -			chip->delink_stage2_step;
> -		int delink_stage3_cnt = delink_stage2_cnt +
> -			chip->delink_stage3_step;
> -
> -		if (chip->auto_delink_cnt <= delink_stage3_cnt) {
> -			if (chip->auto_delink_cnt == delink_stage1_cnt) {
> -				rtsx_set_stat(chip, RTSX_STAT_DELINK);
> -
> -				if (chip->asic_code && CHECK_PID(chip, 0x5208))
> -					rtsx_set_phy_reg_bit(chip, 0x1C, 2);
> -
> -				if (chip->card_exist) {
> -					dev_dbg(rtsx_dev(chip), "False card inserted, do force delink\n");
> -
> -					if (enter_L1)
> -						rtsx_write_register(chip,
> -							      HOST_SLEEP_STATE,
> -							      0x03, 1);
> -
> -					rtsx_write_register(chip,
> -							    CHANGE_LINK_STATE,
> -							    0x0A, 0x0A);
> -
> -					if (enter_L1)
> -						rtsx_enter_L1(chip);
> -
> -					chip->auto_delink_cnt =
> -						delink_stage3_cnt + 1;
> -				} else {
> -					dev_dbg(rtsx_dev(chip), "No card inserted, do delink\n");
> -
> -					if (enter_L1)
> -						rtsx_write_register(chip,
> -							      HOST_SLEEP_STATE,
> -							      0x03, 1);
> -
> -					rtsx_write_register(chip,
> -							    CHANGE_LINK_STATE,
> -							    0x02, 0x02);
> -
> -					if (enter_L1)
> -						rtsx_enter_L1(chip);
> -				}
> -			}
> -
> -			if (chip->auto_delink_cnt == delink_stage2_cnt) {
> -				dev_dbg(rtsx_dev(chip), "Try to do force delink\n");
> -
> -				if (enter_L1)
> -					rtsx_exit_L1(chip);
> -
> -				if (chip->asic_code && CHECK_PID(chip, 0x5208))
> -					rtsx_set_phy_reg_bit(chip, 0x1C, 2);
> -
> -				rtsx_write_register(chip, CHANGE_LINK_STATE,
> -						    0x0A, 0x0A);
> -			}
> -
> -			chip->auto_delink_cnt++;
> -		}
> -	} else {
> -		chip->auto_delink_cnt = 0;
> -	}
> +	rtsx_delink_stage(chip);
>  }
>  
>  void rtsx_undo_delink(struct rtsx_chip *chip)
> -- 
> 2.1.4
> 
> _______________________________________________
> devel mailing list
> devel@xxxxxxxxxxxxxxxxxxxxxx
> http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
_______________________________________________
devel mailing list
devel@xxxxxxxxxxxxxxxxxxxxxx
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel



[Index of Archives]     [Linux Driver Backports]     [DMA Engine]     [Linux GPIO]     [Linux SPI]     [Video for Linux]     [Linux USB Devel]     [Linux Coverity]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux