Commit 8882f081 authored by Xiangliang Yu's avatar Xiangliang Yu Committed by James Bottomley

[SCSI] mvsas: fix 94xx hotplug issue

Fix 94xx A0/B0 revision hotplug issue.
Remove unused macro: DISABLE_HOTPLUG_DMA_FIX
Signed-off-by: default avatarXiangliang Yu <yuxiangl@marvell.com>
Signed-off-by: default avatarJames Bottomley <JBottomley@Parallels.com>
parent 83c7b61c
...@@ -744,11 +744,13 @@ int mvs_64xx_spi_waitdataready(struct mvs_info *mvi, u32 timeout) ...@@ -744,11 +744,13 @@ int mvs_64xx_spi_waitdataready(struct mvs_info *mvi, u32 timeout)
return -1; return -1;
} }
#ifndef DISABLE_HOTPLUG_DMA_FIX void mvs_64xx_fix_dma(struct mvs_info *mvi, u32 phy_mask,
void mvs_64xx_fix_dma(dma_addr_t buf_dma, int buf_len, int from, void *prd) int buf_len, int from, void *prd)
{ {
int i; int i;
struct mvs_prd *buf_prd = prd; struct mvs_prd *buf_prd = prd;
dma_addr_t buf_dma = mvi->bulk_buffer_dma;
buf_prd += from; buf_prd += from;
for (i = 0; i < MAX_SG_ENTRY - from; i++) { for (i = 0; i < MAX_SG_ENTRY - from; i++) {
buf_prd->addr = cpu_to_le64(buf_dma); buf_prd->addr = cpu_to_le64(buf_dma);
...@@ -756,7 +758,6 @@ void mvs_64xx_fix_dma(dma_addr_t buf_dma, int buf_len, int from, void *prd) ...@@ -756,7 +758,6 @@ void mvs_64xx_fix_dma(dma_addr_t buf_dma, int buf_len, int from, void *prd)
++buf_prd; ++buf_prd;
} }
} }
#endif
static void mvs_64xx_tune_interrupt(struct mvs_info *mvi, u32 time) static void mvs_64xx_tune_interrupt(struct mvs_info *mvi, u32 time)
{ {
...@@ -830,9 +831,7 @@ const struct mvs_dispatch mvs_64xx_dispatch = { ...@@ -830,9 +831,7 @@ const struct mvs_dispatch mvs_64xx_dispatch = {
mvs_64xx_spi_buildcmd, mvs_64xx_spi_buildcmd,
mvs_64xx_spi_issuecmd, mvs_64xx_spi_issuecmd,
mvs_64xx_spi_waitdataready, mvs_64xx_spi_waitdataready,
#ifndef DISABLE_HOTPLUG_DMA_FIX
mvs_64xx_fix_dma, mvs_64xx_fix_dma,
#endif
mvs_64xx_tune_interrupt, mvs_64xx_tune_interrupt,
NULL, NULL,
}; };
......
...@@ -871,19 +871,27 @@ int mvs_94xx_spi_waitdataready(struct mvs_info *mvi, u32 timeout) ...@@ -871,19 +871,27 @@ int mvs_94xx_spi_waitdataready(struct mvs_info *mvi, u32 timeout)
return -1; return -1;
} }
#ifndef DISABLE_HOTPLUG_DMA_FIX void mvs_94xx_fix_dma(struct mvs_info *mvi, u32 phy_mask,
void mvs_94xx_fix_dma(dma_addr_t buf_dma, int buf_len, int from, void *prd) int buf_len, int from, void *prd)
{ {
int i; int i;
struct mvs_prd *buf_prd = prd; struct mvs_prd *buf_prd = prd;
dma_addr_t buf_dma;
buf_prd += from; buf_prd += from;
if ((mvi->pdev->revision == VANIR_A0_REV) ||
(mvi->pdev->revision == VANIR_B0_REV))
buf_dma = (phy_mask <= 0x08) ?
mvi->bulk_buffer_dma : mvi->bulk_buffer_dma1;
else
return;
for (i = 0; i < MAX_SG_ENTRY - from; i++) { for (i = 0; i < MAX_SG_ENTRY - from; i++) {
buf_prd->addr = cpu_to_le64(buf_dma); buf_prd->addr = cpu_to_le64(buf_dma);
buf_prd->im_len.len = cpu_to_le32(buf_len); buf_prd->im_len.len = cpu_to_le32(buf_len);
++buf_prd; ++buf_prd;
} }
} }
#endif
/* /*
* FIXME JEJB: temporary nop clear_srs_irq to make 94xx still work * FIXME JEJB: temporary nop clear_srs_irq to make 94xx still work
...@@ -967,9 +975,7 @@ const struct mvs_dispatch mvs_94xx_dispatch = { ...@@ -967,9 +975,7 @@ const struct mvs_dispatch mvs_94xx_dispatch = {
mvs_94xx_spi_buildcmd, mvs_94xx_spi_buildcmd,
mvs_94xx_spi_issuecmd, mvs_94xx_spi_issuecmd,
mvs_94xx_spi_waitdataready, mvs_94xx_spi_waitdataready,
#ifndef DISABLE_HOTPLUG_DMA_FIX
mvs_94xx_fix_dma, mvs_94xx_fix_dma,
#endif
mvs_94xx_tune_interrupt, mvs_94xx_tune_interrupt,
mvs_94xx_non_spec_ncq_error, mvs_94xx_non_spec_ncq_error,
}; };
......
...@@ -153,11 +153,13 @@ static void mvs_free(struct mvs_info *mvi) ...@@ -153,11 +153,13 @@ static void mvs_free(struct mvs_info *mvi)
dma_free_coherent(mvi->dev, dma_free_coherent(mvi->dev,
sizeof(*mvi->slot) * slot_nr, sizeof(*mvi->slot) * slot_nr,
mvi->slot, mvi->slot_dma); mvi->slot, mvi->slot_dma);
#ifndef DISABLE_HOTPLUG_DMA_FIX
if (mvi->bulk_buffer) if (mvi->bulk_buffer)
dma_free_coherent(mvi->dev, TRASH_BUCKET_SIZE, dma_free_coherent(mvi->dev, TRASH_BUCKET_SIZE,
mvi->bulk_buffer, mvi->bulk_buffer_dma); mvi->bulk_buffer, mvi->bulk_buffer_dma);
#endif if (mvi->bulk_buffer1)
dma_free_coherent(mvi->dev, TRASH_BUCKET_SIZE,
mvi->bulk_buffer1, mvi->bulk_buffer_dma1);
MVS_CHIP_DISP->chip_iounmap(mvi); MVS_CHIP_DISP->chip_iounmap(mvi);
if (mvi->shost) if (mvi->shost)
...@@ -278,13 +280,18 @@ static int __devinit mvs_alloc(struct mvs_info *mvi, struct Scsi_Host *shost) ...@@ -278,13 +280,18 @@ static int __devinit mvs_alloc(struct mvs_info *mvi, struct Scsi_Host *shost)
goto err_out; goto err_out;
memset(mvi->slot, 0, sizeof(*mvi->slot) * slot_nr); memset(mvi->slot, 0, sizeof(*mvi->slot) * slot_nr);
#ifndef DISABLE_HOTPLUG_DMA_FIX
mvi->bulk_buffer = dma_alloc_coherent(mvi->dev, mvi->bulk_buffer = dma_alloc_coherent(mvi->dev,
TRASH_BUCKET_SIZE, TRASH_BUCKET_SIZE,
&mvi->bulk_buffer_dma, GFP_KERNEL); &mvi->bulk_buffer_dma, GFP_KERNEL);
if (!mvi->bulk_buffer) if (!mvi->bulk_buffer)
goto err_out; goto err_out;
#endif
mvi->bulk_buffer1 = dma_alloc_coherent(mvi->dev,
TRASH_BUCKET_SIZE,
&mvi->bulk_buffer_dma1, GFP_KERNEL);
if (!mvi->bulk_buffer1)
goto err_out;
sprintf(pool_name, "%s%d", "mvs_dma_pool", mvi->id); sprintf(pool_name, "%s%d", "mvs_dma_pool", mvi->id);
mvi->dma_pool = pci_pool_create(pool_name, mvi->pdev, MVS_SLOT_BUF_SZ, 16, 0); mvi->dma_pool = pci_pool_create(pool_name, mvi->pdev, MVS_SLOT_BUF_SZ, 16, 0);
if (!mvi->dma_pool) { if (!mvi->dma_pool) {
......
...@@ -630,14 +630,11 @@ static int mvs_task_prep_ata(struct mvs_info *mvi, ...@@ -630,14 +630,11 @@ static int mvs_task_prep_ata(struct mvs_info *mvi,
(mvi_dev->taskfileset << TXQ_SRS_SHIFT); (mvi_dev->taskfileset << TXQ_SRS_SHIFT);
mvi->tx[mvi->tx_prod] = cpu_to_le32(del_q); mvi->tx[mvi->tx_prod] = cpu_to_le32(del_q);
#ifndef DISABLE_HOTPLUG_DMA_FIX
if (task->data_dir == DMA_FROM_DEVICE) if (task->data_dir == DMA_FROM_DEVICE)
flags = (MVS_CHIP_DISP->prd_count() << MCH_PRD_LEN_SHIFT); flags = (MVS_CHIP_DISP->prd_count() << MCH_PRD_LEN_SHIFT);
else else
flags = (tei->n_elem << MCH_PRD_LEN_SHIFT); flags = (tei->n_elem << MCH_PRD_LEN_SHIFT);
#else
flags = (tei->n_elem << MCH_PRD_LEN_SHIFT);
#endif
if (task->ata_task.use_ncq) if (task->ata_task.use_ncq)
flags |= MCH_FPDMA; flags |= MCH_FPDMA;
if (dev->sata_dev.command_set == ATAPI_COMMAND_SET) { if (dev->sata_dev.command_set == ATAPI_COMMAND_SET) {
...@@ -729,11 +726,11 @@ static int mvs_task_prep_ata(struct mvs_info *mvi, ...@@ -729,11 +726,11 @@ static int mvs_task_prep_ata(struct mvs_info *mvi,
/* fill in PRD (scatter/gather) table, if any */ /* fill in PRD (scatter/gather) table, if any */
MVS_CHIP_DISP->make_prd(task->scatter, tei->n_elem, buf_prd); MVS_CHIP_DISP->make_prd(task->scatter, tei->n_elem, buf_prd);
#ifndef DISABLE_HOTPLUG_DMA_FIX
if (task->data_dir == DMA_FROM_DEVICE) if (task->data_dir == DMA_FROM_DEVICE)
MVS_CHIP_DISP->dma_fix(mvi->bulk_buffer_dma, MVS_CHIP_DISP->dma_fix(mvi, sas_port->phy_mask,
TRASH_BUCKET_SIZE, tei->n_elem, buf_prd); TRASH_BUCKET_SIZE, tei->n_elem, buf_prd);
#endif
return 0; return 0;
} }
...@@ -1283,6 +1280,13 @@ static u32 mvs_is_sig_fis_received(u32 irq_status) ...@@ -1283,6 +1280,13 @@ static u32 mvs_is_sig_fis_received(u32 irq_status)
return irq_status & PHYEV_SIG_FIS; return irq_status & PHYEV_SIG_FIS;
} }
static void mvs_sig_remove_timer(struct mvs_phy *phy)
{
if (phy->timer.function)
del_timer(&phy->timer);
phy->timer.function = NULL;
}
void mvs_update_phyinfo(struct mvs_info *mvi, int i, int get_st) void mvs_update_phyinfo(struct mvs_info *mvi, int i, int get_st)
{ {
struct mvs_phy *phy = &mvi->phy[i]; struct mvs_phy *phy = &mvi->phy[i];
...@@ -1305,6 +1309,7 @@ void mvs_update_phyinfo(struct mvs_info *mvi, int i, int get_st) ...@@ -1305,6 +1309,7 @@ void mvs_update_phyinfo(struct mvs_info *mvi, int i, int get_st)
if (phy->phy_type & PORT_TYPE_SATA) { 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)) {
mvs_sig_remove_timer(phy);
phy->phy_attached = 1; phy->phy_attached = 1;
phy->att_dev_sas_addr = phy->att_dev_sas_addr =
i + mvi->id * mvi->chip->n_phy; i + mvi->id * mvi->chip->n_phy;
...@@ -1322,7 +1327,6 @@ void mvs_update_phyinfo(struct mvs_info *mvi, int i, int get_st) ...@@ -1322,7 +1327,6 @@ void mvs_update_phyinfo(struct mvs_info *mvi, int i, int get_st)
tmp | PHYEV_SIG_FIS); tmp | PHYEV_SIG_FIS);
phy->phy_attached = 0; phy->phy_attached = 0;
phy->phy_type &= ~PORT_TYPE_SATA; phy->phy_type &= ~PORT_TYPE_SATA;
MVS_CHIP_DISP->phy_reset(mvi, i, 0);
goto out_done; goto out_done;
} }
} else if (phy->phy_type & PORT_TYPE_SAS } else if (phy->phy_type & PORT_TYPE_SAS
...@@ -2193,13 +2197,6 @@ static void mvs_sig_time_out(unsigned long tphy) ...@@ -2193,13 +2197,6 @@ static void mvs_sig_time_out(unsigned long tphy)
} }
} }
static void mvs_sig_remove_timer(struct mvs_phy *phy)
{
if (phy->timer.function)
del_timer(&phy->timer);
phy->timer.function = NULL;
}
void mvs_int_port(struct mvs_info *mvi, int phy_no, u32 events) void mvs_int_port(struct mvs_info *mvi, int phy_no, u32 events)
{ {
u32 tmp; u32 tmp;
...@@ -2263,7 +2260,6 @@ void mvs_int_port(struct mvs_info *mvi, int phy_no, u32 events) ...@@ -2263,7 +2260,6 @@ void mvs_int_port(struct mvs_info *mvi, int phy_no, u32 events)
} }
if (phy->irq_status & (PHYEV_SIG_FIS | PHYEV_ID_DONE)) { if (phy->irq_status & (PHYEV_SIG_FIS | PHYEV_ID_DONE)) {
phy->phy_status = mvs_is_phy_ready(mvi, phy_no); phy->phy_status = mvs_is_phy_ready(mvi, phy_no);
mvs_sig_remove_timer(phy);
mv_dprintk("notify plug in on phy[%d]\n", phy_no); mv_dprintk("notify plug in on phy[%d]\n", phy_no);
if (phy->phy_status) { if (phy->phy_status) {
mdelay(10); mdelay(10);
......
...@@ -168,9 +168,8 @@ struct mvs_dispatch { ...@@ -168,9 +168,8 @@ struct mvs_dispatch {
); );
int (*spi_issuecmd)(struct mvs_info *mvi, u32 cmd); int (*spi_issuecmd)(struct mvs_info *mvi, u32 cmd);
int (*spi_waitdataready)(struct mvs_info *mvi, u32 timeout); int (*spi_waitdataready)(struct mvs_info *mvi, u32 timeout);
#ifndef DISABLE_HOTPLUG_DMA_FIX void (*dma_fix)(struct mvs_info *mvi, u32 phy_mask,
void (*dma_fix)(dma_addr_t buf_dma, int buf_len, int from, void *prd); int buf_len, int from, void *prd);
#endif
void (*tune_interrupt)(struct mvs_info *mvi, u32 time); void (*tune_interrupt)(struct mvs_info *mvi, u32 time);
void (*non_spec_ncq_error)(struct mvs_info *mvi); void (*non_spec_ncq_error)(struct mvs_info *mvi);
...@@ -409,11 +408,11 @@ struct mvs_info { ...@@ -409,11 +408,11 @@ struct mvs_info {
void *addon; void *addon;
struct hba_info_page hba_info_param; struct hba_info_page hba_info_param;
struct mvs_device devices[MVS_MAX_DEVICES]; struct mvs_device devices[MVS_MAX_DEVICES];
#ifndef DISABLE_HOTPLUG_DMA_FIX
void *bulk_buffer; void *bulk_buffer;
dma_addr_t bulk_buffer_dma; dma_addr_t bulk_buffer_dma;
void *bulk_buffer1;
dma_addr_t bulk_buffer_dma1;
#define TRASH_BUCKET_SIZE 0x20000 #define TRASH_BUCKET_SIZE 0x20000
#endif
void *dma_pool; void *dma_pool;
struct mvs_slot_info slot_info[0]; struct mvs_slot_info slot_info[0];
}; };
......
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