From: Faiz Abbas > Sent: 19 October 2017 14:09 > On Thursday 19 October 2017 06:13 PM, Faiz Abbas wrote: > > Enable support for printing the LTSSM link state for debugging PCI > > when link is down. > > > > Signed-off-by: Faiz Abbas <faiz_abbas@xxxxxx> > > --- > > v2: > > 1. Changed dev_err() to dev_dbg() > > 2. Changed static char array to static const char * const > > 3. format changes > > > > drivers/pci/dwc/pci-dra7xx.c | 48 ++++++++++++++++++++++++++++++++++++++++++++ > > 1 file changed, 48 insertions(+) > > > > diff --git a/drivers/pci/dwc/pci-dra7xx.c b/drivers/pci/dwc/pci-dra7xx.c > > index 34427a6..0e70e77 100644 > > --- a/drivers/pci/dwc/pci-dra7xx.c > > +++ b/drivers/pci/dwc/pci-dra7xx.c > > @@ -98,6 +98,45 @@ struct dra7xx_pcie_of_data { > > > > #define to_dra7xx_pcie(x) dev_get_drvdata((x)->dev) > > > > +static const char * const state[] = { > > + "DETECT_QUIET", ... > > + "RCVRY_EQ3" > > +}; > > + > > static inline u32 dra7xx_pcie_readl(struct dra7xx_pcie *pcie, u32 offset) > > { > > return readl(pcie->base + offset); > > @@ -118,6 +157,15 @@ static int dra7xx_pcie_link_up(struct dw_pcie *pci) > > { > > struct dra7xx_pcie *dra7xx = to_dra7xx_pcie(pci); > > u32 reg = dra7xx_pcie_readl(dra7xx, PCIECTRL_DRA7XX_CONF_PHY_CS); > > + u32 cmd_reg; > > + u32 ltssm_state; > > + > > + if (!(reg & LINK_UP)) { > > + cmd_reg = dra7xx_pcie_readl(dra7xx, > > + PCIECTRL_DRA7XX_CONF_DEVICE_CMD); > > + ltssm_state = (cmd_reg & GENMASK(7, 2)) >> 2; > > + dev_dbg(pci->dev, "Link state:%s\n", state[ltssm_state]); Hmmm... GENMASK leaves by hunting header files... Why not (cmd_reg >> 2) & 63 and explicitly define state[64] to guarantee that you never print anything worse than a NULL pointer. > > + } > > > > return !!(reg & LINK_UP); > > } > > > > I missed David's comment in v1. Will submit a new version. Please ignore. I've a 'neat' trick for generating strings that match constants. You can get the compiler to do all the work for you: (Assuming I've typed it correctly) #define LTSSM_DEFS(x) \ x(DETECT_QUIET) \ x(DETECT_ACT) \ (continue for all the names) Define an enum with the named constants: #define X(name) LTSSM_STATE_##name, enum (LTSSM_DEFS(X) LTSSM_STATE_SIZE=64); #undef X Array of strings: #define X(name) [LTSSM_STATE_##name] = #name static const char * const state_names[LTSSM_STATE_SIZE] = { LTSSM_DEFS(X) }; #undef X David ��.n��������+%������w��{.n�����{�������ܨ}���Ơz�j:+v�����w����ޙ��&�)ߡ�a����z�ޗ���ݢj��w�f