Ignore:
Timestamp:
Apr 14, 2017, 9:41:36 PM (6 weeks ago)
Author:
brainslayer
Message:

kernel update

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/linux/universal/linux-4.9/drivers/scsi/ufs/ufshcd.c

    r31574 r31859  
    124124        UFSHCD_STATE_ERROR,
    125125        UFSHCD_STATE_OPERATIONAL,
     126        UFSHCD_STATE_EH_SCHEDULED,
    126127};
    127128
     
    188189        return ufs_pm_lvl_states[lvl].link_state;
    189190}
     191
     192static struct ufs_dev_fix ufs_fixups[] = {
     193        /* UFS cards deviations table */
     194        UFS_FIX(UFS_VENDOR_SAMSUNG, UFS_ANY_MODEL,
     195                UFS_DEVICE_QUIRK_DELAY_BEFORE_LPM),
     196        UFS_FIX(UFS_VENDOR_SAMSUNG, UFS_ANY_MODEL, UFS_DEVICE_NO_VCCQ),
     197        UFS_FIX(UFS_VENDOR_SAMSUNG, UFS_ANY_MODEL,
     198                UFS_DEVICE_QUIRK_RECOVERY_FROM_DL_NAC_ERRORS),
     199        UFS_FIX(UFS_VENDOR_SAMSUNG, UFS_ANY_MODEL,
     200                UFS_DEVICE_NO_FASTAUTO),
     201        UFS_FIX(UFS_VENDOR_SAMSUNG, UFS_ANY_MODEL,
     202                UFS_DEVICE_QUIRK_HOST_PA_TACTIVATE),
     203        UFS_FIX(UFS_VENDOR_TOSHIBA, UFS_ANY_MODEL,
     204                UFS_DEVICE_QUIRK_DELAY_BEFORE_LPM),
     205        UFS_FIX(UFS_VENDOR_TOSHIBA, "THGLF2G9C8KBADG",
     206                UFS_DEVICE_QUIRK_PA_TACTIVATE),
     207        UFS_FIX(UFS_VENDOR_TOSHIBA, "THGLF2G9D8KBADG",
     208                UFS_DEVICE_QUIRK_PA_TACTIVATE),
     209        UFS_FIX(UFS_VENDOR_SKHYNIX, UFS_ANY_MODEL, UFS_DEVICE_NO_VCCQ),
     210        UFS_FIX(UFS_VENDOR_SKHYNIX, UFS_ANY_MODEL,
     211                UFS_DEVICE_QUIRK_HOST_PA_SAVECONFIGTIME),
     212
     213        END_FIX
     214};
    190215
    191216static void ufshcd_tmc_handler(struct ufs_hba *hba);
     
    10891114 * Returns 0 in case of success, non-zero value in case of failure
    10901115 */
    1091 static int ufshcd_map_sg(struct ufshcd_lrb *lrbp)
     1116static int ufshcd_map_sg(struct ufs_hba *hba, struct ufshcd_lrb *lrbp)
    10921117{
    10931118        struct ufshcd_sg_entry *prd_table;
     
    11031128
    11041129        if (sg_segments) {
    1105                 lrbp->utr_descriptor_ptr->prd_table_length =
    1106                                         cpu_to_le16((u16) (sg_segments));
     1130                if (hba->quirks & UFSHCD_QUIRK_PRDT_BYTE_GRAN)
     1131                        lrbp->utr_descriptor_ptr->prd_table_length =
     1132                                cpu_to_le16((u16)(sg_segments *
     1133                                        sizeof(struct ufshcd_sg_entry)));
     1134                else
     1135                        lrbp->utr_descriptor_ptr->prd_table_length =
     1136                                cpu_to_le16((u16) (sg_segments));
    11071137
    11081138                prd_table = (struct ufshcd_sg_entry *)lrbp->ucd_prdt_ptr;
     
    14111441        case UFSHCD_STATE_OPERATIONAL:
    14121442                break;
     1443        case UFSHCD_STATE_EH_SCHEDULED:
    14131444        case UFSHCD_STATE_RESET:
    14141445                err = SCSI_MLQUEUE_HOST_BUSY;
     
    14661497        ufshcd_comp_scsi_upiu(hba, lrbp);
    14671498
    1468         err = ufshcd_map_sg(lrbp);
     1499        err = ufshcd_map_sg(hba, lrbp);
    14691500        if (err) {
    14701501                lrbp->cmd = NULL;
     
    23212352
    23222353                /* Response upiu and prdt offset should be in double words */
    2323                 utrdlp[i].response_upiu_offset =
     2354                if (hba->quirks & UFSHCD_QUIRK_PRDT_BYTE_GRAN) {
     2355                        utrdlp[i].response_upiu_offset =
     2356                                cpu_to_le16(response_offset);
     2357                        utrdlp[i].prd_table_offset =
     2358                                cpu_to_le16(prdt_offset);
     2359                        utrdlp[i].response_upiu_length =
     2360                                cpu_to_le16(ALIGNED_UPIU_SIZE);
     2361                } else {
     2362                        utrdlp[i].response_upiu_offset =
    23242363                                cpu_to_le16((response_offset >> 2));
    2325                 utrdlp[i].prd_table_offset =
     2364                        utrdlp[i].prd_table_offset =
    23262365                                cpu_to_le16((prdt_offset >> 2));
    2327                 utrdlp[i].response_upiu_length =
     2366                        utrdlp[i].response_upiu_length =
    23282367                                cpu_to_le16(ALIGNED_UPIU_SIZE >> 2);
     2368                }
    23292369
    23302370                hba->lrb[i].utr_descriptor_ptr = (utrdlp + i);
     
    30913131        int ret;
    30923132        int retries = DME_LINKSTARTUP_RETRIES;
    3093 
     3133        bool link_startup_again = false;
     3134
     3135        /*
     3136         * If UFS device isn't active then we will have to issue link startup
     3137         * 2 times to make sure the device state move to active.
     3138         */
     3139        if (!ufshcd_is_ufs_dev_active(hba))
     3140                link_startup_again = true;
     3141
     3142link_startup:
    30943143        do {
    30953144                ufshcd_vops_link_startup_notify(hba, PRE_CHANGE);
     
    31163165                /* failed to get the link up... retire */
    31173166                goto out;
     3167
     3168        if (link_startup_again) {
     3169                link_startup_again = false;
     3170                retries = DME_LINKSTARTUP_RETRIES;
     3171                goto link_startup;
     3172        }
    31183173
    31193174        if (hba->quirks & UFSHCD_QUIRK_BROKEN_LCC) {
     
    41594214                        scsi_block_requests(hba->host);
    41604215
    4161                         hba->ufshcd_state = UFSHCD_STATE_ERROR;
     4216                        hba->ufshcd_state = UFSHCD_STATE_EH_SCHEDULED;
    41624217                        schedule_work(&hba->eh_work);
    41634218                }
     
    49665021}
    49675022
     5023/**
     5024 * ufshcd_quirk_tune_host_pa_tactivate - Ensures that host PA_TACTIVATE is
     5025 * less than device PA_TACTIVATE time.
     5026 * @hba: per-adapter instance
     5027 *
     5028 * Some UFS devices require host PA_TACTIVATE to be lower than device
     5029 * PA_TACTIVATE, we need to enable UFS_DEVICE_QUIRK_HOST_PA_TACTIVATE quirk
     5030 * for such devices.
     5031 *
     5032 * Returns zero on success, non-zero error value on failure.
     5033 */
     5034static int ufshcd_quirk_tune_host_pa_tactivate(struct ufs_hba *hba)
     5035{
     5036        int ret = 0;
     5037        u32 granularity, peer_granularity;
     5038        u32 pa_tactivate, peer_pa_tactivate;
     5039        u32 pa_tactivate_us, peer_pa_tactivate_us;
     5040        u8 gran_to_us_table[] = {1, 4, 8, 16, 32, 100};
     5041
     5042        ret = ufshcd_dme_get(hba, UIC_ARG_MIB(PA_GRANULARITY),
     5043                                  &granularity);
     5044        if (ret)
     5045                goto out;
     5046
     5047        ret = ufshcd_dme_peer_get(hba, UIC_ARG_MIB(PA_GRANULARITY),
     5048                                  &peer_granularity);
     5049        if (ret)
     5050                goto out;
     5051
     5052        if ((granularity < PA_GRANULARITY_MIN_VAL) ||
     5053            (granularity > PA_GRANULARITY_MAX_VAL)) {
     5054                dev_err(hba->dev, "%s: invalid host PA_GRANULARITY %d",
     5055                        __func__, granularity);
     5056                return -EINVAL;
     5057        }
     5058
     5059        if ((peer_granularity < PA_GRANULARITY_MIN_VAL) ||
     5060            (peer_granularity > PA_GRANULARITY_MAX_VAL)) {
     5061                dev_err(hba->dev, "%s: invalid device PA_GRANULARITY %d",
     5062                        __func__, peer_granularity);
     5063                return -EINVAL;
     5064        }
     5065
     5066        ret = ufshcd_dme_get(hba, UIC_ARG_MIB(PA_TACTIVATE), &pa_tactivate);
     5067        if (ret)
     5068                goto out;
     5069
     5070        ret = ufshcd_dme_peer_get(hba, UIC_ARG_MIB(PA_TACTIVATE),
     5071                                  &peer_pa_tactivate);
     5072        if (ret)
     5073                goto out;
     5074
     5075        pa_tactivate_us = pa_tactivate * gran_to_us_table[granularity - 1];
     5076        peer_pa_tactivate_us = peer_pa_tactivate *
     5077                             gran_to_us_table[peer_granularity - 1];
     5078
     5079        if (pa_tactivate_us > peer_pa_tactivate_us) {
     5080                u32 new_peer_pa_tactivate;
     5081
     5082                new_peer_pa_tactivate = pa_tactivate_us /
     5083                                      gran_to_us_table[peer_granularity - 1];
     5084                new_peer_pa_tactivate++;
     5085                ret = ufshcd_dme_peer_set(hba, UIC_ARG_MIB(PA_TACTIVATE),
     5086                                          new_peer_pa_tactivate);
     5087        }
     5088
     5089out:
     5090        return ret;
     5091}
     5092
    49685093static void ufshcd_tune_unipro_params(struct ufs_hba *hba)
    49695094{
     
    49765101                /* set 1ms timeout for PA_TACTIVATE */
    49775102                ufshcd_dme_set(hba, UIC_ARG_MIB(PA_TACTIVATE), 10);
     5103
     5104        if (hba->dev_quirks & UFS_DEVICE_QUIRK_HOST_PA_TACTIVATE)
     5105                ufshcd_quirk_tune_host_pa_tactivate(hba);
     5106
     5107        ufshcd_vops_apply_dev_quirks(hba);
    49785108}
    49795109
     
    65166646
    65176647        /*
    6518          * The device-initialize-sequence hasn't been invoked yet.
    6519          * Set the device to power-off state
     6648         * We are assuming that device wasn't put in sleep/power-down
     6649         * state exclusively during the boot stage before kernel.
     6650         * This assumption helps avoid doing link startup twice during
     6651         * ufshcd_probe_hba().
    65206652         */
    6521         ufshcd_set_ufs_dev_poweroff(hba);
     6653        ufshcd_set_ufs_dev_active(hba);
    65226654
    65236655        async_schedule(ufshcd_async_scan, hba);
Note: See TracChangeset for help on using the changeset viewer.