[Bug 60758] module scsi_wait_scan not found kernel panic on boot
https://bugzilla.kernel.org/show_bug.cgi?id=60758 --- Comment #7 from Alan Bartlett a...@elrepo.org --- (In reply to Jeff Zhou from comment #5) If your system fails by module scsi_wait_scan not found, then it could be the init script issue in your CentOS box. The last kernel with scsi_wait_scan.ko is v3.5.7, it has been removed ever since v3.6. Any init script for 3.10 should not use that module. Another point is in your config, the CONFIG_SCSI_SCAN_ASYNC is not set, try to turn it into Y and see what's happening. Jeff, For the fuller picture please see -- http://elrepo.org/bugs/view.php?id=401 This non-booting issue only occurs with one system. The reporter has other systems which do boot correctly using the same kernel(s). As was explained in the referenced bug report (note 3235), the mention of module scsi_wait_scan not found is a red-herring. Note the following section from the 3.10.10 drivers/scsi/Kconfig file -- [quote] config SCSI_SCAN_ASYNC bool Asynchronous SCSI scanning depends on SCSI help The SCSI subsystem can probe for devices while the rest of the system continues booting, and even probe devices on different busses in parallel, leading to a significant speed-up. If you have built SCSI as modules, enabling this option can be a problem as the devices may not have been found by the time your system expects them to have been. You can load the scsi_wait_scan module to ensure that all scans have completed. If you build your SCSI drivers into the kernel, then everything will work fine if you say Y here. You can override this choice by specifying scsi_mod.scan=sync or async on the kernel's command line. [/quote] It still makes a reference to the scsi_wait_scan module and advises against setting SCSI_SCAN_ASYNC=y when scsi drivers have been built as modules. It is unnecessary to build a new kernel to test, as per your last point. Just appending scsi_mod.scan=async to the kernel boot line will be sufficient. Perhaps the reporter will test with that and then report back? Alan / burakkucat. -- You are receiving this mail because: You are the assignee for the bug. -- To unsubscribe from this list: send the line unsubscribe linux-scsi in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 0/6] scsi: ufs: ufshcd updates and fixes
Hi James, Please apply the following patches to 'misc' branch. Thanks, Santosh Seungwon Jeon (6): scsi: ufs: find out sense data over scsi status values scsi: ufs: fix the setting interrupt aggregation counter scsi: ufs: add dme configuration primitives scsi: ufs: add unipro attribute IDs scsi: ufs: add operation for the uic power mode change scsi: ufs: configure the attribute for power mode drivers/scsi/ufs/ufs.h| 1 + drivers/scsi/ufs/ufshcd.c | 328 +++--- drivers/scsi/ufs/ufshcd.h | 54 drivers/scsi/ufs/ufshci.h | 22 +++- drivers/scsi/ufs/unipro.h | 151 + 5 files changed, 507 insertions(+), 49 deletions(-) create mode 100644 drivers/scsi/ufs/unipro.h -- 1.8.4 -- To unsubscribe from this list: send the line unsubscribe linux-scsi in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 2/6] scsi: ufs: fix the setting interrupt aggregation counter
From: Seungwon Jeon tgih@samsung.com IACTH(Interrupt aggregation counter threshold) value is allowed up to 0x1F and current setting value is the maximum. This value is related with NUTRS(max:0x20) of HCI's capability. Considering HCI controller doesn't support the maximum, IACTH setting should be adjusted with possible value. For that, existing 'ufshcd_config_int_aggr' is split into two part [reset, configure]. Signed-off-by: Seungwon Jeon tgih@samsung.com Reviewed-by: Subhash Jadavani subha...@codeaurora.org Tested-by: Yaniv Gardi yga...@codeaurora.org Signed-off-by: Santosh Y santos...@gmail.com diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c index ac3d56b..86d7286 100644 --- a/drivers/scsi/ufs/ufshcd.c +++ b/drivers/scsi/ufs/ufshcd.c @@ -59,6 +59,9 @@ /* Expose the flag value from utp_upiu_query.value */ #define MASK_QUERY_UPIU_FLAG_LOC 0xFF +/* Interrupt aggregation default timeout, unit: 40us */ +#define INT_AGGR_DEF_TO0x02 + enum { UFSHCD_MAX_CHANNEL = 0, UFSHCD_MAX_ID = 1, @@ -94,12 +97,6 @@ enum { UFSHCD_INT_CLEAR, }; -/* Interrupt aggregation options */ -enum { - INT_AGGR_RESET, - INT_AGGR_CONFIG, -}; - #define ufshcd_set_eh_in_progress(h) \ (h-eh_flags |= UFSHCD_EH_IN_PROGRESS) #define ufshcd_eh_in_progress(h) \ @@ -340,30 +337,30 @@ static inline bool ufshcd_is_exception_event(struct utp_upiu_rsp *ucd_rsp_ptr) } /** - * ufshcd_config_int_aggr - Configure interrupt aggregation values. - * Currently there is no use case where we want to configure - * interrupt aggregation dynamically. So to configure interrupt - * aggregation, #define INT_AGGR_COUNTER_THRESHOLD_VALUE and - * INT_AGGR_TIMEOUT_VALUE are used. + * ufshcd_reset_intr_aggr - Reset interrupt aggregation values. * @hba: per adapter instance - * @option: Interrupt aggregation option */ static inline void -ufshcd_config_int_aggr(struct ufs_hba *hba, int option) +ufshcd_reset_intr_aggr(struct ufs_hba *hba) { - switch (option) { - case INT_AGGR_RESET: - ufshcd_writel(hba, INT_AGGR_ENABLE | - INT_AGGR_COUNTER_AND_TIMER_RESET, - REG_UTP_TRANSFER_REQ_INT_AGG_CONTROL); - break; - case INT_AGGR_CONFIG: - ufshcd_writel(hba, INT_AGGR_ENABLE | INT_AGGR_PARAM_WRITE | - INT_AGGR_COUNTER_THRESHOLD_VALUE | - INT_AGGR_TIMEOUT_VALUE, - REG_UTP_TRANSFER_REQ_INT_AGG_CONTROL); - break; - } + ufshcd_writel(hba, INT_AGGR_ENABLE | + INT_AGGR_COUNTER_AND_TIMER_RESET, + REG_UTP_TRANSFER_REQ_INT_AGG_CONTROL); +} + +/** + * ufshcd_config_intr_aggr - Configure interrupt aggregation values. + * @hba: per adapter instance + * @cnt: Interrupt aggregation counter threshold + * @tmout: Interrupt aggregation timeout value + */ +static inline void +ufshcd_config_intr_aggr(struct ufs_hba *hba, u8 cnt, u8 tmout) +{ + ufshcd_writel(hba, INT_AGGR_ENABLE | INT_AGGR_PARAM_WRITE | + INT_AGGR_COUNTER_THLD_VAL(cnt) | + INT_AGGR_TIMEOUT_VAL(tmout), + REG_UTP_TRANSFER_REQ_INT_AGG_CONTROL); } /** @@ -1523,7 +1520,7 @@ static int ufshcd_make_hba_operational(struct ufs_hba *hba) ufshcd_enable_intr(hba, UFSHCD_ENABLE_INTRS); /* Configure interrupt aggregation */ - ufshcd_config_int_aggr(hba, INT_AGGR_CONFIG); + ufshcd_config_intr_aggr(hba, hba-nutrs - 1, INT_AGGR_DEF_TO); /* Configure UTRL and UTMRL base address registers */ ufshcd_writel(hba, lower_32_bits(hba-utrdl_dma_addr), @@ -1971,7 +1968,7 @@ static void ufshcd_transfer_req_compl(struct ufs_hba *hba) /* Reset interrupt aggregation counters */ if (int_aggr_reset) - ufshcd_config_int_aggr(hba, INT_AGGR_RESET); + ufshcd_reset_intr_aggr(hba); } /** diff --git a/drivers/scsi/ufs/ufshci.h b/drivers/scsi/ufs/ufshci.h index f1e1b74..739ae3a 100644 --- a/drivers/scsi/ufs/ufshci.h +++ b/drivers/scsi/ufs/ufshci.h @@ -226,8 +226,8 @@ enum { #define MASK_UIC_COMMAND_RESULT0xFF -#define INT_AGGR_COUNTER_THRESHOLD_VALUE (0x1F 8) -#define INT_AGGR_TIMEOUT_VALUE (0x02) +#define INT_AGGR_COUNTER_THLD_VAL(c) (((c) 0x1F) 8) +#define INT_AGGR_TIMEOUT_VAL(t)(((t) 0xFF) 0) /* Interrupt disable masks */ enum { -- 1.8.4 -- To unsubscribe from this list: send the line unsubscribe linux-scsi in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 4/6] scsi: ufs: add unipro attribute IDs
From: Seungwon Jeon tgih@samsung.com 'drivers/scsi/ufs/unipro.h' is added. Attributes in the layers of the UNIPRO stack can be read and written via the DME. Signed-off-by: Seungwon Jeon tgih@samsung.com Reviewed-by: Subhash Jadavani subha...@codeaurora.org Tested-by: Yaniv Gardi yga...@codeaurora.org Signed-off-by: Santosh Y santos...@gmail.com diff --git a/drivers/scsi/ufs/unipro.h b/drivers/scsi/ufs/unipro.h new file mode 100644 index 000..3a710eb --- /dev/null +++ b/drivers/scsi/ufs/unipro.h @@ -0,0 +1,130 @@ +/* + * drivers/scsi/ufs/unipro.h + * + * Copyright (C) 2013 Samsung Electronics Co., Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + */ + +#ifndef _UNIPRO_H_ +#define _UNIPRO_H_ + +/* + * PHY Adpater attributes + */ +#define PA_ACTIVETXDATALANES 0x1560 +#define PA_ACTIVERXDATALANES 0x1580 +#define PA_TXTRAILINGCLOCKS0x1564 +#define PA_PHY_TYPE0x1500 +#define PA_AVAILTXDATALANES0x1520 +#define PA_AVAILRXDATALANES0x1540 +#define PA_MINRXTRAILINGCLOCKS 0x1543 +#define PA_TXPWRSTATUS 0x1567 +#define PA_RXPWRSTATUS 0x1582 +#define PA_TXFORCECLOCK0x1562 +#define PA_TXPWRMODE 0x1563 +#define PA_LEGACYDPHYESCDL 0x1570 +#define PA_MAXTXSPEEDFAST 0x1521 +#define PA_MAXTXSPEEDSLOW 0x1522 +#define PA_MAXRXSPEEDFAST 0x1541 +#define PA_MAXRXSPEEDSLOW 0x1542 +#define PA_TXLINKSTARTUPHS 0x1544 +#define PA_TXSPEEDFAST 0x1565 +#define PA_TXSPEEDSLOW 0x1566 +#define PA_REMOTEVERINFO 0x15A0 +#define PA_TXGEAR 0x1568 +#define PA_TXTERMINATION 0x1569 +#define PA_HSSERIES0x156A +#define PA_PWRMODE 0x1571 +#define PA_RXGEAR 0x1583 +#define PA_RXTERMINATION 0x1584 +#define PA_MAXRXPWMGEAR0x1586 +#define PA_MAXRXHSGEAR 0x1587 +#define PA_RXHSUNTERMCAP 0x15A5 +#define PA_RXLSTERMCAP 0x15A6 +#define PA_PACPREQTIMEOUT 0x1590 +#define PA_PACPREQEOBTIMEOUT 0x1591 +#define PA_HIBERN8TIME 0x15A7 +#define PA_LOCALVERINFO0x15A9 +#define PA_TACTIVATE 0x15A8 +#define PA_PACPFRAMECOUNT 0x15C0 +#define PA_PACPERRORCOUNT 0x15C1 +#define PA_PHYTESTCONTROL 0x15C2 +#define PA_PWRMODEUSERDATA00x15B0 +#define PA_PWRMODEUSERDATA10x15B1 +#define PA_PWRMODEUSERDATA20x15B2 +#define PA_PWRMODEUSERDATA30x15B3 +#define PA_PWRMODEUSERDATA40x15B4 +#define PA_PWRMODEUSERDATA50x15B5 +#define PA_PWRMODEUSERDATA60x15B6 +#define PA_PWRMODEUSERDATA70x15B7 +#define PA_PWRMODEUSERDATA80x15B8 +#define PA_PWRMODEUSERDATA90x15B9 +#define PA_PWRMODEUSERDATA10 0x15BA +#define PA_PWRMODEUSERDATA11 0x15BB +#define PA_CONNECTEDTXDATALANES0x1561 +#define PA_CONNECTEDRXDATALANES0x1581 +#define PA_LOGICALLANEMAP 0x15A1 +#define PA_SLEEPNOCONFIGTIME 0x15A2 +#define PA_STALLNOCONFIGTIME 0x15A3 +#define PA_SAVECONFIGTIME 0x15A4 + +/* + * Data Link Layer Attributes + */ +#define DL_TC0TXFCTHRESHOLD0x2040 +#define DL_FC0PROTTIMEOUTVAL 0x2041 +#define DL_TC0REPLAYTIMEOUTVAL 0x2042 +#define DL_AFC0REQTIMEOUTVAL 0x2043 +#define DL_AFC0CREDITTHRESHOLD 0x2044 +#define DL_TC0OUTACKTHRESHOLD 0x2045 +#define DL_TC1TXFCTHRESHOLD0x2060 +#define DL_FC1PROTTIMEOUTVAL 0x2061 +#define DL_TC1REPLAYTIMEOUTVAL 0x2062 +#define DL_AFC1REQTIMEOUTVAL 0x2063 +#define DL_AFC1CREDITTHRESHOLD 0x2064 +#define DL_TC1OUTACKTHRESHOLD 0x2065 +#define DL_TXPREEMPTIONCAP 0x2000 +#define DL_TC0TXMAXSDUSIZE 0x2001 +#define DL_TC0RXINITCREDITVAL 0x2002 +#define DL_TC0TXBUFFERSIZE 0x2005 +#define DL_PEERTC0PRESENT 0x2046 +#define DL_PEERTC0RXINITCREVAL 0x2047 +#define DL_TC1TXMAXSDUSIZE 0x2003 +#define DL_TC1RXINITCREDITVAL 0x2004 +#define DL_TC1TXBUFFERSIZE 0x2006 +#define DL_PEERTC1PRESENT 0x2066 +#define DL_PEERTC1RXINITCREVAL 0x2067 + +/* + * Network Layer Attributes + */ +#define N_DEVICEID 0x3000 +#define N_DEVICEID_VALID 0x3001 +#define N_TC0TXMAXSDUSIZE 0x3020 +#define N_TC1TXMAXSDUSIZE 0x3021 + +/* + * Transport Layer Attributes + */ +#define T_NUMCPORTS0x4000 +#define T_NUMTESTFEATURES 0x4001 +#define T_CONNECTIONSTATE 0x4020 +#define T_PEERDEVICEID 0x4021 +#define T_PEERCPORTID 0x4022 +#define T_TRAFFICCLASS 0x4023 +#define T_PROTOCOLID 0x4024 +#define T_CPORTFLAGS 0x4025 +#define T_TXTOKENVALUE 0x4026 +#define T_RXTOKENVALUE 0x4027 +#define T_LOCALBUFFERSPACE 0x4028 +#define T_PEERBUFFERSPACE 0x4029 +#define T_CREDITSTOSEND0x402A +#define T_CPORTMODE0x402B +#define T_TC0TXMAXSDUSIZE 0x4060 +#define T_TC1TXMAXSDUSIZE
[PATCH 1/6] scsi: ufs: find out sense data over scsi status values
From: Seungwon Jeon tgih@samsung.com Unlike 'GOOD' and 'CHECK CONDITION', other status values in Response UPIU may or may not contain sense data. That is returning sense data isn't obvious. So, in this case the Data Segment Length field should be checked. If a non-zero value, it means that UPIU has Sense Data in the Data Segment area. Signed-off-by: Seungwon Jeon tgih@samsung.com Reviewed-by: Subhash Jadavani subha...@codeaurora.org Tested-by: Yaniv Gardi yga...@codeaurora.org Signed-off-by: Santosh Y santos...@gmail.com diff --git a/drivers/scsi/ufs/ufs.h b/drivers/scsi/ufs/ufs.h index bce09a6..7210500 100644 --- a/drivers/scsi/ufs/ufs.h +++ b/drivers/scsi/ufs/ufs.h @@ -177,6 +177,7 @@ enum { MASK_TASK_RESPONSE = 0xFF00, MASK_RSP_UPIU_RESULT= 0x, MASK_QUERY_DATA_SEG_LEN = 0x, + MASK_RSP_UPIU_DATA_SEG_LEN = 0x, MASK_RSP_EXCEPTION_EVENT= 0x1, }; diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c index a0f5ac2..ac3d56b 100644 --- a/drivers/scsi/ufs/ufshcd.c +++ b/drivers/scsi/ufs/ufshcd.c @@ -310,6 +310,20 @@ ufshcd_get_rsp_upiu_result(struct utp_upiu_rsp *ucd_rsp_ptr) return be32_to_cpu(ucd_rsp_ptr-header.dword_1) MASK_RSP_UPIU_RESULT; } +/* + * ufshcd_get_rsp_upiu_data_seg_len - Get the data segment length + * from response UPIU + * @ucd_rsp_ptr: pointer to response UPIU + * + * Return the data segment length. + */ +static inline unsigned int +ufshcd_get_rsp_upiu_data_seg_len(struct utp_upiu_rsp *ucd_rsp_ptr) +{ + return be32_to_cpu(ucd_rsp_ptr-header.dword_2) + MASK_RSP_UPIU_DATA_SEG_LEN; +} + /** * ufshcd_is_exception_event - Check if the device raised an exception event * @ucd_rsp_ptr: pointer to response UPIU @@ -405,7 +419,8 @@ void ufshcd_send_command(struct ufs_hba *hba, unsigned int task_tag) static inline void ufshcd_copy_sense_data(struct ufshcd_lrb *lrbp) { int len; - if (lrbp-sense_buffer) { + if (lrbp-sense_buffer + ufshcd_get_rsp_upiu_data_seg_len(lrbp-ucd_rsp_ptr)) { len = be16_to_cpu(lrbp-ucd_rsp_ptr-sr.sense_data_len); memcpy(lrbp-sense_buffer, lrbp-ucd_rsp_ptr-sr.sense_data, @@ -1789,32 +1804,24 @@ ufshcd_scsi_cmd_status(struct ufshcd_lrb *lrbp, int scsi_status) int result = 0; switch (scsi_status) { - case SAM_STAT_GOOD: - result |= DID_OK 16 | - COMMAND_COMPLETE 8 | - SAM_STAT_GOOD; - break; case SAM_STAT_CHECK_CONDITION: + ufshcd_copy_sense_data(lrbp); + case SAM_STAT_GOOD: result |= DID_OK 16 | COMMAND_COMPLETE 8 | - SAM_STAT_CHECK_CONDITION; - ufshcd_copy_sense_data(lrbp); - break; - case SAM_STAT_BUSY: - result |= SAM_STAT_BUSY; + scsi_status; break; case SAM_STAT_TASK_SET_FULL: - /* * If a LUN reports SAM_STAT_TASK_SET_FULL, then the LUN queue * depth needs to be adjusted to the exact number of * outstanding commands the LUN can handle at any given time. */ ufshcd_adjust_lun_qdepth(lrbp-cmd); - result |= SAM_STAT_TASK_SET_FULL; - break; + case SAM_STAT_BUSY: case SAM_STAT_TASK_ABORTED: - result |= SAM_STAT_TASK_ABORTED; + ufshcd_copy_sense_data(lrbp); + result |= scsi_status; break; default: result |= DID_ERROR 16; -- 1.8.4 -- To unsubscribe from this list: send the line unsubscribe linux-scsi in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 3/6] scsi: ufs: add dme configuration primitives
From: Seungwon Jeon tgih@samsung.com Implements to support GET and SET operations of the DME. These operations are used to configure the behavior of the UNIPRO. Along with basic operation, {Peer/AttrSetType} can be mixed. Signed-off-by: Seungwon Jeon tgih@samsung.com Reviewed-by: Subhash Jadavani subha...@codeaurora.org Tested-by: Yaniv Gardi yga...@codeaurora.org Signed-off-by: Santosh Y santos...@gmail.com diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c index 86d7286..03ff4da 100644 --- a/drivers/scsi/ufs/ufshcd.c +++ b/drivers/scsi/ufs/ufshcd.c @@ -285,6 +285,18 @@ static inline int ufshcd_get_uic_cmd_result(struct ufs_hba *hba) } /** + * ufshcd_get_dme_attr_val - Get the value of attribute returned by UIC command + * @hba: Pointer to adapter instance + * + * This function gets UIC command argument3 + * Returns 0 on success, non zero value on error + */ +static inline u32 ufshcd_get_dme_attr_val(struct ufs_hba *hba) +{ + return ufshcd_readl(hba, REG_UIC_COMMAND_ARG_3); +} + +/** * ufshcd_get_req_rsp - returns the TR response transaction type * @ucd_rsp_ptr: pointer to response UPIU */ @@ -1440,6 +1452,80 @@ static int ufshcd_dme_link_startup(struct ufs_hba *hba) } /** + * ufshcd_dme_set_attr - UIC command for DME_SET, DME_PEER_SET + * @hba: per adapter instance + * @attr_sel: uic command argument1 + * @attr_set: attribute set type as uic command argument2 + * @mib_val: setting value as uic command argument3 + * @peer: indicate whether peer or local + * + * Returns 0 on success, non-zero value on failure + */ +int ufshcd_dme_set_attr(struct ufs_hba *hba, u32 attr_sel, + u8 attr_set, u32 mib_val, u8 peer) +{ + struct uic_command uic_cmd = {0}; + static const char *const action[] = { + dme-set, + dme-peer-set + }; + const char *set = action[!!peer]; + int ret; + + uic_cmd.command = peer ? + UIC_CMD_DME_PEER_SET : UIC_CMD_DME_SET; + uic_cmd.argument1 = attr_sel; + uic_cmd.argument2 = UIC_ARG_ATTR_TYPE(attr_set); + uic_cmd.argument3 = mib_val; + + ret = ufshcd_send_uic_cmd(hba, uic_cmd); + if (ret) + dev_err(hba-dev, %s: attr-id 0x%x val 0x%x error code %d\n, + set, UIC_GET_ATTR_ID(attr_sel), mib_val, ret); + + return ret; +} +EXPORT_SYMBOL_GPL(ufshcd_dme_set_attr); + +/** + * ufshcd_dme_get_attr - UIC command for DME_GET, DME_PEER_GET + * @hba: per adapter instance + * @attr_sel: uic command argument1 + * @mib_val: the value of the attribute as returned by the UIC command + * @peer: indicate whether peer or local + * + * Returns 0 on success, non-zero value on failure + */ +int ufshcd_dme_get_attr(struct ufs_hba *hba, u32 attr_sel, + u32 *mib_val, u8 peer) +{ + struct uic_command uic_cmd = {0}; + static const char *const action[] = { + dme-get, + dme-peer-get + }; + const char *get = action[!!peer]; + int ret; + + uic_cmd.command = peer ? + UIC_CMD_DME_PEER_GET : UIC_CMD_DME_GET; + uic_cmd.argument1 = attr_sel; + + ret = ufshcd_send_uic_cmd(hba, uic_cmd); + if (ret) { + dev_err(hba-dev, %s: attr-id 0x%x error code %d\n, + get, UIC_GET_ATTR_ID(attr_sel), ret); + goto out; + } + + if (mib_val) + *mib_val = uic_cmd.argument3; +out: + return ret; +} +EXPORT_SYMBOL_GPL(ufshcd_dme_get_attr); + +/** * ufshcd_complete_dev_init() - checks device readiness * hba: per-adapter instance * @@ -1912,6 +1998,8 @@ static void ufshcd_uic_cmd_compl(struct ufs_hba *hba) if (hba-active_uic_cmd) { hba-active_uic_cmd-argument2 |= ufshcd_get_uic_cmd_result(hba); + hba-active_uic_cmd-argument3 = + ufshcd_get_dme_attr_val(hba); complete(hba-active_uic_cmd-done); } } diff --git a/drivers/scsi/ufs/ufshcd.h b/drivers/scsi/ufs/ufshcd.h index 8f5624e..ab1518d 100644 --- a/drivers/scsi/ufs/ufshcd.h +++ b/drivers/scsi/ufs/ufshcd.h @@ -275,4 +275,55 @@ static inline void check_upiu_size(void) extern int ufshcd_runtime_suspend(struct ufs_hba *hba); extern int ufshcd_runtime_resume(struct ufs_hba *hba); extern int ufshcd_runtime_idle(struct ufs_hba *hba); +extern int ufshcd_dme_set_attr(struct ufs_hba *hba, u32 attr_sel, + u8 attr_set, u32 mib_val, u8 peer); +extern int ufshcd_dme_get_attr(struct ufs_hba *hba, u32 attr_sel, + u32 *mib_val, u8 peer); + +/* UIC command interfaces for DME primitives */ +#define DME_LOCAL 0 +#define DME_PEER 1 +#define ATTR_SET_NOR 0 /* NORMAL */ +#define ATTR_SET_ST1 /* STATIC */ + +static inline int ufshcd_dme_set(struct ufs_hba *hba, u32 attr_sel, +u32 mib_val)
[PATCH 5/6] scsi: ufs: add operation for the uic power mode change
From: Seungwon Jeon tgih@samsung.com Setting PA_PWRMode using DME_SET triggers the power mode change. And then the result will be given by the HCS.UPMCRS. This operation should be done atomically. Signed-off-by: Seungwon Jeon tgih@samsung.com Reviewed-by: Subhash Jadavani subha...@codeaurora.org Tested-by: Yaniv Gardi yga...@codeaurora.org Signed-off-by: Santosh Y santos...@gmail.com diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c index 03ff4da..4c6d891 100644 --- a/drivers/scsi/ufs/ufshcd.c +++ b/drivers/scsi/ufs/ufshcd.c @@ -36,9 +36,11 @@ #include linux/async.h #include ufshcd.h +#include unipro.h #define UFSHCD_ENABLE_INTRS(UTP_TRANSFER_REQ_COMPL |\ UTP_TASK_REQ_COMPL |\ +UIC_POWER_MODE |\ UFSHCD_ERROR_MASK) /* UIC command timeout, unit: ms */ #define UIC_CMD_TIMEOUT500 @@ -520,6 +522,18 @@ static inline bool ufshcd_ready_for_uic_cmd(struct ufs_hba *hba) } /** + * ufshcd_get_upmcrs - Get the power mode change request status + * @hba: Pointer to adapter instance + * + * This function gets the UPMCRS field of HCS register + * Returns value of UPMCRS field + */ +static inline u8 ufshcd_get_upmcrs(struct ufs_hba *hba) +{ + return (ufshcd_readl(hba, REG_CONTROLLER_STATUS) 8) 0x7; +} + +/** * ufshcd_dispatch_uic_cmd - Dispatch UIC commands to unipro layers * @hba: per adapter instance * @uic_cmd: UIC command @@ -1526,6 +1540,64 @@ out: EXPORT_SYMBOL_GPL(ufshcd_dme_get_attr); /** + * ufshcd_uic_change_pwr_mode - Perform the UIC power mode chage + * using DME_SET primitives. + * @hba: per adapter instance + * @mode: powr mode value + * + * Returns 0 on success, non-zero value on failure + */ +int ufshcd_uic_change_pwr_mode(struct ufs_hba *hba, u8 mode) +{ + struct uic_command uic_cmd = {0}; + struct completion pwr_done; + unsigned long flags; + u8 status; + int ret; + + uic_cmd.command = UIC_CMD_DME_SET; + uic_cmd.argument1 = UIC_ARG_MIB(PA_PWRMODE); + uic_cmd.argument3 = mode; + init_completion(pwr_done); + + mutex_lock(hba-uic_cmd_mutex); + + spin_lock_irqsave(hba-host-host_lock, flags); + hba-pwr_done = pwr_done; + spin_unlock_irqrestore(hba-host-host_lock, flags); + ret = __ufshcd_send_uic_cmd(hba, uic_cmd); + if (ret) { + dev_err(hba-dev, + pwr mode change with mode 0x%x uic error %d\n, + mode, ret); + goto out; + } + + if (!wait_for_completion_timeout(hba-pwr_done, +msecs_to_jiffies(UIC_CMD_TIMEOUT))) { + dev_err(hba-dev, + pwr mode change with mode 0x%x completion timeout\n, + mode); + ret = -ETIMEDOUT; + goto out; + } + + status = ufshcd_get_upmcrs(hba); + if (status != PWR_LOCAL) { + dev_err(hba-dev, + pwr mode change failed, host umpcrs:0x%x\n, + status); + ret = (status != PWR_OK) ? status : -1; + } +out: + spin_lock_irqsave(hba-host-host_lock, flags); + hba-pwr_done = NULL; + spin_unlock_irqrestore(hba-host-host_lock, flags); + mutex_unlock(hba-uic_cmd_mutex); + return ret; +} + +/** * ufshcd_complete_dev_init() - checks device readiness * hba: per-adapter instance * @@ -1992,16 +2064,20 @@ ufshcd_transfer_rsp_status(struct ufs_hba *hba, struct ufshcd_lrb *lrbp) /** * ufshcd_uic_cmd_compl - handle completion of uic command * @hba: per adapter instance + * @intr_status: interrupt status generated by the controller */ -static void ufshcd_uic_cmd_compl(struct ufs_hba *hba) +static void ufshcd_uic_cmd_compl(struct ufs_hba *hba, u32 intr_status) { - if (hba-active_uic_cmd) { + if ((intr_status UIC_COMMAND_COMPL) hba-active_uic_cmd) { hba-active_uic_cmd-argument2 |= ufshcd_get_uic_cmd_result(hba); hba-active_uic_cmd-argument3 = ufshcd_get_dme_attr_val(hba); complete(hba-active_uic_cmd-done); } + + if ((intr_status UIC_POWER_MODE) hba-pwr_done) + complete(hba-pwr_done); } /** @@ -2451,8 +2527,8 @@ static void ufshcd_sl_intr(struct ufs_hba *hba, u32 intr_status) if (hba-errors) ufshcd_check_errors(hba); - if (intr_status UIC_COMMAND_COMPL) - ufshcd_uic_cmd_compl(hba); + if (intr_status UFSHCD_UIC_MASK) + ufshcd_uic_cmd_compl(hba, intr_status); if (intr_status UTP_TASK_REQ_COMPL) ufshcd_tmc_handler(hba); diff --git a/drivers/scsi/ufs/ufshcd.h b/drivers/scsi/ufs/ufshcd.h index ab1518d..ecff83d 100644 --- a/drivers/scsi/ufs/ufshcd.h +++
[PATCH 6/6] scsi: ufs: configure the attribute for power mode
From: Seungwon Jeon tgih@samsung.com UIC attributes can be set with using DME_SET command for power mode change. For configuration the link capability attributes are used, which is updated after successful link startup. Signed-off-by: Seungwon Jeon tgih@samsung.com Reviewed-by: Subhash Jadavani subha...@codeaurora.org Signed-off-by: Santosh Y santos...@gmail.com diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c index 4c6d891..d7a373f 100644 --- a/drivers/scsi/ufs/ufshcd.c +++ b/drivers/scsi/ufs/ufshcd.c @@ -1598,6 +1598,70 @@ out: } /** + * ufshcd_config_max_pwr_mode - Set Change power mode with + * maximum capability attribute information. + * @hba: per adapter instance + * + * Returns 0 on success, non-zero value on failure + */ +static int ufshcd_config_max_pwr_mode(struct ufs_hba *hba) +{ + enum {RX = 0, TX = 1}; + u32 lanes[] = {1, 1}; + u32 gear[] = {1, 1}; + u8 pwr[] = {FASTAUTO_MODE, FASTAUTO_MODE}; + int ret; + + /* Get the connected lane count */ + ufshcd_dme_get(hba, UIC_ARG_MIB(PA_CONNECTEDRXDATALANES), lanes[RX]); + ufshcd_dme_get(hba, UIC_ARG_MIB(PA_CONNECTEDTXDATALANES), lanes[TX]); + + /* +* First, get the maximum gears of HS speed. +* If a zero value, it means there is no HSGEAR capability. +* Then, get the maximum gears of PWM speed. +*/ + ufshcd_dme_get(hba, UIC_ARG_MIB(PA_MAXRXHSGEAR), gear[RX]); + if (!gear[RX]) { + ufshcd_dme_get(hba, UIC_ARG_MIB(PA_MAXRXPWMGEAR), gear[RX]); + pwr[RX] = SLOWAUTO_MODE; + } + + ufshcd_dme_peer_get(hba, UIC_ARG_MIB(PA_MAXRXHSGEAR), gear[TX]); + if (!gear[TX]) { + ufshcd_dme_peer_get(hba, UIC_ARG_MIB(PA_MAXRXPWMGEAR), + gear[TX]); + pwr[TX] = SLOWAUTO_MODE; + } + + /* +* Configure attributes for power mode change with below. +* - PA_RXGEAR, PA_ACTIVERXDATALANES, PA_RXTERMINATION, +* - PA_TXGEAR, PA_ACTIVETXDATALANES, PA_TXTERMINATION, +* - PA_HSSERIES +*/ + ufshcd_dme_set(hba, UIC_ARG_MIB(PA_RXGEAR), gear[RX]); + ufshcd_dme_set(hba, UIC_ARG_MIB(PA_ACTIVERXDATALANES), lanes[RX]); + if (pwr[RX] == FASTAUTO_MODE) + ufshcd_dme_set(hba, UIC_ARG_MIB(PA_RXTERMINATION), TRUE); + + ufshcd_dme_set(hba, UIC_ARG_MIB(PA_TXGEAR), gear[TX]); + ufshcd_dme_set(hba, UIC_ARG_MIB(PA_ACTIVETXDATALANES), lanes[TX]); + if (pwr[TX] == FASTAUTO_MODE) + ufshcd_dme_set(hba, UIC_ARG_MIB(PA_TXTERMINATION), TRUE); + + if (pwr[RX] == FASTAUTO_MODE || pwr[TX] == FASTAUTO_MODE) + ufshcd_dme_set(hba, UIC_ARG_MIB(PA_HSSERIES), PA_HS_MODE_B); + + ret = ufshcd_uic_change_pwr_mode(hba, pwr[RX] 4 | pwr[TX]); + if (ret) + dev_err(hba-dev, + pwr_mode: power mode change failed %d\n, ret); + + return ret; +} + +/** * ufshcd_complete_dev_init() - checks device readiness * hba: per-adapter instance * @@ -2942,6 +3006,8 @@ static void ufshcd_async_scan(void *data, async_cookie_t cookie) if (ret) goto out; + ufshcd_config_max_pwr_mode(hba); + ret = ufshcd_verify_dev_init(hba); if (ret) goto out; diff --git a/drivers/scsi/ufs/unipro.h b/drivers/scsi/ufs/unipro.h index 3a710eb..0bb8041 100644 --- a/drivers/scsi/ufs/unipro.h +++ b/drivers/scsi/ufs/unipro.h @@ -72,6 +72,21 @@ #define PA_STALLNOCONFIGTIME 0x15A3 #define PA_SAVECONFIGTIME 0x15A4 +/* PA power modes */ +enum { + FAST_MODE = 1, + SLOW_MODE = 2, + FASTAUTO_MODE = 4, + SLOWAUTO_MODE = 5, + UNCHANGED = 7, +}; + +/* PA TX/RX Frequency Series */ +enum { + PA_HS_MODE_A= 1, + PA_HS_MODE_B= 2, +}; + /* * Data Link Layer Attributes */ @@ -127,4 +142,10 @@ #define T_TC0TXMAXSDUSIZE 0x4060 #define T_TC1TXMAXSDUSIZE 0x4061 +/* Boolean attribute values */ +enum { + FALSE = 0, + TRUE, +}; + #endif /* _UNIPRO_H_ */ -- 1.8.4 -- To unsubscribe from this list: send the line unsubscribe linux-scsi in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[Bug 60758] module scsi_wait_scan not found kernel panic on boot
https://bugzilla.kernel.org/show_bug.cgi?id=60758 --- Comment #8 from zakrzews...@wp.pl --- Yes, I can test ;) -- You are receiving this mail because: You are the assignee for the bug. -- To unsubscribe from this list: send the line unsubscribe linux-scsi in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[GIT PULL] SCSI fixes for 3.11-rc7
This is a bug fix for the pm80xx driver. It turns out that when the new hardware support was added in 3.10 the IO command size was kept at the old hard coded value. This means that the driver attaches to some new cards and then simply hangs the system. The patch is available here: git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi.git scsi-fixes The short changelog is: Hans Verkuil (1): pm80xx: fix Adaptec 71605H hang And the diffstat drivers/scsi/pm8001/pm8001_hwi.c | 4 ++-- drivers/scsi/pm8001/pm80xx_hwi.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) With full diff attached below. James --- diff --git a/drivers/scsi/pm8001/pm8001_hwi.c b/drivers/scsi/pm8001/pm8001_hwi.c index 5456f5c..4a21957 100644 --- a/drivers/scsi/pm8001/pm8001_hwi.c +++ b/drivers/scsi/pm8001/pm8001_hwi.c @@ -221,7 +221,7 @@ static void init_default_table_values(struct pm8001_hba_info *pm8001_ha) pm8001_ha-main_cfg_tbl.pm8001_tbl.fatal_err_interrupt = 0x01; for (i = 0; i PM8001_MAX_INB_NUM; i++) { pm8001_ha-inbnd_q_tbl[i].element_pri_size_cnt = - PM8001_MPI_QUEUE | (64 16) | (0x0030); + PM8001_MPI_QUEUE | (pm8001_ha-iomb_size 16) | (0x0030); pm8001_ha-inbnd_q_tbl[i].upper_base_addr = pm8001_ha-memoryMap.region[IB + i].phys_addr_hi; pm8001_ha-inbnd_q_tbl[i].lower_base_addr = @@ -247,7 +247,7 @@ static void init_default_table_values(struct pm8001_hba_info *pm8001_ha) } for (i = 0; i PM8001_MAX_OUTB_NUM; i++) { pm8001_ha-outbnd_q_tbl[i].element_size_cnt = - PM8001_MPI_QUEUE | (64 16) | (0x0130); + PM8001_MPI_QUEUE | (pm8001_ha-iomb_size 16) | (0x0130); pm8001_ha-outbnd_q_tbl[i].upper_base_addr = pm8001_ha-memoryMap.region[OB + i].phys_addr_hi; pm8001_ha-outbnd_q_tbl[i].lower_base_addr = diff --git a/drivers/scsi/pm8001/pm80xx_hwi.c b/drivers/scsi/pm8001/pm80xx_hwi.c index 7f77210..9f91030 100644 --- a/drivers/scsi/pm8001/pm80xx_hwi.c +++ b/drivers/scsi/pm8001/pm80xx_hwi.c @@ -275,7 +275,7 @@ static void init_default_table_values(struct pm8001_hba_info *pm8001_ha) for (i = 0; i PM8001_MAX_SPCV_INB_NUM; i++) { pm8001_ha-inbnd_q_tbl[i].element_pri_size_cnt = - PM8001_MPI_QUEUE | (64 16) | (0x0030); + PM8001_MPI_QUEUE | (pm8001_ha-iomb_size 16) | (0x0030); pm8001_ha-inbnd_q_tbl[i].upper_base_addr = pm8001_ha-memoryMap.region[IB + i].phys_addr_hi; pm8001_ha-inbnd_q_tbl[i].lower_base_addr = @@ -301,7 +301,7 @@ static void init_default_table_values(struct pm8001_hba_info *pm8001_ha) } for (i = 0; i PM8001_MAX_SPCV_OUTB_NUM; i++) { pm8001_ha-outbnd_q_tbl[i].element_size_cnt = - PM8001_MPI_QUEUE | (64 16) | (0x0130); + PM8001_MPI_QUEUE | (pm8001_ha-iomb_size 16) | (0x0130); pm8001_ha-outbnd_q_tbl[i].upper_base_addr = pm8001_ha-memoryMap.region[OB + i].phys_addr_hi; pm8001_ha-outbnd_q_tbl[i].lower_base_addr = -- To unsubscribe from this list: send the line unsubscribe linux-scsi in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[Bug 60758] module scsi_wait_scan not found kernel panic on boot
https://bugzilla.kernel.org/show_bug.cgi?id=60758 --- Comment #9 from zakrzews...@wp.pl --- I will booting with these options: timeout 0 default 0 title CentOS (3.10.10-1.el6.elrepo.x86_64) root (hd0,1) kernel /vmlinuz-3.10.10-1.el6.elrepo.x86_64 ro root=/dev/md2 rd_NO_LUKS rd_NO_DM nomodeset crashkernel=auto SYSFONT=latarcyrheb-sun16 LANG=en_US.UTF-8 KEYTABLE=de scsi_mod.scan=sync initrd /initramfs-3.10.10-1.el6.elrepo.x86_64.img -- You are receiving this mail because: You are the assignee for the bug. -- To unsubscribe from this list: send the line unsubscribe linux-scsi in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[Bug 60758] module scsi_wait_scan not found kernel panic on boot
https://bugzilla.kernel.org/show_bug.cgi?id=60758 --- Comment #10 from zakrzews...@wp.pl --- Made a mistake, so once again: timeout 0 default 0 title CentOS (3.10.10-1.el6.elrepo.x86_64) root (hd0,1) kernel /vmlinuz-3.10.10-1.el6.elrepo.x86_64 ro root=/dev/md2 rd_NO_LUKS rd_NO_DM nomodeset crashkernel=auto SYSFONT=latarcyrheb-sun16 LANG=en_US.UTF-8 KEYTABLE=de scsi_mod.scan=async initrd /initramfs-3.10.10-1.el6.elrepo.x86_64.img -- You are receiving this mail because: You are the assignee for the bug. -- To unsubscribe from this list: send the line unsubscribe linux-scsi in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH] scsi: bfa: Use ARRAY_SIZE
Use ARRAY_SIZE to calculate the size of an array. Signed-off-by: Christoph Jaeger christophjae...@linux.com --- drivers/scsi/bfa/bfa_core.c | 2 +- drivers/scsi/bfa/bfa_fcs.c | 10 -- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/drivers/scsi/bfa/bfa_core.c b/drivers/scsi/bfa/bfa_core.c index 520540a..4cc8763 100644 --- a/drivers/scsi/bfa/bfa_core.c +++ b/drivers/scsi/bfa/bfa_core.c @@ -1941,7 +1941,7 @@ bfa_get_pciids(struct bfa_pciid_s **pciids, int *npciids) {BFA_PCI_VENDOR_ID_BROCADE, BFA_PCI_DEVICE_ID_CT_FC}, }; - *npciids = sizeof(__pciids) / sizeof(__pciids[0]); + *npciids = ARRAY_SIZE(__pciids); *pciids = __pciids; } diff --git a/drivers/scsi/bfa/bfa_fcs.c b/drivers/scsi/bfa/bfa_fcs.c index a3ab5cc..6a8 100644 --- a/drivers/scsi/bfa/bfa_fcs.c +++ b/drivers/scsi/bfa/bfa_fcs.c @@ -81,7 +81,7 @@ bfa_fcs_attach(struct bfa_fcs_s *fcs, struct bfa_s *bfa, struct bfad_s *bfad, bfa-fcs = BFA_TRUE; fcbuild_init(); - for (i = 0; i sizeof(fcs_modules) / sizeof(fcs_modules[0]); i++) { + for (i = 0; i ARRAY_SIZE(fcs_modules); i++) { mod = fcs_modules[i]; if (mod-attach) mod-attach(fcs); @@ -97,7 +97,7 @@ bfa_fcs_init(struct bfa_fcs_s *fcs) int i; struct bfa_fcs_mod_s *mod; - for (i = 0; i sizeof(fcs_modules) / sizeof(fcs_modules[0]); i++) { + for (i = 0; i ARRAY_SIZE(fcs_modules); i++) { mod = fcs_modules[i]; if (mod-modinit) mod-modinit(fcs); @@ -180,13 +180,11 @@ void bfa_fcs_exit(struct bfa_fcs_s *fcs) { struct bfa_fcs_mod_s *mod; - int nmods, i; + int i; bfa_wc_init(fcs-wc, bfa_fcs_exit_comp, fcs); - nmods = sizeof(fcs_modules) / sizeof(fcs_modules[0]); - - for (i = 0; i nmods; i++) { + for (i = 0; i ARRAY_SIZE(fcs_modules); i++) { mod = fcs_modules[i]; if (mod-modexit) { -- 1.8.3.1 -- To unsubscribe from this list: send the line unsubscribe linux-scsi in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH] scsi disk: Use its own buffer for the vpd request
On 31 Aug 2013, Greg KH said: On Fri, Aug 30, 2013 at 11:01:56AM +0100, Nix wrote: On 1 Aug 2013, Bernd Schubert said: Once I noticed that scsi_get_vpd_page() works fine from other function calls and that it is not 0x89, but already 0x0 that fails fixing it became easy. Nix, any chance you could verify it also works for you? As an aside, this commit does indeed fix the bug I reported, but it doesn't seem to have gone anywhere, not even into -stable. Is it held up somehow? (stable has commit 0ac10bd036f0f3b8ce7ac2390446eab9531c72eb Author: Martin K. Petersen martin.peter...@oracle.com Date: Tue Jul 30 22:58:34 2013 -0400 SCSI: Don't attempt to send extended INQUIRY command if skip_vpd_pages is set which IIRC was eventually found not to be necessary, because this fix works fine instead?) Possibly I'm misremembering the order of month-old events and Martin's fix was eventually considered better... in which case, sorry for the noise. Is that other patch even needed anymore, now that Martin's patch is in the tree? My understanding is that this patch is rather better, since Martin's patch prevents sending of the extended INQUIRY command at all: this one just uses a reduced buffer size, but can still issue the command. (But I may be misunderstanding everything.) -- NULL (void) -- To unsubscribe from this list: send the line unsubscribe linux-scsi in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[Bug 60758] module scsi_wait_scan not found kernel panic on boot
https://bugzilla.kernel.org/show_bug.cgi?id=60758 --- Comment #11 from Jeff Zhou jz.researc...@yahoo.com --- Thanks. I am a bit curious about the description in Kconfig, since the scsi_wait_scan.ko was built from scsi_wait_scan.c, which was removed in v.3.6. How to refer a non-exist module, as described in the section of config SCSI_SCAN_ASYNC From v.3.5.7 to v.3.6.1, there is a change in source code, but it seems the documentation in Kconfig has not been updated. (In reply to Alan Bartlett from comment #7) (In reply to Jeff Zhou from comment #5) If your system fails by module scsi_wait_scan not found, then it could be the init script issue in your CentOS box. The last kernel with scsi_wait_scan.ko is v3.5.7, it has been removed ever since v3.6. Any init script for 3.10 should not use that module. Another point is in your config, the CONFIG_SCSI_SCAN_ASYNC is not set, try to turn it into Y and see what's happening. Jeff, For the fuller picture please see -- http://elrepo.org/bugs/view.php?id=401 This non-booting issue only occurs with one system. The reporter has other systems which do boot correctly using the same kernel(s). As was explained in the referenced bug report (note 3235), the mention of module scsi_wait_scan not found is a red-herring. Note the following section from the 3.10.10 drivers/scsi/Kconfig file -- [quote] config SCSI_SCAN_ASYNC bool Asynchronous SCSI scanning depends on SCSI help The SCSI subsystem can probe for devices while the rest of the system continues booting, and even probe devices on different busses in parallel, leading to a significant speed-up. If you have built SCSI as modules, enabling this option can be a problem as the devices may not have been found by the time your system expects them to have been. You can load the scsi_wait_scan module to ensure that all scans have completed. If you build your SCSI drivers into the kernel, then everything will work fine if you say Y here. You can override this choice by specifying scsi_mod.scan=sync or async on the kernel's command line. [/quote] It still makes a reference to the scsi_wait_scan module and advises against setting SCSI_SCAN_ASYNC=y when scsi drivers have been built as modules. It is unnecessary to build a new kernel to test, as per your last point. Just appending scsi_mod.scan=async to the kernel boot line will be sufficient. Perhaps the reporter will test with that and then report back? Alan / burakkucat. -- You are receiving this mail because: You are the assignee for the bug. -- To unsubscribe from this list: send the line unsubscribe linux-scsi in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[Bug 60758] module scsi_wait_scan not found kernel panic on boot
https://bugzilla.kernel.org/show_bug.cgi?id=60758 --- Comment #12 from Jeff Zhou jz.researc...@yahoo.com --- (In reply to zakrzewskim from comment #10) Made a mistake, so once again: timeout 0 default 0 title CentOS (3.10.10-1.el6.elrepo.x86_64) root (hd0,1) kernel /vmlinuz-3.10.10-1.el6.elrepo.x86_64 ro root=/dev/md2 rd_NO_LUKS rd_NO_DM nomodeset crashkernel=auto SYSFONT=latarcyrheb-sun16 LANG=en_US.UTF-8 KEYTABLE=de scsi_mod.scan=async initrd /initramfs-3.10.10-1.el6.elrepo.x86_64.img In thread http://elrepo.org/bugs/view.php?id=401 says 3.10.4-1 boots fine, would you run lsinitramfs to see if scsi_scan_wait module is there? From changelog 3.10.4 to 3.10.5, I did not see any modifications to that. -- You are receiving this mail because: You are the assignee for the bug. -- To unsubscribe from this list: send the line unsubscribe linux-scsi in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[Bug 60758] module scsi_wait_scan not found kernel panic on boot
https://bugzilla.kernel.org/show_bug.cgi?id=60758 --- Comment #13 from zakrzews...@wp.pl --- lsinitramfs -bash: lsinitramfs: command not found What do I need to install ? -- You are receiving this mail because: You are the assignee for the bug. -- To unsubscribe from this list: send the line unsubscribe linux-scsi in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[Bug 60758] module scsi_wait_scan not found kernel panic on boot
https://bugzilla.kernel.org/show_bug.cgi?id=60758 --- Comment #14 from zakrzews...@wp.pl --- The server does not boot with kernel 3.10.10-1.el6.elrepo.x86_64 :/ -- You are receiving this mail because: You are the assignee for the bug. -- To unsubscribe from this list: send the line unsubscribe linux-scsi in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[Bug 60758] module scsi_wait_scan not found kernel panic on boot
https://bugzilla.kernel.org/show_bug.cgi?id=60758 --- Comment #15 from Akemi Yagi tora...@elrepo.org --- (In reply to zakrzewskim from comment #13) lsinitramfs -bash: lsinitramfs: command not found What do I need to install ? You can use lsinitrd that is included in the dracut package. -- You are receiving this mail because: You are the assignee for the bug. -- To unsubscribe from this list: send the line unsubscribe linux-scsi in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [GIT PULL -v2] target fixes for v3.11
Hi again Linus, On Fri, 2013-08-30 at 20:53 -0700, Nicholas A. Bellinger wrote: Hi Linus, Here is a -v2 PULL request for the current set of target-pending fixes for v3.11. These fixes have not hit mainline yet, so I'm resending them now to be sure they hit v3.11 before the merge window opens. Please let me know if you have any concerns with the series. The original PULL request from last Saturday is here: http://marc.info/?l=linux-kernelm=137737916904812w=2 Please go ahead and pull from: git://git.kernel.org/pub/scm/linux/kernel/git/nab/target-pending.git master The first patch is to address a long standing issue where INQUIRY vendor + model response data was not correctly padded with ASCII spaces, causing MSFT and Falconstor multipath stacks to not function with our LUNs. The remaining patches are additional iscsi-target regression fixes for the post = v3.10 iser-target changes. The second and third are failure cases that have appeared during further testing, and the forth is only reproducible with malformed NOP packets. The last three patches are CC'ed to stable, and the first one will be sent to Greg-KH separately. One more late v3.11 specific regression fix has been pushed into target-pending/master for this series. The updated diffstat should read: Nicholas Bellinger (5): target: Fix trailing ASCII space usage in INQUIRY vendor+model iscsi-target: Fix ImmediateData=Yes failure regression in = v3.10 iscsi-target: Fix iscsit_transport reference leak during NP thread reset iscsi-target: Fix potential NULL pointer in solicited NOPOUT reject target: Fix se_cmd-state_list leak regression during WRITE failure drivers/target/iscsi/iscsi_target.c | 17 ++--- drivers/target/iscsi/iscsi_target_login.c |9 - drivers/target/target_core_spc.c |9 ++--- drivers/target/target_core_transport.c| 11 +++ 4 files changed, 31 insertions(+), 15 deletions(-) The full diff is included below. Please PULL. Thank you, --nab diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c index f73da43..3a17930 100644 --- a/drivers/target/iscsi/iscsi_target.c +++ b/drivers/target/iscsi/iscsi_target.c @@ -1086,7 +1086,6 @@ int iscsit_process_scsi_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, if (cmd-reject_reason) return 0; - target_put_sess_cmd(conn-sess-se_sess, cmd-se_cmd); return 1; } /* @@ -1124,14 +1123,10 @@ after_immediate_data: */ cmdsn_ret = iscsit_sequence_cmd(cmd-conn, cmd, (unsigned char *)hdr, hdr-cmdsn); - if (cmdsn_ret == CMDSN_ERROR_CANNOT_RECOVER) { + if (cmdsn_ret == CMDSN_ERROR_CANNOT_RECOVER) return -1; - } else if (cmdsn_ret == CMDSN_LOWER_THAN_EXP) { - target_put_sess_cmd(conn-sess-se_sess, cmd-se_cmd); - return 0; - } - if (cmd-sense_reason) { + if (cmd-sense_reason || cmdsn_ret == CMDSN_LOWER_THAN_EXP) { int rc; rc = iscsit_dump_data_payload(cmd-conn, @@ -1527,6 +1522,10 @@ int iscsit_setup_nop_out(struct iscsi_conn *conn, struct iscsi_cmd *cmd, if (hdr-itt == RESERVED_ITT !(hdr-opcode ISCSI_OP_IMMEDIATE)) { pr_err(NOPOUT ITT is reserved, but Immediate Bit is not set, protocol error.\n); + if (!cmd) + return iscsit_add_reject(conn, ISCSI_REASON_PROTOCOL_ERROR, +(unsigned char *)hdr); + return iscsit_reject_cmd(cmd, ISCSI_REASON_PROTOCOL_ERROR, (unsigned char *)hdr); } @@ -1536,6 +1535,10 @@ int iscsit_setup_nop_out(struct iscsi_conn *conn, struct iscsi_cmd *cmd, greater than MaxXmitDataSegmentLength: %u, protocol error.\n, payload_length, conn-conn_ops-MaxXmitDataSegmentLength); + if (!cmd) + return iscsit_add_reject(conn, ISCSI_REASON_PROTOCOL_ERROR, +(unsigned char *)hdr); + return iscsit_reject_cmd(cmd, ISCSI_REASON_PROTOCOL_ERROR, (unsigned char *)hdr); } diff --git a/drivers/target/iscsi/iscsi_target_login.c b/drivers/target/iscsi/iscsi_target_login.c index 3402241..bc788c5 100644 --- a/drivers/target/iscsi/iscsi_target_login.c +++ b/drivers/target/iscsi/iscsi_target_login.c @@ -1163,12 +1163,11 @@ static int __iscsi_target_login_thread(struct iscsi_np *np) if (np-np_thread_state == ISCSI_NP_THREAD_RESET) {
[PATCH 1/2] megaraid_sas: Add High Availability clustering support using shared Logical Disks
James/linux-scsi, The following patch for megaraid_sas will add support for High Availability (HA)/clustering using shared Logical Disks. Signed-off-by: Adam Radford aradf...@gmail.com diff -Naur scsi-misc.old/drivers/scsi/megaraid/megaraid_sas_base.c scsi-misc.new/drivers/scsi/megaraid/megaraid_sas_base.c --- scsi-misc.old/drivers/scsi/megaraid/megaraid_sas_base.c 2013-08-31 16:17:56.907172388 -0700 +++ scsi-misc.new/drivers/scsi/megaraid/megaraid_sas_base.c 2013-08-31 16:23:31.077143117 -0700 @@ -92,6 +92,8 @@ int megasas_transition_to_ready(struct megasas_instance *instance, int ocr); static int megasas_get_pd_list(struct megasas_instance *instance); +static int megasas_ld_list_query(struct megasas_instance *instance, + u8 query_type); static int megasas_issue_init_mfi(struct megasas_instance *instance); static int megasas_register_aen(struct megasas_instance *instance, u32 seq_num, u32 class_locale_word); @@ -3271,6 +3273,84 @@ } /** + * megasas_ld_list_query - Returns FW's ld_list structure + * @instance: Adapter soft state + * @ld_list: ld_list structure + * + * Issues an internal command (DCMD) to get the FW's controller PD + * list structure. This information is mainly used to find out SYSTEM + * supported by the FW. + */ +static int +megasas_ld_list_query(struct megasas_instance *instance, u8 query_type) +{ + int ret = 0, ld_index = 0, ids = 0; + struct megasas_cmd *cmd; + struct megasas_dcmd_frame *dcmd; + struct MR_LD_TARGETID_LIST *ci; + dma_addr_t ci_h = 0; + + cmd = megasas_get_cmd(instance); + + if (!cmd) { + printk(KERN_WARNING + megasas:(megasas_ld_list_query): Failed to get cmd\n); + return -ENOMEM; + } + + dcmd = cmd-frame-dcmd; + + ci = pci_alloc_consistent(instance-pdev, + sizeof(struct MR_LD_TARGETID_LIST), ci_h); + + if (!ci) { + printk(KERN_WARNING + megasas: Failed to alloc mem for ld_list_query\n); + megasas_return_cmd(instance, cmd); + return -ENOMEM; + } + + memset(ci, 0, sizeof(*ci)); + memset(dcmd-mbox.b, 0, MFI_MBOX_SIZE); + + dcmd-mbox.b[0] = query_type; + + dcmd-cmd = MFI_CMD_DCMD; + dcmd-cmd_status = 0xFF; + dcmd-sge_count = 1; + dcmd-flags = MFI_FRAME_DIR_READ; + dcmd-timeout = 0; + dcmd-data_xfer_len = sizeof(struct MR_LD_TARGETID_LIST); + dcmd-opcode = MR_DCMD_LD_LIST_QUERY; + dcmd-sgl.sge32[0].phys_addr = ci_h; + dcmd-sgl.sge32[0].length = sizeof(struct MR_LD_TARGETID_LIST); + dcmd-pad_0 = 0; + + if (!megasas_issue_polled(instance, cmd) !dcmd-cmd_status) { + ret = 0; + } else { + /* On failure, call older LD list DCMD */ + ret = 1; + } + + if ((ret == 0) (ci-count = (MAX_LOGICAL_DRIVES))) { + memset(instance-ld_ids, 0xff, MEGASAS_MAX_LD_IDS); + for (ld_index = 0; ld_index ci-count; ld_index++) { + ids = ci-targetId[ld_index]; + instance-ld_ids[ids] = ci-targetId[ld_index]; + } + + } + + pci_free_consistent(instance-pdev, sizeof(struct MR_LD_TARGETID_LIST), +ci, ci_h); + + megasas_return_cmd(instance, cmd); + + return ret; +} + +/** * megasas_get_controller_info - Returns FW's controller structure * @instance: Adapter soft state * @ctrl_info: Controller information structure @@ -3648,7 +3728,9 @@ megasas_get_pd_list(instance); memset(instance-ld_ids, 0xff, MEGASAS_MAX_LD_IDS); - megasas_get_ld_list(instance); + if (megasas_ld_list_query(instance, + MR_LD_QUERY_TYPE_EXPOSED_TO_HOST)) + megasas_get_ld_list(instance); ctrl_info = kmalloc(sizeof(struct megasas_ctrl_info), GFP_KERNEL); @@ -5389,7 +5471,9 @@ case MR_EVT_LD_OFFLINE: case MR_EVT_CFG_CLEARED: case MR_EVT_LD_DELETED: - megasas_get_ld_list(instance); + if (megasas_ld_list_query(instance, + MR_LD_QUERY_TYPE_EXPOSED_TO_HOST)) + megasas_get_ld_list(instance); for (i = 0; i MEGASAS_MAX_LD_CHANNELS; i++) { for (j = 0; j MEGASAS_MAX_DEV_PER_CHANNEL; @@ -5399,7 +5483,7 @@ (i * MEGASAS_MAX_DEV_PER_CHANNEL) + j; sdev1 = scsi_device_lookup(host, - i + MEGASAS_MAX_LD_CHANNELS, + MEGASAS_MAX_PD_CHANNELS + i, j, 0); @@ -5418,7 +5502,9 @@ doscan = 0; break; case MR_EVT_LD_CREATED: - megasas_get_ld_list(instance); + if (megasas_ld_list_query(instance, + MR_LD_QUERY_TYPE_EXPOSED_TO_HOST)) + megasas_get_ld_list(instance); for (i = 0; i MEGASAS_MAX_LD_CHANNELS; i++) { for (j = 0; j MEGASAS_MAX_DEV_PER_CHANNEL; @@ -5427,14 +5513,14 @@ (i * MEGASAS_MAX_DEV_PER_CHANNEL) + j; sdev1 = scsi_device_lookup(host, - i+MEGASAS_MAX_LD_CHANNELS, + MEGASAS_MAX_PD_CHANNELS + i, j, 0); if (instance-ld_ids[ld_index] != 0xff) { if (!sdev1) { scsi_add_device(host, - i + 2, + MEGASAS_MAX_PD_CHANNELS + i, j, 0); } } @@ -5483,18 +5569,20 @@ } } - megasas_get_ld_list(instance); + if (megasas_ld_list_query(instance, + MR_LD_QUERY_TYPE_EXPOSED_TO_HOST)) + megasas_get_ld_list(instance); for (i = 0; i MEGASAS_MAX_LD_CHANNELS; i++) { for (j = 0; j MEGASAS_MAX_DEV_PER_CHANNEL; j++) { ld_index = (i * MEGASAS_MAX_DEV_PER_CHANNEL) + j; sdev1 = scsi_device_lookup(host, - i+MEGASAS_MAX_LD_CHANNELS, j, 0); + MEGASAS_MAX_PD_CHANNELS + i,
[PATCH 0/2] megaraid_sas: Updates for scsi-misc
James/linux-scsi, The following small patch series for megaraid_sas brings the driver up to v06.700.06.00-rc1: 1. Add High Availability clustering support using shared Logical Disks. 2. Version and Changelog update. -Adam -- To unsubscribe from this list: send the line unsubscribe linux-scsi in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 2/2] megaraid_sas: Version and Changelog update
James/linux-scsi, This patch updates the megaraid_sas driver version and updates Documentation/ChangeLog.megaraid_sas Signed-off-by: Adam Radford aradf...@gmail.com diff -Naur scsi-misc.old/Documentation/scsi/ChangeLog.megaraid_sas scsi-misc.new/Documentation/scsi/ChangeLog.megaraid_sas --- scsi-misc.old/Documentation/scsi/ChangeLog.megaraid_sas 2013-08-25 17:43:22.0 -0700 +++ scsi-misc.new/Documentation/scsi/ChangeLog.megaraid_sas 2013-08-31 16:09:54.273079869 -0700 @@ -1,3 +1,13 @@ +Release Date: Sat. Aug 31, 2013 17:00:00 PST 2013 - + (emaild-id:megaraidli...@lsi.com) + Adam Radford + Kashyap Desai + Sumit Saxena +Current Version : 06.700.06.00-rc1 +Old Version : 06.600.18.00-rc1 +1. Add High Availability clustering support using shared Logical Disks. +2. Version and Changelog update. +--- Release Date: Wed. May 15, 2013 17:00:00 PST 2013 - (emaild-id:megaraidli...@lsi.com) Adam Radford diff -Naur scsi-misc.old/drivers/scsi/megaraid/megaraid_sas_base.c scsi-misc.new/drivers/scsi/megaraid/megaraid_sas_base.c --- scsi-misc.old/drivers/scsi/megaraid/megaraid_sas_base.c 2013-08-31 16:05:24.341172944 -0700 +++ scsi-misc.new/drivers/scsi/megaraid/megaraid_sas_base.c 2013-08-31 16:07:04.985077563 -0700 @@ -18,7 +18,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * FILE: megaraid_sas_base.c - * Version : 06.600.18.00-rc1 + * Version : 06.700.06.00-rc1 * * Authors: LSI Corporation * Sreenivas Bagalkote diff -Naur scsi-misc.old/drivers/scsi/megaraid/megaraid_sas.h scsi-misc.new/drivers/scsi/megaraid/megaraid_sas.h --- scsi-misc.old/drivers/scsi/megaraid/megaraid_sas.h 2013-08-31 16:05:24.394079466 -0700 +++ scsi-misc.new/drivers/scsi/megaraid/megaraid_sas.h 2013-08-31 16:06:48.461080925 -0700 @@ -33,9 +33,9 @@ /* * MegaRAID SAS Driver meta data */ -#define MEGASAS_VERSION 06.600.18.00-rc1 -#define MEGASAS_RELDATE May. 15, 2013 -#define MEGASAS_EXT_VERSION Wed. May. 15 17:00:00 PDT 2013 +#define MEGASAS_VERSION 06.700.06.00-rc1 +#define MEGASAS_RELDATE Aug. 31, 2013 +#define MEGASAS_EXT_VERSION Sat. Aug. 31 17:00:00 PDT 2013 /* * Device IDs megaraid_sas.patch2 Description: Binary data
[Bug 60758] module scsi_wait_scan not found kernel panic on boot
https://bugzilla.kernel.org/show_bug.cgi?id=60758 --- Comment #16 from Alan Bartlett a...@elrepo.org --- For completeness (so that we cover 'every angle') I have built a version of our kernel-ml-3.10.10 package (64-bit) with CONFIG_SCSI_SCAN_ASYNC=y, as Jeff has suggested. It is available to download from -- http://elrepo.org/people/ajb/tmp/ However I do not expect that will make any difference. -- You are receiving this mail because: You are the assignee for the bug. -- To unsubscribe from this list: send the line unsubscribe linux-scsi in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[Bug 60758] module scsi_wait_scan not found kernel panic on boot
https://bugzilla.kernel.org/show_bug.cgi?id=60758 --- Comment #17 from zakrzews...@wp.pl --- It doesn't work too. I don't know what's wrong. Only 3.10.4-1 works fine and I need to stick with it :/ -- You are receiving this mail because: You are the assignee for the bug. -- To unsubscribe from this list: send the line unsubscribe linux-scsi in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[Bug 60758] module scsi_wait_scan not found kernel panic on boot
https://bugzilla.kernel.org/show_bug.cgi?id=60758 --- Comment #18 from Jeff Zhou jz.researc...@yahoo.com --- (In reply to zakrzewskim from comment #17) It doesn't work too. I don't know what's wrong. Only 3.10.4-1 works fine and I need to stick with it :/ [1] May I know, do you have separate directories for each version of kernel source during building/installation, or unpack different versions of kernel source to the same folder to save some space while upgrading? [2] Would you like to show a more complete booting log? -- You are receiving this mail because: You are the assignee for the bug. -- To unsubscribe from this list: send the line unsubscribe linux-scsi in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html