Loading drivers/scsi/ufs/ufshcd.c +92 −0 Original line number Diff line number Diff line Loading @@ -94,6 +94,8 @@ _ret = ufshcd_disable_vreg(_dev, _vreg); \ _ret; \ }) #define ufshcd_hex_dump(prefix_str, buf, len) \ print_hex_dump(KERN_ERR, prefix_str, DUMP_PREFIX_OFFSET, 16, 4, buf, len, false) /* Interrupt aggregation default timeout, unit: 40us */ #define INT_AGGR_DEF_TO 0x02 Loading Loading @@ -196,6 +198,77 @@ static inline void ufshcd_disable_irq(struct ufs_hba *hba) } } static void ufshcd_print_host_regs(struct ufs_hba *hba) { /* * hex_dump reads its data without the readl macro. This might * cause inconsistency issues on some platform, as the printed * values may be from cache and not the most recent value. * To know whether you are looking at an un-cached version verify * that IORESOURCE_MEM flag is on when xxx_get_resource() is invoked * during platform/pci probe function. */ ufshcd_hex_dump("host regs: ", hba->mmio_base, UFSHCI_REG_SPACE_SIZE); dev_err(hba->dev, "hba->ufs_version = 0x%x, hba->capabilities = 0x%x", hba->ufs_version, hba->capabilities); dev_err(hba->dev, "hba->outstanding_reqs = 0x%x, hba->outstanding_tasks = 0x%x", (u32)hba->outstanding_reqs, (u32)hba->outstanding_tasks); } static void ufshcd_print_trs(struct ufs_hba *hba, unsigned long bitmap, bool pr_prdt) { struct ufshcd_lrb *lrbp; int tag; for_each_set_bit(tag, &bitmap, hba->nutrs) { lrbp = &hba->lrb[tag]; dev_err(hba->dev, "UPIU[%d] - Transfer Request Descriptor", tag); ufshcd_hex_dump("UPIU TRD: ", &lrbp->utr_descriptor_ptr, sizeof(struct utp_transfer_req_desc)); dev_err(hba->dev, "UPIU[%d] - Request UPIU", tag); ufshcd_hex_dump("UPIU REQ: ", lrbp->ucd_req_ptr, sizeof(struct utp_upiu_req)); dev_err(hba->dev, "UPIU[%d] - Response UPIU", tag); ufshcd_hex_dump("UPIU RSP: ", lrbp->ucd_rsp_ptr, sizeof(struct utp_upiu_rsp)); if (pr_prdt) { int prdt_length = le16_to_cpu( lrbp->utr_descriptor_ptr->prd_table_length); dev_err(hba->dev, "UPIU[%d] - PRDT - %d entries", tag, prdt_length); ufshcd_hex_dump("UPIU PRDT: ", lrbp->ucd_prdt_ptr, sizeof(struct ufshcd_sg_entry) * prdt_length); } } } static void ufshcd_print_tmrs(struct ufs_hba *hba, unsigned long bitmap) { struct utp_task_req_desc *tmrdp; int tag; for_each_set_bit(tag, &bitmap, hba->nutmrs) { tmrdp = &hba->utmrdl_base_addr[tag]; dev_err(hba->dev, "TM[%d] - Task Management Header", tag); ufshcd_hex_dump("TM TRD: ", &tmrdp->header, sizeof(struct request_desc_header)); dev_err(hba->dev, "TM[%d] - Task Management Request UPIU", tag); ufshcd_hex_dump("TM REQ: ", tmrdp->task_req_upiu, sizeof(struct utp_upiu_req)); dev_err(hba->dev, "TM[%d] - Task Management Response UPIU", tag); ufshcd_hex_dump("TM RSP: ", tmrdp->task_rsp_upiu, sizeof(struct utp_task_req_desc)); } } /* * ufshcd_wait_for_register - wait for register value to change * @hba - per-adapter interface Loading Loading @@ -2439,6 +2512,8 @@ ufshcd_transfer_rsp_status(struct ufs_hba *hba, struct ufshcd_lrb *lrbp) break; } /* end of switch */ if (host_byte(result) != DID_OK) ufshcd_print_trs(hba, 1 << lrbp->task_tag, true); return result; } Loading Loading @@ -2898,6 +2973,17 @@ static void ufshcd_check_errors(struct ufs_hba *hba) hba->saved_uic_err |= hba->uic_error; hba->ufshcd_state = UFSHCD_STATE_ERROR; /* dump controller state before resetting */ if (hba->saved_err & (INT_FATAL_ERRORS | UIC_ERROR)) { bool pr_prdt = !!(hba->saved_err & SYSTEM_BUS_FATAL_ERROR); ufshcd_print_host_regs(hba); ufshcd_print_tmrs(hba, hba->outstanding_tasks); ufshcd_print_trs(hba, hba->outstanding_reqs, pr_prdt); } schedule_work(&hba->eh_work); } } Loading Loading @@ -3163,6 +3249,11 @@ static int ufshcd_abort(struct scsi_cmnd *cmd) __func__, tag); } /* Print Transfer Request of aborted task */ dev_err(hba->dev, "%s: Device abort task at tag %d", __func__, tag); ufshcd_print_host_regs(hba); ufshcd_print_trs(hba, 1 << tag, true); lrbp = &hba->lrb[tag]; for (poll_cnt = 100; poll_cnt; poll_cnt--) { err = ufshcd_issue_tm_cmd(hba, lrbp->lun, lrbp->task_tag, Loading Loading @@ -4469,6 +4560,7 @@ int ufshcd_init(struct ufs_hba *hba, void __iomem *mmio_base, unsigned int irq) err = ufshcd_hba_enable(hba); if (err) { dev_err(hba->dev, "Host controller enable failed\n"); ufshcd_print_host_regs(hba); goto out_remove_scsi_host; } Loading drivers/scsi/ufs/ufshci.h +2 −0 Original line number Diff line number Diff line Loading @@ -72,6 +72,8 @@ enum { REG_UIC_COMMAND_ARG_1 = 0x94, REG_UIC_COMMAND_ARG_2 = 0x98, REG_UIC_COMMAND_ARG_3 = 0x9C, UFSHCI_REG_SPACE_SIZE = 0xA0, }; /* Controller capability masks */ Loading Loading
drivers/scsi/ufs/ufshcd.c +92 −0 Original line number Diff line number Diff line Loading @@ -94,6 +94,8 @@ _ret = ufshcd_disable_vreg(_dev, _vreg); \ _ret; \ }) #define ufshcd_hex_dump(prefix_str, buf, len) \ print_hex_dump(KERN_ERR, prefix_str, DUMP_PREFIX_OFFSET, 16, 4, buf, len, false) /* Interrupt aggregation default timeout, unit: 40us */ #define INT_AGGR_DEF_TO 0x02 Loading Loading @@ -196,6 +198,77 @@ static inline void ufshcd_disable_irq(struct ufs_hba *hba) } } static void ufshcd_print_host_regs(struct ufs_hba *hba) { /* * hex_dump reads its data without the readl macro. This might * cause inconsistency issues on some platform, as the printed * values may be from cache and not the most recent value. * To know whether you are looking at an un-cached version verify * that IORESOURCE_MEM flag is on when xxx_get_resource() is invoked * during platform/pci probe function. */ ufshcd_hex_dump("host regs: ", hba->mmio_base, UFSHCI_REG_SPACE_SIZE); dev_err(hba->dev, "hba->ufs_version = 0x%x, hba->capabilities = 0x%x", hba->ufs_version, hba->capabilities); dev_err(hba->dev, "hba->outstanding_reqs = 0x%x, hba->outstanding_tasks = 0x%x", (u32)hba->outstanding_reqs, (u32)hba->outstanding_tasks); } static void ufshcd_print_trs(struct ufs_hba *hba, unsigned long bitmap, bool pr_prdt) { struct ufshcd_lrb *lrbp; int tag; for_each_set_bit(tag, &bitmap, hba->nutrs) { lrbp = &hba->lrb[tag]; dev_err(hba->dev, "UPIU[%d] - Transfer Request Descriptor", tag); ufshcd_hex_dump("UPIU TRD: ", &lrbp->utr_descriptor_ptr, sizeof(struct utp_transfer_req_desc)); dev_err(hba->dev, "UPIU[%d] - Request UPIU", tag); ufshcd_hex_dump("UPIU REQ: ", lrbp->ucd_req_ptr, sizeof(struct utp_upiu_req)); dev_err(hba->dev, "UPIU[%d] - Response UPIU", tag); ufshcd_hex_dump("UPIU RSP: ", lrbp->ucd_rsp_ptr, sizeof(struct utp_upiu_rsp)); if (pr_prdt) { int prdt_length = le16_to_cpu( lrbp->utr_descriptor_ptr->prd_table_length); dev_err(hba->dev, "UPIU[%d] - PRDT - %d entries", tag, prdt_length); ufshcd_hex_dump("UPIU PRDT: ", lrbp->ucd_prdt_ptr, sizeof(struct ufshcd_sg_entry) * prdt_length); } } } static void ufshcd_print_tmrs(struct ufs_hba *hba, unsigned long bitmap) { struct utp_task_req_desc *tmrdp; int tag; for_each_set_bit(tag, &bitmap, hba->nutmrs) { tmrdp = &hba->utmrdl_base_addr[tag]; dev_err(hba->dev, "TM[%d] - Task Management Header", tag); ufshcd_hex_dump("TM TRD: ", &tmrdp->header, sizeof(struct request_desc_header)); dev_err(hba->dev, "TM[%d] - Task Management Request UPIU", tag); ufshcd_hex_dump("TM REQ: ", tmrdp->task_req_upiu, sizeof(struct utp_upiu_req)); dev_err(hba->dev, "TM[%d] - Task Management Response UPIU", tag); ufshcd_hex_dump("TM RSP: ", tmrdp->task_rsp_upiu, sizeof(struct utp_task_req_desc)); } } /* * ufshcd_wait_for_register - wait for register value to change * @hba - per-adapter interface Loading Loading @@ -2439,6 +2512,8 @@ ufshcd_transfer_rsp_status(struct ufs_hba *hba, struct ufshcd_lrb *lrbp) break; } /* end of switch */ if (host_byte(result) != DID_OK) ufshcd_print_trs(hba, 1 << lrbp->task_tag, true); return result; } Loading Loading @@ -2898,6 +2973,17 @@ static void ufshcd_check_errors(struct ufs_hba *hba) hba->saved_uic_err |= hba->uic_error; hba->ufshcd_state = UFSHCD_STATE_ERROR; /* dump controller state before resetting */ if (hba->saved_err & (INT_FATAL_ERRORS | UIC_ERROR)) { bool pr_prdt = !!(hba->saved_err & SYSTEM_BUS_FATAL_ERROR); ufshcd_print_host_regs(hba); ufshcd_print_tmrs(hba, hba->outstanding_tasks); ufshcd_print_trs(hba, hba->outstanding_reqs, pr_prdt); } schedule_work(&hba->eh_work); } } Loading Loading @@ -3163,6 +3249,11 @@ static int ufshcd_abort(struct scsi_cmnd *cmd) __func__, tag); } /* Print Transfer Request of aborted task */ dev_err(hba->dev, "%s: Device abort task at tag %d", __func__, tag); ufshcd_print_host_regs(hba); ufshcd_print_trs(hba, 1 << tag, true); lrbp = &hba->lrb[tag]; for (poll_cnt = 100; poll_cnt; poll_cnt--) { err = ufshcd_issue_tm_cmd(hba, lrbp->lun, lrbp->task_tag, Loading Loading @@ -4469,6 +4560,7 @@ int ufshcd_init(struct ufs_hba *hba, void __iomem *mmio_base, unsigned int irq) err = ufshcd_hba_enable(hba); if (err) { dev_err(hba->dev, "Host controller enable failed\n"); ufshcd_print_host_regs(hba); goto out_remove_scsi_host; } Loading
drivers/scsi/ufs/ufshci.h +2 −0 Original line number Diff line number Diff line Loading @@ -72,6 +72,8 @@ enum { REG_UIC_COMMAND_ARG_1 = 0x94, REG_UIC_COMMAND_ARG_2 = 0x98, REG_UIC_COMMAND_ARG_3 = 0x9C, UFSHCI_REG_SPACE_SIZE = 0xA0, }; /* Controller capability masks */ Loading