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

[SCSI] pm80xx: NCQ error handling changes

Handled NCQ errors in the low level driver as the FW
is not providing the faulty tag for NCQ errors for libsas
to recover.

[jejb: fix checkpatch issues]
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 a33a0155
This diff is collapsed.
...@@ -68,7 +68,7 @@ static void pm8001_tag_clear(struct pm8001_hba_info *pm8001_ha, u32 tag) ...@@ -68,7 +68,7 @@ static void pm8001_tag_clear(struct pm8001_hba_info *pm8001_ha, u32 tag)
clear_bit(tag, bitmap); clear_bit(tag, bitmap);
} }
static void pm8001_tag_free(struct pm8001_hba_info *pm8001_ha, u32 tag) void pm8001_tag_free(struct pm8001_hba_info *pm8001_ha, u32 tag)
{ {
pm8001_tag_clear(pm8001_ha, tag); pm8001_tag_clear(pm8001_ha, tag);
} }
...@@ -565,6 +565,24 @@ struct pm8001_device *pm8001_alloc_dev(struct pm8001_hba_info *pm8001_ha) ...@@ -565,6 +565,24 @@ struct pm8001_device *pm8001_alloc_dev(struct pm8001_hba_info *pm8001_ha)
} }
return NULL; return NULL;
} }
/**
* pm8001_find_dev - find a matching pm8001_device
* @pm8001_ha: our hba card information
*/
struct pm8001_device *pm8001_find_dev(struct pm8001_hba_info *pm8001_ha,
u32 device_id)
{
u32 dev;
for (dev = 0; dev < PM8001_MAX_DEVICES; dev++) {
if (pm8001_ha->devices[dev].device_id == device_id)
return &pm8001_ha->devices[dev];
}
if (dev == PM8001_MAX_DEVICES) {
PM8001_FAIL_DBG(pm8001_ha, pm8001_printk("NO MATCHING "
"DEVICE FOUND !!!\n"));
}
return NULL;
}
static void pm8001_free_dev(struct pm8001_device *pm8001_dev) static void pm8001_free_dev(struct pm8001_device *pm8001_dev)
{ {
...@@ -653,7 +671,7 @@ int pm8001_dev_found(struct domain_device *dev) ...@@ -653,7 +671,7 @@ int pm8001_dev_found(struct domain_device *dev)
return pm8001_dev_found_notify(dev); return pm8001_dev_found_notify(dev);
} }
static void pm8001_task_done(struct sas_task *task) void pm8001_task_done(struct sas_task *task)
{ {
if (!del_timer(&task->slow_task->timer)) if (!del_timer(&task->slow_task->timer))
return; return;
......
...@@ -321,7 +321,9 @@ union main_cfg_table { ...@@ -321,7 +321,9 @@ union main_cfg_table {
u32 inbound_queue_offset; u32 inbound_queue_offset;
u32 outbound_queue_offset; u32 outbound_queue_offset;
u32 inbound_q_nppd_hppd; u32 inbound_q_nppd_hppd;
u32 rsvd[10]; u32 rsvd[8];
u32 crc_core_dump;
u32 rsvd1;
u32 upper_event_log_addr; u32 upper_event_log_addr;
u32 lower_event_log_addr; u32 lower_event_log_addr;
u32 event_log_size; u32 event_log_size;
...@@ -493,6 +495,9 @@ struct pm8001_fw_image_header { ...@@ -493,6 +495,9 @@ struct pm8001_fw_image_header {
#define FLASH_UPDATE_DNLD_NOT_SUPPORTED 0x10 #define FLASH_UPDATE_DNLD_NOT_SUPPORTED 0x10
#define FLASH_UPDATE_DISABLED 0x11 #define FLASH_UPDATE_DISABLED 0x11
#define NCQ_READ_LOG_FLAG 0x80000000
#define NCQ_ABORT_ALL_FLAG 0x40000000
#define NCQ_2ND_RLE_FLAG 0x20000000
/** /**
* brief param structure for firmware flash update. * brief param structure for firmware flash update.
*/ */
...@@ -567,7 +572,6 @@ int pm8001_mem_alloc(struct pci_dev *pdev, void **virt_addr, ...@@ -567,7 +572,6 @@ int pm8001_mem_alloc(struct pci_dev *pdev, void **virt_addr,
dma_addr_t *pphys_addr, u32 *pphys_addr_hi, u32 *pphys_addr_lo, dma_addr_t *pphys_addr, u32 *pphys_addr_hi, u32 *pphys_addr_lo,
u32 mem_size, u32 align); u32 mem_size, u32 align);
/********** functions common to spc & spcv - begins ************/
void pm8001_chip_iounmap(struct pm8001_hba_info *pm8001_ha); void pm8001_chip_iounmap(struct pm8001_hba_info *pm8001_ha);
int pm8001_mpi_build_cmd(struct pm8001_hba_info *pm8001_ha, int pm8001_mpi_build_cmd(struct pm8001_hba_info *pm8001_ha,
struct inbound_queue_table *circularQ, struct inbound_queue_table *circularQ,
...@@ -615,7 +619,12 @@ int pm8001_mpi_fw_flash_update_resp(struct pm8001_hba_info *pm8001_ha, ...@@ -615,7 +619,12 @@ int pm8001_mpi_fw_flash_update_resp(struct pm8001_hba_info *pm8001_ha,
void *piomb); void *piomb);
int pm8001_mpi_general_event(struct pm8001_hba_info *pm8001_ha , void *piomb); int pm8001_mpi_general_event(struct pm8001_hba_info *pm8001_ha , void *piomb);
int pm8001_mpi_task_abort_resp(struct pm8001_hba_info *pm8001_ha, void *piomb); int pm8001_mpi_task_abort_resp(struct pm8001_hba_info *pm8001_ha, void *piomb);
/*********** functions common to spc & spcv - ends ************/ struct sas_task *pm8001_alloc_task(void);
void pm8001_task_done(struct sas_task *task);
void pm8001_free_task(struct sas_task *task);
void pm8001_tag_free(struct pm8001_hba_info *pm8001_ha, u32 tag);
struct pm8001_device *pm8001_find_dev(struct pm8001_hba_info *pm8001_ha,
u32 device_id);
int pm8001_bar4_shift(struct pm8001_hba_info *pm8001_ha, u32 shiftValue); int pm8001_bar4_shift(struct pm8001_hba_info *pm8001_ha, u32 shiftValue);
......
This diff is collapsed.
...@@ -1278,6 +1278,7 @@ struct ssp_coalesced_comp_resp { ...@@ -1278,6 +1278,7 @@ struct ssp_coalesced_comp_resp {
#define MAIN_IQNPPD_HPPD_OFFSET 0x24 /* DWORD 0x09 */ #define MAIN_IQNPPD_HPPD_OFFSET 0x24 /* DWORD 0x09 */
/* 0x28 - 0x4C - RSVD */ /* 0x28 - 0x4C - RSVD */
#define MAIN_EVENT_CRC_CHECK 0x48 /* DWORD 0x12 */
#define MAIN_EVENT_LOG_ADDR_HI 0x50 /* DWORD 0x14 */ #define MAIN_EVENT_LOG_ADDR_HI 0x50 /* DWORD 0x14 */
#define MAIN_EVENT_LOG_ADDR_LO 0x54 /* DWORD 0x15 */ #define MAIN_EVENT_LOG_ADDR_LO 0x54 /* DWORD 0x15 */
#define MAIN_EVENT_LOG_BUFF_SIZE 0x58 /* DWORD 0x16 */ #define MAIN_EVENT_LOG_BUFF_SIZE 0x58 /* DWORD 0x16 */
......
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