Message ID | 20240926014332.3905399-4-liyihang9@huawei.com |
---|---|
State | Superseded |
Headers | show |
Series | scsi: hisi_sas: Some fixes for hisi_sas | expand |
Hi Yihang, kernel test robot noticed the following build warnings: [auto build test WARNING on jejb-scsi/for-next] [also build test WARNING on mkp-scsi/for-next linus/master v6.11 next-20240926] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Yihang-Li/scsi-hisi_sas-Adjust-priority-of-registering-and-exiting-debugfs-for-security/20240926-094506 base: https://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi.git for-next patch link: https://lore.kernel.org/r/20240926014332.3905399-4-liyihang9%40huawei.com patch subject: [PATCH 03/13] scsi: hisi_sas: Add firmware information check config: i386-buildonly-randconfig-001-20240926 (https://download.01.org/0day-ci/archive/20240926/202409262056.WfCiaJnA-lkp@intel.com/config) compiler: gcc-12 (Debian 12.2.0-14) 12.2.0 reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240926/202409262056.WfCiaJnA-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202409262056.WfCiaJnA-lkp@intel.com/ All warnings (new ones prefixed by >>): drivers/scsi/hisi_sas/hisi_sas_main.c: In function 'hisi_sas_shost_alloc': >> drivers/scsi/hisi_sas/hisi_sas_main.c:2457:32: warning: returning 'int' from a function with return type 'struct Scsi_Host *' makes pointer from integer without a cast [-Wint-conversion] 2457 | return error; | ^~~~~ vim +2457 drivers/scsi/hisi_sas/hisi_sas_main.c 2424 2425 static struct Scsi_Host *hisi_sas_shost_alloc(struct platform_device *pdev, 2426 const struct hisi_sas_hw *hw) 2427 { 2428 struct resource *res; 2429 struct Scsi_Host *shost; 2430 struct hisi_hba *hisi_hba; 2431 struct device *dev = &pdev->dev; 2432 int error; 2433 2434 shost = scsi_host_alloc(hw->sht, sizeof(*hisi_hba)); 2435 if (!shost) { 2436 dev_err(dev, "scsi host alloc failed\n"); 2437 return NULL; 2438 } 2439 hisi_hba = shost_priv(shost); 2440 2441 INIT_WORK(&hisi_hba->rst_work, hisi_sas_rst_work_handler); 2442 hisi_hba->hw = hw; 2443 hisi_hba->dev = dev; 2444 hisi_hba->platform_dev = pdev; 2445 hisi_hba->shost = shost; 2446 SHOST_TO_SAS_HA(shost) = &hisi_hba->sha; 2447 2448 timer_setup(&hisi_hba->timer, NULL, 0); 2449 2450 if (hisi_sas_get_fw_info(hisi_hba) < 0) 2451 goto err_out; 2452 2453 if (hisi_hba->hw->fw_info_check) { 2454 error = hisi_hba->hw->fw_info_check(hisi_hba); 2455 2456 if (error) > 2457 return error; 2458 } 2459 2460 error = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(64)); 2461 if (error) { 2462 dev_err(dev, "No usable DMA addressing method\n"); 2463 goto err_out; 2464 } 2465 2466 hisi_hba->regs = devm_platform_ioremap_resource(pdev, 0); 2467 if (IS_ERR(hisi_hba->regs)) 2468 goto err_out; 2469 2470 res = platform_get_resource(pdev, IORESOURCE_MEM, 1); 2471 if (res) { 2472 hisi_hba->sgpio_regs = devm_ioremap_resource(dev, res); 2473 if (IS_ERR(hisi_hba->sgpio_regs)) 2474 goto err_out; 2475 } 2476 2477 if (hisi_sas_alloc(hisi_hba)) { 2478 hisi_sas_free(hisi_hba); 2479 goto err_out; 2480 } 2481 2482 return shost; 2483 err_out: 2484 scsi_host_put(shost); 2485 dev_err(dev, "shost alloc failed\n"); 2486 return NULL; 2487 } 2488
Hi Yihang, kernel test robot noticed the following build warnings: [auto build test WARNING on jejb-scsi/for-next] [also build test WARNING on mkp-scsi/for-next linus/master v6.11 next-20240927] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Yihang-Li/scsi-hisi_sas-Adjust-priority-of-registering-and-exiting-debugfs-for-security/20240926-094506 base: https://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi.git for-next patch link: https://lore.kernel.org/r/20240926014332.3905399-4-liyihang9%40huawei.com patch subject: [PATCH 03/13] scsi: hisi_sas: Add firmware information check config: alpha-randconfig-r133-20240929 (https://download.01.org/0day-ci/archive/20240930/202409300042.USclhodY-lkp@intel.com/config) compiler: alpha-linux-gcc (GCC) 13.3.0 reproduce: (https://download.01.org/0day-ci/archive/20240930/202409300042.USclhodY-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202409300042.USclhodY-lkp@intel.com/ sparse warnings: (new ones prefixed by >>) >> drivers/scsi/hisi_sas/hisi_sas_main.c:2457:32: sparse: sparse: incorrect type in return expression (different base types) @@ expected struct Scsi_Host * @@ got int [assigned] error @@ drivers/scsi/hisi_sas/hisi_sas_main.c:2457:32: sparse: expected struct Scsi_Host * drivers/scsi/hisi_sas/hisi_sas_main.c:2457:32: sparse: got int [assigned] error >> drivers/scsi/hisi_sas/hisi_sas_main.c:2457:32: sparse: sparse: non size-preserving integer to pointer cast vim +2457 drivers/scsi/hisi_sas/hisi_sas_main.c 2424 2425 static struct Scsi_Host *hisi_sas_shost_alloc(struct platform_device *pdev, 2426 const struct hisi_sas_hw *hw) 2427 { 2428 struct resource *res; 2429 struct Scsi_Host *shost; 2430 struct hisi_hba *hisi_hba; 2431 struct device *dev = &pdev->dev; 2432 int error; 2433 2434 shost = scsi_host_alloc(hw->sht, sizeof(*hisi_hba)); 2435 if (!shost) { 2436 dev_err(dev, "scsi host alloc failed\n"); 2437 return NULL; 2438 } 2439 hisi_hba = shost_priv(shost); 2440 2441 INIT_WORK(&hisi_hba->rst_work, hisi_sas_rst_work_handler); 2442 hisi_hba->hw = hw; 2443 hisi_hba->dev = dev; 2444 hisi_hba->platform_dev = pdev; 2445 hisi_hba->shost = shost; 2446 SHOST_TO_SAS_HA(shost) = &hisi_hba->sha; 2447 2448 timer_setup(&hisi_hba->timer, NULL, 0); 2449 2450 if (hisi_sas_get_fw_info(hisi_hba) < 0) 2451 goto err_out; 2452 2453 if (hisi_hba->hw->fw_info_check) { 2454 error = hisi_hba->hw->fw_info_check(hisi_hba); 2455 2456 if (error) > 2457 return error; 2458 } 2459 2460 error = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(64)); 2461 if (error) { 2462 dev_err(dev, "No usable DMA addressing method\n"); 2463 goto err_out; 2464 } 2465 2466 hisi_hba->regs = devm_platform_ioremap_resource(pdev, 0); 2467 if (IS_ERR(hisi_hba->regs)) 2468 goto err_out; 2469 2470 res = platform_get_resource(pdev, IORESOURCE_MEM, 1); 2471 if (res) { 2472 hisi_hba->sgpio_regs = devm_ioremap_resource(dev, res); 2473 if (IS_ERR(hisi_hba->sgpio_regs)) 2474 goto err_out; 2475 } 2476 2477 if (hisi_sas_alloc(hisi_hba)) { 2478 hisi_sas_free(hisi_hba); 2479 goto err_out; 2480 } 2481 2482 return shost; 2483 err_out: 2484 scsi_host_put(shost); 2485 dev_err(dev, "shost alloc failed\n"); 2486 return NULL; 2487 } 2488
diff --git a/drivers/scsi/hisi_sas/hisi_sas.h b/drivers/scsi/hisi_sas/hisi_sas.h index d223f482488f..a44768bceb9a 100644 --- a/drivers/scsi/hisi_sas/hisi_sas.h +++ b/drivers/scsi/hisi_sas/hisi_sas.h @@ -307,6 +307,7 @@ enum { struct hisi_sas_hw { int (*hw_init)(struct hisi_hba *hisi_hba); + int (*fw_info_check)(struct hisi_hba *hisi_hba); int (*interrupt_preinit)(struct hisi_hba *hisi_hba); void (*setup_itct)(struct hisi_hba *hisi_hba, struct hisi_sas_device *device); diff --git a/drivers/scsi/hisi_sas/hisi_sas_main.c b/drivers/scsi/hisi_sas/hisi_sas_main.c index d3dcc4918444..e15926c40983 100644 --- a/drivers/scsi/hisi_sas/hisi_sas_main.c +++ b/drivers/scsi/hisi_sas/hisi_sas_main.c @@ -2450,6 +2450,13 @@ static struct Scsi_Host *hisi_sas_shost_alloc(struct platform_device *pdev, if (hisi_sas_get_fw_info(hisi_hba) < 0) goto err_out; + if (hisi_hba->hw->fw_info_check) { + error = hisi_hba->hw->fw_info_check(hisi_hba); + + if (error) + return error; + } + error = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(64)); if (error) { dev_err(dev, "No usable DMA addressing method\n"); diff --git a/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c b/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c index 71b5008c3552..70bba55bc5d0 100644 --- a/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c +++ b/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c @@ -1734,6 +1734,23 @@ static struct attribute *host_v1_hw_attrs[] = { ATTRIBUTE_GROUPS(host_v1_hw); +static int check_fw_info_v1_hw(struct hisi_hba *hisi_hba) +{ + struct device *dev = hisi_hba->dev; + + if (hisi_hba->n_phy < 0 || hisi_hba->n_phy > 9) { + dev_err(dev, "invalid phy number from FW\n"); + return -EINVAL; + } + + if (hisi_hba->queue_count < 0 || hisi_hba->queue_count > 32) { + dev_err(dev, "invalid queue count from FW\n"); + return -EINVAL; + } + + return 0; +} + static const struct scsi_host_template sht_v1_hw = { LIBSAS_SHT_BASE_NO_SLAVE_INIT .device_configure = hisi_sas_device_configure, @@ -1747,6 +1764,7 @@ static const struct scsi_host_template sht_v1_hw = { static const struct hisi_sas_hw hisi_sas_v1_hw = { .hw_init = hisi_sas_v1_init, + .fw_info_check = check_fw_info_v1_hw, .setup_itct = setup_itct_v1_hw, .sl_notify_ssp = sl_notify_ssp_v1_hw, .clear_itct = clear_itct_v1_hw, diff --git a/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c b/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c index 342d75f12051..ab6668dc5b77 100644 --- a/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c +++ b/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c @@ -3566,6 +3566,23 @@ static void map_queues_v2_hw(struct Scsi_Host *shost) } } +static int check_fw_info_v2_hw(struct hisi_hba *hisi_hba) +{ + struct device *dev = hisi_hba->dev; + + if (hisi_hba->n_phy < 0 || hisi_hba->n_phy > 9) { + dev_err(dev, "invalid phy number from FW\n"); + return -EINVAL; + } + + if (hisi_hba->queue_count < 0 || hisi_hba->queue_count > 16) { + dev_err(dev, "invalid queue count from FW\n"); + return -EINVAL; + } + + return 0; +} + static const struct scsi_host_template sht_v2_hw = { LIBSAS_SHT_BASE_NO_SLAVE_INIT .device_configure = hisi_sas_device_configure, @@ -3582,6 +3599,7 @@ static const struct scsi_host_template sht_v2_hw = { static const struct hisi_sas_hw hisi_sas_v2_hw = { .hw_init = hisi_sas_v2_init, + .fw_info_check = check_fw_info_v2_hw, .interrupt_preinit = hisi_sas_v2_interrupt_preinit, .setup_itct = setup_itct_v2_hw, .slot_index_alloc = slot_index_alloc_quirk_v2_hw, diff --git a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c b/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c index 980f28d7b87f..d48777fc4bd9 100644 --- a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c +++ b/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c @@ -3371,6 +3371,23 @@ static const struct hisi_sas_hw hisi_sas_v3_hw = { .debugfs_snapshot_regs = debugfs_snapshot_regs_v3_hw, }; +static int check_fw_info_v3_hw(struct hisi_hba *hisi_hba) +{ + struct device *dev = hisi_hba->dev; + + if (hisi_hba->n_phy < 0 || hisi_hba->n_phy > 8) { + dev_err(dev, "invalid phy number from FW\n"); + return -EINVAL; + } + + if (hisi_hba->queue_count < 0 || hisi_hba->queue_count > 16) { + dev_err(dev, "invalid queue count from FW\n"); + return -EINVAL; + } + + return 0; +} + static struct Scsi_Host * hisi_sas_shost_alloc_pci(struct pci_dev *pdev) { @@ -3401,6 +3418,9 @@ hisi_sas_shost_alloc_pci(struct pci_dev *pdev) if (hisi_sas_get_fw_info(hisi_hba) < 0) goto err_out; + if (check_fw_info_v3_hw(hisi_hba) < 0) + goto err_out; + if (experimental_iopoll_q_cnt < 0 || experimental_iopoll_q_cnt >= hisi_hba->queue_count) dev_err(dev, "iopoll queue count %d cannot exceed or equal 16, using default 0\n",