未验证 提交 9895e9ad 编写于 作者: O openeuler-ci-bot 提交者: Gitee

!618 Bugfixes related to SAS error handling, DIF, and low power consumption

Merge Pull Request from: @xia-bing1 
 
Resolve the following issues:
1.SATA devices on an expander may be removed and not be found again when I_T nexus reset and revalidation are processed simultaneously.
2.Currently the driver sets the port invalid if one phy in the port is not enabled, which may cause issues in expander situation. In directly attached situation, if phy up doesn't occur in time when refreshing port id, the port is incorrectly set to invalid which will also cause disk lost.
3.When the current status of the host controller is suspended, enabling a local PHY just after disabling all local PHYs in expander envirnment, a hung as follows occurs.
4.incorrect port id may be configured in hisi_sas_refresh_port_id().As a result, all the internal IOs fail and disk lost,
5.After a HUAWEI disk that supports DIF3 is converted to a common SAS disk in DIF format, an error message is displayed when the FIO command is executed. 
 
Link:https://gitee.com/openeuler/kernel/pulls/618 

Reviewed-by: Yihang Li <liyihang9@huawei.com> 
Signed-off-by: Jialin Zhang <zhangjialin11@huawei.com> 
...@@ -1468,7 +1468,7 @@ static void hisi_sas_refresh_port_id(struct hisi_hba *hisi_hba) ...@@ -1468,7 +1468,7 @@ static void hisi_sas_refresh_port_id(struct hisi_hba *hisi_hba)
device->linkrate = phy->sas_phy.linkrate; device->linkrate = phy->sas_phy.linkrate;
hisi_hba->hw->setup_itct(hisi_hba, sas_dev); hisi_hba->hw->setup_itct(hisi_hba, sas_dev);
} else } else if (!port->port_attached)
port->id = 0xff; port->id = 0xff;
} }
} }
...@@ -1617,13 +1617,41 @@ void hisi_sas_controller_reset_prepare(struct hisi_hba *hisi_hba) ...@@ -1617,13 +1617,41 @@ void hisi_sas_controller_reset_prepare(struct hisi_hba *hisi_hba)
} }
EXPORT_SYMBOL_GPL(hisi_sas_controller_reset_prepare); EXPORT_SYMBOL_GPL(hisi_sas_controller_reset_prepare);
static void hisi_sas_async_init_wait_phyup(void *data, async_cookie_t cookie)
{
struct hisi_sas_phy *phy = data;
struct hisi_hba *hisi_hba = phy->hisi_hba;
struct device *dev = hisi_hba->dev;
DECLARE_COMPLETION_ONSTACK(completion);
int phy_no = phy->sas_phy.id;
phy->reset_completion = &completion;
hisi_sas_phy_enable(hisi_hba, phy_no, 1);
if (!wait_for_completion_timeout(&completion,
HISI_SAS_WAIT_PHYUP_TIMEOUT))
dev_warn(dev, "phy%d wait phyup timed out\n", phy_no);
phy->reset_completion = NULL;
}
void hisi_sas_controller_reset_done(struct hisi_hba *hisi_hba) void hisi_sas_controller_reset_done(struct hisi_hba *hisi_hba)
{ {
struct Scsi_Host *shost = hisi_hba->shost; struct Scsi_Host *shost = hisi_hba->shost;
ASYNC_DOMAIN_EXCLUSIVE(async);
int phy_no;
/* Init and wait for PHYs to come up and all libsas event finished. */ /* Init and wait for PHYs to come up and all libsas event finished. */
hisi_hba->hw->phys_init(hisi_hba); for (phy_no = 0; phy_no < hisi_hba->n_phy; phy_no++) {
msleep(1000); struct hisi_sas_phy *phy = &hisi_hba->phy[phy_no];
if (!(hisi_hba->phy_state & BIT(phy_no)))
continue;
async_schedule_domain(hisi_sas_async_init_wait_phyup,
phy, &async);
}
async_synchronize_full_domain(&async);
hisi_sas_refresh_port_id(hisi_hba); hisi_sas_refresh_port_id(hisi_hba);
clear_bit(HISI_SAS_REJECT_CMD_BIT, &hisi_hba->flags); clear_bit(HISI_SAS_REJECT_CMD_BIT, &hisi_hba->flags);
...@@ -1885,13 +1913,15 @@ static int hisi_sas_debug_I_T_nexus_reset(struct domain_device *device) ...@@ -1885,13 +1913,15 @@ static int hisi_sas_debug_I_T_nexus_reset(struct domain_device *device)
return rc; return rc;
} }
/* Remote phy */
if (rc) if (rc)
return rc; return rc;
/* Remote phy */
if (dev_is_sata(device)) { if (dev_is_sata(device)) {
rc = sas_ata_wait_after_reset(device, struct ata_link *link = &device->sata_dev.ap->link;
HISI_SAS_WAIT_PHYUP_TIMEOUT);
rc = ata_wait_after_reset(link, HISI_SAS_WAIT_PHYUP_TIMEOUT,
smp_ata_check_ready_type);
} else { } else {
msleep(2000); msleep(2000);
} }
......
...@@ -594,6 +594,27 @@ static u32 hisi_sas_phy_read32(struct hisi_hba *hisi_hba, ...@@ -594,6 +594,27 @@ static u32 hisi_sas_phy_read32(struct hisi_hba *hisi_hba,
readl_poll_timeout_atomic(regs, val, cond, delay_us, timeout_us);\ readl_poll_timeout_atomic(regs, val, cond, delay_us, timeout_us);\
}) })
static void interrupt_enable_v3_hw(struct hisi_hba *hisi_hba)
{
int i;
for (i = 0; i < hisi_hba->queue_count; i++)
hisi_sas_write32(hisi_hba, OQ0_INT_SRC_MSK + 0x4 * i, 0);
hisi_sas_write32(hisi_hba, ENT_INT_SRC_MSK1, 0xfefefefe);
hisi_sas_write32(hisi_hba, ENT_INT_SRC_MSK2, 0xfefefefe);
hisi_sas_write32(hisi_hba, ENT_INT_SRC_MSK3, 0xffc220ff);
hisi_sas_write32(hisi_hba, SAS_ECC_INTR_MSK, 0x155555);
for (i = 0; i < hisi_hba->n_phy; i++) {
hisi_sas_phy_write32(hisi_hba, i, CHL_INT1_MSK, 0xf2057fff);
hisi_sas_phy_write32(hisi_hba, i, CHL_INT2_MSK, 0xffffbfe);
hisi_sas_phy_write32(hisi_hba, i, PHYCTRL_NOT_RDY_MSK, 0x0);
hisi_sas_phy_write32(hisi_hba, i, PHYCTRL_PHY_ENA_MSK, 0x0);
hisi_sas_phy_write32(hisi_hba, i, SL_RX_BCAST_CHK_MSK, 0x0);
}
}
static void init_reg_v3_hw(struct hisi_hba *hisi_hba) static void init_reg_v3_hw(struct hisi_hba *hisi_hba)
{ {
int i, j; int i, j;
...@@ -614,20 +635,14 @@ static void init_reg_v3_hw(struct hisi_hba *hisi_hba) ...@@ -614,20 +635,14 @@ static void init_reg_v3_hw(struct hisi_hba *hisi_hba)
hisi_sas_write32(hisi_hba, ENT_INT_SRC1, 0xffffffff); hisi_sas_write32(hisi_hba, ENT_INT_SRC1, 0xffffffff);
hisi_sas_write32(hisi_hba, ENT_INT_SRC2, 0xffffffff); hisi_sas_write32(hisi_hba, ENT_INT_SRC2, 0xffffffff);
hisi_sas_write32(hisi_hba, ENT_INT_SRC3, 0xffffffff); hisi_sas_write32(hisi_hba, ENT_INT_SRC3, 0xffffffff);
hisi_sas_write32(hisi_hba, ENT_INT_SRC_MSK1, 0xfefefefe);
hisi_sas_write32(hisi_hba, ENT_INT_SRC_MSK2, 0xfefefefe);
hisi_sas_write32(hisi_hba, ENT_INT_SRC_MSK3, 0xffc220ff);
hisi_sas_write32(hisi_hba, CHNL_PHYUPDOWN_INT_MSK, 0x0); hisi_sas_write32(hisi_hba, CHNL_PHYUPDOWN_INT_MSK, 0x0);
hisi_sas_write32(hisi_hba, CHNL_ENT_INT_MSK, 0x0); hisi_sas_write32(hisi_hba, CHNL_ENT_INT_MSK, 0x0);
hisi_sas_write32(hisi_hba, HGC_COM_INT_MSK, 0x0); hisi_sas_write32(hisi_hba, HGC_COM_INT_MSK, 0x0);
hisi_sas_write32(hisi_hba, SAS_ECC_INTR_MSK, 0x155555);
hisi_sas_write32(hisi_hba, AWQOS_AWCACHE_CFG, 0xf0f0); hisi_sas_write32(hisi_hba, AWQOS_AWCACHE_CFG, 0xf0f0);
hisi_sas_write32(hisi_hba, ARQOS_ARCACHE_CFG, 0xf0f0); hisi_sas_write32(hisi_hba, ARQOS_ARCACHE_CFG, 0xf0f0);
for (i = 0; i < hisi_hba->queue_count; i++)
hisi_sas_write32(hisi_hba, OQ0_INT_SRC_MSK + 0x4 * i, 0);
hisi_sas_write32(hisi_hba, HYPER_STREAM_ID_EN_CFG, 1); hisi_sas_write32(hisi_hba, HYPER_STREAM_ID_EN_CFG, 1);
interrupt_enable_v3_hw(hisi_hba);
for (i = 0; i < hisi_hba->n_phy; i++) { for (i = 0; i < hisi_hba->n_phy; i++) {
enum sas_linkrate max; enum sas_linkrate max;
struct hisi_sas_phy *phy = &hisi_hba->phy[i]; struct hisi_sas_phy *phy = &hisi_hba->phy[i];
...@@ -650,13 +665,8 @@ static void init_reg_v3_hw(struct hisi_hba *hisi_hba) ...@@ -650,13 +665,8 @@ static void init_reg_v3_hw(struct hisi_hba *hisi_hba)
hisi_sas_phy_write32(hisi_hba, i, CHL_INT1, 0xffffffff); hisi_sas_phy_write32(hisi_hba, i, CHL_INT1, 0xffffffff);
hisi_sas_phy_write32(hisi_hba, i, CHL_INT2, 0xffffffff); hisi_sas_phy_write32(hisi_hba, i, CHL_INT2, 0xffffffff);
hisi_sas_phy_write32(hisi_hba, i, RXOP_CHECK_CFG_H, 0x1000); hisi_sas_phy_write32(hisi_hba, i, RXOP_CHECK_CFG_H, 0x1000);
hisi_sas_phy_write32(hisi_hba, i, CHL_INT1_MSK, 0xf2057fff);
hisi_sas_phy_write32(hisi_hba, i, CHL_INT2_MSK, 0xffffbfe);
hisi_sas_phy_write32(hisi_hba, i, PHY_CTRL_RDY_MSK, 0x0); hisi_sas_phy_write32(hisi_hba, i, PHY_CTRL_RDY_MSK, 0x0);
hisi_sas_phy_write32(hisi_hba, i, PHYCTRL_NOT_RDY_MSK, 0x0);
hisi_sas_phy_write32(hisi_hba, i, PHYCTRL_DWS_RESET_MSK, 0x0); hisi_sas_phy_write32(hisi_hba, i, PHYCTRL_DWS_RESET_MSK, 0x0);
hisi_sas_phy_write32(hisi_hba, i, PHYCTRL_PHY_ENA_MSK, 0x0);
hisi_sas_phy_write32(hisi_hba, i, SL_RX_BCAST_CHK_MSK, 0x0);
hisi_sas_phy_write32(hisi_hba, i, PHYCTRL_OOB_RESTART_MSK, 0x1); hisi_sas_phy_write32(hisi_hba, i, PHYCTRL_OOB_RESTART_MSK, 0x1);
hisi_sas_phy_write32(hisi_hba, i, STP_LINK_TIMER, 0x7f7a120); hisi_sas_phy_write32(hisi_hba, i, STP_LINK_TIMER, 0x7f7a120);
hisi_sas_phy_write32(hisi_hba, i, CON_CFG_DRIVER, 0x2a0a01); hisi_sas_phy_write32(hisi_hba, i, CON_CFG_DRIVER, 0x2a0a01);
...@@ -2632,7 +2642,6 @@ static int disable_host_v3_hw(struct hisi_hba *hisi_hba) ...@@ -2632,7 +2642,6 @@ static int disable_host_v3_hw(struct hisi_hba *hisi_hba)
u32 status, reg_val; u32 status, reg_val;
int rc; int rc;
interrupt_disable_v3_hw(hisi_hba);
hisi_sas_write32(hisi_hba, DLVRY_QUEUE_ENABLE, 0x0); hisi_sas_write32(hisi_hba, DLVRY_QUEUE_ENABLE, 0x0);
hisi_sas_stop_phys(hisi_hba); hisi_sas_stop_phys(hisi_hba);
...@@ -2662,6 +2671,7 @@ static int soft_reset_v3_hw(struct hisi_hba *hisi_hba) ...@@ -2662,6 +2671,7 @@ static int soft_reset_v3_hw(struct hisi_hba *hisi_hba)
struct device *dev = hisi_hba->dev; struct device *dev = hisi_hba->dev;
int rc; int rc;
interrupt_disable_v3_hw(hisi_hba);
rc = disable_host_v3_hw(hisi_hba); rc = disable_host_v3_hw(hisi_hba);
if (rc) { if (rc) {
dev_err(dev, "soft reset: disable host failed rc=%d\n", rc); dev_err(dev, "soft reset: disable host failed rc=%d\n", rc);
...@@ -4994,6 +5004,7 @@ static void hisi_sas_reset_prepare_v3_hw(struct pci_dev *pdev) ...@@ -4994,6 +5004,7 @@ static void hisi_sas_reset_prepare_v3_hw(struct pci_dev *pdev)
set_bit(HISI_SAS_RESET_BIT, &hisi_hba->flags); set_bit(HISI_SAS_RESET_BIT, &hisi_hba->flags);
hisi_sas_controller_reset_prepare(hisi_hba); hisi_sas_controller_reset_prepare(hisi_hba);
interrupt_disable_v3_hw(hisi_hba);
rc = disable_host_v3_hw(hisi_hba); rc = disable_host_v3_hw(hisi_hba);
if (rc) if (rc)
dev_err(dev, "FLR: disable host failed rc=%d\n", rc); dev_err(dev, "FLR: disable host failed rc=%d\n", rc);
...@@ -5023,6 +5034,21 @@ enum { ...@@ -5023,6 +5034,21 @@ enum {
hip08, hip08,
}; };
static void enable_host_v3_hw(struct hisi_hba *hisi_hba)
{
u32 reg_val;
hisi_sas_write32(hisi_hba, DLVRY_QUEUE_ENABLE,
(u32)((1ULL << hisi_hba->queue_count) - 1));
phys_init_v3_hw(hisi_hba);
reg_val = hisi_sas_read32(hisi_hba, AXI_MASTER_CFG_BASE +
AM_CTRL_GLOBAL);
reg_val &= ~AM_CTRL_SHUTDOWN_REQ_MSK;
hisi_sas_write32(hisi_hba, AXI_MASTER_CFG_BASE +
AM_CTRL_GLOBAL, reg_val);
}
static int _suspend_v3_hw(struct device *device) static int _suspend_v3_hw(struct device *device)
{ {
struct pci_dev *pdev = to_pci_dev(device); struct pci_dev *pdev = to_pci_dev(device);
...@@ -5045,14 +5071,18 @@ static int _suspend_v3_hw(struct device *device) ...@@ -5045,14 +5071,18 @@ static int _suspend_v3_hw(struct device *device)
scsi_block_requests(shost); scsi_block_requests(shost);
set_bit(HISI_SAS_REJECT_CMD_BIT, &hisi_hba->flags); set_bit(HISI_SAS_REJECT_CMD_BIT, &hisi_hba->flags);
flush_workqueue(hisi_hba->wq); flush_workqueue(hisi_hba->wq);
interrupt_disable_v3_hw(hisi_hba);
if (atomic_read(&device->power.usage_count)) {
dev_err(dev, "PM suspend: host status cannot be suspended\n");
rc = -EBUSY;
goto err_out;
}
rc = disable_host_v3_hw(hisi_hba); rc = disable_host_v3_hw(hisi_hba);
if (rc) { if (rc) {
dev_err(dev, "PM suspend: disable host failed rc=%d\n", rc); dev_err(dev, "PM suspend: disable host failed rc=%d\n", rc);
clear_bit(HISI_SAS_REJECT_CMD_BIT, &hisi_hba->flags); goto err_out_recover_host;
clear_bit(HISI_SAS_RESET_BIT, &hisi_hba->flags);
scsi_unblock_requests(shost);
return rc;
} }
hisi_sas_init_mem(hisi_hba); hisi_sas_init_mem(hisi_hba);
...@@ -5063,6 +5093,15 @@ static int _suspend_v3_hw(struct device *device) ...@@ -5063,6 +5093,15 @@ static int _suspend_v3_hw(struct device *device)
dev_warn(dev, "end of suspending controller\n"); dev_warn(dev, "end of suspending controller\n");
return 0; return 0;
err_out_recover_host:
enable_host_v3_hw(hisi_hba);
err_out:
interrupt_enable_v3_hw(hisi_hba);
clear_bit(HISI_SAS_REJECT_CMD_BIT, &hisi_hba->flags);
clear_bit(HISI_SAS_RESET_BIT, &hisi_hba->flags);
scsi_unblock_requests(shost);
return rc;
} }
static int _resume_v3_hw(struct device *device) static int _resume_v3_hw(struct device *device)
......
...@@ -301,6 +301,31 @@ static int sas_ata_clear_pending(struct domain_device *dev, struct ex_phy *phy) ...@@ -301,6 +301,31 @@ static int sas_ata_clear_pending(struct domain_device *dev, struct ex_phy *phy)
return 1; return 1;
} }
int smp_ata_check_ready_type(struct ata_link *link)
{
struct domain_device *dev = link->ap->private_data;
struct sas_phy *phy = sas_get_local_phy(dev);
struct domain_device *ex_dev = dev->parent;
enum sas_device_type type = SAS_PHY_UNUSED;
u8 sas_addr[SAS_ADDR_SIZE];
int res;
res = sas_get_phy_attached_dev(ex_dev, phy->number, sas_addr, &type);
sas_put_local_phy(phy);
if (res)
return res;
switch (type) {
case SAS_SATA_PENDING:
return 0;
case SAS_END_DEVICE:
return 1;
default:
return -ENODEV;
}
}
EXPORT_SYMBOL_GPL(smp_ata_check_ready_type);
static int smp_ata_check_ready(struct ata_link *link) static int smp_ata_check_ready(struct ata_link *link)
{ {
int res; int res;
...@@ -372,7 +397,7 @@ static int sas_ata_printk(const char *level, const struct domain_device *ddev, ...@@ -372,7 +397,7 @@ static int sas_ata_printk(const char *level, const struct domain_device *ddev,
return r; return r;
} }
int sas_ata_wait_after_reset(struct domain_device *dev, unsigned long deadline) static int sas_ata_wait_after_reset(struct domain_device *dev, unsigned long deadline)
{ {
struct sata_device *sata_dev = &dev->sata_dev; struct sata_device *sata_dev = &dev->sata_dev;
int (*check_ready)(struct ata_link *link); int (*check_ready)(struct ata_link *link);
...@@ -394,7 +419,6 @@ int sas_ata_wait_after_reset(struct domain_device *dev, unsigned long deadline) ...@@ -394,7 +419,6 @@ int sas_ata_wait_after_reset(struct domain_device *dev, unsigned long deadline)
return ret; return ret;
} }
EXPORT_SYMBOL_GPL(sas_ata_wait_after_reset);
static int sas_ata_hard_reset(struct ata_link *link, unsigned int *class, static int sas_ata_hard_reset(struct ata_link *link, unsigned int *class,
unsigned long deadline) unsigned long deadline)
......
...@@ -1719,8 +1719,8 @@ static int sas_get_phy_change_count(struct domain_device *dev, ...@@ -1719,8 +1719,8 @@ static int sas_get_phy_change_count(struct domain_device *dev,
return res; return res;
} }
static int sas_get_phy_attached_dev(struct domain_device *dev, int phy_id, int sas_get_phy_attached_dev(struct domain_device *dev, int phy_id,
u8 *sas_addr, enum sas_device_type *type) u8 *sas_addr, enum sas_device_type *type)
{ {
int res; int res;
struct smp_resp *disc_resp; struct smp_resp *disc_resp;
......
...@@ -86,6 +86,8 @@ struct domain_device *sas_ex_to_ata(struct domain_device *ex_dev, int phy_id); ...@@ -86,6 +86,8 @@ struct domain_device *sas_ex_to_ata(struct domain_device *ex_dev, int phy_id);
int sas_ex_phy_discover(struct domain_device *dev, int single); int sas_ex_phy_discover(struct domain_device *dev, int single);
int sas_get_report_phy_sata(struct domain_device *dev, int phy_id, int sas_get_report_phy_sata(struct domain_device *dev, int phy_id,
struct smp_resp *rps_resp); struct smp_resp *rps_resp);
int sas_get_phy_attached_dev(struct domain_device *dev, int phy_id,
u8 *sas_addr, enum sas_device_type *type);
int sas_try_ata_reset(struct asd_sas_phy *phy); int sas_try_ata_reset(struct asd_sas_phy *phy);
void sas_hae_reset(struct work_struct *work); void sas_hae_reset(struct work_struct *work);
......
...@@ -2286,40 +2286,45 @@ static int sd_read_protection_type(struct scsi_disk *sdkp, unsigned char *buffer ...@@ -2286,40 +2286,45 @@ static int sd_read_protection_type(struct scsi_disk *sdkp, unsigned char *buffer
{ {
struct scsi_device *sdp = sdkp->device; struct scsi_device *sdp = sdkp->device;
u8 type; u8 type;
int ret = 0;
if (scsi_device_protection(sdp) == 0 || (buffer[12] & 1) == 0) { if (scsi_device_protection(sdp) == 0 || (buffer[12] & 1) == 0) {
sdkp->protection_type = 0; sdkp->protection_type = 0;
return ret; return 0;
} }
type = ((buffer[12] >> 1) & 7) + 1; /* P_TYPE 0 = Type 1 */ type = ((buffer[12] >> 1) & 7) + 1; /* P_TYPE 0 = Type 1 */
if (type > T10_PI_TYPE3_PROTECTION) if (type > T10_PI_TYPE3_PROTECTION) {
ret = -ENODEV; sd_printk(KERN_ERR, sdkp, "formatted with unsupported" \
else if (scsi_host_dif_capable(sdp->host, type)) " protection type %u. Disabling disk!\n",
ret = 1; type);
sdkp->protection_type = 0;
if (sdkp->first_scan || type != sdkp->protection_type) return -ENODEV;
switch (ret) { }
case -ENODEV:
sd_printk(KERN_ERR, sdkp, "formatted with unsupported" \
" protection type %u. Disabling disk!\n",
type);
break;
case 1:
sd_printk(KERN_NOTICE, sdkp,
"Enabling DIF Type %u protection\n", type);
break;
case 0:
sd_printk(KERN_NOTICE, sdkp,
"Disabling DIF Type %u protection\n", type);
break;
}
sdkp->protection_type = type; sdkp->protection_type = type;
return ret; return 0;
}
static void sd_config_protection(struct scsi_disk *sdkp)
{
struct scsi_device *sdp = sdkp->device;
sd_dif_config_host(sdkp);
if (!sdkp->protection_type)
return;
if (!scsi_host_dif_capable(sdp->host, sdkp->protection_type)) {
sd_first_printk(KERN_NOTICE, sdkp,
"Disabling DIF Type %u protection\n",
sdkp->protection_type);
sdkp->protection_type = 0;
}
sd_first_printk(KERN_NOTICE, sdkp, "Enabling DIF Type %u protection\n",
sdkp->protection_type);
} }
static void read_capacity_error(struct scsi_disk *sdkp, struct scsi_device *sdp, static void read_capacity_error(struct scsi_disk *sdkp, struct scsi_device *sdp,
...@@ -3247,6 +3252,7 @@ static int sd_revalidate_disk(struct gendisk *disk) ...@@ -3247,6 +3252,7 @@ static int sd_revalidate_disk(struct gendisk *disk)
sd_read_app_tag_own(sdkp, buffer); sd_read_app_tag_own(sdkp, buffer);
sd_read_write_same(sdkp, buffer); sd_read_write_same(sdkp, buffer);
sd_read_security(sdkp, buffer); sd_read_security(sdkp, buffer);
sd_config_protection(sdkp);
} }
/* /*
...@@ -3494,11 +3500,6 @@ static int sd_probe(struct device *dev) ...@@ -3494,11 +3500,6 @@ static int sd_probe(struct device *dev)
} }
device_add_disk(dev, gd, NULL); device_add_disk(dev, gd, NULL);
blk_delete_region(disk_devt(sdkp->disk), SD_MINORS, sd_default_probe); blk_delete_region(disk_devt(sdkp->disk), SD_MINORS, sd_default_probe);
if (sdkp->capacity)
sd_dif_config_host(sdkp);
sd_revalidate_disk(gd);
if (sdkp->security) { if (sdkp->security) {
sdkp->opal_dev = init_opal_dev(sdkp, &sd_sec_submit); sdkp->opal_dev = init_opal_dev(sdkp, &sd_sec_submit);
if (sdkp->opal_dev) if (sdkp->opal_dev)
......
...@@ -39,8 +39,10 @@ void sd_dif_config_host(struct scsi_disk *sdkp) ...@@ -39,8 +39,10 @@ void sd_dif_config_host(struct scsi_disk *sdkp)
dif = 0; dix = 1; dif = 0; dix = 1;
} }
if (!dix) if (!dix) {
blk_integrity_unregister(disk);
return; return;
}
memset(&bi, 0, sizeof(bi)); memset(&bi, 0, sizeof(bi));
...@@ -59,8 +61,6 @@ void sd_dif_config_host(struct scsi_disk *sdkp) ...@@ -59,8 +61,6 @@ void sd_dif_config_host(struct scsi_disk *sdkp)
bi.profile = &t10_pi_type1_crc; bi.profile = &t10_pi_type1_crc;
bi.tuple_size = sizeof(struct t10_pi_tuple); bi.tuple_size = sizeof(struct t10_pi_tuple);
sd_printk(KERN_NOTICE, sdkp,
"Enabling DIX %s protection\n", bi.profile->name);
if (dif && type) { if (dif && type) {
bi.flags |= BLK_INTEGRITY_DEVICE_CAPABLE; bi.flags |= BLK_INTEGRITY_DEVICE_CAPABLE;
...@@ -72,11 +72,11 @@ void sd_dif_config_host(struct scsi_disk *sdkp) ...@@ -72,11 +72,11 @@ void sd_dif_config_host(struct scsi_disk *sdkp)
bi.tag_size = sizeof(u16) + sizeof(u32); bi.tag_size = sizeof(u16) + sizeof(u32);
else else
bi.tag_size = sizeof(u16); bi.tag_size = sizeof(u16);
sd_printk(KERN_NOTICE, sdkp, "DIF application tag size %u\n",
bi.tag_size);
} }
sd_first_printk(KERN_NOTICE, sdkp,
"Enabling DIX %s, application tag size %u bytes\n",
bi.profile->name, bi.tag_size);
out: out:
blk_integrity_register(disk, &bi); blk_integrity_register(disk, &bi);
} }
......
...@@ -34,7 +34,7 @@ void sas_suspend_sata(struct asd_sas_port *port); ...@@ -34,7 +34,7 @@ void sas_suspend_sata(struct asd_sas_port *port);
void sas_resume_sata(struct asd_sas_port *port); void sas_resume_sata(struct asd_sas_port *port);
void sas_ata_end_eh(struct ata_port *ap); void sas_ata_end_eh(struct ata_port *ap);
void sas_ata_device_link_abort(struct domain_device *dev, bool force_reset); void sas_ata_device_link_abort(struct domain_device *dev, bool force_reset);
int sas_ata_wait_after_reset(struct domain_device *dev, unsigned long deadline); int smp_ata_check_ready_type(struct ata_link *link);
#else #else
...@@ -93,10 +93,9 @@ static inline void sas_ata_device_link_abort(struct domain_device *dev, ...@@ -93,10 +93,9 @@ static inline void sas_ata_device_link_abort(struct domain_device *dev,
{ {
} }
static inline int sas_ata_wait_after_reset(struct domain_device *dev, static inline int smp_ata_check_ready_type(struct ata_link *link)
unsigned long deadline)
{ {
return -ETIMEDOUT; return 0;
} }
#endif #endif
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册