Commit f5860992 authored by Sakthivel K's avatar Sakthivel K Committed by James Bottomley

[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: default avatarSakthivel K <Sakthivel.SaravananKamalRaju@pmcs.com>
Signed-off-by: default avatarAnand Kumar S <AnandKumar.Santhanam@pmcs.com>
Acked-by: default avatarJack Wang <jack_wang@usish.com>
Reviewed-by: default avatarHannes Reinecke <hare@suse.de>
Signed-off-by: default avatarJames Bottomley <JBottomley@Parallels.com>
parent 1245ee59
...@@ -4,9 +4,10 @@ ...@@ -4,9 +4,10 @@
# Copyright (C) 2008-2009 USI Co., Ltd. # Copyright (C) 2008-2009 USI Co., Ltd.
obj-$(CONFIG_SCSI_PM8001) += pm8001.o obj-$(CONFIG_SCSI_PM8001) += pm80xx.o
pm8001-y += pm8001_init.o \ pm80xx-y += pm8001_init.o \
pm8001_sas.o \ pm8001_sas.o \
pm8001_ctl.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) ...@@ -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 * pm8001_chip_soft_rst - soft reset the PM8001 chip, so that the clear all
* the FW register status to the originated status. * the FW register status to the originated status.
* @pm8001_ha: our hba card information * @pm8001_ha: our hba card information
* @signature: signature in host scratch pad0 register.
*/ */
static int 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 regVal, toggleVal;
u32 max_wait_count; u32 max_wait_count;
u32 regVal1, regVal2, regVal3; u32 regVal1, regVal2, regVal3;
u32 signature = 0x252acbcd; /* for host scratch pad0 */
unsigned long flags; unsigned long flags;
/* step1: Check FW is ready for soft reset */ /* step1: Check FW is ready for soft reset */
......
...@@ -298,7 +298,7 @@ struct local_phy_ctl_resp { ...@@ -298,7 +298,7 @@ struct local_phy_ctl_resp {
#define OP_BITS 0x0000FF00 #define OP_BITS 0x0000FF00
#define ID_BITS 0x0000000F #define ID_BITS 0x000000FF
/* /*
* brief the data structure of PORT Control Command * brief the data structure of PORT Control Command
......
...@@ -50,6 +50,10 @@ static struct scsi_transport_template *pm8001_stt; ...@@ -50,6 +50,10 @@ static struct scsi_transport_template *pm8001_stt;
*/ */
static const struct pm8001_chip_info pm8001_chips[] = { static const struct pm8001_chip_info pm8001_chips[] = {
[chip_8001] = {0, 8, &pm8001_8001_dispatch,}, [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; static int pm8001_id;
...@@ -780,7 +784,7 @@ static int pm8001_pci_probe(struct pci_dev *pdev, ...@@ -780,7 +784,7 @@ static int pm8001_pci_probe(struct pci_dev *pdev,
goto err_out_free; goto err_out_free;
} }
list_add_tail(&pm8001_ha->list, &hba_list); 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); rc = PM8001_CHIP_DISP->chip_init(pm8001_ha);
if (rc) if (rc)
goto err_out_ha_free; goto err_out_ha_free;
...@@ -834,7 +838,7 @@ static void pm8001_pci_remove(struct pci_dev *pdev) ...@@ -834,7 +838,7 @@ static void pm8001_pci_remove(struct pci_dev *pdev)
list_del(&pm8001_ha->list); list_del(&pm8001_ha->list);
scsi_remove_host(pm8001_ha->shost); scsi_remove_host(pm8001_ha->shost);
PM8001_CHIP_DISP->interrupt_disable(pm8001_ha, 0xFF); 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 #ifdef PM8001_USE_MSIX
for (i = 0; i < pm8001_ha->number_of_intr; i++) 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) ...@@ -879,7 +883,7 @@ static int pm8001_pci_suspend(struct pci_dev *pdev, pm_message_t state)
return -ENODEV; return -ENODEV;
} }
PM8001_CHIP_DISP->interrupt_disable(pm8001_ha, 0xFF); 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 #ifdef PM8001_USE_MSIX
for (i = 0; i < pm8001_ha->number_of_intr; i++) for (i = 0; i < pm8001_ha->number_of_intr; i++)
synchronize_irq(pm8001_ha->msix_entries[i].vector); synchronize_irq(pm8001_ha->msix_entries[i].vector);
...@@ -937,7 +941,12 @@ static int pm8001_pci_resume(struct pci_dev *pdev) ...@@ -937,7 +941,12 @@ static int pm8001_pci_resume(struct pci_dev *pdev)
if (rc) if (rc)
goto err_out_disable; 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); rc = PM8001_CHIP_DISP->chip_init(pm8001_ha);
if (rc) if (rc)
goto err_out_disable; goto err_out_disable;
......
/* /*
* 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. * Copyright (c) 2008-2009 USI Co., Ltd.
* All rights reserved. * All rights reserved.
...@@ -212,10 +212,12 @@ int pm8001_phy_control(struct asd_sas_phy *sas_phy, enum phy_func func, ...@@ -212,10 +212,12 @@ int pm8001_phy_control(struct asd_sas_phy *sas_phy, enum phy_func func,
break; break;
case PHY_FUNC_GET_EVENTS: case PHY_FUNC_GET_EVENTS:
spin_lock_irqsave(&pm8001_ha->lock, flags); 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)) { (phy_id < 4) ? 0x30000 : 0x40000)) {
spin_unlock_irqrestore(&pm8001_ha->lock, flags); spin_unlock_irqrestore(&pm8001_ha->lock, flags);
return -EINVAL; return -EINVAL;
}
} }
{ {
struct sas_phy *phy = sas_phy->phy; 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, ...@@ -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->loss_of_dword_sync_count = qp[3];
phy->phy_reset_problem_count = qp[4]; 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); spin_unlock_irqrestore(&pm8001_ha->lock, flags);
return 0; return 0;
default: default:
...@@ -249,7 +252,9 @@ void pm8001_scan_start(struct Scsi_Host *shost) ...@@ -249,7 +252,9 @@ void pm8001_scan_start(struct Scsi_Host *shost)
struct pm8001_hba_info *pm8001_ha; struct pm8001_hba_info *pm8001_ha;
struct sas_ha_struct *sha = SHOST_TO_SAS_HA(shost); struct sas_ha_struct *sha = SHOST_TO_SAS_HA(shost);
pm8001_ha = sha->lldd_ha; 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) for (i = 0; i < pm8001_ha->chip->n_phy; ++i)
PM8001_CHIP_DISP->phy_start_req(pm8001_ha, i); PM8001_CHIP_DISP->phy_start_req(pm8001_ha, i);
} }
......
/* /*
* 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. * Copyright (c) 2008-2009 USI Co., Ltd.
* All rights reserved. * All rights reserved.
...@@ -108,6 +108,7 @@ do { \ ...@@ -108,6 +108,7 @@ do { \
#define PM8001_NAME_LENGTH 32/* generic length of strings */ #define PM8001_NAME_LENGTH 32/* generic length of strings */
extern struct list_head hba_list; extern struct list_head hba_list;
extern const struct pm8001_dispatch pm8001_8001_dispatch; extern const struct pm8001_dispatch pm8001_8001_dispatch;
extern const struct pm8001_dispatch pm8001_80xx_dispatch;
struct pm8001_hba_info; struct pm8001_hba_info;
struct pm8001_ccb_info; struct pm8001_ccb_info;
...@@ -131,7 +132,7 @@ struct pm8001_ioctl_payload { ...@@ -131,7 +132,7 @@ struct pm8001_ioctl_payload {
struct pm8001_dispatch { struct pm8001_dispatch {
char *name; char *name;
int (*chip_init)(struct pm8001_hba_info *pm8001_ha); 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); void (*chip_rst)(struct pm8001_hba_info *pm8001_ha);
int (*chip_ioremap)(struct pm8001_hba_info *pm8001_ha); int (*chip_ioremap)(struct pm8001_hba_info *pm8001_ha);
void (*chip_iounmap)(struct pm8001_hba_info *pm8001_ha); void (*chip_iounmap)(struct pm8001_hba_info *pm8001_ha);
...@@ -453,6 +454,7 @@ struct pm8001_hba_info { ...@@ -453,6 +454,7 @@ struct pm8001_hba_info {
#endif #endif
u32 logging_level; u32 logging_level;
u32 fw_status; u32 fw_status;
u32 smp_exp_mode;
u32 int_vector; u32 int_vector;
const struct firmware *fw_image; const struct firmware *fw_image;
u8 outq[PM8001_MAX_MSIX_VEC]; u8 outq[PM8001_MAX_MSIX_VEC];
......
This source diff could not be displayed because it is too large. You can view the blob instead.
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment