mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-16 16:54:20 +08:00
[SCSI] mvsas: get phy info.
removed unused code and attached SATA address makes use of port id. enable HBA interrupt after calling sas_register_ha(); Signed-off-by: Ke Wei <kewei@marvell.com> Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
This commit is contained in:
parent
963829e650
commit
e9ff91b692
@ -2743,7 +2743,7 @@ static void mvs_update_phyinfo(struct mvs_info *mvi, int i,
|
|||||||
{
|
{
|
||||||
struct mvs_phy *phy = &mvi->phy[i];
|
struct mvs_phy *phy = &mvi->phy[i];
|
||||||
struct pci_dev *pdev = mvi->pdev;
|
struct pci_dev *pdev = mvi->pdev;
|
||||||
u32 tmp, j;
|
u32 tmp;
|
||||||
u64 tmp64;
|
u64 tmp64;
|
||||||
|
|
||||||
mvs_write_port_cfg_addr(mvi, i, PHYR_IDENTIFY);
|
mvs_write_port_cfg_addr(mvi, i, PHYR_IDENTIFY);
|
||||||
@ -2770,46 +2770,20 @@ static void mvs_update_phyinfo(struct mvs_info *mvi, int i,
|
|||||||
sas_phy->linkrate =
|
sas_phy->linkrate =
|
||||||
(phy->phy_status & PHY_NEG_SPP_PHYS_LINK_RATE_MASK) >>
|
(phy->phy_status & PHY_NEG_SPP_PHYS_LINK_RATE_MASK) >>
|
||||||
PHY_NEG_SPP_PHYS_LINK_RATE_MASK_OFFSET;
|
PHY_NEG_SPP_PHYS_LINK_RATE_MASK_OFFSET;
|
||||||
|
phy->minimum_linkrate =
|
||||||
|
(phy->phy_status &
|
||||||
|
PHY_MIN_SPP_PHYS_LINK_RATE_MASK) >> 8;
|
||||||
|
phy->maximum_linkrate =
|
||||||
|
(phy->phy_status &
|
||||||
|
PHY_MAX_SPP_PHYS_LINK_RATE_MASK) >> 12;
|
||||||
|
|
||||||
|
if (phy->phy_type & PORT_TYPE_SAS) {
|
||||||
/* Updated attached_sas_addr */
|
/* Updated attached_sas_addr */
|
||||||
mvs_write_port_cfg_addr(mvi, i, PHYR_ATT_ADDR_HI);
|
mvs_write_port_cfg_addr(mvi, i, PHYR_ATT_ADDR_HI);
|
||||||
phy->att_dev_sas_addr =
|
phy->att_dev_sas_addr =
|
||||||
(u64) mvs_read_port_cfg_data(mvi, i) << 32;
|
(u64) mvs_read_port_cfg_data(mvi, i) << 32;
|
||||||
|
|
||||||
mvs_write_port_cfg_addr(mvi, i, PHYR_ATT_ADDR_LO);
|
mvs_write_port_cfg_addr(mvi, i, PHYR_ATT_ADDR_LO);
|
||||||
phy->att_dev_sas_addr |= mvs_read_port_cfg_data(mvi, i);
|
phy->att_dev_sas_addr |= mvs_read_port_cfg_data(mvi, i);
|
||||||
|
|
||||||
dev_printk(KERN_DEBUG, &pdev->dev,
|
|
||||||
"phy[%d] Get Attached Address 0x%llX ,"
|
|
||||||
" SAS Address 0x%llX\n",
|
|
||||||
i, phy->att_dev_sas_addr, phy->dev_sas_addr);
|
|
||||||
dev_printk(KERN_DEBUG, &pdev->dev,
|
|
||||||
"Rate = %x , type = %d\n",
|
|
||||||
sas_phy->linkrate, phy->phy_type);
|
|
||||||
|
|
||||||
#if 1
|
|
||||||
/*
|
|
||||||
* If the device is capable of supporting a wide port
|
|
||||||
* on its phys, it may configure the phys as a wide port.
|
|
||||||
*/
|
|
||||||
if (phy->phy_type & PORT_TYPE_SAS)
|
|
||||||
for (j = 0; j < mvi->chip->n_phy && j != i; ++j) {
|
|
||||||
if ((mvi->phy[j].phy_attached) &&
|
|
||||||
(mvi->phy[j].phy_type & PORT_TYPE_SAS))
|
|
||||||
if (phy->att_dev_sas_addr ==
|
|
||||||
mvi->phy[j].att_dev_sas_addr - 1) {
|
|
||||||
phy->att_dev_sas_addr =
|
|
||||||
mvi->phy[j].att_dev_sas_addr;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
tmp64 = cpu_to_be64(phy->att_dev_sas_addr);
|
|
||||||
memcpy(sas_phy->attached_sas_addr, &tmp64, SAS_ADDR_SIZE);
|
|
||||||
|
|
||||||
if (phy->phy_type & PORT_TYPE_SAS) {
|
|
||||||
mvs_write_port_cfg_addr(mvi, i, PHYR_ATT_DEV_INFO);
|
mvs_write_port_cfg_addr(mvi, i, PHYR_ATT_DEV_INFO);
|
||||||
phy->att_dev_info = mvs_read_port_cfg_data(mvi, i);
|
phy->att_dev_info = mvs_read_port_cfg_data(mvi, i);
|
||||||
phy->identify.device_type =
|
phy->identify.device_type =
|
||||||
@ -2828,6 +2802,7 @@ static void mvs_update_phyinfo(struct mvs_info *mvi, int i,
|
|||||||
} else if (phy->phy_type & PORT_TYPE_SATA) {
|
} else if (phy->phy_type & PORT_TYPE_SATA) {
|
||||||
phy->identify.target_port_protocols = SAS_PROTOCOL_STP;
|
phy->identify.target_port_protocols = SAS_PROTOCOL_STP;
|
||||||
if (mvs_is_sig_fis_received(phy->irq_status)) {
|
if (mvs_is_sig_fis_received(phy->irq_status)) {
|
||||||
|
phy->att_dev_sas_addr = i; /* temp */
|
||||||
if (phy_st & PHY_OOB_DTCTD)
|
if (phy_st & PHY_OOB_DTCTD)
|
||||||
sas_phy->oob_mode = SATA_OOB_MODE;
|
sas_phy->oob_mode = SATA_OOB_MODE;
|
||||||
phy->frame_rcvd_size =
|
phy->frame_rcvd_size =
|
||||||
@ -2837,20 +2812,34 @@ static void mvs_update_phyinfo(struct mvs_info *mvi, int i,
|
|||||||
} else {
|
} else {
|
||||||
dev_printk(KERN_DEBUG, &pdev->dev,
|
dev_printk(KERN_DEBUG, &pdev->dev,
|
||||||
"No sig fis\n");
|
"No sig fis\n");
|
||||||
|
phy->phy_type &= ~(PORT_TYPE_SATA);
|
||||||
|
goto out_done;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
tmp64 = cpu_to_be64(phy->att_dev_sas_addr);
|
||||||
|
memcpy(sas_phy->attached_sas_addr, &tmp64, SAS_ADDR_SIZE);
|
||||||
|
|
||||||
|
dev_printk(KERN_DEBUG, &pdev->dev,
|
||||||
|
"phy[%d] Get Attached Address 0x%llX ,"
|
||||||
|
" SAS Address 0x%llX\n",
|
||||||
|
i, phy->att_dev_sas_addr, phy->dev_sas_addr);
|
||||||
|
dev_printk(KERN_DEBUG, &pdev->dev,
|
||||||
|
"Rate = %x , type = %d\n",
|
||||||
|
sas_phy->linkrate, phy->phy_type);
|
||||||
|
|
||||||
/* workaround for HW phy decoding error on 1.5g disk drive */
|
/* workaround for HW phy decoding error on 1.5g disk drive */
|
||||||
mvs_write_port_vsr_addr(mvi, i, VSR_PHY_MODE6);
|
mvs_write_port_vsr_addr(mvi, i, VSR_PHY_MODE6);
|
||||||
tmp = mvs_read_port_vsr_data(mvi, i);
|
tmp = mvs_read_port_vsr_data(mvi, i);
|
||||||
if (((phy->phy_status & PHY_NEG_SPP_PHYS_LINK_RATE_MASK) >>
|
if (((phy->phy_status & PHY_NEG_SPP_PHYS_LINK_RATE_MASK) >>
|
||||||
PHY_NEG_SPP_PHYS_LINK_RATE_MASK_OFFSET) ==
|
PHY_NEG_SPP_PHYS_LINK_RATE_MASK_OFFSET) ==
|
||||||
SAS_LINK_RATE_1_5_GBPS)
|
SAS_LINK_RATE_1_5_GBPS)
|
||||||
tmp &= ~PHY_MODE6_DTL_SPEED;
|
tmp &= ~PHY_MODE6_LATECLK;
|
||||||
else
|
else
|
||||||
tmp |= PHY_MODE6_DTL_SPEED;
|
tmp |= PHY_MODE6_LATECLK;
|
||||||
mvs_write_port_vsr_data(mvi, i, tmp);
|
mvs_write_port_vsr_data(mvi, i, tmp);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
out_done:
|
||||||
if (get_st)
|
if (get_st)
|
||||||
mvs_write_port_irq_stat(mvi, i, phy->irq_status);
|
mvs_write_port_irq_stat(mvi, i, phy->irq_status);
|
||||||
}
|
}
|
||||||
@ -2875,6 +2864,11 @@ static void mvs_port_formed(struct asd_sas_phy *sas_phy)
|
|||||||
spin_unlock_irqrestore(&mvi->lock, flags);
|
spin_unlock_irqrestore(&mvi->lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int mvs_I_T_nexus_reset(struct domain_device *dev)
|
||||||
|
{
|
||||||
|
return TMF_RESP_FUNC_FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
static int __devinit mvs_hw_init(struct mvs_info *mvi)
|
static int __devinit mvs_hw_init(struct mvs_info *mvi)
|
||||||
{
|
{
|
||||||
void __iomem *regs = mvi->regs;
|
void __iomem *regs = mvi->regs;
|
||||||
@ -3036,13 +3030,12 @@ static int __devinit mvs_hw_init(struct mvs_info *mvi)
|
|||||||
/* enable CMD/CMPL_Q/RESP mode */
|
/* enable CMD/CMPL_Q/RESP mode */
|
||||||
mw32(PCS, PCS_SATA_RETRY | PCS_FIS_RX_EN | PCS_CMD_EN);
|
mw32(PCS, PCS_SATA_RETRY | PCS_FIS_RX_EN | PCS_CMD_EN);
|
||||||
|
|
||||||
/* re-enable interrupts globally */
|
|
||||||
mvs_hba_interrupt_enable(mvi);
|
|
||||||
|
|
||||||
/* enable completion queue interrupt */
|
/* enable completion queue interrupt */
|
||||||
tmp = (CINT_PORT_MASK | CINT_DONE | CINT_MEM);
|
tmp = (CINT_PORT_MASK | CINT_DONE | CINT_MEM | CINT_SRS);
|
||||||
mw32(INT_MASK, tmp);
|
mw32(INT_MASK, tmp);
|
||||||
|
|
||||||
|
/* Enable SRS interrupt */
|
||||||
|
mw32(INT_MASK_SRS, 0xFF);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3116,6 +3109,8 @@ static int __devinit mvs_pci_init(struct pci_dev *pdev,
|
|||||||
|
|
||||||
mvs_print_info(mvi);
|
mvs_print_info(mvi);
|
||||||
|
|
||||||
|
mvs_hba_interrupt_enable(mvi);
|
||||||
|
|
||||||
scsi_scan_host(mvi->shost);
|
scsi_scan_host(mvi->shost);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -3161,7 +3156,8 @@ static struct sas_domain_function_template mvs_transport_ops = {
|
|||||||
.lldd_execute_task = mvs_task_exec,
|
.lldd_execute_task = mvs_task_exec,
|
||||||
.lldd_control_phy = mvs_phy_control,
|
.lldd_control_phy = mvs_phy_control,
|
||||||
.lldd_abort_task = mvs_task_abort,
|
.lldd_abort_task = mvs_task_abort,
|
||||||
.lldd_port_formed = mvs_port_formed
|
.lldd_port_formed = mvs_port_formed,
|
||||||
|
.lldd_I_T_nexus_reset = mvs_I_T_nexus_reset,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct pci_device_id __devinitdata mvs_pci_table[] = {
|
static struct pci_device_id __devinitdata mvs_pci_table[] = {
|
||||||
|
Loading…
Reference in New Issue
Block a user