mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2025-03-01 19:16:22 +07:00
[SCSI] pm80xx: Added SPCv/ve specific hardware functionalities and relevant changes in common files
Implementation of SPCv/ve specific hardware functionality and macros. Changing common functionalities wrt SPCv/ve operations. Conditional checks for SPC specific operations. Signed-off-by: Sakthivel K <Sakthivel.SaravananKamalRaju@pmcs.com> Signed-off-by: Anand Kumar S <AnandKumar.Santhanam@pmcs.com> Acked-by: Jack Wang <jack_wang@usish.com> Reviewed-by: Hannes Reinecke <hare@suse.de> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
This commit is contained in:
parent
1245ee5996
commit
f5860992db
@ -4,9 +4,10 @@
|
||||
# Copyright (C) 2008-2009 USI Co., Ltd.
|
||||
|
||||
|
||||
obj-$(CONFIG_SCSI_PM8001) += pm8001.o
|
||||
pm8001-y += pm8001_init.o \
|
||||
obj-$(CONFIG_SCSI_PM8001) += pm80xx.o
|
||||
pm80xx-y += pm8001_init.o \
|
||||
pm8001_sas.o \
|
||||
pm8001_ctl.o \
|
||||
pm8001_hwi.o
|
||||
pm8001_hwi.o \
|
||||
pm80xx_hwi.o
|
||||
|
||||
|
@ -785,14 +785,14 @@ static u32 soft_reset_ready_check(struct pm8001_hba_info *pm8001_ha)
|
||||
* pm8001_chip_soft_rst - soft reset the PM8001 chip, so that the clear all
|
||||
* the FW register status to the originated status.
|
||||
* @pm8001_ha: our hba card information
|
||||
* @signature: signature in host scratch pad0 register.
|
||||
*/
|
||||
static int
|
||||
pm8001_chip_soft_rst(struct pm8001_hba_info *pm8001_ha, u32 signature)
|
||||
pm8001_chip_soft_rst(struct pm8001_hba_info *pm8001_ha)
|
||||
{
|
||||
u32 regVal, toggleVal;
|
||||
u32 max_wait_count;
|
||||
u32 regVal1, regVal2, regVal3;
|
||||
u32 signature = 0x252acbcd; /* for host scratch pad0 */
|
||||
unsigned long flags;
|
||||
|
||||
/* step1: Check FW is ready for soft reset */
|
||||
|
@ -298,7 +298,7 @@ struct local_phy_ctl_resp {
|
||||
|
||||
|
||||
#define OP_BITS 0x0000FF00
|
||||
#define ID_BITS 0x0000000F
|
||||
#define ID_BITS 0x000000FF
|
||||
|
||||
/*
|
||||
* brief the data structure of PORT Control Command
|
||||
|
@ -50,6 +50,10 @@ static struct scsi_transport_template *pm8001_stt;
|
||||
*/
|
||||
static const struct pm8001_chip_info pm8001_chips[] = {
|
||||
[chip_8001] = {0, 8, &pm8001_8001_dispatch,},
|
||||
[chip_8008] = {0, 8, &pm8001_80xx_dispatch,},
|
||||
[chip_8009] = {1, 8, &pm8001_80xx_dispatch,},
|
||||
[chip_8018] = {0, 16, &pm8001_80xx_dispatch,},
|
||||
[chip_8019] = {1, 16, &pm8001_80xx_dispatch,},
|
||||
};
|
||||
static int pm8001_id;
|
||||
|
||||
@ -780,7 +784,7 @@ static int pm8001_pci_probe(struct pci_dev *pdev,
|
||||
goto err_out_free;
|
||||
}
|
||||
list_add_tail(&pm8001_ha->list, &hba_list);
|
||||
PM8001_CHIP_DISP->chip_soft_rst(pm8001_ha, 0x252acbcd);
|
||||
PM8001_CHIP_DISP->chip_soft_rst(pm8001_ha);
|
||||
rc = PM8001_CHIP_DISP->chip_init(pm8001_ha);
|
||||
if (rc)
|
||||
goto err_out_ha_free;
|
||||
@ -834,7 +838,7 @@ static void pm8001_pci_remove(struct pci_dev *pdev)
|
||||
list_del(&pm8001_ha->list);
|
||||
scsi_remove_host(pm8001_ha->shost);
|
||||
PM8001_CHIP_DISP->interrupt_disable(pm8001_ha, 0xFF);
|
||||
PM8001_CHIP_DISP->chip_soft_rst(pm8001_ha, 0x252acbcd);
|
||||
PM8001_CHIP_DISP->chip_soft_rst(pm8001_ha);
|
||||
|
||||
#ifdef PM8001_USE_MSIX
|
||||
for (i = 0; i < pm8001_ha->number_of_intr; i++)
|
||||
@ -879,7 +883,7 @@ static int pm8001_pci_suspend(struct pci_dev *pdev, pm_message_t state)
|
||||
return -ENODEV;
|
||||
}
|
||||
PM8001_CHIP_DISP->interrupt_disable(pm8001_ha, 0xFF);
|
||||
PM8001_CHIP_DISP->chip_soft_rst(pm8001_ha, 0x252acbcd);
|
||||
PM8001_CHIP_DISP->chip_soft_rst(pm8001_ha);
|
||||
#ifdef PM8001_USE_MSIX
|
||||
for (i = 0; i < pm8001_ha->number_of_intr; i++)
|
||||
synchronize_irq(pm8001_ha->msix_entries[i].vector);
|
||||
@ -937,7 +941,12 @@ static int pm8001_pci_resume(struct pci_dev *pdev)
|
||||
if (rc)
|
||||
goto err_out_disable;
|
||||
|
||||
PM8001_CHIP_DISP->chip_soft_rst(pm8001_ha, 0x252acbcd);
|
||||
/* chip soft rst only for spc */
|
||||
if (pm8001_ha->chip_id == chip_8001) {
|
||||
PM8001_CHIP_DISP->chip_soft_rst(pm8001_ha);
|
||||
PM8001_INIT_DBG(pm8001_ha,
|
||||
pm8001_printk("chip soft reset successful\n"));
|
||||
}
|
||||
rc = PM8001_CHIP_DISP->chip_init(pm8001_ha);
|
||||
if (rc)
|
||||
goto err_out_disable;
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* PMC-Sierra SPC 8001 SAS/SATA based host adapters driver
|
||||
* PMC-Sierra PM8001/8081/8088/8089 SAS/SATA based host adapters driver
|
||||
*
|
||||
* Copyright (c) 2008-2009 USI Co., Ltd.
|
||||
* All rights reserved.
|
||||
@ -212,10 +212,12 @@ int pm8001_phy_control(struct asd_sas_phy *sas_phy, enum phy_func func,
|
||||
break;
|
||||
case PHY_FUNC_GET_EVENTS:
|
||||
spin_lock_irqsave(&pm8001_ha->lock, flags);
|
||||
if (-1 == pm8001_bar4_shift(pm8001_ha,
|
||||
if (pm8001_ha->chip_id == chip_8001) {
|
||||
if (-1 == pm8001_bar4_shift(pm8001_ha,
|
||||
(phy_id < 4) ? 0x30000 : 0x40000)) {
|
||||
spin_unlock_irqrestore(&pm8001_ha->lock, flags);
|
||||
return -EINVAL;
|
||||
spin_unlock_irqrestore(&pm8001_ha->lock, flags);
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
{
|
||||
struct sas_phy *phy = sas_phy->phy;
|
||||
@ -228,7 +230,8 @@ int pm8001_phy_control(struct asd_sas_phy *sas_phy, enum phy_func func,
|
||||
phy->loss_of_dword_sync_count = qp[3];
|
||||
phy->phy_reset_problem_count = qp[4];
|
||||
}
|
||||
pm8001_bar4_shift(pm8001_ha, 0);
|
||||
if (pm8001_ha->chip_id == chip_8001)
|
||||
pm8001_bar4_shift(pm8001_ha, 0);
|
||||
spin_unlock_irqrestore(&pm8001_ha->lock, flags);
|
||||
return 0;
|
||||
default:
|
||||
@ -249,7 +252,9 @@ void pm8001_scan_start(struct Scsi_Host *shost)
|
||||
struct pm8001_hba_info *pm8001_ha;
|
||||
struct sas_ha_struct *sha = SHOST_TO_SAS_HA(shost);
|
||||
pm8001_ha = sha->lldd_ha;
|
||||
PM8001_CHIP_DISP->sas_re_init_req(pm8001_ha);
|
||||
/* SAS_RE_INITIALIZATION not available in SPCv/ve */
|
||||
if (pm8001_ha->chip_id == chip_8001)
|
||||
PM8001_CHIP_DISP->sas_re_init_req(pm8001_ha);
|
||||
for (i = 0; i < pm8001_ha->chip->n_phy; ++i)
|
||||
PM8001_CHIP_DISP->phy_start_req(pm8001_ha, i);
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* PMC-Sierra 8001/8081/8088/8089 SAS/SATA based host adapters driver
|
||||
* PMC-Sierra PM8001/8081/8088/8089 SAS/SATA based host adapters driver
|
||||
*
|
||||
* Copyright (c) 2008-2009 USI Co., Ltd.
|
||||
* All rights reserved.
|
||||
@ -108,6 +108,7 @@ do { \
|
||||
#define PM8001_NAME_LENGTH 32/* generic length of strings */
|
||||
extern struct list_head hba_list;
|
||||
extern const struct pm8001_dispatch pm8001_8001_dispatch;
|
||||
extern const struct pm8001_dispatch pm8001_80xx_dispatch;
|
||||
|
||||
struct pm8001_hba_info;
|
||||
struct pm8001_ccb_info;
|
||||
@ -131,7 +132,7 @@ struct pm8001_ioctl_payload {
|
||||
struct pm8001_dispatch {
|
||||
char *name;
|
||||
int (*chip_init)(struct pm8001_hba_info *pm8001_ha);
|
||||
int (*chip_soft_rst)(struct pm8001_hba_info *pm8001_ha, u32 signature);
|
||||
int (*chip_soft_rst)(struct pm8001_hba_info *pm8001_ha);
|
||||
void (*chip_rst)(struct pm8001_hba_info *pm8001_ha);
|
||||
int (*chip_ioremap)(struct pm8001_hba_info *pm8001_ha);
|
||||
void (*chip_iounmap)(struct pm8001_hba_info *pm8001_ha);
|
||||
@ -453,6 +454,7 @@ struct pm8001_hba_info {
|
||||
#endif
|
||||
u32 logging_level;
|
||||
u32 fw_status;
|
||||
u32 smp_exp_mode;
|
||||
u32 int_vector;
|
||||
const struct firmware *fw_image;
|
||||
u8 outq[PM8001_MAX_MSIX_VEC];
|
||||
|
3772
drivers/scsi/pm8001/pm80xx_hwi.c
Normal file
3772
drivers/scsi/pm8001/pm80xx_hwi.c
Normal file
File diff suppressed because it is too large
Load Diff
1480
drivers/scsi/pm8001/pm80xx_hwi.h
Normal file
1480
drivers/scsi/pm8001/pm80xx_hwi.h
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user