Message ID | 20201211164137.8605-1-puranjay12@gmail.com |
---|---|
State | New |
Headers | show |
Series | drivers: block: skd: remove skd_pci_info() | expand |
On 12/11/20 08:45, Puranjay Mohan wrote: > PCI core calls __pcie_print_link_status() for every device, it prints > both the link width and the link speed. skd_pci_info() does the same > thing again, hence it can be removed. > > Signed-off-by: Puranjay Mohan <puranjay12@gmail.com> > --- > drivers/block/skd_main.c | 31 ------------------------------- > 1 file changed, 31 deletions(-) > > diff --git a/drivers/block/skd_main.c b/drivers/block/skd_main.c > index a962b4551bed..da7aac5335d9 100644 > --- a/drivers/block/skd_main.c > +++ b/drivers/block/skd_main.c > @@ -3134,40 +3134,11 @@ static const struct pci_device_id skd_pci_tbl[] = { > > MODULE_DEVICE_TABLE(pci, skd_pci_tbl); > > -static char *skd_pci_info(struct skd_device *skdev, char *str) > -{ > - int pcie_reg; > - > - strcpy(str, "PCIe ("); > - pcie_reg = pci_find_capability(skdev->pdev, PCI_CAP_ID_EXP); > - > - if (pcie_reg) { > - > - char lwstr[6]; > - uint16_t pcie_lstat, lspeed, lwidth; > - > - pcie_reg += 0x12; > - pci_read_config_word(skdev->pdev, pcie_reg, &pcie_lstat); > - lspeed = pcie_lstat & (0xF); > - lwidth = (pcie_lstat & 0x3F0) >> 4; > - > - if (lspeed == 1) > - strcat(str, "2.5GT/s "); > - else if (lspeed == 2) > - strcat(str, "5.0GT/s "); > - else > - strcat(str, "<unknown> "); The skd driver prints unknown if the speed is not "2.5GT/s" or "5.0GT/s". __pcie_print_link_status() prints "unknown" only if speed value >= ARRAY_SIZE(speed_strings). If a buggy skd card returns value that is not != ("2.5GT/s" or "5.0GT/s") && value < ARRAY_SIZE(speed_strings) then it will not print the unknown but the value from speed string array. Which breaks the current behavior. Please correct me if I'm wrong. > - snprintf(lwstr, sizeof(lwstr), "%dX)", lwidth); > - strcat(str, lwstr); > - } > - return str; > -} > > static int skd_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) > { > int i; > int rc = 0; > - char pci_str[32]; > struct skd_device *skdev; > > dev_dbg(&pdev->dev, "vendor=%04X device=%04x\n", pdev->vendor, > @@ -3201,8 +3172,6 @@ static int skd_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) > goto err_out_regions; > } > > - skd_pci_info(skdev, pci_str); > - dev_info(&pdev->dev, "%s 64bit\n", pci_str); > > pci_set_master(pdev); > rc = pci_enable_pcie_error_reporting(pdev);
On Fri, Dec 11, 2020 at 09:50:52PM +0000, Chaitanya Kulkarni wrote: > On 12/11/20 08:45, Puranjay Mohan wrote: > > PCI core calls __pcie_print_link_status() for every device, it prints > > both the link width and the link speed. skd_pci_info() does the same > > thing again, hence it can be removed. > > > > Signed-off-by: Puranjay Mohan <puranjay12@gmail.com> > > --- > > drivers/block/skd_main.c | 31 ------------------------------- > > 1 file changed, 31 deletions(-) > > > > diff --git a/drivers/block/skd_main.c b/drivers/block/skd_main.c > > index a962b4551bed..da7aac5335d9 100644 > > --- a/drivers/block/skd_main.c > > +++ b/drivers/block/skd_main.c > > @@ -3134,40 +3134,11 @@ static const struct pci_device_id skd_pci_tbl[] = { > > > > MODULE_DEVICE_TABLE(pci, skd_pci_tbl); > > > > -static char *skd_pci_info(struct skd_device *skdev, char *str) > > -{ > > - int pcie_reg; > > - > > - strcpy(str, "PCIe ("); > > - pcie_reg = pci_find_capability(skdev->pdev, PCI_CAP_ID_EXP); > > - > > - if (pcie_reg) { > > - > > - char lwstr[6]; > > - uint16_t pcie_lstat, lspeed, lwidth; > > - > > - pcie_reg += 0x12; > > - pci_read_config_word(skdev->pdev, pcie_reg, &pcie_lstat); > > - lspeed = pcie_lstat & (0xF); > > - lwidth = (pcie_lstat & 0x3F0) >> 4; > > - > > - if (lspeed == 1) > > - strcat(str, "2.5GT/s "); > > - else if (lspeed == 2) > > - strcat(str, "5.0GT/s "); > > - else > > - strcat(str, "<unknown> "); > The skd driver prints unknown if the speed is not "2.5GT/s" or "5.0GT/s". > __pcie_print_link_status() prints "unknown" only if speed > value >= ARRAY_SIZE(speed_strings). > > If a buggy skd card returns value that is not != ("2.5GT/s" or "5.0GT/s") > && value < ARRAY_SIZE(speed_strings) then it will not print the unknown but > the value from speed string array. > > Which breaks the current behavior. Please correct me if I'm wrong. I think you're right, but I don't think it actually *breaks* anything. For skd devices that work correctly, there should be no problem, and if there ever were an skd device that operated at a speed greater than 5GT/s, the PCI core would print that speed correctly instead of having the driver print "<unknown>". I don't think it's a good idea to have a driver artificially constrain the speed a device operates at. And the existing code doesn't actually constrain anything; it only prints "<unknown>" if it doesn't recognize it. The probe still succeeds. I don't see much value in that "<unknown>". Or am I missing an actual problem this patch causes? > > - snprintf(lwstr, sizeof(lwstr), "%dX)", lwidth); > > - strcat(str, lwstr); > > - } > > - return str; > > -} > > > > static int skd_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) > > { > > int i; > > int rc = 0; > > - char pci_str[32]; > > struct skd_device *skdev; > > > > dev_dbg(&pdev->dev, "vendor=%04X device=%04x\n", pdev->vendor, > > @@ -3201,8 +3172,6 @@ static int skd_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) > > goto err_out_regions; > > } > > > > - skd_pci_info(skdev, pci_str); > > - dev_info(&pdev->dev, "%s 64bit\n", pci_str); > > > > pci_set_master(pdev); > > rc = pci_enable_pcie_error_reporting(pdev); >
On Fri, 2020-12-11 at 22:11 +0530, Puranjay Mohan wrote: > PCI core calls __pcie_print_link_status() for every device, it prints > both the link width and the link speed. skd_pci_info() does the same > thing again, hence it can be removed. Hmmm... On my box, I see this for the skd card: [ 8.509243] pci 0000:d8:00.0: [1b39:0001] type 00 class 0x018000 [ 8.515933] pci 0000:d8:00.0: reg 0x10: [mem 0xfbe00000-0xfbe0ffff] [ 8.521924] pci 0000:d8:00.0: reg 0x14: [mem 0xfbe10000-0xfbe10fff] [ 8.527957] pci 0000:d8:00.0: reg 0x30: [mem 0xfbd00000-0xfbdfffff pref] [ 8.534999] pci 0000:d8:00.0: supports D1 D2 No link speed. Checking the code, I think you need to actually call pcie_print_link_status() (which calls __pcie_print_link_status() with verbose = true) from the driver to see anything. Otherwise, the PCIe core will not print anything if the driver is just probing and getting resources for the card. > > Signed-off-by: Puranjay Mohan <puranjay12@gmail.com> > --- > drivers/block/skd_main.c | 31 ------------------------------- > 1 file changed, 31 deletions(-) > > diff --git a/drivers/block/skd_main.c b/drivers/block/skd_main.c > index a962b4551bed..da7aac5335d9 100644 > --- a/drivers/block/skd_main.c > +++ b/drivers/block/skd_main.c [...] > static int skd_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) > { > int i; > int rc = 0; > - char pci_str[32]; > struct skd_device *skdev; > > dev_dbg(&pdev->dev, "vendor=%04X device=%04x\n", pdev->vendor, > @@ -3201,8 +3172,6 @@ static int skd_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) > goto err_out_regions; > } > > - skd_pci_info(skdev, pci_str); > - dev_info(&pdev->dev, "%s 64bit\n", pci_str); Replace these 2 lines with: pcie_print_link_status(pdev); And the link speed information will be printed.
diff --git a/drivers/block/skd_main.c b/drivers/block/skd_main.c index a962b4551bed..da7aac5335d9 100644 --- a/drivers/block/skd_main.c +++ b/drivers/block/skd_main.c @@ -3134,40 +3134,11 @@ static const struct pci_device_id skd_pci_tbl[] = { MODULE_DEVICE_TABLE(pci, skd_pci_tbl); -static char *skd_pci_info(struct skd_device *skdev, char *str) -{ - int pcie_reg; - - strcpy(str, "PCIe ("); - pcie_reg = pci_find_capability(skdev->pdev, PCI_CAP_ID_EXP); - - if (pcie_reg) { - - char lwstr[6]; - uint16_t pcie_lstat, lspeed, lwidth; - - pcie_reg += 0x12; - pci_read_config_word(skdev->pdev, pcie_reg, &pcie_lstat); - lspeed = pcie_lstat & (0xF); - lwidth = (pcie_lstat & 0x3F0) >> 4; - - if (lspeed == 1) - strcat(str, "2.5GT/s "); - else if (lspeed == 2) - strcat(str, "5.0GT/s "); - else - strcat(str, "<unknown> "); - snprintf(lwstr, sizeof(lwstr), "%dX)", lwidth); - strcat(str, lwstr); - } - return str; -} static int skd_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) { int i; int rc = 0; - char pci_str[32]; struct skd_device *skdev; dev_dbg(&pdev->dev, "vendor=%04X device=%04x\n", pdev->vendor, @@ -3201,8 +3172,6 @@ static int skd_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) goto err_out_regions; } - skd_pci_info(skdev, pci_str); - dev_info(&pdev->dev, "%s 64bit\n", pci_str); pci_set_master(pdev); rc = pci_enable_pcie_error_reporting(pdev);
PCI core calls __pcie_print_link_status() for every device, it prints both the link width and the link speed. skd_pci_info() does the same thing again, hence it can be removed. Signed-off-by: Puranjay Mohan <puranjay12@gmail.com> --- drivers/block/skd_main.c | 31 ------------------------------- 1 file changed, 31 deletions(-)