Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'ata-6.9-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/libata/linux

Pull ata fixes from Damien Le Moal:

- Add the mask_port_map parameter to the ahci driver. This is a
follow-up to the recent snafu with the ASMedia controller and its
virtual port hidding port-multiplier devices. As ASMedia confirmed
that there is no way to determine if these slow-to-probe virtual
ports are actually representing the ports of a port-multiplier
devices, this new parameter allow masking ports to significantly
speed up probing during system boot, resulting in shorter boot times.

- A fix for an incorrect handling of a port unlock in
ata_scsi_dev_rescan().

- Allow command duration limits to be detected for ACS-4 devices are
there are such devices out in the field.

* tag 'ata-6.9-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/libata/linux:
ata: libata-core: Allow command duration limits detection for ACS-4 drives
ata: libata-scsi: Fix ata_scsi_dev_rescan() error path
ata: ahci: Add mask_port_map module parameter

+91 -5
+85
drivers/ata/ahci.c
··· 666 666 module_param(mobile_lpm_policy, int, 0644); 667 667 MODULE_PARM_DESC(mobile_lpm_policy, "Default LPM policy for mobile chipsets"); 668 668 669 + static char *ahci_mask_port_map; 670 + module_param_named(mask_port_map, ahci_mask_port_map, charp, 0444); 671 + MODULE_PARM_DESC(mask_port_map, 672 + "32-bits port map masks to ignore controllers ports. " 673 + "Valid values are: " 674 + "\"<mask>\" to apply the same mask to all AHCI controller " 675 + "devices, and \"<pci_dev>=<mask>,<pci_dev>=<mask>,...\" to " 676 + "specify different masks for the controllers specified, " 677 + "where <pci_dev> is the PCI ID of an AHCI controller in the " 678 + "form \"domain:bus:dev.func\""); 679 + 680 + static void ahci_apply_port_map_mask(struct device *dev, 681 + struct ahci_host_priv *hpriv, char *mask_s) 682 + { 683 + unsigned int mask; 684 + 685 + if (kstrtouint(mask_s, 0, &mask)) { 686 + dev_err(dev, "Invalid port map mask\n"); 687 + return; 688 + } 689 + 690 + hpriv->mask_port_map = mask; 691 + } 692 + 693 + static void ahci_get_port_map_mask(struct device *dev, 694 + struct ahci_host_priv *hpriv) 695 + { 696 + char *param, *end, *str, *mask_s; 697 + char *name; 698 + 699 + if (!strlen(ahci_mask_port_map)) 700 + return; 701 + 702 + str = kstrdup(ahci_mask_port_map, GFP_KERNEL); 703 + if (!str) 704 + return; 705 + 706 + /* Handle single mask case */ 707 + if (!strchr(str, '=')) { 708 + ahci_apply_port_map_mask(dev, hpriv, str); 709 + goto free; 710 + } 711 + 712 + /* 713 + * Mask list case: parse the parameter to apply the mask only if 714 + * the device name matches. 715 + */ 716 + param = str; 717 + end = param + strlen(param); 718 + while (param && param < end && *param) { 719 + name = param; 720 + param = strchr(name, '='); 721 + if (!param) 722 + break; 723 + 724 + *param = '\0'; 725 + param++; 726 + if (param >= end) 727 + break; 728 + 729 + if (strcmp(dev_name(dev), name) != 0) { 730 + param = strchr(param, ','); 731 + if (param) 732 + param++; 733 + continue; 734 + } 735 + 736 + mask_s = param; 737 + param = strchr(mask_s, ','); 738 + if (param) { 739 + *param = '\0'; 740 + param++; 741 + } 742 + 743 + ahci_apply_port_map_mask(dev, hpriv, mask_s); 744 + } 745 + 746 + free: 747 + kfree(str); 748 + } 749 + 669 750 static void ahci_pci_save_initial_config(struct pci_dev *pdev, 670 751 struct ahci_host_priv *hpriv) 671 752 { ··· 768 687 dev_info(&pdev->dev, 769 688 "Disabling your PATA port. Use the boot option 'ahci.marvell_enable=0' to avoid this.\n"); 770 689 } 690 + 691 + /* Handle port map masks passed as module parameter. */ 692 + if (ahci_mask_port_map) 693 + ahci_get_port_map_mask(&pdev->dev, hpriv); 771 694 772 695 ahci_save_initial_config(&pdev->dev, hpriv); 773 696 }
+1 -1
drivers/ata/libata-core.c
··· 2539 2539 bool cdl_enabled; 2540 2540 u64 val; 2541 2541 2542 - if (ata_id_major_version(dev->id) < 12) 2542 + if (ata_id_major_version(dev->id) < 11) 2543 2543 goto not_supported; 2544 2544 2545 2545 if (!ata_log_supported(dev, ATA_LOG_IDENTIFY_DEVICE) ||
+5 -4
drivers/ata/libata-scsi.c
··· 4745 4745 * bail out. 4746 4746 */ 4747 4747 if (ap->pflags & ATA_PFLAG_SUSPENDED) 4748 - goto unlock; 4748 + goto unlock_ap; 4749 4749 4750 4750 if (!sdev) 4751 4751 continue; ··· 4758 4758 if (do_resume) { 4759 4759 ret = scsi_resume_device(sdev); 4760 4760 if (ret == -EWOULDBLOCK) 4761 - goto unlock; 4761 + goto unlock_scan; 4762 4762 dev->flags &= ~ATA_DFLAG_RESUMING; 4763 4763 } 4764 4764 ret = scsi_rescan_device(sdev); ··· 4766 4766 spin_lock_irqsave(ap->lock, flags); 4767 4767 4768 4768 if (ret) 4769 - goto unlock; 4769 + goto unlock_ap; 4770 4770 } 4771 4771 } 4772 4772 4773 - unlock: 4773 + unlock_ap: 4774 4774 spin_unlock_irqrestore(ap->lock, flags); 4775 + unlock_scan: 4775 4776 mutex_unlock(&ap->scsi_scan_mutex); 4776 4777 4777 4778 /* Reschedule with a delay if scsi_rescan_device() returned an error */