diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2014-11-29 13:15:31 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-11-29 13:15:31 -0500 |
| commit | ed02bfa4aaf7fa015cbb8444d83a98f9f263c5df (patch) | |
| tree | 0e3db172b10f98ea0d9543e4756208f31b113cbb | |
| parent | 88910638717dd195cff1dd1ea74772b159632bba (diff) | |
| parent | 3e660fbef96f53d01ba022b1b75b72759a02983e (diff) | |
Merge tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi
Pull SCSI fixes from James Bottomley:
"This is a set of ten fixes: 8 for UFS including four static checker
warnings, a potential null deref in the voltage regulator code, a race
on module unload, a ref counting fix on the well known LUNs which made
it impossible to remove the ufs module and fix to correct the
information in pwr_info.
In addition to UFS, there's a blacklist for the Intel Multi-Flex array
which chokes on report supported operation codes and a fix to an oops
in bnx2fc caused by shared skbs"
[ For us non-SCSI people: "UFS" here is "Universal Flash Storage" not
the filesystem. - Linus ]
* tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi:
ufs: fix NULL dereference when no regulators are defined
ufs: ensure clk gating work is finished before module unloading
scsi: ufs: fix static checker warning in ufshcd_parse_clock_info
scsi: ufs: fix static checker warning in __ufshcd_setup_clocks
scsi: ufs: fix static checker warning in ufshcd_populate_vreg
scsi: ufs: fix static checker errors in ufshcd_system_suspend
ufs: fix power info after link start-up
ufs: fix reference counting of W-LUs
scsi: add Intel Multi-Flex to scsi scan blacklist
bnx2fc: do not add shared skbs to the fcoe_rx_list
| -rw-r--r-- | drivers/scsi/bnx2fc/bnx2fc_fcoe.c | 7 | ||||
| -rw-r--r-- | drivers/scsi/scsi_devinfo.c | 1 | ||||
| -rw-r--r-- | drivers/scsi/ufs/ufshcd-pltfrm.c | 15 | ||||
| -rw-r--r-- | drivers/scsi/ufs/ufshcd.c | 104 | ||||
| -rw-r--r-- | drivers/scsi/ufs/ufshcd.h | 2 |
5 files changed, 77 insertions, 52 deletions
diff --git a/drivers/scsi/bnx2fc/bnx2fc_fcoe.c b/drivers/scsi/bnx2fc/bnx2fc_fcoe.c index 79e5c94107a9..72533c58c1f3 100644 --- a/drivers/scsi/bnx2fc/bnx2fc_fcoe.c +++ b/drivers/scsi/bnx2fc/bnx2fc_fcoe.c | |||
| @@ -412,6 +412,7 @@ static int bnx2fc_rcv(struct sk_buff *skb, struct net_device *dev, | |||
| 412 | struct fc_frame_header *fh; | 412 | struct fc_frame_header *fh; |
| 413 | struct fcoe_rcv_info *fr; | 413 | struct fcoe_rcv_info *fr; |
| 414 | struct fcoe_percpu_s *bg; | 414 | struct fcoe_percpu_s *bg; |
| 415 | struct sk_buff *tmp_skb; | ||
| 415 | unsigned short oxid; | 416 | unsigned short oxid; |
| 416 | 417 | ||
| 417 | interface = container_of(ptype, struct bnx2fc_interface, | 418 | interface = container_of(ptype, struct bnx2fc_interface, |
| @@ -424,6 +425,12 @@ static int bnx2fc_rcv(struct sk_buff *skb, struct net_device *dev, | |||
| 424 | goto err; | 425 | goto err; |
| 425 | } | 426 | } |
| 426 | 427 | ||
| 428 | tmp_skb = skb_share_check(skb, GFP_ATOMIC); | ||
| 429 | if (!tmp_skb) | ||
| 430 | goto err; | ||
| 431 | |||
| 432 | skb = tmp_skb; | ||
| 433 | |||
| 427 | if (unlikely(eth_hdr(skb)->h_proto != htons(ETH_P_FCOE))) { | 434 | if (unlikely(eth_hdr(skb)->h_proto != htons(ETH_P_FCOE))) { |
| 428 | printk(KERN_ERR PFX "bnx2fc_rcv: Wrong FC type frame\n"); | 435 | printk(KERN_ERR PFX "bnx2fc_rcv: Wrong FC type frame\n"); |
| 429 | goto err; | 436 | goto err; |
diff --git a/drivers/scsi/scsi_devinfo.c b/drivers/scsi/scsi_devinfo.c index 49014a143c6a..c1d04d4d3c6c 100644 --- a/drivers/scsi/scsi_devinfo.c +++ b/drivers/scsi/scsi_devinfo.c | |||
| @@ -202,6 +202,7 @@ static struct { | |||
| 202 | {"IOMEGA", "Io20S *F", NULL, BLIST_KEY}, | 202 | {"IOMEGA", "Io20S *F", NULL, BLIST_KEY}, |
| 203 | {"INSITE", "Floptical F*8I", NULL, BLIST_KEY}, | 203 | {"INSITE", "Floptical F*8I", NULL, BLIST_KEY}, |
| 204 | {"INSITE", "I325VM", NULL, BLIST_KEY}, | 204 | {"INSITE", "I325VM", NULL, BLIST_KEY}, |
| 205 | {"Intel", "Multi-Flex", NULL, BLIST_NO_RSOC}, | ||
| 205 | {"iRiver", "iFP Mass Driver", NULL, BLIST_NOT_LOCKABLE | BLIST_INQUIRY_36}, | 206 | {"iRiver", "iFP Mass Driver", NULL, BLIST_NOT_LOCKABLE | BLIST_INQUIRY_36}, |
| 206 | {"LASOUND", "CDX7405", "3.10", BLIST_MAX5LUN | BLIST_SINGLELUN}, | 207 | {"LASOUND", "CDX7405", "3.10", BLIST_MAX5LUN | BLIST_SINGLELUN}, |
| 207 | {"MATSHITA", "PD-1", NULL, BLIST_FORCELUN | BLIST_SINGLELUN}, | 208 | {"MATSHITA", "PD-1", NULL, BLIST_FORCELUN | BLIST_SINGLELUN}, |
diff --git a/drivers/scsi/ufs/ufshcd-pltfrm.c b/drivers/scsi/ufs/ufshcd-pltfrm.c index 8adf067ff019..1c3467b82566 100644 --- a/drivers/scsi/ufs/ufshcd-pltfrm.c +++ b/drivers/scsi/ufs/ufshcd-pltfrm.c | |||
| @@ -102,7 +102,6 @@ static int ufshcd_parse_clock_info(struct ufs_hba *hba) | |||
| 102 | clkfreq = devm_kzalloc(dev, sz * sizeof(*clkfreq), | 102 | clkfreq = devm_kzalloc(dev, sz * sizeof(*clkfreq), |
| 103 | GFP_KERNEL); | 103 | GFP_KERNEL); |
| 104 | if (!clkfreq) { | 104 | if (!clkfreq) { |
| 105 | dev_err(dev, "%s: no memory\n", "freq-table-hz"); | ||
| 106 | ret = -ENOMEM; | 105 | ret = -ENOMEM; |
| 107 | goto out; | 106 | goto out; |
| 108 | } | 107 | } |
| @@ -112,19 +111,19 @@ static int ufshcd_parse_clock_info(struct ufs_hba *hba) | |||
| 112 | if (ret && (ret != -EINVAL)) { | 111 | if (ret && (ret != -EINVAL)) { |
| 113 | dev_err(dev, "%s: error reading array %d\n", | 112 | dev_err(dev, "%s: error reading array %d\n", |
| 114 | "freq-table-hz", ret); | 113 | "freq-table-hz", ret); |
| 115 | goto free_clkfreq; | 114 | return ret; |
| 116 | } | 115 | } |
| 117 | 116 | ||
| 118 | for (i = 0; i < sz; i += 2) { | 117 | for (i = 0; i < sz; i += 2) { |
| 119 | ret = of_property_read_string_index(np, | 118 | ret = of_property_read_string_index(np, |
| 120 | "clock-names", i/2, (const char **)&name); | 119 | "clock-names", i/2, (const char **)&name); |
| 121 | if (ret) | 120 | if (ret) |
| 122 | goto free_clkfreq; | 121 | goto out; |
| 123 | 122 | ||
| 124 | clki = devm_kzalloc(dev, sizeof(*clki), GFP_KERNEL); | 123 | clki = devm_kzalloc(dev, sizeof(*clki), GFP_KERNEL); |
| 125 | if (!clki) { | 124 | if (!clki) { |
| 126 | ret = -ENOMEM; | 125 | ret = -ENOMEM; |
| 127 | goto free_clkfreq; | 126 | goto out; |
| 128 | } | 127 | } |
| 129 | 128 | ||
| 130 | clki->min_freq = clkfreq[i]; | 129 | clki->min_freq = clkfreq[i]; |
| @@ -134,8 +133,6 @@ static int ufshcd_parse_clock_info(struct ufs_hba *hba) | |||
| 134 | clki->min_freq, clki->max_freq, clki->name); | 133 | clki->min_freq, clki->max_freq, clki->name); |
| 135 | list_add_tail(&clki->list, &hba->clk_list_head); | 134 | list_add_tail(&clki->list, &hba->clk_list_head); |
| 136 | } | 135 | } |
| 137 | free_clkfreq: | ||
| 138 | kfree(clkfreq); | ||
| 139 | out: | 136 | out: |
| 140 | return ret; | 137 | return ret; |
| 141 | } | 138 | } |
| @@ -162,10 +159,8 @@ static int ufshcd_populate_vreg(struct device *dev, const char *name, | |||
| 162 | } | 159 | } |
| 163 | 160 | ||
| 164 | vreg = devm_kzalloc(dev, sizeof(*vreg), GFP_KERNEL); | 161 | vreg = devm_kzalloc(dev, sizeof(*vreg), GFP_KERNEL); |
| 165 | if (!vreg) { | 162 | if (!vreg) |
| 166 | dev_err(dev, "No memory for %s regulator\n", name); | 163 | return -ENOMEM; |
| 167 | goto out; | ||
| 168 | } | ||
| 169 | 164 | ||
| 170 | vreg->name = kstrdup(name, GFP_KERNEL); | 165 | vreg->name = kstrdup(name, GFP_KERNEL); |
| 171 | 166 | ||
diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c index 497c38a4a866..605ca60e8a10 100644 --- a/drivers/scsi/ufs/ufshcd.c +++ b/drivers/scsi/ufs/ufshcd.c | |||
| @@ -744,6 +744,8 @@ static void ufshcd_exit_clk_gating(struct ufs_hba *hba) | |||
| 744 | if (!ufshcd_is_clkgating_allowed(hba)) | 744 | if (!ufshcd_is_clkgating_allowed(hba)) |
| 745 | return; | 745 | return; |
| 746 | device_remove_file(hba->dev, &hba->clk_gating.delay_attr); | 746 | device_remove_file(hba->dev, &hba->clk_gating.delay_attr); |
| 747 | cancel_work_sync(&hba->clk_gating.ungate_work); | ||
| 748 | cancel_delayed_work_sync(&hba->clk_gating.gate_work); | ||
| 747 | } | 749 | } |
| 748 | 750 | ||
| 749 | /* Must be called with host lock acquired */ | 751 | /* Must be called with host lock acquired */ |
| @@ -2246,6 +2248,22 @@ static int ufshcd_uic_hibern8_exit(struct ufs_hba *hba) | |||
| 2246 | return ret; | 2248 | return ret; |
| 2247 | } | 2249 | } |
| 2248 | 2250 | ||
| 2251 | /** | ||
| 2252 | * ufshcd_init_pwr_info - setting the POR (power on reset) | ||
| 2253 | * values in hba power info | ||
| 2254 | * @hba: per-adapter instance | ||
| 2255 | */ | ||
| 2256 | static void ufshcd_init_pwr_info(struct ufs_hba *hba) | ||
| 2257 | { | ||
| 2258 | hba->pwr_info.gear_rx = UFS_PWM_G1; | ||
| 2259 | hba->pwr_info.gear_tx = UFS_PWM_G1; | ||
| 2260 | hba->pwr_info.lane_rx = 1; | ||
| 2261 | hba->pwr_info.lane_tx = 1; | ||
| 2262 | hba->pwr_info.pwr_rx = SLOWAUTO_MODE; | ||
| 2263 | hba->pwr_info.pwr_tx = SLOWAUTO_MODE; | ||
| 2264 | hba->pwr_info.hs_rate = 0; | ||
| 2265 | } | ||
| 2266 | |||
| 2249 | /** | 2267 | /** |
| 2250 | * ufshcd_get_max_pwr_mode - reads the max power mode negotiated with device | 2268 | * ufshcd_get_max_pwr_mode - reads the max power mode negotiated with device |
| 2251 | * @hba: per-adapter instance | 2269 | * @hba: per-adapter instance |
| @@ -2844,8 +2862,13 @@ static void ufshcd_slave_destroy(struct scsi_device *sdev) | |||
| 2844 | hba = shost_priv(sdev->host); | 2862 | hba = shost_priv(sdev->host); |
| 2845 | scsi_deactivate_tcq(sdev, hba->nutrs); | 2863 | scsi_deactivate_tcq(sdev, hba->nutrs); |
| 2846 | /* Drop the reference as it won't be needed anymore */ | 2864 | /* Drop the reference as it won't be needed anymore */ |
| 2847 | if (ufshcd_scsi_to_upiu_lun(sdev->lun) == UFS_UPIU_UFS_DEVICE_WLUN) | 2865 | if (ufshcd_scsi_to_upiu_lun(sdev->lun) == UFS_UPIU_UFS_DEVICE_WLUN) { |
| 2866 | unsigned long flags; | ||
| 2867 | |||
| 2868 | spin_lock_irqsave(hba->host->host_lock, flags); | ||
| 2848 | hba->sdev_ufs_device = NULL; | 2869 | hba->sdev_ufs_device = NULL; |
| 2870 | spin_unlock_irqrestore(hba->host->host_lock, flags); | ||
| 2871 | } | ||
| 2849 | } | 2872 | } |
| 2850 | 2873 | ||
| 2851 | /** | 2874 | /** |
| @@ -4062,6 +4085,8 @@ static void ufshcd_init_icc_levels(struct ufs_hba *hba) | |||
| 4062 | static int ufshcd_scsi_add_wlus(struct ufs_hba *hba) | 4085 | static int ufshcd_scsi_add_wlus(struct ufs_hba *hba) |
| 4063 | { | 4086 | { |
| 4064 | int ret = 0; | 4087 | int ret = 0; |
| 4088 | struct scsi_device *sdev_rpmb; | ||
| 4089 | struct scsi_device *sdev_boot; | ||
| 4065 | 4090 | ||
| 4066 | hba->sdev_ufs_device = __scsi_add_device(hba->host, 0, 0, | 4091 | hba->sdev_ufs_device = __scsi_add_device(hba->host, 0, 0, |
| 4067 | ufshcd_upiu_wlun_to_scsi_wlun(UFS_UPIU_UFS_DEVICE_WLUN), NULL); | 4092 | |
