Re: [PATCH 3/8] pcie, aer: rework MASK macros in aerdrv_errprint.c

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

 



On Fri, 2009-08-21 at 12:46 +0900, Hidetoshi Seto wrote:
> Definitions of MASK macros in aerdrv_errprint.c are tricky and unsafe.
> 
> For example, AER_AGENT_TRANSMITTER_MASK(_sev, _stat) does work like:
>   static inline func(int _sev, int _stat)
>   {
>     if (_sev == AER_CORRECTABLE)
>       return (_stat & (PCI_ERR_COR_REP_ROLL|PCI_ERR_COR_REP_TIMER));
>     else
>       return (_stat & PCI_ERR_COR_REP_ROLL);
>   }
> In case of else path here, for uncorrectable errors, testing bits in
> _stat by PCI_ERR_COR_* does not make sense because _stat should have only
> PCI_ERR_UNC_* bits originated in uncorrectable error status register.
> But at this time this is safe because uncorrectable error using bit
> position same to PCI_ERR_COR_REP_ROLL(= bit position 8) is not defined.
> Likewise, AER_AGENT_COMPLETER_MASK is always PCI_ERR_UNC_COMP_ABORT but
> it works because bit 15 of correctable error status is not defined.
> 
> It means that these MASK macros will turn to be wrong once if new error
> is defined. (In fact, bit 15 of correctable is now defined in PCIe 2.1)
> 
> This patch changes these MASK macros to be more strict, not to return
> PCI_ERR_COR_* bits for uncorrectable error status and vise versa.
> 
> Signed-off-by: Hidetoshi Seto <seto.hidetoshi@xxxxxxxxxxxxxx>
> ---
>  drivers/pci/pcie/aer/aerdrv_errprint.c |   46 ++++++++++++++-----------------
>  1 files changed, 21 insertions(+), 25 deletions(-)
> 
> diff --git a/drivers/pci/pcie/aer/aerdrv_errprint.c b/drivers/pci/pcie/aer/aerdrv_errprint.c
> index 7fb5a2c..48f70fa 100644
> --- a/drivers/pci/pcie/aer/aerdrv_errprint.c
> +++ b/drivers/pci/pcie/aer/aerdrv_errprint.c
> @@ -27,39 +27,35 @@
>  #define AER_AGENT_COMPLETER		2
>  #define AER_AGENT_TRANSMITTER		3
>  
> -#define AER_AGENT_REQUESTER_MASK	(PCI_ERR_UNC_COMP_TIME|	\
> -					PCI_ERR_UNC_UNSUP)
> -
> -#define AER_AGENT_COMPLETER_MASK	PCI_ERR_UNC_COMP_ABORT
> -
> -#define AER_AGENT_TRANSMITTER_MASK(t, e) (e & (PCI_ERR_COR_REP_ROLL| \
> -	((t == AER_CORRECTABLE) ? PCI_ERR_COR_REP_TIMER : 0)))
> +#define AER_AGENT_REQUESTER_MASK(t)	((t == AER_CORRECTABLE) ?	\
> +	0 : (PCI_ERR_UNC_COMP_TIME|PCI_ERR_UNC_UNSUP))
> +#define AER_AGENT_COMPLETER_MASK(t)	((t == AER_CORRECTABLE) ?	\
> +	0 : PCI_ERR_UNC_COMP_ABORT)
> +#define AER_AGENT_TRANSMITTER_MASK(t)	((t == AER_CORRECTABLE) ?	\
> +	(PCI_ERR_COR_REP_ROLL|PCI_ERR_COR_REP_TIMER) : 0)
>  
>  #define AER_GET_AGENT(t, e)						\
> -	((e & AER_AGENT_COMPLETER_MASK) ? AER_AGENT_COMPLETER :		\
> -	(e & AER_AGENT_REQUESTER_MASK) ? AER_AGENT_REQUESTER :		\
> -	(AER_AGENT_TRANSMITTER_MASK(t, e)) ? AER_AGENT_TRANSMITTER :	\
> +	((e & AER_AGENT_COMPLETER_MASK(t)) ? AER_AGENT_COMPLETER :	\
> +	(e & AER_AGENT_REQUESTER_MASK(t)) ? AER_AGENT_REQUESTER :	\
> +	(e & AER_AGENT_TRANSMITTER_MASK(t)) ? AER_AGENT_TRANSMITTER :	\
>  	AER_AGENT_RECEIVER)
>  
> -#define AER_PHYSICAL_LAYER_ERROR_MASK	PCI_ERR_COR_RCVR
> -#define AER_DATA_LINK_LAYER_ERROR_MASK(t, e)	\
> -		(PCI_ERR_UNC_DLP|		\
> -		PCI_ERR_COR_BAD_TLP|		\
> -		PCI_ERR_COR_BAD_DLLP|		\
> -		PCI_ERR_COR_REP_ROLL|		\
> -		((t == AER_CORRECTABLE) ?	\
> -		PCI_ERR_COR_REP_TIMER : 0))
> -
>  #define AER_PHYSICAL_LAYER_ERROR	0
>  #define AER_DATA_LINK_LAYER_ERROR	1
>  #define AER_TRANSACTION_LAYER_ERROR	2
>  
> -#define AER_GET_LAYER_ERROR(t, e)				\
> -	((e & AER_PHYSICAL_LAYER_ERROR_MASK) ?			\
> -	AER_PHYSICAL_LAYER_ERROR :				\
> -	(e & AER_DATA_LINK_LAYER_ERROR_MASK(t, e)) ?		\
> -		AER_DATA_LINK_LAYER_ERROR :			\
> -		AER_TRANSACTION_LAYER_ERROR)
> +#define AER_PHYSICAL_LAYER_ERROR_MASK(t) ((t == AER_CORRECTABLE) ?	\
> +	PCI_ERR_COR_RCVR : 0)
> +#define AER_DATA_LINK_LAYER_ERROR_MASK(t) ((t == AER_CORRECTABLE) ?	\
> +	(PCI_ERR_COR_BAD_TLP|						\
> +	PCI_ERR_COR_BAD_DLLP|						\
> +	PCI_ERR_COR_REP_ROLL|						\
> +	PCI_ERR_COR_REP_TIMER) : PCI_ERR_UNC_DLP)
> +
> +#define AER_GET_LAYER_ERROR(t, e)					\
> +	((e & AER_PHYSICAL_LAYER_ERROR_MASK(t)) ? AER_PHYSICAL_LAYER_ERROR : \
> +	(e & AER_DATA_LINK_LAYER_ERROR_MASK(t)) ? AER_DATA_LINK_LAYER_ERROR : \
> +	AER_TRANSACTION_LAYER_ERROR)
>  
>  #define AER_PR(info, fmt, args...)				\
>  	printk("%s" fmt, (info->severity == AER_CORRECTABLE) ?	\
> -- 
> 1.6.4
> 

Reviewed-by: Andrew Patterson <andrew.patterson@xxxxxx>

> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-pci" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 
-- 
Andrew Patterson
Hewlett-Packard

--
To unsubscribe from this list: send the line "unsubscribe linux-pci" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [DMA Engine]     [Linux Coverity]     [Linux USB]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Greybus]

  Powered by Linux