5.14.4-rc1 review
Subsystems (2)
Greg Kroah-Hartman
maintainerPATCH 125/334 drm/amd/pm: Fix a bug communicating with the SMU (v5)
In reply to Greg Kroah-HartmanFrom: Luben Tuikov <[email protected]>
[ Upstream commit 5810323ba692895b045e3f1b3e107605c3717dab ]
This fixes a bug which if we probe a non-existing I2C device, and the SMU returns 0xFF, from then on we can never communicate with the SMU, because the code before this patch reads and interprets 0xFF as a terminal error, and thus we never write 0 into register 90 to clear the status (and subsequently send a new command to the SMU.)
It is not an error that the SMU returns status 0xFF. This means that the SMU executed the last command successfully (execution status), but the command result is an error of some sort (execution result), depending on what the command was.
When doing a status check of the SMU, before we send a new command, the only status which precludes us from sending a new command is 0--the SMU hasn't finished executing a previous command, and 0xFC--the SMU is busy.
This bug was seen as the following line in the kernel log,
amdgpu: Msg issuing pre-check failed(0xff) and SMU may be not in the right state!
when subsequent SMU commands, not necessarily related to I2C, were sent to the SMU.
This patch fixes this bug.
v2: Add a comment to the description of __smu_cmn_poll_stat() to explain why we're NOT defining the SMU FW return codes as macros, but are instead hard-coding them. Such a change, can be followed up by a subsequent patch.
v3: The changes are,
a) Add comments to break labels in
__smu_cmn_reg2errno().
b) When an unknown/unspecified/undefined result is returned back from the SMU, map that to -EREMOTEIO, to distinguish failure at the SMU FW.
c) Add kernel-doc to
smu_cmn_send_msg_without_waiting(),
smu_cmn_wait_for_response(),
smu_cmn_send_smc_msg_with_param().
d) In smu_cmn_send_smc_msg_with_param(), since we wait for completion of the command, if the result of the completion is undefined/unknown/unspecified, we print that to the kernel log.
v4: a) Add macros as requested, though redundant, to
be removed when SMU consolidates for all ASICs--see comment in code.
b) Get out if the SMU code is unknown.
v5: Rename the macro names.
--- drivers/gpu/drm/amd/pm/swsmu/smu_cmn.c | 288 +++++++++++++++++++++---- drivers/gpu/drm/amd/pm/swsmu/smu_cmn.h | 3 +- 2 files changed, 244 insertions(+), 47 deletions(-)
drivers/gpu/drm/amd/pm/swsmu/smu_cmn.c +242 -46
@@ -55,7 +55,7 @@#undef __SMU_DUMMY_MAP#define __SMU_DUMMY_MAP (type) #type -static const char * __smu_message_names[] = { +static const char *const __smu_message_names[] = {SMU_MESSAGE_TYPES };
@@ -76,55 +76,258 @@ static void smu_cmn_read_arg(struct smu_context *smu, *arg =RREG32_SOC15 (MP1 ,0 , mmMP1_SMN_C2PMSG_82); } -int smu_cmn_wait_for_response (struct smu_context *smu) +/* Redefine the SMU error codes here. +* +* Note that these definitions are redundant and should be removed +* when the SMU has exported a unified header file containing these +* macros, which header file we can just include and use the SMU's +* macros. At the moment, these error codes are defined by the SMU +* per-ASIC unfortunately, yet we're a one driver for all ASICs. +*/ +#define SMU_RESP_NONE 0 +#define SMU_RESP_OK 1 +#define SMU_RESP_CMD_FAIL 0xFF +#define SMU_RESP_CMD_UNKNOWN 0xFE +#define SMU_RESP_CMD_BAD_PREREQ 0xFD +#define SMU_RESP_BUSY_OTHER 0xFC +#define SMU_RESP_DEBUG_END 0xFB + +/** +* __smu_cmn_poll_stat -- poll for a status from the SMU +* smu: a pointer to SMU context +* +* Returns the status of the SMU, which could be, +* 0, the SMU is busy with your previous command; +* 1, execution status: success, execution result: success; +* 0xFF, execution status: success, execution result: failure; +* 0xFE, unknown command; +* 0xFD, valid command, but bad (command) prerequisites; +* 0xFC, the command was rejected as the SMU is busy; +* 0xFB, "SMC_Result_DebugDataDumpEnd". +* +* The values here are not defined by macros, because I'd rather we +* include a single header file which defines them, which is +* maintained by the SMU FW team, so that we're impervious to firmware +* changes. At the moment those values are defined in various header +* files, one for each ASIC, yet here we're a single ASIC-agnostic +* interface. Such a change can be followed-up by a subsequent patch. +*/ +static u32 __smu_cmn_poll_stat (struct smu_context *smu) {struct amdgpu_device *adev = smu->adev; -uint32_t cur_value, i, timeout = adev->usec_timeout *20 ; +int timeout = adev->usec_timeout *20 ; +u32 reg; -for (i =0 ; i < timeout; i++) { - cur_value =RREG32_SOC15 (MP1 ,0 , mmMP1_SMN_C2PMSG_90); -if ((cur_value &MP1_C2PMSG_90__CONTENT_MASK ) !=0 ) -return cur_value; +for ( ; timeout >0 ; timeout--) { + reg =RREG32_SOC15 (MP1 ,0 , mmMP1_SMN_C2PMSG_90); +if ((reg &MP1_C2PMSG_90__CONTENT_MASK ) !=0 ) +break ;udelay (1 ); } -/* timeout means wrong logic */ -if (i == timeout) -return -ETIME ; - -return RREG32_SOC15 (MP1 ,0 , mmMP1_SMN_C2PMSG_90); +return reg; } -int smu_cmn_send_msg_without_waiting (struct smu_context *smu, -uint16_t msg,uint32_t param) +static void __smu_cmn_reg_print_error (struct smu_context *smu, +u32 reg_c2pmsg_90, +int msg_index, +u32 param, +enum smu_message_type msg) {struct amdgpu_device *adev = smu->adev; -int ret; +const char *message =smu_get_message_name (smu, msg); - ret =smu_cmn_wait_for_response (smu); -if (ret !=0x1 ) { -dev_err (adev->dev,"Msg issuing pre-check failed(0x%x) and " -"SMU may be not in the right state!\n" , ret); -if (ret != -ETIME ) - ret = -EIO ; -return ret; +switch (reg_c2pmsg_90) { +case SMU_RESP_NONE : +dev_err_ratelimited (adev->dev, +"SMU: I'm not done with your previous command!" ); +break ; +case SMU_RESP_OK : +/* The SMU executed the command. It completed with a +* successful result. +*/ +break ; +case SMU_RESP_CMD_FAIL : +/* The SMU executed the command. It completed with an +* unsuccessful result. +*/ +break ; +case SMU_RESP_CMD_UNKNOWN : +dev_err_ratelimited (adev->dev, +"SMU: unknown command: index:%d param:0x%08X message:%s" , + msg_index, param, message); +break ; +case SMU_RESP_CMD_BAD_PREREQ : +dev_err_ratelimited (adev->dev, +"SMU: valid command, bad prerequisites: index:%d param:0x%08X message:%s" , + msg_index, param, message); +break ; +case SMU_RESP_BUSY_OTHER : +dev_err_ratelimited (adev->dev, +"SMU: I'm very busy for your command: index:%d param:0x%08X message:%s" , + msg_index, param, message); +break ; +case SMU_RESP_DEBUG_END : +dev_err_ratelimited (adev->dev, +"SMU: I'm debugging!" ); +break ; +default : +dev_err_ratelimited (adev->dev, +"SMU: response:0x%08X for index:%d param:0x%08X message:%s?" , + reg_c2pmsg_90, msg_index, param, message); +break ; + } +} + +static int __smu_cmn_reg2errno (struct smu_context *smu,u32 reg_c2pmsg_90) +{ +int res; + +switch (reg_c2pmsg_90) { +case SMU_RESP_NONE : +/* The SMU is busy--still executing your command. +*/ + res = -ETIME ; +break ; +case SMU_RESP_OK : + res =0 ; +break ; +case SMU_RESP_CMD_FAIL : +/* Command completed successfully, but the command +* status was failure. +*/ + res = -EIO ; +break ; +case SMU_RESP_CMD_UNKNOWN : +/* Unknown command--ignored by the SMU. +*/ + res = -EOPNOTSUPP ; +break ; +case SMU_RESP_CMD_BAD_PREREQ : +/* Valid command--bad prerequisites. +*/ + res = -EINVAL ; +break ; +case SMU_RESP_BUSY_OTHER : +/* The SMU is busy with other commands. The client +* should retry in 10 us. +*/ + res = -EBUSY ; +break ; +default : +/* Unknown or debug response from the SMU. +*/ + res = -EREMOTEIO ; +break ; } +return res; +} + +static void __smu_cmn_send_msg (struct smu_context *smu, +u16 msg, +u32 param) +{ +struct amdgpu_device *adev = smu->adev; +WREG32_SOC15 (MP1 ,0 , mmMP1_SMN_C2PMSG_90,0 );WREG32_SOC15 (MP1 ,0 , mmMP1_SMN_C2PMSG_82, param);WREG32_SOC15 (MP1 ,0 , mmMP1_SMN_C2PMSG_66, msg); +} -return 0 ; +/** +* smu_cmn_send_msg_without_waiting -- send the message; don't wait for status +* @smu: pointer to an SMU context +* @msg_index: message index +* @param: message parameter to send to the SMU +* +* Send a message to the SMU with the parameter passed. Do not wait +* for status/result of the message, thus the "without_waiting". +* +* Return 0 on success, -errno on error if we weren't able to _send_ +* the message for some reason. See __smu_cmn_reg2errno() for details +* of the -errno. +*/ +int smu_cmn_send_msg_without_waiting (struct smu_context *smu, +uint16_t msg_index, +uint32_t param) +{ +u32 reg; +int res; + +if (smu->adev->no_hw_access) +return 0 ; + +mutex_lock (&smu->message_lock); + reg =__smu_cmn_poll_stat (smu); + res =__smu_cmn_reg2errno (smu, reg); +if (reg ==SMU_RESP_NONE || + reg ==SMU_RESP_BUSY_OTHER || + res == -EREMOTEIO ) + goto Out; +__smu_cmn_send_msg (smu, msg_index, param); + res =0 ; +Out: +mutex_unlock (&smu->message_lock); +return res; } +/** +* smu_cmn_wait_for_response -- wait for response from the SMU +* @smu: pointer to an SMU context +* +* Wait for status from the SMU. +* +* Return 0 on success, -errno on error, indicating the execution +* status and result of the message being waited for. See +* __smu_cmn_reg2errno() for details of the -errno. +*/ +int smu_cmn_wait_for_response (struct smu_context *smu) +{ +u32 reg; + + reg =__smu_cmn_poll_stat (smu); +return __smu_cmn_reg2errno (smu, reg); +} + +/** +* smu_cmn_send_smc_msg_with_param -- send a message with parameter +* @smu: pointer to an SMU context +* @msg: message to send +* @param: parameter to send to the SMU +* @read_arg: pointer to u32 to return a value from the SMU back +* to the caller +* +* Send the message @msg with parameter @param to the SMU, wait for +* completion of the command, and return back a value from the SMU in +* @read_arg pointer. +* +* Return 0 on success, -errno on error, if we weren't able to send +* the message or if the message completed with some kind of +* error. See __smu_cmn_reg2errno() for details of the -errno. +* +* If we weren't able to send the message to the SMU, we also print +* the error to the standard log. +* +* Command completion status is printed only if the -errno is +* -EREMOTEIO, indicating that the SMU returned back an +* undefined/unknown/unspecified result. All other cases are +* well-defined, not printed, but instead given back to the client to +* decide what further to do. +* +* The return value, @read_arg is read back regardless, to give back +* more information to the client, which on error would most likely be +* @param, but we can't assume that. This also eliminates more +* conditionals. +*/ int smu_cmn_send_smc_msg_with_param (struct smu_context *smu,enum smu_message_type msg,uint32_t param,uint32_t *read_arg) { -struct amdgpu_device *adev = smu->adev; -int ret =0 , index =0 ; +int res, index; +u32 reg;if (smu->adev->no_hw_access)return 0 ;
@@ -136,31 +339,24 @@ int smu_cmn_send_smc_msg_with_param(struct smu_context *smu,return index == -EACCES ?0 : index;mutex_lock (&smu->message_lock); - ret =smu_cmn_send_msg_without_waiting (smu, (uint16_t )index, param); -if (ret) - goto out; - - ret =smu_cmn_wait_for_response (smu); -if (ret !=0x1 ) { -if (ret == -ETIME ) { -dev_err (adev->dev,"message: %15s (%d) \tparam: 0x%08x is timeout (no response)\n" , -smu_get_message_name (smu, msg), index, param); - }else { -dev_err (adev->dev,"failed send message: %15s (%d) \tparam: 0x%08x response %#x\n" , -smu_get_message_name (smu, msg), index, param, - ret); - ret = -EIO ; - } - goto out; + reg =__smu_cmn_poll_stat (smu); + res =__smu_cmn_reg2errno (smu, reg); +if (reg ==SMU_RESP_NONE || + reg ==SMU_RESP_BUSY_OTHER || + res == -EREMOTEIO ) { +__smu_cmn_reg_print_error (smu, reg, index, param, msg); + goto Out; } - +__smu_cmn_send_msg (smu, (uint16_t ) index, param); + reg =__smu_cmn_poll_stat (smu); + res =__smu_cmn_reg2errno (smu, reg); +if (res == -EREMOTEIO ) +__smu_cmn_reg_print_error (smu, reg, index, param, msg);if (read_arg)smu_cmn_read_arg (smu, read_arg); - - ret =0 ;/* 0 as driver return value */ -out: +Out:mutex_unlock (&smu->message_lock); -return ret; +return res; } int smu_cmn_send_smc_msg(struct smu_context *smu,
drivers/gpu/drm/amd/pm/swsmu/smu_cmn.h +2 -1
@@ -27,7 +27,8 @@#if defined(SWSMU_CODE_LAYER_L2 ) || defined(SWSMU_CODE_LAYER_L3 ) || defined(SWSMU_CODE_LAYER_L4 )int smu_cmn_send_msg_without_waiting (struct smu_context *smu, -uint16_t msg,uint32_t param); +uint16_t msg_index, +uint32_t param); int smu_cmn_send_smc_msg_with_param(struct smu_context *smu, enum smu_message_type msg, uint32_t param,
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 126/334 tcp: seq_file: Avoid skipping sk during tcp_seek_last_pos
In reply to Greg Kroah-HartmanFrom: Martin KaFai Lau <[email protected]>
[ Upstream commit 525e2f9fd0229eb10cb460a9e6d978257f24804e ]
st->bucket stores the current bucket number.st->offset stores the offset within this bucket that is the sk to be seq_show(). Thus, st->offset only makes sense within the same st->bucket.
These two variables are an optimization for the common no-lseek case. When resuming the seq_file iteration (i.e. seq_start()), tcp_seek_last_pos() tries to continue from the st->offset at bucket st->bucket.
However, it is possible that the bucket pointed by st->bucket has changed and st->offset may end up skipping the whole st->bucket without finding a sk. In this case, tcp_seek_last_pos() currently continues to satisfy the offset condition in the next (and incorrect) bucket. Instead, regardless of the offset value, the first sk of the next bucket should be returned. Thus, "bucket == st->bucket" check is added to tcp_seek_last_pos().
The chance of hitting this is small and the issue is a decade old, so targeting for the next tree.
--- net/ipv4/tcp_ipv4.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
net/ipv4/tcp_ipv4.c +3 -2
@@ -2451,6 +2451,7 @@ static void *tcp_get_idx(struct seq_file *seq, loff_t pos)static void *tcp_seek_last_pos (struct seq_file *seq) {struct tcp_iter_state *st = seq->private; +int bucket = st->bucket;int offset = st->offset;int orig_num = st->num;void *rc =NULL ;
@@ -2461,7 +2462,7 @@ static void *tcp_seek_last_pos(struct seq_file *seq)break ; st->state =TCP_SEQ_STATE_LISTENING ; rc =listening_get_next (seq,NULL ); -while (offset-- && rc) +while (offset-- && rc && bucket == st->bucket) rc =listening_get_next (seq, rc);if (rc)break ;
@@ -2472,7 +2473,7 @@ static void *tcp_seek_last_pos(struct seq_file *seq)if (st->bucket > tcp_hashinfo.ehash_mask)break ; rc =established_get_first (seq); -while (offset-- && rc) +while (offset-- && rc && bucket == st->bucket) rc =established_get_next (seq, rc); }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 127/334 ARM: dts: meson8: Use a higher default GPU clock frequency
In reply to Greg Kroah-HartmanFrom: Martin Blumenstingl <[email protected]>
[ Upstream commit 44cf630bcb8c5ec78125805c9447dd5766792224 ]
We are seeing "imprecise external abort (0x1406)" errors during boot (which then cause the whole board to hang) on Meson8 (but not Meson8m2). These are observed while trying to access the GPU's registers when the MALI clock is running at it's default setting of 24MHz. The 3.10 vendor kernel uses 318.75MHz as "default" GPU frequency. Using that makes the "imprecise external aborts" go away.
Add the assigned-clocks and assigned-clock-rates properties to also bump the MALI clock to 318.75MHz before accessing any of it's registers.
--- arch/arm/boot/dts/meson8.dtsi | 5 +++++ 1 file changed, 5 insertions(+)
arch/arm/boot/dts/meson8.dtsi +5 -0
@@ -304,8 +304,13 @@ "pp2", "ppmmu2", "pp4", "ppmmu4", "pp5", "ppmmu5", "pp6", "ppmmu6"; resets = <&reset RESET_MALI>; + clocks = <&clkc CLKID_CLK81>, <&clkc CLKID_MALI>; clock-names = "bus", "core"; + + assigned-clocks = <&clkc CLKID_MALI>; + assigned-clock-rates = <318750000>; + operating-points-v2 = <&gpu_opp_table>; #cooling-cells = <2>; /* min followed by max */ };
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 128/334 ARM: dts: meson8b: odroidc1: Fix the pwm regulator supply properties
In reply to Greg Kroah-HartmanFrom: Anand Moon <[email protected]>
[ Upstream commit 876228e9f935f19c7afc7ba394d17e2ec9143b65 ]
After enabling CONFIG_REGULATOR_DEBUG=y we observe below debug logs. Changes help link VCCK and VDDEE pwm regulator to 5V regulator supply instead of dummy regulator.
[ 7.117140] pwm-regulator regulator-vcck: Looking up pwm-supply from device tree [ 7.117153] pwm-regulator regulator-vcck: Looking up pwm-supply property in node /regulator-vcck failed [ 7.117184] VCCK: supplied by regulator-dummy [ 7.117194] regulator-dummy: could not add device link regulator.8: -ENOENT [ 7.117266] VCCK: 860 <--> 1140 mV at 986 mV, enabled [ 7.118498] VDDEE: will resolve supply early: pwm [ 7.118515] pwm-regulator regulator-vddee: Looking up pwm-supply from device tree [ 7.118526] pwm-regulator regulator-vddee: Looking up pwm-supply property in node /regulator-vddee failed [ 7.118553] VDDEE: supplied by regulator-dummy [ 7.118563] regulator-dummy: could not add device link regulator.9: -ENOENT
--- arch/arm/boot/dts/meson8b-odroidc1.dts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/arm/boot/dts/meson8b-odroidc1.dts +2 -2
@@ -131,7 +131,7 @@ regulator-min-microvolt = <860000>; regulator-max-microvolt = <1140000>; - vin-supply = <&p5v0>; + pwm-supply = <&p5v0>; pwms = <&pwm_cd 0 12218 0>; pwm-dutycycle-range = <91 0>;
@@ -163,7 +163,7 @@ regulator-min-microvolt = <860000>; regulator-max-microvolt = <1140000>; - vin-supply = <&p5v0>; + pwm-supply = <&p5v0>; pwms = <&pwm_cd 1 12218 0>; pwm-dutycycle-range = <91 0>;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 129/334 ARM: dts: meson8b: mxq: Fix the pwm regulator supply properties
In reply to Greg Kroah-HartmanFrom: Anand Moon <[email protected]>
[ Upstream commit 632062e540becbbcb067523ec8bcadb1239d9578 ]
After enabling CONFIG_REGULATOR_DEBUG=y we observer below debug logs. Changes help link VCCK and VDDEE pwm regulator to 5V regulator supply instead of dummy regulator.
Add missing pwm-supply for regulator-vcck regulator node.
[ 7.117140] pwm-regulator regulator-vcck: Looking up pwm-supply from device tree [ 7.117153] pwm-regulator regulator-vcck: Looking up pwm-supply property in node /regulator-vcck failed [ 7.117184] VCCK: supplied by regulator-dummy [ 7.117194] regulator-dummy: could not add device link regulator.8: -ENOENT [ 7.117266] VCCK: 860 <--> 1140 mV at 986 mV, enabled [ 7.118498] VDDEE: will resolve supply early: pwm [ 7.118515] pwm-regulator regulator-vddee: Looking up pwm-supply from device tree [ 7.118526] pwm-regulator regulator-vddee: Looking up pwm-supply property in node /regulator-vddee failed [ 7.118553] VDDEE: supplied by regulator-dummy [ 7.118563] regulator-dummy: could not add device link regulator.9: -ENOENT
--- arch/arm/boot/dts/meson8b-mxq.dts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
arch/arm/boot/dts/meson8b-mxq.dts +3 -1
@@ -34,6 +34,8 @@ regulator-min-microvolt = <860000>; regulator-max-microvolt = <1140000>; + pwm-supply = <&vcc_5v>; + pwms = <&pwm_cd 0 1148 0>; pwm-dutycycle-range = <100 0>;
@@ -79,7 +81,7 @@ regulator-min-microvolt = <860000>; regulator-max-microvolt = <1140000>; - vin-supply = <&vcc_5v>; + pwm-supply = <&vcc_5v>; pwms = <&pwm_cd 1 1148 0>; pwm-dutycycle-range = <100 0>;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 130/334 ARM: dts: meson8b: ec100: Fix the pwm regulator supply properties
In reply to Greg Kroah-HartmanFrom: Anand Moon <[email protected]>
[ Upstream commit 72ccc373b064ae3ac0c5b5f2306069b60ca118df ]
After enabling CONFIG_REGULATOR_DEBUG=y we observer below debug logs. Changes help link VCCK and VDDEE pwm regulator to 5V regulator supply instead of dummy regulator.
[ 7.117140] pwm-regulator regulator-vcck: Looking up pwm-supply from device tree [ 7.117153] pwm-regulator regulator-vcck: Looking up pwm-supply property in node /regulator-vcck failed [ 7.117184] VCCK: supplied by regulator-dummy [ 7.117194] regulator-dummy: could not add device link regulator.8: -ENOENT [ 7.117266] VCCK: 860 <--> 1140 mV at 986 mV, enabled [ 7.118498] VDDEE: will resolve supply early: pwm [ 7.118515] pwm-regulator regulator-vddee: Looking up pwm-supply from device tree [ 7.118526] pwm-regulator regulator-vddee: Looking up pwm-supply property in node /regulator-vddee failed [ 7.118553] VDDEE: supplied by regulator-dummy [ 7.118563] regulator-dummy: could not add device link regulator.9: -ENOENT
--- arch/arm/boot/dts/meson8b-ec100.dts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/arm/boot/dts/meson8b-ec100.dts +2 -2
@@ -148,7 +148,7 @@ regulator-min-microvolt = <860000>; regulator-max-microvolt = <1140000>; - vin-supply = <&vcc_5v>; + pwm-supply = <&vcc_5v>; pwms = <&pwm_cd 0 1148 0>; pwm-dutycycle-range = <100 0>;
@@ -232,7 +232,7 @@ regulator-min-microvolt = <860000>; regulator-max-microvolt = <1140000>; - vin-supply = <&vcc_5v>; + pwm-supply = <&vcc_5v>; pwms = <&pwm_cd 1 1148 0>; pwm-dutycycle-range = <100 0>;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 131/334 net/mlx5e: Prohibit inner indir TIRs in IPoIB
In reply to Greg Kroah-HartmanFrom: Maxim Mikityanskiy <[email protected]>
[ Upstream commit 9c43f3865c2a03be104f1c1d5e9129c2a2bdba88 ]
TIR's rx_hash_field_selector_inner can be enabled only when tunneled_offload_en = 1. tunneled_offload_en is filled according to the tunneled_offload_en field in struct mlx5e_params, which is false in the IPoIB profile. On the other hand, the IPoIB profile passes inner_ttc = true to mlx5e_create_indirect_tirs, which potentially allows the latter function to attempt to create inner indirect TIRs without having tunneled_offload_en set.
This commit prohibits this behavior by passing inner_ttc = false to mlx5e_create_indirect_tirs. The latter function won't attempt to create inner indirect TIRs.
As inner indirect TIRs are not created in the IPoIB profile (this commit blocks it explicitly, and even before they would have failed to be created), the call to mlx5e_create_inner_ttc_table in mlx5i_create_flow_steering is a no-op and can be removed.
--- .../net/ethernet/mellanox/mlx5/core/en/fs.h | 6 ------ .../net/ethernet/mellanox/mlx5/core/en_fs.c | 10 +++++----- .../ethernet/mellanox/mlx5/core/ipoib/ipoib.c | 18 ++---------------- 3 files changed, 7 insertions(+), 27 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/en/fs.h +0 -6
@@ -248,18 +248,12 @@ struct ttc_params {void mlx5e_set_ttc_basic_params (struct mlx5e_priv *priv,struct ttc_params *ttc_params);void mlx5e_set_ttc_ft_params (struct ttc_params *ttc_params); -void mlx5e_set_inner_ttc_ft_params (struct ttc_params *ttc_params);int mlx5e_create_ttc_table (struct mlx5e_priv *priv,struct ttc_params *params,struct mlx5e_ttc_table *ttc);void mlx5e_destroy_ttc_table (struct mlx5e_priv *priv,struct mlx5e_ttc_table *ttc); -int mlx5e_create_inner_ttc_table (struct mlx5e_priv *priv,struct ttc_params *params, -struct mlx5e_ttc_table *ttc); -void mlx5e_destroy_inner_ttc_table (struct mlx5e_priv *priv, -struct mlx5e_ttc_table *ttc); -void mlx5e_destroy_flow_table (struct mlx5e_flow_table *ft);int mlx5e_ttc_fwd_dest (struct mlx5e_priv *priv,enum mlx5e_traffic_types type,struct mlx5_flow_destination *new_dest);
drivers/net/ethernet/mellanox/mlx5/core/en_fs.c +5 -5
@@ -1324,7 +1324,7 @@ void mlx5e_set_ttc_basic_params(struct mlx5e_priv *priv, ttc_params->inner_ttc = &priv->fs.inner_ttc; } -void mlx5e_set_inner_ttc_ft_params (struct ttc_params *ttc_params) +static void mlx5e_set_inner_ttc_ft_params (struct ttc_params *ttc_params) {struct mlx5_flow_table_attr *ft_attr = &ttc_params->ft_attr;
@@ -1343,8 +1343,8 @@ void mlx5e_set_ttc_ft_params(struct ttc_params *ttc_params) ft_attr->prio =MLX5E_NIC_PRIO ; } -int mlx5e_create_inner_ttc_table (struct mlx5e_priv *priv,struct ttc_params *params, -struct mlx5e_ttc_table *ttc) +static int mlx5e_create_inner_ttc_table (struct mlx5e_priv *priv,struct ttc_params *params, +struct mlx5e_ttc_table *ttc) {struct mlx5e_flow_table *ft = &ttc->ft;int err;
@@ -1374,8 +1374,8 @@ err:return err; } -void mlx5e_destroy_inner_ttc_table (struct mlx5e_priv *priv, -struct mlx5e_ttc_table *ttc) +static void mlx5e_destroy_inner_ttc_table (struct mlx5e_priv *priv, +struct mlx5e_ttc_table *ttc) {if (!mlx5e_tunnel_inner_ft_supported (priv->mdev))return ;
drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib.c +2 -16
@@ -331,17 +331,6 @@ static int mlx5i_create_flow_steering(struct mlx5e_priv *priv) }mlx5e_set_ttc_basic_params (priv, &ttc_params); -mlx5e_set_inner_ttc_ft_params (&ttc_params); -for (tt =0 ; tt <MLX5E_NUM_INDIR_TIRS ; tt++) - ttc_params.indir_tirn[tt] = priv->inner_indir_tir[tt].tirn; - - err =mlx5e_create_inner_ttc_table (priv, &ttc_params, &priv->fs.inner_ttc); -if (err) { -netdev_err (priv->netdev,"Failed to create inner ttc table, err=%d\n" , - err); - goto err_destroy_arfs_tables; - } -mlx5e_set_ttc_ft_params (&ttc_params);for (tt =0 ; tt <MLX5E_NUM_INDIR_TIRS ; tt++) ttc_params.indir_tirn[tt] = priv->indir_tir[tt].tirn;
@@ -350,13 +339,11 @@ static int mlx5i_create_flow_steering(struct mlx5e_priv *priv)if (err) {netdev_err (priv->netdev,"Failed to create ttc table, err=%d\n" , err); - goto err_destroy_inner_ttc_table; + goto err_destroy_arfs_tables; }return 0 ; -err_destroy_inner_ttc_table: -mlx5e_destroy_inner_ttc_table (priv, &priv->fs.inner_ttc); err_destroy_arfs_tables:mlx5e_arfs_destroy_tables (priv);
@@ -366,7 +353,6 @@ err_destroy_arfs_tables:static void mlx5i_destroy_flow_steering (struct mlx5e_priv *priv) {mlx5e_destroy_ttc_table (priv, &priv->fs.ttc); -mlx5e_destroy_inner_ttc_table (priv, &priv->fs.inner_ttc);mlx5e_arfs_destroy_tables (priv); }
@@ -392,7 +378,7 @@ static int mlx5i_init_rx(struct mlx5e_priv *priv)if (err) goto err_destroy_indirect_rqts; - err =mlx5e_create_indirect_tirs (priv, true); + err =mlx5e_create_indirect_tirs (priv, false);if (err) goto err_destroy_direct_rqts;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 132/334 net/mlx5e: Block LRO if firmware asks for tunneled LRO
In reply to Greg Kroah-HartmanFrom: Maxim Mikityanskiy <[email protected]>
[ Upstream commit 26ab7b384525ccfa678c518577f7f0d841209c8b ]
This commit does a cleanup in LRO configuration.
LRO is a parameter of an RQ, but its state is changed by modifying a TIR related to the RQ.
The current status: LRO for tunneled packets is not supported in the driver, inner TIRs may enable LRO on creation, but LRO status of inner TIRs isn't changed in mlx5e_modify_tirs_lro(). This is inconsistent, but as long as the firmware doesn't declare support for tunneled LRO, it works, because the same RQs are shared between the inner and outer TIRs.
This commit does two fixes:
1. If the firmware has the tunneled LRO capability, LRO is blocked altogether, because it's not possible to block it for inner TIRs only, when the same RQs are shared between inner and outer TIRs, and the driver won't be able to handle tunneled LRO traffic.
2. mlx5e_modify_tirs_lro() is patched to modify LRO state for all TIRs, including inner ones, because all TIRs related to an RQ should agree on their LRO state.
--- drivers/net/ethernet/mellanox/mlx5/core/en_main.c | 15 +++++++++++++++ include/linux/mlx5/mlx5_ifc.h | 3 ++- 2 files changed, 17 insertions(+), 1 deletion(-)
drivers/net/ethernet/mellanox/mlx5/core/en_main.c +15 -0
@@ -2567,6 +2567,14 @@ static int mlx5e_modify_tirs_lro(struct mlx5e_priv *priv) err =mlx5_core_modify_tir (mdev, priv->indir_tir[tt].tirn, in);if (err) goto free_in; + +/* Verify inner tirs resources allocated */ +if (!priv->inner_indir_tir[0 ].tirn) +continue ; + + err =mlx5_core_modify_tir (mdev, priv->inner_indir_tir[tt].tirn, in); +if (err) + goto free_in; }for (ix =0 ; ix < priv->max_nch; ix++) {
@@ -4812,7 +4820,14 @@ static void mlx5e_build_nic_netdev(struct net_device *netdev) netdev->hw_enc_features |=NETIF_F_HW_VLAN_CTAG_TX ; netdev->hw_enc_features |=NETIF_F_HW_VLAN_CTAG_RX ; +/* Tunneled LRO is not supported in the driver, and the same RQs are +* shared between inner and outer TIRs, so the driver can't disable LRO +* for inner TIRs while having it enabled for outer TIRs. Due to this, +* block LRO altogether if the firmware declares tunneled LRO support. +*/ if (!!MLX5_CAP_ETH (mdev, lro_cap) && + !MLX5_CAP_ETH (mdev, tunnel_lro_vxlan) && + !MLX5_CAP_ETH (mdev, tunnel_lro_gre) &&mlx5e_check_fragmented_striding_rq_cap (mdev)) netdev->vlan_features |=NETIF_F_LRO ;
include/linux/mlx5/mlx5_ifc.h +2 -1
@@ -921,7 +921,8 @@ struct mlx5_ifc_per_protocol_networking_offload_caps_bits {u8 scatter_fcs[0x1 ];u8 enhanced_multi_pkt_send_wqe[0x1 ];u8 tunnel_lso_const_out_ip_id[0x1 ]; -u8 reserved_at_1c[0x2 ]; +u8 tunnel_lro_gre[0x1 ]; +u8 tunnel_lro_vxlan[0x1 ];u8 tunnel_stateless_gre[0x1 ];u8 tunnel_stateless_vxlan[0x1 ];
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 133/334 cgroup/cpuset: Fix a partition bug with hotplug
In reply to Greg Kroah-HartmanFrom: Waiman Long <[email protected]>
[ Upstream commit 15d428e6fe77fffc3f4fff923336036f5496ef17 ]
In cpuset_hotplug_workfn(), the detection of whether the cpu list has been changed is done by comparing the effective cpus of the top cpuset with the cpu_active_mask. However, in the rare case that just all the CPUs in the subparts_cpus are offlined, the detection fails and the partition states are not updated correctly. Fix it by forcing the cpus_updated flag to true in this particular case.
--- kernel/cgroup/cpuset.c | 7 +++++++ 1 file changed, 7 insertions(+)
kernel/cgroup/cpuset.c +7 -0
@@ -3168,6 +3168,13 @@ static void cpuset_hotplug_workfn(struct work_struct *work) cpus_updated = !cpumask_equal (top_cpuset.effective_cpus, &new_cpus); mems_updated = !nodes_equal (top_cpuset.effective_mems, new_mems); +/* +* In the rare case that hotplug removes all the cpus in subparts_cpus, +* we assumed that cpus are updated. +*/ +if (!cpus_updated && top_cpuset.nr_subparts_cpus) + cpus_updated = true; +/* synchronize cpus_allowed to cpu_active_mask */ if (cpus_updated) {spin_lock_irq (&callback_lock);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 134/334 drm: mxsfb: Enable recovery on underflow
In reply to Greg Kroah-HartmanFrom: Marek Vasut <[email protected]>
[ Upstream commit 0c9856e4edcdcac22d65618e8ceff9eb41447880 ]
There is some sort of corner case behavior of the controller, which could rarely be triggered at least on i.MX6SX connected to 800x480 DPI panel and i.MX8MM connected to DPI->DSI->LVDS bridged 1920x1080 panel (and likely on other setups too), where the image on the panel shifts to the right and wraps around. This happens either when the controller is enabled on boot or even later during run time. The condition does not correct itself automatically, i.e. the display image remains shifted.
It seems this problem is known and is due to sporadic underflows of the LCDIF FIFO. While the LCDIF IP does have underflow/overflow IRQs, neither of the IRQs trigger and neither IRQ status bit is asserted when this condition occurs.
All known revisions of the LCDIF IP have CTRL1 RECOVER_ON_UNDERFLOW bit, which is described in the reference manual since i.MX23 as "
Set this bit to enable the LCDIF block to recover in the next field/frame if there was an underflow in the current field/frame.
"
Enable this bit to mitigate the sporadic underflows.
--- drivers/gpu/drm/mxsfb/mxsfb_kms.c | 29 +++++++++++++++++++++++++++++ drivers/gpu/drm/mxsfb/mxsfb_regs.h | 1 + 2 files changed, 30 insertions(+)
drivers/gpu/drm/mxsfb/mxsfb_kms.c +29 -0
@@ -115,6 +115,35 @@ static void mxsfb_enable_controller(struct mxsfb_drm_private *mxsfb) reg |=VDCTRL4_SYNC_SIGNALS_ON ;writel (reg, mxsfb->base +LCDC_VDCTRL4 ); +/* +* Enable recovery on underflow. +* +* There is some sort of corner case behavior of the controller, +* which could rarely be triggered at least on i.MX6SX connected +* to 800x480 DPI panel and i.MX8MM connected to DPI->DSI->LVDS +* bridged 1920x1080 panel (and likely on other setups too), where +* the image on the panel shifts to the right and wraps around. +* This happens either when the controller is enabled on boot or +* even later during run time. The condition does not correct +* itself automatically, i.e. the display image remains shifted. +* +* It seems this problem is known and is due to sporadic underflows +* of the LCDIF FIFO. While the LCDIF IP does have underflow/overflow +* IRQs, neither of the IRQs trigger and neither IRQ status bit is +* asserted when this condition occurs. +* +* All known revisions of the LCDIF IP have CTRL1 RECOVER_ON_UNDERFLOW +* bit, which is described in the reference manual since i.MX23 as +* " +* Set this bit to enable the LCDIF block to recover in the next +* field/frame if there was an underflow in the current field/frame. +* " +* Enable this bit to mitigate the sporadic underflows. +*/ + reg =readl (mxsfb->base +LCDC_CTRL1 ); + reg |=CTRL1_RECOVER_ON_UNDERFLOW ; +writel (reg, mxsfb->base +LCDC_CTRL1 ); +writel (CTRL_RUN , mxsfb->base +LCDC_CTRL +REG_SET ); }
drivers/gpu/drm/mxsfb/mxsfb_regs.h +1 -0
@@ -54,6 +54,7 @@#define CTRL_DF24 BIT(1)#define CTRL_RUN BIT(0) +#define CTRL1_RECOVER_ON_UNDERFLOW BIT(24)#define CTRL1_FIFO_CLEAR BIT(21)#define CTRL1_SET_BYTE_PACKAGING (x) (((x) & 0xf) << 16)#define CTRL1_GET_BYTE_PACKAGING (x) (((x) >> 16) & 0xf)
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 135/334 drm: mxsfb: Increase number of outstanding requests on V4 and newer HW
In reply to Greg Kroah-HartmanFrom: Marek Vasut <[email protected]>
[ Upstream commit 9891cb54445bc65bf156bda416b6215048c7f617 ]
In case the DRAM is under high load, the MXSFB FIFO might underflow and that causes visible artifacts. This could be triggered on i.MX8MM using e.g. "$ memtester 128M" on a device with 1920x1080 panel. The first "Stuck Address" test of the memtester will completely corrupt the image on the panel and leave the MXSFB FIFO in odd state.
To avoid this underflow, increase number of outstanding requests to DRAM from 2 to 16, which is the maximum. This mitigates the issue and it can no longer be triggered.
--- drivers/gpu/drm/mxsfb/mxsfb_drv.c | 3 +++ drivers/gpu/drm/mxsfb/mxsfb_drv.h | 1 + drivers/gpu/drm/mxsfb/mxsfb_kms.c | 8 ++++++++ drivers/gpu/drm/mxsfb/mxsfb_regs.h | 8 ++++++++ 4 files changed, 20 insertions(+)
drivers/gpu/drm/mxsfb/mxsfb_drv.c +3 -0
@@ -51,6 +51,7 @@ static const struct mxsfb_devdata mxsfb_devdata[] = { .hs_wdth_mask = 0xff, .hs_wdth_shift = 24, .has_overlay = false, + .has_ctrl2 = false, }, [MXSFB_V4] = { .transfer_count = LCDC_V4_TRANSFER_COUNT,
@@ -59,6 +60,7 @@ static const struct mxsfb_devdata mxsfb_devdata[] = { .hs_wdth_mask = 0x3fff, .hs_wdth_shift = 18, .has_overlay = false, + .has_ctrl2 = true, }, [MXSFB_V6] = { .transfer_count = LCDC_V4_TRANSFER_COUNT,
@@ -67,6 +69,7 @@ static const struct mxsfb_devdata mxsfb_devdata[] = { .hs_wdth_mask = 0x3fff, .hs_wdth_shift = 18, .has_overlay = true, + .has_ctrl2 = true, }, };
drivers/gpu/drm/mxsfb/mxsfb_drv.h +1 -0
@@ -22,6 +22,7 @@ struct mxsfb_devdata {unsigned int hs_wdth_mask;unsigned int hs_wdth_shift;bool has_overlay; +bool has_ctrl2; };struct mxsfb_drm_private {
drivers/gpu/drm/mxsfb/mxsfb_kms.c +8 -0
@@ -107,6 +107,14 @@ static void mxsfb_enable_controller(struct mxsfb_drm_private *mxsfb)clk_prepare_enable (mxsfb->clk_disp_axi);clk_prepare_enable (mxsfb->clk); +/* Increase number of outstanding requests on all supported IPs */ +if (mxsfb->devdata->has_ctrl2) { + reg =readl (mxsfb->base +LCDC_V4_CTRL2 ); + reg &= ~CTRL2_SET_OUTSTANDING_REQS_MASK ; + reg |=CTRL2_SET_OUTSTANDING_REQS_16 ; +writel (reg, mxsfb->base +LCDC_V4_CTRL2 ); + } +/* If it was disabled, re-enable the mode again */ writel (CTRL_DOTCLK_MODE , mxsfb->base +LCDC_CTRL +REG_SET );
drivers/gpu/drm/mxsfb/mxsfb_regs.h +8 -0
@@ -15,6 +15,7 @@#define LCDC_CTRL 0x00#define LCDC_CTRL1 0x10#define LCDC_V3_TRANSFER_COUNT 0x20 +#define LCDC_V4_CTRL2 0x20#define LCDC_V4_TRANSFER_COUNT 0x30#define LCDC_V4_CUR_BUF 0x40#define LCDC_V4_NEXT_BUF 0x50
@@ -61,6 +62,13 @@#define CTRL1_CUR_FRAME_DONE_IRQ_EN BIT(13)#define CTRL1_CUR_FRAME_DONE_IRQ BIT(9) +#define CTRL2_SET_OUTSTANDING_REQS_1 0 +#define CTRL2_SET_OUTSTANDING_REQS_2 (0x1 << 21) +#define CTRL2_SET_OUTSTANDING_REQS_4 (0x2 << 21) +#define CTRL2_SET_OUTSTANDING_REQS_8 (0x3 << 21) +#define CTRL2_SET_OUTSTANDING_REQS_16 (0x4 << 21) +#define CTRL2_SET_OUTSTANDING_REQS_MASK (0x7 << 21) +#define TRANSFER_COUNT_SET_VCOUNT (x) (((x) & 0xffff) << 16)#define TRANSFER_COUNT_GET_VCOUNT (x) (((x) >> 16) & 0xffff)#define TRANSFER_COUNT_SET_HCOUNT (x) ((x) & 0xffff)
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 136/334 drm: mxsfb: Clear FIFO_CLEAR bit
In reply to Greg Kroah-HartmanFrom: Marek Vasut <[email protected]>
[ Upstream commit 5e23c98178eb1a2cdb7c4fee9a39baf8cabf282d ]
Make sure the FIFO_CLEAR bit is latched in when configuring the controller, so that the FIFO is really cleared. And then clear the FIFO_CLEAR bit, since it is not self-clearing.
--- drivers/gpu/drm/mxsfb/mxsfb_kms.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/gpu/drm/mxsfb/mxsfb_kms.c +3 -0
@@ -243,6 +243,9 @@ static void mxsfb_crtc_mode_set_nofb(struct mxsfb_drm_private *mxsfb)/* Clear the FIFOs */ writel (CTRL1_FIFO_CLEAR , mxsfb->base +LCDC_CTRL1 +REG_SET ); +readl (mxsfb->base +LCDC_CTRL1 ); +writel (CTRL1_FIFO_CLEAR , mxsfb->base +LCDC_CTRL1 +REG_CLR ); +readl (mxsfb->base +LCDC_CTRL1 );if (mxsfb->devdata->has_overlay)writel (0 , mxsfb->base +LCDC_AS_CTRL );
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 137/334 net: cipso: fix warnings in netlbl_cipsov4_add_std
In reply to Greg Kroah-HartmanFrom: Pavel Skripkin <[email protected]>
[ Upstream commit 8ca34a13f7f9b3fa2c464160ffe8cc1a72088204 ]
Syzbot reported warning in netlbl_cipsov4_add(). The problem was in too big doi_def->map.std->lvl.local_size passed to kcalloc(). Since this value comes from userpace there is no need to warn if value is not correct.
The same problem may occur with other kcalloc() calls in this function, so, I've added __GFP_NOWARN flag to all kcalloc() calls there.
--- net/netlabel/netlabel_cipso_v4.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
net/netlabel/netlabel_cipso_v4.c +4 -4
@@ -187,14 +187,14 @@ static int netlbl_cipsov4_add_std(struct genl_info *info, } doi_def->map.std->lvl.local =kcalloc (doi_def->map.std->lvl.local_size,sizeof (u32), -GFP_KERNEL ); +GFP_KERNEL | __GFP_NOWARN);if (doi_def->map.std->lvl.local ==NULL ) { ret_val = -ENOMEM ; goto add_std_failure; } doi_def->map.std->lvl.cipso =kcalloc (doi_def->map.std->lvl.cipso_size,sizeof (u32), -GFP_KERNEL ); +GFP_KERNEL | __GFP_NOWARN);if (doi_def->map.std->lvl.cipso ==NULL ) { ret_val = -ENOMEM ; goto add_std_failure;
@@ -263,7 +263,7 @@ static int netlbl_cipsov4_add_std(struct genl_info *info, doi_def->map.std->cat.local =kcalloc ( doi_def->map.std->cat.local_size,sizeof (u32), -GFP_KERNEL ); +GFP_KERNEL | __GFP_NOWARN);if (doi_def->map.std->cat.local ==NULL ) { ret_val = -ENOMEM ; goto add_std_failure;
@@ -271,7 +271,7 @@ static int netlbl_cipsov4_add_std(struct genl_info *info, doi_def->map.std->cat.cipso =kcalloc ( doi_def->map.std->cat.cipso_size,sizeof (u32), -GFP_KERNEL ); +GFP_KERNEL | __GFP_NOWARN);if (doi_def->map.std->cat.cipso ==NULL ) { ret_val = -ENOMEM ; goto add_std_failure;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 138/334 net: ti: am65-cpsw-nuss: fix wrong devlink release order
In reply to Greg Kroah-HartmanFrom: Leon Romanovsky <[email protected]>
[ Upstream commit acf34954efd17d4f65c7bb3e614381e6afc33222 ]
The commit that introduced devlink support released devlink resources in wrong order, that made an unwind flow to be asymmetrical. In addition, the am65-cpsw-nuss used internal to devlink core field - registered.
In order to fix the unwind flow and remove such access to the registered field, rewrite the code to call devlink_port_unregister only on registered ports.
--- drivers/net/ethernet/ti/am65-cpsw-nuss.c | 34 ++++++++++++------------ 1 file changed, 17 insertions(+), 17 deletions(-)
drivers/net/ethernet/ti/am65-cpsw-nuss.c +17 -17
@@ -2388,21 +2388,6 @@ static const struct devlink_param am65_cpsw_devlink_params[] = { am65_cpsw_dl_switch_mode_set, NULL), }; -static void am65_cpsw_unregister_devlink_ports (struct am65_cpsw_common *common) -{ -struct devlink_port *dl_port; -struct am65_cpsw_port *port; -int i; - -for (i =1 ; i <= common->port_num; i++) { - port =am65_common_get_port (common, i); - dl_port = &port->devlink_port; - -if (dl_port->registered) -devlink_port_unregister (dl_port); - } -} -static int am65_cpsw_nuss_register_devlink (struct am65_cpsw_common *common) {struct devlink_port_attrs attrs = {};
@@ -2464,7 +2449,12 @@ static int am65_cpsw_nuss_register_devlink(struct am65_cpsw_common *common)return ret; dl_port_unreg: -am65_cpsw_unregister_devlink_ports (common); +for (i = i -1 ; i >=1 ; i--) { + port =am65_common_get_port (common, i); + dl_port = &port->devlink_port; + +devlink_port_unregister (dl_port); + } dl_unreg:devlink_unregister (common->devlink); dl_free:
@@ -2475,6 +2465,17 @@ dl_free:static void am65_cpsw_unregister_devlink (struct am65_cpsw_common *common) { +struct devlink_port *dl_port; +struct am65_cpsw_port *port; +int i; + +for (i =1 ; i <= common->port_num; i++) { + port =am65_common_get_port (common, i); + dl_port = &port->devlink_port; + +devlink_port_unregister (dl_port); + } +if (!AM65_CPSW_IS_CPSW2G (common) &&IS_ENABLED (CONFIG_TI_K3_AM65_CPSW_SWITCHDEV )) {devlink_params_unpublish (common->devlink);
@@ -2482,7 +2483,6 @@ static void am65_cpsw_unregister_devlink(struct am65_cpsw_common *common) ARRAY_SIZE(am65_cpsw_devlink_params)); } -am65_cpsw_unregister_devlink_ports (common);devlink_unregister (common->devlink);devlink_free (common->devlink); }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 139/334 drm: rcar-du: Dont put reference to drm_device in rcar_du_remove()
In reply to Greg Kroah-HartmanFrom: Laurent Pinchart <[email protected]>
[ Upstream commit c29b6b0b126e9ee69a5d6339475e831a149295bd ]
The reference to the drm_device that was acquired by devm_drm_dev_alloc() is released automatically by the devres infrastructure. It must not be released manually, as that causes a reference underflow..
--- drivers/gpu/drm/rcar-du/rcar_du_drv.c | 2 -- 1 file changed, 2 deletions(-)
drivers/gpu/drm/rcar-du/rcar_du_drv.c +0 -2
@@ -556,8 +556,6 @@ static int rcar_du_remove(struct platform_device *pdev)drm_kms_helper_poll_fini (ddev); -drm_dev_put (ddev); -return 0 ; }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 140/334 Bluetooth: mgmt: Fix wrong opcode in the response for add_adv cmd
In reply to Greg Kroah-HartmanFrom: Tedd Ho-Jeong An <[email protected]>
[ Upstream commit a25fca4d3c18766b6f7a3c95fa8faec23ef464c5 ]
This patch fixes the MGMT add_advertising command repsones with the wrong opcode when it is trying to return the not supported error.
--- net/bluetooth/mgmt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/bluetooth/mgmt.c +1 -1
@@ -7725,7 +7725,7 @@ static int add_advertising(struct sock *sk, struct hci_dev *hdev,* advertising. */ if (hci_dev_test_flag (hdev,HCI_ENABLE_LL_PRIVACY )) -return mgmt_cmd_status (sk, hdev->id,MGMT_OP_SET_ADVERTISING , +return mgmt_cmd_status (sk, hdev->id,MGMT_OP_ADD_ADVERTISING ,MGMT_STATUS_NOT_SUPPORTED );if (cp->instance <1 || cp->instance > hdev->le_num_of_adv_sets)
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 141/334 drm/amd/pm: Fix a bug in semaphore double-lock
In reply to Greg Kroah-HartmanFrom: Luben Tuikov <[email protected]>
[ Upstream commit 544dcd74b7093ad4befac99b11d90331aa73348e ]
Fix a bug in smu_cmn_send_msg_without_waiting() in that this function does not need to take the smu->message_lock mutex in order to send a message down to the SMU. The mutex is acquired by the caller of this function instead.
--- drivers/gpu/drm/amd/pm/swsmu/smu_cmn.c | 2 -- 1 file changed, 2 deletions(-)
drivers/gpu/drm/amd/pm/swsmu/smu_cmn.c +0 -2
@@ -259,7 +259,6 @@ int smu_cmn_send_msg_without_waiting(struct smu_context *smu,if (smu->adev->no_hw_access)return 0 ; -mutex_lock (&smu->message_lock); reg =__smu_cmn_poll_stat (smu); res =__smu_cmn_reg2errno (smu, reg); if (reg == SMU_RESP_NONE ||
@@ -269,7 +268,6 @@ int smu_cmn_send_msg_without_waiting(struct smu_context *smu,__smu_cmn_send_msg (smu, msg_index, param); res =0 ; Out: -mutex_unlock (&smu->message_lock);return res; }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 142/334 lib/test_scanf: Handle n_bits == 0 in random tests
In reply to Greg Kroah-HartmanFrom: Andy Shevchenko <[email protected]>
[ Upstream commit fe8e3ee0d588566c1f44f28a555042ef50eba491 ]
UBSAN reported (via LKP)
[ 11.021349][ T1] UBSAN: shift-out-of-bounds in lib/test_scanf.c:275:51 [ 11.022782][ T1] shift exponent 32 is too large for 32-bit type 'unsigned int'
When n_bits == 0, the shift is out of range. Switch code to use GENMASK to handle this case.
--- lib/test_scanf.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
lib/test_scanf.c +2 -2
@@ -271,7 +271,7 @@ static u32 __init next_test_random(u32 max_bits) {u32 n_bits =hweight32 (prandom_u32_state (&rnd_state)) % (max_bits +1 ); -return prandom_u32_state (&rnd_state) & (UINT_MAX >> (32 - n_bits)); +return prandom_u32_state (&rnd_state) &GENMASK (n_bits,0 ); }static unsigned long long __init next_test_random_ull (void )
@@ -280,7 +280,7 @@ static unsigned long long __init next_test_random_ull(void)u32 n_bits = (hweight32 (rand1) *3 ) %64 ;u64 val = (u64 )prandom_u32_state (&rnd_state) * rand1; -return val & (ULLONG_MAX >> (64 - n_bits)); +return val &GENMASK_ULL (n_bits,0 ); }#define random_for_type (T ) \
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 143/334 libbpf: Return non-null error on failures in libbpf_find_prog_btf_id()
In reply to Greg Kroah-HartmanFrom: Quentin Monnet <[email protected]>
[ Upstream commit 6d2d73cdd673d493f9f3751188757129b1d23fb7 ]
Variable "err" is initialised to -EINVAL so that this error code is returned when something goes wrong in libbpf_find_prog_btf_id(). However, a recent change in the function made use of the variable in such a way that it is set to 0 if retrieving linear information on the program is successful, and this 0 value remains if we error out on failures at later stages.
Let's fix this by setting err to -EINVAL later in the function.
--- tools/lib/bpf/libbpf.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
tools/lib/bpf/libbpf.c +3 -1
@@ -9515,7 +9515,7 @@ static int libbpf_find_prog_btf_id(const char *name, __u32 attach_prog_fd)struct bpf_prog_info_linear *info_linear;struct bpf_prog_info *info;struct btf *btf =NULL ; -int err = -EINVAL ; +int err; info_linear =bpf_program__get_prog_info_linear (attach_prog_fd,0 ); err =libbpf_get_error (info_linear);
@@ -9524,6 +9524,8 @@ static int libbpf_find_prog_btf_id(const char *name, __u32 attach_prog_fd) attach_prog_fd);return err; } + + err = -EINVAL ; info = &info_linear->info;if (!info->btf_id) {pr_warn ("The target program doesn't have BTF\n" );
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 144/334 tools: Free BTF objects at various locations
In reply to Greg Kroah-HartmanFrom: Quentin Monnet <[email protected]>
[ Upstream commit 369e955b3d1c12f6ec2e51a95911bb80ada55d79 ]
Make sure to call btf__free() (and not simply free(), which does not free all pointers stored in the struct) on pointers to struct btf objects retrieved at various locations.
These were found while updating the calls to btf__get_from_id().
--- tools/bpf/bpftool/prog.c | 5 ++++- tools/perf/util/bpf-event.c | 4 ++-- tools/perf/util/bpf_counter.c | 3 ++- tools/testing/selftests/bpf/prog_tests/btf.c | 1 + 4 files changed, 9 insertions(+), 4 deletions(-)
tools/bpf/bpftool/prog.c +4 -1
@@ -781,6 +781,8 @@ prog_dump(struct bpf_prog_info *info, enum dump_mode mode,kernel_syms_destroy (&dd); } +btf__free (btf); +return 0 ; }
@@ -2002,8 +2004,8 @@ static char *profile_target_name(int tgt_fd)struct bpf_prog_info_linear *info_linear;struct bpf_func_info *func_info;const struct btf_type *t; +struct btf *btf =NULL ;char *name =NULL ; -struct btf *btf; info_linear =bpf_program__get_prog_info_linear ( tgt_fd,1UL <<BPF_PROG_INFO_FUNC_INFO );
@@ -2027,6 +2029,7 @@ static char *profile_target_name(int tgt_fd) } name =strdup (btf__name_by_offset (btf, t->name_off)); out: +btf__free (btf);free (info_linear);return name; }
tools/perf/util/bpf-event.c +2 -2
@@ -296,7 +296,7 @@ static int perf_event__synthesize_one_bpf_prog(struct perf_session *session, out:free (info_linear); -free (btf); +btf__free (btf);return err ?-1 :0 ; }
@@ -486,7 +486,7 @@ static void perf_env__add_bpf_info(struct perf_env *env, u32 id)perf_env__fetch_btf (env, btf_id, btf); out: -free (btf); +btf__free (btf);close (fd); }
tools/perf/util/bpf_counter.c +2 -1
@@ -64,8 +64,8 @@ static char *bpf_target_prog_name(int tgt_fd)struct bpf_prog_info_linear *info_linear;struct bpf_func_info *func_info;const struct btf_type *t; +struct btf *btf =NULL ;char *name =NULL ; -struct btf *btf; info_linear =bpf_program__get_prog_info_linear ( tgt_fd,1UL <<BPF_PROG_INFO_FUNC_INFO );
@@ -89,6 +89,7 @@ static char *bpf_target_prog_name(int tgt_fd) } name =strdup (btf__name_by_offset (btf, t->name_off)); out: +btf__free (btf);free (info_linear);return name; }
tools/testing/selftests/bpf/prog_tests/btf.c +1 -0
@@ -4386,6 +4386,7 @@ skip:fprintf (stderr,"OK" ); done: +btf__free (btf);free (func_info);bpf_object__close (obj); }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 145/334 arm64: dts: renesas: hihope-rzg2-ex: Add EtherAVB internal rx delay
In reply to Greg Kroah-HartmanFrom: Biju Das <[email protected]>
[ Upstream commit c96ca5604a889a142d6b60889cc6da48498806e9 ]
Hihope boards use Realtek PHY. From the very beginning it use only tx delays. However the phy driver commit bbc4d71d63549bcd003 ("net: phy: realtek: fix rtl8211e rx/tx delay config") introduced NFS mount failure. Now it needs rx delay inaddition to tx delay for NFS mount to work. This patch fixes NFS mount failure issue by adding MAC internal rx delay.
--- arch/arm64/boot/dts/renesas/hihope-rzg2-ex.dtsi | 1 + 1 file changed, 1 insertion(+)
arch/arm64/boot/dts/renesas/hihope-rzg2-ex.dtsi +1 -0
@@ -20,6 +20,7 @@ pinctrl-names = "default"; phy-handle = <&phy0>; tx-internal-delay-ps = <2000>; + rx-internal-delay-ps = <1800>; status = "okay"; phy0: ethernet-phy@0 {
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 146/334 devlink: Break parameter notification sequence to be before/after unload/load driver
In reply to Greg Kroah-HartmanFrom: Leon Romanovsky <[email protected]>
[ Upstream commit 05a7f4a8dff19999ca8a83a35ff4782689de7bfc ]
The change of namespaces during devlink reload calls to driver unload before it accesses devlink parameters. The commands below causes to use-after-free bug when trying to get flow steering mode.
* ip netns add n1
* devlink dev reload pci/0000:00:09.0 netns n1
==================================================================
BUG: KASAN: use-after-free in mlx5_devlink_fs_mode_get+0x96/0xa0 [mlx5_core]
Read of size 4 at addr ffff888009d04308 by task devlink/275
CPU: 6 PID: 275 Comm: devlink Not tainted 5.12.0-rc2+ #2853
Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS rel-1.13.0-0-gf21b5a4aeb02-prebuilt.qemu.org 04/01/2014
Call Trace:
dump_stack+0x93/0xc2
print_address_description.constprop.0+0x18/0x140
? mlx5_devlink_fs_mode_get+0x96/0xa0 [mlx5_core]
? mlx5_devlink_fs_mode_get+0x96/0xa0 [mlx5_core]
kasan_report.cold+0x7c/0xd8
? mlx5_devlink_fs_mode_get+0x96/0xa0 [mlx5_core]
mlx5_devlink_fs_mode_get+0x96/0xa0 [mlx5_core]
devlink_nl_param_fill+0x1c8/0xe80
? __free_pages_ok+0x37a/0x8a0
? devlink_flash_update_timeout_notify+0xd0/0xd0
? lock_acquire+0x1a9/0x6d0
? fs_reclaim_acquire+0xb7/0x160
? lock_is_held_type+0x98/0x110
? 0xffffffff81000000
? lock_release+0x1f9/0x6c0
? fs_reclaim_release+0xa1/0xf0
? lock_downgrade+0x6d0/0x6d0
? lock_is_held_type+0x98/0x110
? lock_is_held_type+0x98/0x110
? memset+0x20/0x40
? __build_skb_around+0x1f8/0x2b0
devlink_param_notify+0x6d/0x180
devlink_reload+0x1c3/0x520
? devlink_remote_reload_actions_performed+0x30/0x30
? mutex_trylock+0x24b/0x2d0
? devlink_nl_cmd_reload+0x62b/0x1070
devlink_nl_cmd_reload+0x66d/0x1070
? devlink_reload+0x520/0x520
? devlink_get_from_attrs+0x1bc/0x260
? devlink_nl_pre_doit+0x64/0x4d0
genl_family_rcv_msg_doit+0x1e9/0x2f0
? mutex_lock_io_nested+0x1130/0x1130
? genl_family_rcv_msg_attrs_parse.constprop.0+0x240/0x240
? security_capable+0x51/0x90
genl_rcv_msg+0x27f/0x4a0
? genl_get_cmd+0x3c0/0x3c0
? lock_acquire+0x1a9/0x6d0
? devlink_reload+0x520/0x520
? lock_release+0x6c0/0x6c0
netlink_rcv_skb+0x11d/0x340
? genl_get_cmd+0x3c0/0x3c0
? netlink_ack+0x9f0/0x9f0
? lock_release+0x1f9/0x6c0
genl_rcv+0x24/0x40
netlink_unicast+0x433/0x700
? netlink_attachskb+0x730/0x730
? _copy_from_iter_full+0x178/0x650
? __alloc_skb+0x113/0x2b0
netlink_sendmsg+0x6f1/0xbd0
? netlink_unicast+0x700/0x700
? lock_is_held_type+0x98/0x110
? netlink_unicast+0x700/0x700
sock_sendmsg+0xb0/0xe0
__sys_sendto+0x193/0x240
? __x64_sys_getpeername+0xb0/0xb0
? do_sys_openat2+0x10b/0x370
? __up_read+0x1a1/0x7b0
? do_user_addr_fault+0x219/0xdc0
? __x64_sys_openat+0x120/0x1d0
? __x64_sys_open+0x1a0/0x1a0
__x64_sys_sendto+0xdd/0x1b0
? syscall_enter_from_user_mode+0x1d/0x50
do_syscall_64+0x2d/0x40
entry_SYSCALL_64_after_hwframe+0x44/0xae
RIP: 0033:0x7fc69d0af14a
Code: d8 64 89 02 48 c7 c0 ff ff ff ff eb b8 0f 1f 00 f3 0f 1e fa 41 89 ca 64 8b 04 25 18 00 00 00 85 c0 75 15 b8 2c 00 00 00 0f 05 <48> 3d 00 f0 ff ff 77 76 c3 0f 1f 44 00 00 55 48 83 ec 30 44 89 4c
RSP: 002b:00007ffc1d8292f8 EFLAGS: 00000246 ORIG_RAX: 000000000000002c
RAX: ffffffffffffffda RBX: 0000000000000005 RCX: 00007fc69d0af14a
RDX: 0000000000000038 RSI: 0000555f57c56440 RDI: 0000000000000003
RBP: 0000555f57c56410 R08: 00007fc69d17b200 R09: 000000000000000c
R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000000000
R13: 0000000000000000 R14: 0000000000000000 R15: 0000000000000000
Allocated by task 146:
kasan_save_stack+0x1b/0x40
__kasan_kmalloc+0x99/0xc0
mlx5_init_fs+0xf0/0x1c50 [mlx5_core]
mlx5_load+0xd2/0x180 [mlx5_core]
mlx5_init_one+0x2f6/0x450 [mlx5_core]
probe_one+0x47d/0x6e0 [mlx5_core]
pci_device_probe+0x2a0/0x4a0
really_probe+0x20a/0xc90
driver_probe_device+0xd8/0x380
device_driver_attach+0x1df/0x250
__driver_attach+0xff/0x240
bus_for_each_dev+0x11e/0x1a0
bus_add_driver+0x309/0x570
driver_register+0x1ee/0x380
0xffffffffa06b8062
do_one_initcall+0xd5/0x410
do_init_module+0x1c8/0x760
load_module+0x6d8b/0x9650
__do_sys_finit_module+0x118/0x1b0
do_syscall_64+0x2d/0x40
entry_SYSCALL_64_after_hwframe+0x44/0xae
Freed by task 275:
kasan_save_stack+0x1b/0x40
kasan_set_track+0x1c/0x30
kasan_set_free_info+0x20/0x30
__kasan_slab_free+0x102/0x140
slab_free_freelist_hook+0x74/0x1b0
kfree+0xd7/0x2a0
mlx5_unload+0x16/0xb0 [mlx5_core]
mlx5_unload_one+0xae/0x120 [mlx5_core]
mlx5_devlink_reload_down+0x1bc/0x380 [mlx5_core]
devlink_reload+0x141/0x520
devlink_nl_cmd_reload+0x66d/0x1070
genl_family_rcv_msg_doit+0x1e9/0x2f0
genl_rcv_msg+0x27f/0x4a0
netlink_rcv_skb+0x11d/0x340
genl_rcv+0x24/0x40
netlink_unicast+0x433/0x700
netlink_sendmsg+0x6f1/0xbd0
sock_sendmsg+0xb0/0xe0
__sys_sendto+0x193/0x240
__x64_sys_sendto+0xdd/0x1b0
do_syscall_64+0x2d/0x40
entry_SYSCALL_64_after_hwframe+0x44/0xae
The buggy address belongs to the object at ffff888009d04300
which belongs to the cache kmalloc-128 of size 128
The buggy address is located 8 bytes inside of
128-byte region [ffff888009d04300, ffff888009d04380)
The buggy address belongs to the page:
page:0000000086a64ecc refcount:1 mapcount:0 mapping:0000000000000000 index:0xffff888009d04000 pfn:0x9d04
head:0000000086a64ecc order:1 compound_mapcount:0
flags: 0x4000000000010200(slab|head)
raw: 4000000000010200 ffffea0000203980 0000000200000002 ffff8880050428c0
raw: ffff888009d04000 000000008020001d 00000001ffffffff 0000000000000000
page dumped because: kasan: bad access detected
Memory state around the buggy address:
ffff888009d04200: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
ffff888009d04280: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
>ffff888009d04300: fa fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
^
ffff888009d04380: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
ffff888009d04400: fa fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
==================================================================The right solution to devlink reload is to notify about deletion of parameters, unload driver, change net namespaces, load driver and notify about addition of parameters.
--- net/core/devlink.c | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-)
net/core/devlink.c +20 -12
@@ -3801,10 +3801,12 @@ static void devlink_param_notify(struct devlink *devlink,struct devlink_param_item *param_item, enum devlink_command cmd); -static void devlink_reload_netns_change (struct devlink *devlink, -struct net *dest_net) +static void devlink_ns_change_notify (struct devlink *devlink, +struct net *dest_net,struct net *curr_net, +bool new) {struct devlink_param_item *param_item; +enum devlink_command cmd;/* Userspace needs to be notified about devlink objects * removed from original and entering new network namespace.
@@ -3812,17 +3814,18 @@ static void devlink_reload_netns_change(struct devlink *devlink,* reload process so the notifications are generated separatelly. */ -list_for_each_entry (param_item, &devlink->param_list, list) -devlink_param_notify (devlink,0 , param_item, -DEVLINK_CMD_PARAM_DEL ); -devlink_notify (devlink,DEVLINK_CMD_DEL ); +if (!dest_net ||net_eq (dest_net, curr_net)) +return ; -__devlink_net_set (devlink, dest_net); +if (new) +devlink_notify (devlink,DEVLINK_CMD_NEW ); -devlink_notify (devlink,DEVLINK_CMD_NEW ); + cmd = new ?DEVLINK_CMD_PARAM_NEW :DEVLINK_CMD_PARAM_DEL ;list_for_each_entry (param_item, &devlink->param_list, list) -devlink_param_notify (devlink,0 , param_item, -DEVLINK_CMD_PARAM_NEW ); +devlink_param_notify (devlink,0 , param_item, cmd); + +if (!new) +devlink_notify (devlink,DEVLINK_CMD_DEL ); }static bool devlink_reload_supported (const struct devlink_ops *ops)
@@ -3902,6 +3905,7 @@ static int devlink_reload(struct devlink *devlink, struct net *dest_net, u32 *actions_performed, struct netlink_ext_ack *extack) { u32 remote_reload_stats[DEVLINK_RELOAD_STATS_ARRAY_SIZE]; +struct net *curr_net;int err;if (!devlink->reload_enabled)
@@ -3909,18 +3913,22 @@ static int devlink_reload(struct devlink *devlink, struct net *dest_net,memcpy (remote_reload_stats, devlink->stats.remote_reload_stats,sizeof (remote_reload_stats)); + + curr_net =devlink_net (devlink); +devlink_ns_change_notify (devlink, dest_net, curr_net, false); err = devlink->ops->reload_down (devlink, !!dest_net, action, limit, extack);if (err)return err; -if (dest_net && !net_eq (dest_net,devlink_net (devlink))) -devlink_reload_netns_change (devlink, dest_net); +if (dest_net && !net_eq (dest_net, curr_net)) +__devlink_net_set (devlink, dest_net); err = devlink->ops->reload_up (devlink, action, limit, actions_performed, extack);devlink_reload_failed_set (devlink, !!err);if (err)return err; +devlink_ns_change_notify (devlink, dest_net, curr_net, true);WARN_ON (!(*actions_performed &BIT (action)));/* Catch driver on updating the remote action within devlink reload */ WARN_ON(memcmp(remote_reload_stats, devlink->stats.remote_reload_stats,
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 147/334 drm/bridge: ti-sn65dsi86: Dont read EDID blob over DDC
In reply to Greg Kroah-HartmanFrom: Douglas Anderson <[email protected]>
[ Upstream commit a70e558c151043ce46a5e5999f4310e0b3551f57 ]
This is really just a revert of commit 58074b08c04a ("drm/bridge:
ti-sn65dsi86: Read EDID blob over DDC"), resolving conflicts.
The old code failed to read the EDID properly in a very important
case: before the bridge's pre_enable() was called. The way things need to work:
1. Read the EDID.
2. Based on the EDID, decide on video settings and pixel clock.
3. Enable the bridge w/ the desired settings.
The way things were working:
1. Try to read the EDID but fail; fall back to hardcoded values.
2. Based on hardcoded values, decide on video settings and pixel clock.
3. Enable the bridge w/ the desired settings.
4. Try again to read the EDID, it works now!
5. Realize that the hardcoded settings weren't quite right.
6. Disable / reenable the bridge w/ the right settings.
The reasons for the failures were twofold:
a) Since we never ran the bridge chip's pre-enable then we never set the bit to ignore HPD. This meant the bridge chip didn't even _try_ to go out on the bus and communicate with the panel.
b) Even if we fixed things to ignore HPD, the EDID still wouldn't read if the panel wasn't on.
Instead of reverting the code, we could fix it to set the HPD bit and also power on the panel. However, it also works nicely to just let the panel code read the EDID. Now that we've split the driver up we can expose the DDC AUX channel bus to the panel node. The panel can take charge of reading the EDID.
NOTE: in order for things to work, anyone that needs to read the EDID will need to instantiate their panel using the new DP AUX bus (AKA by listing their panel under the "aux-bus" node of the bridge chip in the device tree).
In the future if we want to use the bridge chip to provide a full external DP port (which won't have a panel) then we will have to conditinally add EDID reading back in.
--- drivers/gpu/drm/bridge/ti-sn65dsi86.c | 22 ---------------------- 1 file changed, 22 deletions(-)
drivers/gpu/drm/bridge/ti-sn65dsi86.c +0 -22
@@ -124,7 +124,6 @@* @connector: Our connector. * @host_node: Remote DSI node. * @dsi: Our MIPI DSI source. -* @edid: Detected EDID of eDP panel. * @refclk: Our reference clock. * @panel: Our panel. * @enable_gpio: The GPIO we toggle to enable the bridge.
@@ -154,7 +153,6 @@ struct ti_sn65dsi86 {struct drm_dp_aux aux;struct drm_bridge bridge;struct drm_connector connector; -struct edid *edid;struct device_node *host_node;struct mipi_dsi_device *dsi;struct clk *refclk;
@@ -403,24 +401,6 @@ connector_to_ti_sn65dsi86(struct drm_connector *connector)static int ti_sn_bridge_connector_get_modes (struct drm_connector *connector) {struct ti_sn65dsi86 *pdata =connector_to_ti_sn65dsi86 (connector); -struct edid *edid = pdata->edid; -int num, ret; - -if (!edid) { -pm_runtime_get_sync (pdata->dev); - edid = pdata->edid =drm_get_edid (connector, &pdata->aux.ddc); -pm_runtime_put_autosuspend (pdata->dev); - } - -if (edid &&drm_edid_is_valid (edid)) { - ret =drm_connector_update_edid_property (connector, edid); -if (!ret) { - num =drm_add_edid_modes (connector, edid); -if (num) -return num; - } - } -return drm_panel_get_modes (pdata->panel, connector); }
@@ -1358,8 +1338,6 @@ static void ti_sn_bridge_remove(struct auxiliary_device *adev)mipi_dsi_device_unregister (pdata->dsi); } -kfree (pdata->edid); -drm_bridge_remove (&pdata->bridge);of_node_put (pdata->host_node);
Signature · 1 line
2.30.2
Re: [PATCH 5.14 147/334] drm/bridge: ti-sn65dsi86: Dont read EDID blob over DDC
Hi,
Quoted 45 lines · Greg Kroah-Hartman
From: Douglas Anderson <[email protected]>
[ Upstream commit
a70e558c151043ce46a5e5999f4310e0b3551f57]This is really just a revert of commit
58074b08c04a("drm/bridge:
ti-sn65dsi86: Read EDID blob over DDC"), resolving conflicts.The old code failed to read the EDID properly in a very important
case: before the bridge'spre_enable()was called. The way things need to work:
1. Read the EDID.
2. Based on the EDID, decide on video settings and pixel clock.
3. Enable the bridge w/ the desired settings.The way things were working:
1. Try to read the EDID but fail; fall back to hardcoded values.
2. Based on hardcoded values, decide on video settings and pixel clock.
3. Enable the bridge w/ the desired settings.
4. Try again to read the EDID, it works now!
5. Realize that the hardcoded settings weren't quite right.
6. Disable / reenable the bridge w/ the right settings.The reasons for the failures were twofold:
a) Since we never ran the bridge chip's pre-enable then we never set the bit to ignore HPD. This meant the bridge chip didn't even _try_ to go out on the bus and communicate with the panel.
b) Even if we fixed things to ignore HPD, the EDID still wouldn't read if the panel wasn't on.Instead of reverting the code, we could fix it to set the HPD bit and also power on the panel. However, it also works nicely to just let the panel code read the EDID. Now that we've split the driver up we can expose the DDC AUX channel bus to the panel node. The panel can take charge of reading the EDID.
NOTE: in order for things to work, anyone that needs to read the EDID will need to instantiate their panel using the new DP AUX bus (AKA by listing their panel under the "aux-bus" node of the bridge chip in the device tree).
In the future if we want to use the bridge chip to provide a full external DP port (which won't have a panel) then we will have to conditinally add EDID reading back in.
Quoted 8 lines
Suggested-by Andrzej Hajda <[email protected]>Signed-off-by Douglas Anderson <[email protected]>Reviewed-by Bjorn Andersson <[email protected]>Signed-off-by Sasha Levin <[email protected]>--- drivers/gpu/drm/bridge/ti-sn65dsi86.c | 22 ---------------------- 1 file changed, 22 deletions(-)
I guess it's not a huge deal, but I did respond to Sasha and request that this patch be dropped from the stable queue unless the whole big pile of patches was being backported. See:
https://lore.kernel.org/lkml/CAD=FV=U2dGjeEzp+K1vnLTj8oPJ-GKBTTKz2XQ1OZ7QF_sTHuw@mail.gmail.com/
Quoted 4 lines · I said:
I would suggest against backporting this one unless you're going to backport the whole pile of DP AUX bus patches, which probably doesn't make sense for stable. Even though the old EDID reading was broken for the first read, it still worked for later reads. ...and the first read
. didn't crash or anything--it just timed out.
-Doug
Greg Kroah-Hartman
maintainerRe: [PATCH 5.14 147/334] drm/bridge: ti-sn65dsi86: Dont read EDID blob over DDC
Quoted 64 lines · Doug Anderson
Hi,
Quoted 45 lines · Greg Kroah-Hartman
From: Douglas Anderson <[email protected]>
[ Upstream commit
a70e558c151043ce46a5e5999f4310e0b3551f57]This is really just a revert of commit
58074b08c04a("drm/bridge:
ti-sn65dsi86: Read EDID blob over DDC"), resolving conflicts.The old code failed to read the EDID properly in a very important
case: before the bridge'spre_enable()was called. The way things need to work:
1. Read the EDID.
2. Based on the EDID, decide on video settings and pixel clock.
3. Enable the bridge w/ the desired settings.The way things were working:
1. Try to read the EDID but fail; fall back to hardcoded values.
2. Based on hardcoded values, decide on video settings and pixel clock.
3. Enable the bridge w/ the desired settings.
4. Try again to read the EDID, it works now!
5. Realize that the hardcoded settings weren't quite right.
6. Disable / reenable the bridge w/ the right settings.The reasons for the failures were twofold:
a) Since we never ran the bridge chip's pre-enable then we never set the bit to ignore HPD. This meant the bridge chip didn't even _try_ to go out on the bus and communicate with the panel.
b) Even if we fixed things to ignore HPD, the EDID still wouldn't read if the panel wasn't on.Instead of reverting the code, we could fix it to set the HPD bit and also power on the panel. However, it also works nicely to just let the panel code read the EDID. Now that we've split the driver up we can expose the DDC AUX channel bus to the panel node. The panel can take charge of reading the EDID.
NOTE: in order for things to work, anyone that needs to read the EDID will need to instantiate their panel using the new DP AUX bus (AKA by listing their panel under the "aux-bus" node of the bridge chip in the device tree).
In the future if we want to use the bridge chip to provide a full external DP port (which won't have a panel) then we will have to conditinally add EDID reading back in.
Quoted 8 lines
Suggested-by Andrzej Hajda <[email protected]>Signed-off-by Douglas Anderson <[email protected]>Reviewed-by Bjorn Andersson <[email protected]>Signed-off-by Sasha Levin <[email protected]>--- drivers/gpu/drm/bridge/ti-sn65dsi86.c | 22 ---------------------- 1 file changed, 22 deletions(-)I guess it's not a huge deal, but I did respond to Sasha and request that this patch be dropped from the stable queue unless the whole big pile of patches was being backported. See:
https://lore.kernel.org/lkml/CAD=FV=U2dGjeEzp+K1vnLTj8oPJ-GKBTTKz2XQ1OZ7QF_sTHuw@mail.gmail.com/
Quoted 7 lines
Quoted 4 lines · I said:
I would suggest against backporting this one unless you're going to backport the whole pile of DP AUX bus patches, which probably doesn't make sense for stable. Even though the old EDID reading was broken for the first read, it still worked for later reads. ...and the first read
. didn't crash or anything--it just timed out.
I see a "bunch" of patches for this driver in this -rc, did Sasha not get them all? If not, I can drop this one, but maybe it was needed for the follow-on patches?
thanks,
greg k-h
Re: [PATCH 5.14 147/334] drm/bridge: ti-sn65dsi86: Dont read EDID blob over DDC
Hi,
Quoted 72 lines · Greg Kroah-Hartman
Quoted 70 lines · Doug Anderson
Hi,
Quoted 45 lines · Greg Kroah-Hartman
From: Douglas Anderson <[email protected]>
[ Upstream commit
a70e558c151043ce46a5e5999f4310e0b3551f57]This is really just a revert of commit
58074b08c04a("drm/bridge:
ti-sn65dsi86: Read EDID blob over DDC"), resolving conflicts.The old code failed to read the EDID properly in a very important
case: before the bridge'spre_enable()was called. The way things need to work:
1. Read the EDID.
2. Based on the EDID, decide on video settings and pixel clock.
3. Enable the bridge w/ the desired settings.The way things were working:
1. Try to read the EDID but fail; fall back to hardcoded values.
2. Based on hardcoded values, decide on video settings and pixel clock.
3. Enable the bridge w/ the desired settings.
4. Try again to read the EDID, it works now!
5. Realize that the hardcoded settings weren't quite right.
6. Disable / reenable the bridge w/ the right settings.The reasons for the failures were twofold:
a) Since we never ran the bridge chip's pre-enable then we never set the bit to ignore HPD. This meant the bridge chip didn't even _try_ to go out on the bus and communicate with the panel.
b) Even if we fixed things to ignore HPD, the EDID still wouldn't read if the panel wasn't on.Instead of reverting the code, we could fix it to set the HPD bit and also power on the panel. However, it also works nicely to just let the panel code read the EDID. Now that we've split the driver up we can expose the DDC AUX channel bus to the panel node. The panel can take charge of reading the EDID.
NOTE: in order for things to work, anyone that needs to read the EDID will need to instantiate their panel using the new DP AUX bus (AKA by listing their panel under the "aux-bus" node of the bridge chip in the device tree).
In the future if we want to use the bridge chip to provide a full external DP port (which won't have a panel) then we will have to conditinally add EDID reading back in.
Quoted 8 lines
Suggested-by Andrzej Hajda <[email protected]>Signed-off-by Douglas Anderson <[email protected]>Reviewed-by Bjorn Andersson <[email protected]>Signed-off-by Sasha Levin <[email protected]>--- drivers/gpu/drm/bridge/ti-sn65dsi86.c | 22 ---------------------- 1 file changed, 22 deletions(-)I guess it's not a huge deal, but I did respond to Sasha and request that this patch be dropped from the stable queue unless the whole big pile of patches was being backported. See:
https://lore.kernel.org/lkml/CAD=FV=U2dGjeEzp+K1vnLTj8oPJ-GKBTTKz2XQ1OZ7QF_sTHuw@mail.gmail.com/
Quoted 4 lines · I said:
I would suggest against backporting this one unless you're going to backport the whole pile of DP AUX bus patches, which probably doesn't make sense for stable. Even though the old EDID reading was broken for the first read, it still worked for later reads. ...and the first read
Quoted 5 lines
Quoted 1 line
. didn't crash or anything--it just timed out.
I see a "bunch" of patches for this driver in this -rc, did Sasha not get them all? If not, I can drop this one, but maybe it was needed for the follow-on patches?
It's been a long journey trying to make this bridge work better. I think the easiest way to say it is that if you don't have the parent of ${SUBJECT} patch, AKA:
e0bbcc6233f7 drm/bridge: ti-sn65dsi86: Add support for the DP AUX bus
...then you don't have DP AUX bus support and you shouldn't take ${SUBJECT} patch. If you have that patch and it compiles / builds then it means that you have all the proper dependencies. However, there are _a lot_ of dependencies and I wouldn't suggest picking them all to stable unless it's critical for someone.
-Doug
Greg Kroah-Hartman
maintainerRe: [PATCH 5.14 147/334] drm/bridge: ti-sn65dsi86: Dont read EDID blob over DDC
Quoted 86 lines · Doug Anderson
Hi,
Quoted 72 lines · Greg Kroah-Hartman
Quoted 70 lines · Doug Anderson
Hi,
Quoted 45 lines · Greg Kroah-Hartman
From: Douglas Anderson <[email protected]>
[ Upstream commit
a70e558c151043ce46a5e5999f4310e0b3551f57]This is really just a revert of commit
58074b08c04a("drm/bridge:
ti-sn65dsi86: Read EDID blob over DDC"), resolving conflicts.The old code failed to read the EDID properly in a very important
case: before the bridge'spre_enable()was called. The way things need to work:
1. Read the EDID.
2. Based on the EDID, decide on video settings and pixel clock.
3. Enable the bridge w/ the desired settings.The way things were working:
1. Try to read the EDID but fail; fall back to hardcoded values.
2. Based on hardcoded values, decide on video settings and pixel clock.
3. Enable the bridge w/ the desired settings.
4. Try again to read the EDID, it works now!
5. Realize that the hardcoded settings weren't quite right.
6. Disable / reenable the bridge w/ the right settings.The reasons for the failures were twofold:
a) Since we never ran the bridge chip's pre-enable then we never set the bit to ignore HPD. This meant the bridge chip didn't even _try_ to go out on the bus and communicate with the panel.
b) Even if we fixed things to ignore HPD, the EDID still wouldn't read if the panel wasn't on.Instead of reverting the code, we could fix it to set the HPD bit and also power on the panel. However, it also works nicely to just let the panel code read the EDID. Now that we've split the driver up we can expose the DDC AUX channel bus to the panel node. The panel can take charge of reading the EDID.
NOTE: in order for things to work, anyone that needs to read the EDID will need to instantiate their panel using the new DP AUX bus (AKA by listing their panel under the "aux-bus" node of the bridge chip in the device tree).
In the future if we want to use the bridge chip to provide a full external DP port (which won't have a panel) then we will have to conditinally add EDID reading back in.
Quoted 8 lines
Suggested-by Andrzej Hajda <[email protected]>Signed-off-by Douglas Anderson <[email protected]>Reviewed-by Bjorn Andersson <[email protected]>Signed-off-by Sasha Levin <[email protected]>--- drivers/gpu/drm/bridge/ti-sn65dsi86.c | 22 ---------------------- 1 file changed, 22 deletions(-)I guess it's not a huge deal, but I did respond to Sasha and request that this patch be dropped from the stable queue unless the whole big pile of patches was being backported. See:
https://lore.kernel.org/lkml/CAD=FV=U2dGjeEzp+K1vnLTj8oPJ-GKBTTKz2XQ1OZ7QF_sTHuw@mail.gmail.com/
Quoted 4 lines · I said:
I would suggest against backporting this one unless you're going to backport the whole pile of DP AUX bus patches, which probably doesn't make sense for stable. Even though the old EDID reading was broken for the first read, it still worked for later reads. ...and the first read
Quoted 5 lines
Quoted 1 line
. didn't crash or anything--it just timed out.
I see a "bunch" of patches for this driver in this -rc, did Sasha not get them all? If not, I can drop this one, but maybe it was needed for the follow-on patches?
It's been a long journey trying to make this bridge work better. I think the easiest way to say it is that if you don't have the parent of ${SUBJECT} patch, AKA:
Quoted 7 lines
e0bbcc6233f7drm/bridge: ti-sn65dsi86: Add support for the DP AUX bus...then you don't have DP AUX bus support and you shouldn't take ${SUBJECT} patch. If you have that patch and it compiles / builds then it means that you have all the proper dependencies. However, there are _a
lot_of dependencies and I wouldn't suggest picking them all to stable unless it's critical for someone.
I tried to drop this one, and it turned out to be a depandancy for another patch for this driver. And that was another dependancy. So I've now dropped all of these from the queue.
Here are the commits I dropped. If you think any should be added back, please let us know:
05a7f4a8dff1 ("devlink: Break parameter notification sequence to be before/after unload/load driver") e183bf31cf0d ("drm/bridge: ti-sn65dsi86: Add some 100 us delays")c7782443a889 ("drm/bridge: ti-sn65dsi86: Avoid creating multiple connectors") a70e558c1510 ("drm/bridge: ti-sn65dsi86: Don't read EDID blob over DDC")acb06210b096 ("drm/bridge: ti-sn65dsi86: Fix power off sequence")4c1b3d94bf63 ("drm/bridge: ti-sn65dsi86: Improve probe errors with dev_err_probe()") 4e5763f03e10 ("drm/bridge: ti-sn65dsi86: Wrap panel with panel-bridge")
thanks,
greg k-h
Sasha Levin
maintainerRe: [PATCH 5.14 147/334] drm/bridge: ti-sn65dsi86: Dont read EDID blob over DDC
Quoted 102 lines · Greg Kroah-Hartman
Quoted 86 lines · Doug Anderson
Hi,
Quoted 72 lines · Greg Kroah-Hartman
Quoted 70 lines · Doug Anderson
Hi,
Quoted 45 lines · Greg Kroah-Hartman
From: Douglas Anderson <[email protected]>
[ Upstream commit
a70e558c151043ce46a5e5999f4310e0b3551f57]This is really just a revert of commit
58074b08c04a("drm/bridge:
ti-sn65dsi86: Read EDID blob over DDC"), resolving conflicts.The old code failed to read the EDID properly in a very important
case: before the bridge'spre_enable()was called. The way things need to work:
1. Read the EDID.
2. Based on the EDID, decide on video settings and pixel clock.
3. Enable the bridge w/ the desired settings.The way things were working:
1. Try to read the EDID but fail; fall back to hardcoded values.
2. Based on hardcoded values, decide on video settings and pixel clock.
3. Enable the bridge w/ the desired settings.
4. Try again to read the EDID, it works now!
5. Realize that the hardcoded settings weren't quite right.
6. Disable / reenable the bridge w/ the right settings.The reasons for the failures were twofold:
a) Since we never ran the bridge chip's pre-enable then we never set the bit to ignore HPD. This meant the bridge chip didn't even _try_ to go out on the bus and communicate with the panel.
b) Even if we fixed things to ignore HPD, the EDID still wouldn't read if the panel wasn't on.Instead of reverting the code, we could fix it to set the HPD bit and also power on the panel. However, it also works nicely to just let the panel code read the EDID. Now that we've split the driver up we can expose the DDC AUX channel bus to the panel node. The panel can take charge of reading the EDID.
NOTE: in order for things to work, anyone that needs to read the EDID will need to instantiate their panel using the new DP AUX bus (AKA by listing their panel under the "aux-bus" node of the bridge chip in the device tree).
In the future if we want to use the bridge chip to provide a full external DP port (which won't have a panel) then we will have to conditinally add EDID reading back in.
Quoted 8 lines
Suggested-by Andrzej Hajda <[email protected]>Signed-off-by Douglas Anderson <[email protected]>Reviewed-by Bjorn Andersson <[email protected]>Signed-off-by Sasha Levin <[email protected]>--- drivers/gpu/drm/bridge/ti-sn65dsi86.c | 22 ---------------------- 1 file changed, 22 deletions(-)I guess it's not a huge deal, but I did respond to Sasha and request that this patch be dropped from the stable queue unless the whole big pile of patches was being backported. See:
https://lore.kernel.org/lkml/CAD=FV=U2dGjeEzp+K1vnLTj8oPJ-GKBTTKz2XQ1OZ7QF_sTHuw@mail.gmail.com/
Quoted 4 lines · I said:
I would suggest against backporting this one unless you're going to backport the whole pile of DP AUX bus patches, which probably doesn't make sense for stable. Even though the old EDID reading was broken for the first read, it still worked for later reads. ...and the first read
Quoted 5 lines
Quoted 1 line
. didn't crash or anything--it just timed out.
I see a "bunch" of patches for this driver in this -rc, did Sasha not get them all? If not, I can drop this one, but maybe it was needed for the follow-on patches?
It's been a long journey trying to make this bridge work better. I think the easiest way to say it is that if you don't have the parent of ${SUBJECT} patch, AKA:
Quoted 7 lines
e0bbcc6233f7drm/bridge: ti-sn65dsi86: Add support for the DP AUX bus...then you don't have DP AUX bus support and you shouldn't take ${SUBJECT} patch. If you have that patch and it compiles / builds then it means that you have all the proper dependencies. However, there are _a
lot_of dependencies and I wouldn't suggest picking them all to stable unless it's critical for someone.I tried to drop this one, and it turned out to be a depandancy for another patch for this driver. And that was another dependancy. So I've now dropped all of these from the queue.
Here are the commits I dropped. If you think any should be added back, please let us know:
Quoted 7 lines
05a7f4a8dff1("devlink: Break parameter notification sequence to be before/after unload/load driver")e183bf31cf0d("drm/bridge: ti-sn65dsi86: Add some 100 us delays")c7782443a889("drm/bridge: ti-sn65dsi86: Avoid creating multiple connectors")a70e558c1510("drm/bridge: ti-sn65dsi86: Don't read EDID blob over DDC")acb06210b096("drm/bridge: ti-sn65dsi86: Fix power off sequence")4c1b3d94bf63("drm/bridge: ti-sn65dsi86: Improve probe errors withdev_err_probe()")4e5763f03e10("drm/bridge: ti-sn65dsi86: Wrap panel with panel-bridge")
Thanks! And yes, I dropped the patch based on the request but it snuck in as a dependency for a few patches with a Fixes tag.
Signature · 2 lines
Thanks, Sasha
Re: [PATCH 5.14 147/334] drm/bridge: ti-sn65dsi86: Dont read EDID blob over DDC
In reply to Greg Kroah-HartmanHi,
Quoted 96 lines · Greg Kroah-Hartman
Quoted 86 lines · Doug Anderson
Hi,
Quoted 72 lines · Greg Kroah-Hartman
Quoted 70 lines · Doug Anderson
Hi,
Quoted 45 lines · Greg Kroah-Hartman
From: Douglas Anderson <[email protected]>
[ Upstream commit
a70e558c151043ce46a5e5999f4310e0b3551f57]This is really just a revert of commit
58074b08c04a("drm/bridge:
ti-sn65dsi86: Read EDID blob over DDC"), resolving conflicts.The old code failed to read the EDID properly in a very important
case: before the bridge'spre_enable()was called. The way things need to work:
1. Read the EDID.
2. Based on the EDID, decide on video settings and pixel clock.
3. Enable the bridge w/ the desired settings.The way things were working:
1. Try to read the EDID but fail; fall back to hardcoded values.
2. Based on hardcoded values, decide on video settings and pixel clock.
3. Enable the bridge w/ the desired settings.
4. Try again to read the EDID, it works now!
5. Realize that the hardcoded settings weren't quite right.
6. Disable / reenable the bridge w/ the right settings.The reasons for the failures were twofold:
a) Since we never ran the bridge chip's pre-enable then we never set the bit to ignore HPD. This meant the bridge chip didn't even _try_ to go out on the bus and communicate with the panel.
b) Even if we fixed things to ignore HPD, the EDID still wouldn't read if the panel wasn't on.Instead of reverting the code, we could fix it to set the HPD bit and also power on the panel. However, it also works nicely to just let the panel code read the EDID. Now that we've split the driver up we can expose the DDC AUX channel bus to the panel node. The panel can take charge of reading the EDID.
NOTE: in order for things to work, anyone that needs to read the EDID will need to instantiate their panel using the new DP AUX bus (AKA by listing their panel under the "aux-bus" node of the bridge chip in the device tree).
In the future if we want to use the bridge chip to provide a full external DP port (which won't have a panel) then we will have to conditinally add EDID reading back in.
Quoted 8 lines
Suggested-by Andrzej Hajda <[email protected]>Signed-off-by Douglas Anderson <[email protected]>Reviewed-by Bjorn Andersson <[email protected]>Signed-off-by Sasha Levin <[email protected]>--- drivers/gpu/drm/bridge/ti-sn65dsi86.c | 22 ---------------------- 1 file changed, 22 deletions(-)I guess it's not a huge deal, but I did respond to Sasha and request that this patch be dropped from the stable queue unless the whole big pile of patches was being backported. See:
https://lore.kernel.org/lkml/CAD=FV=U2dGjeEzp+K1vnLTj8oPJ-GKBTTKz2XQ1OZ7QF_sTHuw@mail.gmail.com/
Quoted 4 lines · I said:
I would suggest against backporting this one unless you're going to backport the whole pile of DP AUX bus patches, which probably doesn't make sense for stable. Even though the old EDID reading was broken for the first read, it still worked for later reads. ...and the first read
Quoted 5 lines
Quoted 1 line
. didn't crash or anything--it just timed out.
I see a "bunch" of patches for this driver in this -rc, did Sasha not get them all? If not, I can drop this one, but maybe it was needed for the follow-on patches?
It's been a long journey trying to make this bridge work better. I think the easiest way to say it is that if you don't have the parent of ${SUBJECT} patch, AKA:
Quoted 7 lines
e0bbcc6233f7drm/bridge: ti-sn65dsi86: Add support for the DP AUX bus...then you don't have DP AUX bus support and you shouldn't take ${SUBJECT} patch. If you have that patch and it compiles / builds then it means that you have all the proper dependencies. However, there are _a
lot_of dependencies and I wouldn't suggest picking them all to stable unless it's critical for someone.
Quoted 3 lines
I tried to drop this one, and it turned out to be a depandancy for another patch for this driver. And that was another dependancy. So I've now dropped all of these from the queue.
Ugh. :(
Quoted 4 lines
Here are the commits I dropped. If you think any should be added back, please let us know:
05a7f4a8dff1("devlink: Break parameter notification sequence to be before/after unload/load driver")
I don't understand what the "devlink" patch had to do with ti-sn65dsi86. I'll assume you didn't intend to have it in your list.
Quoted 6 lines
e183bf31cf0d("drm/bridge: ti-sn65dsi86: Add some 100 us delays")c7782443a889("drm/bridge: ti-sn65dsi86: Avoid creating multiple connectors")a70e558c1510("drm/bridge: ti-sn65dsi86: Don't read EDID blob over DDC")acb06210b096("drm/bridge: ti-sn65dsi86: Fix power off sequence")4c1b3d94bf63("drm/bridge: ti-sn65dsi86: Improve probe errors withdev_err_probe()")4e5763f03e10("drm/bridge: ti-sn65dsi86: Wrap panel with panel-bridge")
I'd say it's OK to drop these. If someone demonstrates a need for them on stable channel then I can help with backporting, but otherwise I can't see that it's worth it. Basically:
1. I think ${SUBJECT} patch without full DP AUX support for people could cause a real regression if anyone is using this bridge chip on 5.14 stable.
2. I think picking back full DP AUX support is too heavy for a stable-channel backport without a demonstrated need.
3. Of the above patches, only one fixes a problem that was observed on real hardware ("Fix power off sequence"). That was only seen on a panel that _requires_ the full DP AUX support in order to work. Other ones are fixes based on code inspection, cleanups, or fixes for other patches in the series there.
-Doug
Greg Kroah-Hartman
maintainerRe: [PATCH 5.14 147/334] drm/bridge: ti-sn65dsi86: Dont read EDID blob over DDC
Quoted 107 lines · Doug Anderson
Hi,
Quoted 96 lines · Greg Kroah-Hartman
Quoted 86 lines · Doug Anderson
Hi,
Quoted 72 lines · Greg Kroah-Hartman
Quoted 70 lines · Doug Anderson
Hi,
Quoted 45 lines · Greg Kroah-Hartman
From: Douglas Anderson <[email protected]>
[ Upstream commit
a70e558c151043ce46a5e5999f4310e0b3551f57]This is really just a revert of commit
58074b08c04a("drm/bridge:
ti-sn65dsi86: Read EDID blob over DDC"), resolving conflicts.The old code failed to read the EDID properly in a very important
case: before the bridge'spre_enable()was called. The way things need to work:
1. Read the EDID.
2. Based on the EDID, decide on video settings and pixel clock.
3. Enable the bridge w/ the desired settings.The way things were working:
1. Try to read the EDID but fail; fall back to hardcoded values.
2. Based on hardcoded values, decide on video settings and pixel clock.
3. Enable the bridge w/ the desired settings.
4. Try again to read the EDID, it works now!
5. Realize that the hardcoded settings weren't quite right.
6. Disable / reenable the bridge w/ the right settings.The reasons for the failures were twofold:
a) Since we never ran the bridge chip's pre-enable then we never set the bit to ignore HPD. This meant the bridge chip didn't even _try_ to go out on the bus and communicate with the panel.
b) Even if we fixed things to ignore HPD, the EDID still wouldn't read if the panel wasn't on.Instead of reverting the code, we could fix it to set the HPD bit and also power on the panel. However, it also works nicely to just let the panel code read the EDID. Now that we've split the driver up we can expose the DDC AUX channel bus to the panel node. The panel can take charge of reading the EDID.
NOTE: in order for things to work, anyone that needs to read the EDID will need to instantiate their panel using the new DP AUX bus (AKA by listing their panel under the "aux-bus" node of the bridge chip in the device tree).
In the future if we want to use the bridge chip to provide a full external DP port (which won't have a panel) then we will have to conditinally add EDID reading back in.
Quoted 8 lines
Suggested-by Andrzej Hajda <[email protected]>Signed-off-by Douglas Anderson <[email protected]>Reviewed-by Bjorn Andersson <[email protected]>Signed-off-by Sasha Levin <[email protected]>--- drivers/gpu/drm/bridge/ti-sn65dsi86.c | 22 ---------------------- 1 file changed, 22 deletions(-)I guess it's not a huge deal, but I did respond to Sasha and request that this patch be dropped from the stable queue unless the whole big pile of patches was being backported. See:
https://lore.kernel.org/lkml/CAD=FV=U2dGjeEzp+K1vnLTj8oPJ-GKBTTKz2XQ1OZ7QF_sTHuw@mail.gmail.com/
Quoted 4 lines · I said:
I would suggest against backporting this one unless you're going to backport the whole pile of DP AUX bus patches, which probably doesn't make sense for stable. Even though the old EDID reading was broken for the first read, it still worked for later reads. ...and the first read
Quoted 5 lines
Quoted 1 line
. didn't crash or anything--it just timed out.
I see a "bunch" of patches for this driver in this -rc, did Sasha not get them all? If not, I can drop this one, but maybe it was needed for the follow-on patches?
It's been a long journey trying to make this bridge work better. I think the easiest way to say it is that if you don't have the parent of ${SUBJECT} patch, AKA:
Quoted 7 lines
e0bbcc6233f7drm/bridge: ti-sn65dsi86: Add support for the DP AUX bus...then you don't have DP AUX bus support and you shouldn't take ${SUBJECT} patch. If you have that patch and it compiles / builds then it means that you have all the proper dependencies. However, there are _a
lot_of dependencies and I wouldn't suggest picking them all to stable unless it's critical for someone.Quoted 3 lines
I tried to drop this one, and it turned out to be a depandancy for another patch for this driver. And that was another dependancy. So I've now dropped all of these from the queue.
Ugh. :(
Quoted 7 lines
Quoted 4 lines
Here are the commits I dropped. If you think any should be added back, please let us know:
05a7f4a8dff1("devlink: Break parameter notification sequence to be before/after unload/load driver")I don't understand what the "devlink" patch had to do with ti-sn65dsi86. I'll assume you didn't intend to have it in your list.
Odd, good point, I think I messed up in removing too many patches, let me go add that back...
thanks,
greg k-h
Greg Kroah-Hartman
maintainerPATCH 148/334 drm/bridge: ti-sn65dsi86: Improve probe errors with dev_err_probe()
In reply to Greg Kroah-HartmanFrom: Douglas Anderson <[email protected]>
[ Upstream commit 4c1b3d94bf632c1420a5d4108199f55a5655831d ]
As I was testing to make sure that the DEFER path worked well with my patch series, I got tired of seeing this scary message in my logs just because the panel needed to defer:
[drm:ti_sn_bridge_probe] *ERROR* could not find any panel node
Let's use dev_err_probe() which nicely quiets this error and also simplifies the code a tiny bit. We'll also update other places in the file which can use dev_err_probe().
--- drivers/gpu/drm/bridge/ti-sn65dsi86.c | 31 +++++++++++---------------- 1 file changed, 13 insertions(+), 18 deletions(-)
drivers/gpu/drm/bridge/ti-sn65dsi86.c +13 -18
@@ -1302,10 +1302,9 @@ static int ti_sn_bridge_probe(struct auxiliary_device *adev,int ret; ret =drm_of_find_panel_or_bridge (np,1 ,0 , &pdata->panel,NULL ); -if (ret) { -DRM_ERROR ("could not find any panel node\n" ); -return ret; - } +if (ret) +return dev_err_probe (&adev->dev, ret, +"could not find any panel node\n" );ti_sn_bridge_parse_lanes (pdata, np);
@@ -1432,27 +1431,23 @@ static int ti_sn65dsi86_probe(struct i2c_client *client, pdata->regmap =devm_regmap_init_i2c (client, &ti_sn65dsi86_regmap_config); -if (IS_ERR (pdata->regmap)) { -DRM_ERROR ("regmap i2c init failed\n" ); -return PTR_ERR (pdata->regmap); - } +if (IS_ERR (pdata->regmap)) +return dev_err_probe (dev,PTR_ERR (pdata->regmap), +"regmap i2c init failed\n" ); pdata->enable_gpio =devm_gpiod_get (dev,"enable" ,GPIOD_OUT_LOW ); -if (IS_ERR (pdata->enable_gpio)) { -DRM_ERROR ("failed to get enable gpio from DT\n" ); - ret =PTR_ERR (pdata->enable_gpio); -return ret; - } +if (IS_ERR (pdata->enable_gpio)) +return dev_err_probe (dev,PTR_ERR (pdata->enable_gpio), +"failed to get enable gpio from DT\n" ); ret =ti_sn65dsi86_parse_regulators (pdata); -if (ret) { -DRM_ERROR ("failed to parse regulators\n" ); -return ret; - } +if (ret) +return dev_err_probe (dev, ret,"failed to parse regulators\n" ); pdata->refclk =devm_clk_get_optional (dev,"refclk" );if (IS_ERR (pdata->refclk)) -return PTR_ERR (pdata->refclk); +return dev_err_probe (dev,PTR_ERR (pdata->refclk), +"failed to get reference clock\n" );pm_runtime_enable (dev); ret =devm_add_action_or_reset (dev, ti_sn65dsi86_runtime_disable, dev);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 149/334 drm/bridge: ti-sn65dsi86: Wrap panel with panel-bridge
In reply to Greg Kroah-HartmanFrom: Laurent Pinchart <[email protected]>
[ Upstream commit 4e5763f03e105fedfcd7a83bec1dccae96e334dd ]
To simplify interfacing with the panel, wrap it in a panel-bridge and let the DRM bridge helpers handle chaining of operations.
This also prepares for support of DRM_BRIDGE_ATTACH_NO_CONNECTOR, which requires all components in the display pipeline to be represented by bridges.
--- drivers/gpu/drm/bridge/ti-sn65dsi86.c | 32 +++++++++++++++++---------- 1 file changed, 20 insertions(+), 12 deletions(-)
drivers/gpu/drm/bridge/ti-sn65dsi86.c +20 -12
@@ -125,7 +125,7 @@* @host_node: Remote DSI node. * @dsi: Our MIPI DSI source. * @refclk: Our reference clock. -* @panel: Our panel. +* @next_bridge: The bridge on the eDP side. * @enable_gpio: The GPIO we toggle to enable the bridge. * @supplies: Data for bulk enabling/disabling our regulators. * @dp_lanes: Count of dp_lanes we're using.
@@ -156,7 +156,7 @@ struct ti_sn65dsi86 {struct device_node *host_node;struct mipi_dsi_device *dsi;struct clk *refclk; -struct drm_panel *panel; +struct drm_bridge *next_bridge;struct gpio_desc *enable_gpio;struct regulator_bulk_data supplies[SN_REGULATOR_SUPPLY_NUM ];int dp_lanes;
@@ -401,7 +401,8 @@ connector_to_ti_sn65dsi86(struct drm_connector *connector)static int ti_sn_bridge_connector_get_modes (struct drm_connector *connector) {struct ti_sn65dsi86 *pdata =connector_to_ti_sn65dsi86 (connector); -return drm_panel_get_modes (pdata->panel, connector); + +return drm_bridge_get_modes (pdata->next_bridge, connector); } static enum drm_mode_status
@@ -527,8 +528,16 @@ static int ti_sn_bridge_attach(struct drm_bridge *bridge, } pdata->dsi = dsi; +/* Attach the next bridge */ + ret =drm_bridge_attach (bridge->encoder, pdata->next_bridge, + &pdata->bridge, flags); +if (ret <0 ) + goto err_dsi_detach; +return 0 ; +err_dsi_detach: +mipi_dsi_detach (dsi); err_dsi_attach:mipi_dsi_device_unregister (dsi); err_dsi_host:
@@ -547,8 +556,6 @@ static void ti_sn_bridge_disable(struct drm_bridge *bridge) {struct ti_sn65dsi86 *pdata =bridge_to_ti_sn65dsi86 (bridge); -drm_panel_disable (pdata->panel); -/* disable video stream */ regmap_update_bits (pdata->regmap,SN_ENH_FRAME_REG ,VSTREAM_ENABLE ,0 );/* semi auto link training mode OFF */
@@ -873,8 +880,6 @@ static void ti_sn_bridge_enable(struct drm_bridge *bridge)/* enable video stream */ regmap_update_bits (pdata->regmap,SN_ENH_FRAME_REG ,VSTREAM_ENABLE ,VSTREAM_ENABLE ); - -drm_panel_enable (pdata->panel); }static void ti_sn_bridge_pre_enable (struct drm_bridge *bridge)
@@ -885,16 +890,12 @@ static void ti_sn_bridge_pre_enable(struct drm_bridge *bridge)if (!pdata->refclk)ti_sn65dsi86_enable_comms (pdata); - -drm_panel_prepare (pdata->panel); }static void ti_sn_bridge_post_disable (struct drm_bridge *bridge) {struct ti_sn65dsi86 *pdata =bridge_to_ti_sn65dsi86 (bridge); -drm_panel_unprepare (pdata->panel); -if (!pdata->refclk)ti_sn65dsi86_disable_comms (pdata);
@@ -1299,13 +1300,20 @@ static int ti_sn_bridge_probe(struct auxiliary_device *adev, {struct ti_sn65dsi86 *pdata =dev_get_drvdata (adev->dev.parent);struct device_node *np = pdata->dev->of_node; +struct drm_panel *panel;int ret; - ret =drm_of_find_panel_or_bridge (np,1 ,0 , &pdata->panel,NULL ); + ret =drm_of_find_panel_or_bridge (np,1 ,0 , &panel,NULL );if (ret)return dev_err_probe (&adev->dev, ret,"could not find any panel node\n" ); + pdata->next_bridge =devm_drm_panel_bridge_add (pdata->dev, panel); +if (IS_ERR (pdata->next_bridge)) { +DRM_ERROR ("failed to create panel bridge\n" ); +return PTR_ERR (pdata->next_bridge); + } +ti_sn_bridge_parse_lanes (pdata, np); ret =ti_sn_bridge_parse_dsi_host (pdata);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 150/334 drm/bridge: ti-sn65dsi86: Fix power off sequence
In reply to Greg Kroah-HartmanFrom: Douglas Anderson <[email protected]>
[ Upstream commit acb06210b096830e28e9ffd2c6501fe99bdb10fd ]
When testing with a panel that's apparently a little more persnickety about the correct power sequence (specifically Samsung ATNA33XC20), we found that the ti-sn65dsi86 was doing things just slightly wrong.
Looking closely at the ti-sn65dsi86's datasheet, the power off sequence is supposed to be:
1. Clear VSTREAM_ENABLE bit
2. Stop DSI stream from GPU. DSI lanes must be placed in LP11 state.
3. Program the ML_TX_MODE to 0x0 (OFF)
4. Program the DP_NUM_LANES register to 0x0
5. Clear the DP_PLL_EN bit.
6. Deassert the EN pin.
7. Remove power from supply pins
Since we were doing the whole sequence in the "disable", I believe that step #2 (stopping the DSI stream from the GPU) wasn't happening. We also weren't setting DP_NUM_LANES to 0.
Let's fix this.
NOTE: things are a little asymmetric now. For instance, we turn the PLL on in "enable" but now we're not turning it off until "post_disable". It would seem to make sense to move the PLL turning on to "pre_enable" to match. Unfortunately, I don't believe that's allowed. It looks as if (in the non-refclk mode which probably nobody is using) we have to wait until the MIPI clock is there before we can enable the PLL. In any case, the way it is here won't really hurt--it'll just leave the PLL on a little longer.
--- drivers/gpu/drm/bridge/ti-sn65dsi86.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-)
drivers/gpu/drm/bridge/ti-sn65dsi86.c +7 -4
@@ -558,10 +558,6 @@ static void ti_sn_bridge_disable(struct drm_bridge *bridge)/* disable video stream */ regmap_update_bits (pdata->regmap,SN_ENH_FRAME_REG ,VSTREAM_ENABLE ,0 ); -/* semi auto link training mode OFF */ -regmap_write (pdata->regmap,SN_ML_TX_MODE_REG ,0 ); -/* disable DP PLL */ -regmap_write (pdata->regmap,SN_PLL_ENABLE_REG ,0 ); }static void ti_sn_bridge_set_dsi_rate (struct ti_sn65dsi86 *pdata)
@@ -896,6 +892,13 @@ static void ti_sn_bridge_post_disable(struct drm_bridge *bridge) {struct ti_sn65dsi86 *pdata =bridge_to_ti_sn65dsi86 (bridge); +/* semi auto link training mode OFF */ +regmap_write (pdata->regmap,SN_ML_TX_MODE_REG ,0 ); +/* Num lanes to 0 as per power sequencing in data sheet */ +regmap_update_bits (pdata->regmap,SN_SSC_CONFIG_REG ,DP_NUM_LANES_MASK ,0 ); +/* disable DP PLL */ +regmap_write (pdata->regmap,SN_PLL_ENABLE_REG ,0 ); +if (!pdata->refclk)ti_sn65dsi86_disable_comms (pdata);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 151/334 drm/bridge: ti-sn65dsi86: Add some 100 us delays
In reply to Greg Kroah-HartmanFrom: Douglas Anderson <[email protected]>
[ Upstream commit e183bf31cf0d3a05162e633e428350ed176ce926 ]
The manual has always said that we need 100 us delays in a few places. Though it hasn't seemed to be a big deal to skip these, let's add them in case it makes something happier.
NOTE: this fixes no known issues but it seems good to make it right.
--- drivers/gpu/drm/bridge/ti-sn65dsi86.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/gpu/drm/bridge/ti-sn65dsi86.c +6 -0
@@ -304,6 +304,9 @@ static int __maybe_unused ti_sn65dsi86_resume(struct device *dev)return ret; } +/* td2: min 100 us after regulators before enabling the GPIO */ +usleep_range (100 ,110 ); +gpiod_set_value (pdata->enable_gpio,1 );/*
@@ -886,6 +889,9 @@ static void ti_sn_bridge_pre_enable(struct drm_bridge *bridge)if (!pdata->refclk)ti_sn65dsi86_enable_comms (pdata); + +/* td7: min 100 us after enable before DSI data */ +usleep_range (100 ,110 ); }static void ti_sn_bridge_post_disable (struct drm_bridge *bridge)
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 152/334 net/mlx5: Fix missing return value in mlx5_devlink_eswitch_inline_mode_set()
In reply to Greg Kroah-HartmanFrom: Jiapeng Chong <[email protected]>
[ Upstream commit bcd68c04c7692416206414dc8971730aa140eba7 ]
The return value is missing in this code scenario, add the return value '0' to the return value 'err'.
Eliminate the follow smatch warning:
drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c:3083 mlx5_devlink_eswitch_inline_mode_set() warn: missing error code 'err'.
--- drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c +4 -1
@@ -3091,8 +3091,11 @@ int mlx5_devlink_eswitch_inline_mode_set(struct devlink *devlink, u8 mode,switch (MLX5_CAP_ETH (dev, wqe_inline_mode)) {case MLX5_CAP_INLINE_MODE_NOT_REQUIRED : -if (mode ==DEVLINK_ESWITCH_INLINE_MODE_NONE ) +if (mode ==DEVLINK_ESWITCH_INLINE_MODE_NONE ) { + err =0 ; goto out; + } + fallthrough;case MLX5_CAP_INLINE_MODE_L2 :NL_SET_ERR_MSG_MOD (extack,"Inline mode can't be set" );
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 153/334 i2c: highlander: add IRQ check
In reply to Greg Kroah-HartmanFrom: Sergey Shtylyov <[email protected]>
[ Upstream commit f16a3bb69aa6baabf8f0aca982c8cf21e2a4f6bc ]
The driver is written as if platform_get_irq() returns 0 on errors (while actually it returns a negative error code), blithely passing these error codes to request_irq() (which takes *unsigned* IRQ #) -- which fails with -EINVAL. Add the necessary error check to the pre-existing *if* statement forcing the driver into the polling mode...
--- drivers/i2c/busses/i2c-highlander.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/i2c/busses/i2c-highlander.c +1 -1
@@ -379,7 +379,7 @@ static int highlander_i2c_probe(struct platform_device *pdev)platform_set_drvdata (pdev, dev); dev->irq =platform_get_irq (pdev,0 ); -if (iic_force_poll) +if (dev->irq <0 || iic_force_poll) dev->irq =0 ;if (dev->irq) {
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 154/334 leds: lgm-sso: Put fwnode in any case during ->probe()
In reply to Greg Kroah-HartmanFrom: Andy Shevchenko <[email protected]>
[ Upstream commit 9999908ca1abee7aa518a4f6a3739517c137acbf ]
fwnode_get_next_child_node() bumps a reference counting of a returned variable. We have to balance it whenever we return to the caller.
All the same in fwnode_for_each_child_node() case.
--- drivers/leds/blink/leds-lgm-sso.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-)
drivers/leds/blink/leds-lgm-sso.c +7 -4
@@ -631,8 +631,10 @@ __sso_led_dt_parse(struct sso_led_priv *priv, struct fwnode_handle *fw_ssoled)fwnode_for_each_child_node (fw_ssoled, fwnode_child) { led =devm_kzalloc (dev,sizeof (*led),GFP_KERNEL ); -if (!led) -return -ENOMEM ; +if (!led) { + ret = -ENOMEM ; + goto __dt_err; + }INIT_LIST_HEAD (&led->list); led->priv = priv;
@@ -702,11 +704,11 @@ __sso_led_dt_parse(struct sso_led_priv *priv, struct fwnode_handle *fw_ssoled)if (sso_create_led (priv, led, fwnode_child)) goto __dt_err; } -fwnode_handle_put (fw_ssoled);return 0 ; + __dt_err: -fwnode_handle_put (fw_ssoled); +fwnode_handle_put (fwnode_child);/* unregister leds */ list_for_each (p, &priv->led_list) { led = list_entry(p, struct sso_led, list);
@@ -731,6 +733,7 @@ static int sso_led_dt_parse(struct sso_led_priv *priv) fw_ssoled =fwnode_get_named_child_node (fwnode,"ssoled" );if (fw_ssoled) { ret =__sso_led_dt_parse (priv, fw_ssoled); +fwnode_handle_put (fw_ssoled);if (ret)return ret; }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 155/334 leds: lgm-sso: Dont spam logs when probe is deferred
In reply to Greg Kroah-HartmanFrom: Andy Shevchenko <[email protected]>
[ Upstream commit 1ed4d05e0a0b23ba15e0affcff4008dd537ae3ee ]
When requesting GPIO line the probe can be deferred. In such case don't spam logs with an error message. This can be achieved by switching to dev_err_probe().
--- drivers/leds/blink/leds-lgm-sso.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/leds/blink/leds-lgm-sso.c +1 -1
@@ -644,7 +644,7 @@ __sso_led_dt_parse(struct sso_led_priv *priv, struct fwnode_handle *fw_ssoled) fwnode_child, GPIOD_ASIS, NULL);if (IS_ERR (led->gpiod)) { -dev_err (dev,"led: get gpio fail!\n" ); +dev_err_probe (dev,PTR_ERR (led->gpiod),"led: get gpio fail!\n" ); goto __dt_err; }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 156/334 leds: lt3593: Put fwnode in any case during ->probe()
In reply to Greg Kroah-HartmanFrom: Andy Shevchenko <[email protected]>
[ Upstream commit 7e1baaaa2407a642ea19b58e214fab9a69cda1d7 ]
device_get_next_child_node() bumps a reference counting of a returned variable. We have to balance it whenever we return to the caller.
--- drivers/leds/leds-lt3593.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
drivers/leds/leds-lt3593.c +2 -3
@@ -97,10 +97,9 @@ static int lt3593_led_probe(struct platform_device *pdev) init_data.default_label =":" ; ret =devm_led_classdev_register_ext (dev, &led_data->cdev, &init_data); -if (ret <0 ) { -fwnode_handle_put (child); +fwnode_handle_put (child); +if (ret <0 )return ret; - }platform_set_drvdata (pdev, led_data);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 157/334 leds: rt8515: Put fwnode in any case during ->probe()
In reply to Greg Kroah-HartmanFrom: Andy Shevchenko <[email protected]>
[ Upstream commit 8aa41952ef245449df79100e1942b5e6288b098a ]
fwnode_get_next_available_child_node() bumps a reference counting of a returned variable. We have to balance it whenever we return to the caller.
--- drivers/leds/flash/leds-rt8515.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/leds/flash/leds-rt8515.c +3 -1
@@ -343,8 +343,9 @@ static int rt8515_probe(struct platform_device *pdev) ret =devm_led_classdev_flash_register_ext (dev, fled, &init_data);if (ret) { -dev_err (dev,"can't register LED %s\n" , led->name); +fwnode_handle_put (child);mutex_destroy (&rt->lock); +dev_err (dev,"can't register LED %s\n" , led->name);return ret; }
@@ -362,6 +363,7 @@ static int rt8515_probe(struct platform_device *pdev)*/ } +fwnode_handle_put (child);return 0 ; }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 158/334 leds: trigger: audio: Add an activate callback to ensure the initial brightness is set
In reply to Greg Kroah-HartmanFrom: Hans de Goede <[email protected]>
[ Upstream commit 64f67b5240db79eceb0bd57dae8e591fd3103ba0 ]
Some 2-in-1s with a detachable (USB) keyboard(dock) have mute-LEDs in the speaker- and/or mic-mute keys on the keyboard.
Examples of this are the Lenovo Thinkpad10 tablet (with its USB kbd-dock) and the HP x2 10 series.
The detachable nature of these keyboards means that the keyboard and thus the mute LEDs may show up after the user (or userspace restoring old mixer settings) has muted the speaker and/or mic.
Current LED-class devices with a default_trigger of "audio-mute" or "audio-micmute" initialize the brightness member of led_classdev with ledtrig_audio_get() before registering the LED.
This makes the software state after attaching the keyboard match the actual audio mute state, e.g. cat /sys/class/leds/foo/brightness will show the right value.
But before this commit nothing was actually calling the led_classdev's brightness_set[_blocking] callback so the value returned by ledtrig_audio_get() was never actually being sent to the hw, leading to the mute LEDs staying in their default power-on state, after attaching the keyboard, even if ledtrig_audio_get() returned a different state.
This could be fixed by having the individual LED drivers call brightness_set[_blocking] themselves after registering the LED, but this really is something which should be done by a led-trigger activate callback.
Add an activate callback for this, fixing the issue of the mute LEDs being out of sync after (re)attaching the keyboard.
--- drivers/leds/trigger/ledtrig-audio.c | 37 ++++++++++++++++++++++------ 1 file changed, 29 insertions(+), 8 deletions(-)
drivers/leds/trigger/ledtrig-audio.c +29 -8
@@ -6,10 +6,33 @@#include <linux/kernel.h> #include <linux/leds.h> #include <linux/module.h> +#include "../leds.h" -static struct led_trigger *ledtrig_audio[NUM_AUDIO_LEDS ];static enum led_brightness audio_state[NUM_AUDIO_LEDS ]; +static int ledtrig_audio_mute_activate (struct led_classdev *led_cdev) +{ +led_set_brightness_nosleep (led_cdev, audio_state[LED_AUDIO_MUTE ]); +return 0 ; +} + +static int ledtrig_audio_micmute_activate (struct led_classdev *led_cdev) +{ +led_set_brightness_nosleep (led_cdev, audio_state[LED_AUDIO_MICMUTE ]); +return 0 ; +} + +static struct led_trigger ledtrig_audio[NUM_AUDIO_LEDS ] = { + [LED_AUDIO_MUTE ] = { + .name ="audio-mute" , + .activate = ledtrig_audio_mute_activate, + }, + [LED_AUDIO_MICMUTE ] = { + .name ="audio-micmute" , + .activate = ledtrig_audio_micmute_activate, + }, +}; +enum led_brightness ledtrig_audio_get (enum led_audio type) {return audio_state[type];
@@ -19,24 +42,22 @@ EXPORT_SYMBOL_GPL(ledtrig_audio_get);void ledtrig_audio_set (enum led_audio type,enum led_brightness state) { audio_state[type] = state; -led_trigger_event (ledtrig_audio[type], state); +led_trigger_event (&ledtrig_audio[type], state); }EXPORT_SYMBOL_GPL (ledtrig_audio_set);static int __init ledtrig_audio_init (void ) { -led_trigger_register_simple ("audio-mute" , - &ledtrig_audio[LED_AUDIO_MUTE ]); -led_trigger_register_simple ("audio-micmute" , - &ledtrig_audio[LED_AUDIO_MICMUTE ]); +led_trigger_register (&ledtrig_audio[LED_AUDIO_MUTE ]); +led_trigger_register (&ledtrig_audio[LED_AUDIO_MICMUTE ]);return 0 ; }module_init (ledtrig_audio_init); static void __exit ledtrig_audio_exit(void) { -led_trigger_unregister_simple (ledtrig_audio[LED_AUDIO_MUTE ]); -led_trigger_unregister_simple (ledtrig_audio[LED_AUDIO_MICMUTE ]); +led_trigger_unregister (&ledtrig_audio[LED_AUDIO_MUTE ]); +led_trigger_unregister (&ledtrig_audio[LED_AUDIO_MICMUTE ]); }module_exit (ledtrig_audio_exit);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 159/334 media: em28xx-input: fix refcount bug in em28xx_usb_disconnect
In reply to Greg Kroah-HartmanFrom: Dongliang Mu <[email protected]>
[ Upstream commit 6fa54bc713c262e1cfbc5613377ef52280d7311f ]
If em28xx_ir_init fails, it would decrease the refcount of dev. However, in the em28xx_ir_fini, when ir is NULL, it goes to ref_put and decrease the refcount of dev. This will lead to a refcount bug.
Fix this bug by removing the kref_put in the error handling code of em28xx_ir_init.
refcount_t: underflow; use-after-free.
WARNING: CPU: 0 PID: 7 at lib/refcount.c:28 refcount_warn_saturate+0x18e/0x1a0 lib/refcount.c:28 Modules linked in: CPU: 0 PID: 7 Comm: kworker/0:1 Not tainted 5.13.0 #3 Workqueue: usb_hub_wq hub_event RIP: 0010:refcount_warn_saturate+0x18e/0x1a0 lib/refcount.c:28 Call Trace: kref_put.constprop.0+0x60/0x85 include/linux/kref.h:69 em28xx_usb_disconnect.cold+0xd7/0xdc drivers/media/usb/em28xx/em28xx-cards.c:4150 usb_unbind_interface+0xbf/0x3a0 drivers/usb/core/driver.c:458 __device_release_driver drivers/base/dd.c:1201 [inline] device_release_driver_internal+0x22a/0x230 drivers/base/dd.c:1232 bus_remove_device+0x108/0x160 drivers/base/bus.c:529 device_del+0x1fe/0x510 drivers/base/core.c:3540 usb_disable_device+0xd1/0x1d0 drivers/usb/core/message.c:1419 usb_disconnect+0x109/0x330 drivers/usb/core/hub.c:2221 hub_port_connect drivers/usb/core/hub.c:5151 [inline] hub_port_connect_change drivers/usb/core/hub.c:5440 [inline] port_event drivers/usb/core/hub.c:5586 [inline] hub_event+0xf81/0x1d40 drivers/usb/core/hub.c:5668 process_one_work+0x2c9/0x610 kernel/workqueue.c:2276 process_scheduled_works kernel/workqueue.c:2338 [inline] worker_thread+0x333/0x5b0 kernel/workqueue.c:2424 kthread+0x188/0x1d0 kernel/kthread.c:319 ret_from_fork+0x1f/0x30 arch/x86/entry/entry_64.S:295
--- drivers/media/usb/em28xx/em28xx-input.c | 1 - 1 file changed, 1 deletion(-)
drivers/media/usb/em28xx/em28xx-input.c +0 -1
@@ -842,7 +842,6 @@ error:kfree (ir); ref_put:em28xx_shutdown_buttons (dev); -kref_put (&dev->ref, em28xx_free_device);return err; }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 160/334 media: omap3isp: Fix missing unlock in isp_subdev_notifier_complete()
In reply to Greg Kroah-HartmanFrom: Wei Yongjun <[email protected]>
[ Upstream commit 0368e7d2cd84a90d0518753fac33795e13df553f ]
Add the missing unlock before return from function isp_subdev_notifier_complete() in the init error handling case.
--- drivers/media/platform/omap3isp/isp.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/media/platform/omap3isp/isp.c +3 -1
@@ -2037,8 +2037,10 @@ static int isp_subdev_notifier_complete(struct v4l2_async_notifier *async)mutex_lock (&isp->media_dev.graph_mutex); ret =media_entity_enum_init (&isp->crashed, &isp->media_dev); -if (ret) +if (ret) { +mutex_unlock (&isp->media_dev.graph_mutex);return ret; + }list_for_each_entry (sd, &v4l2_dev->subdevs, list) {if (sd->notifier != &isp->notifier)
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 161/334 media: venus: hfi: fix return value check in sys_get_prop_image_version()
In reply to Greg Kroah-HartmanFrom: Zhen Lei <[email protected]>
[ Upstream commit 331e06bbde5856059b7a6bb183f12878ed4decb1 ]
In case of error, the function qcom_smem_get() returns ERR_PTR() and never returns NULL. The NULL test in the return value check should be replaced with IS_ERR().
--- drivers/media/platform/qcom/venus/hfi_msgs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/media/platform/qcom/venus/hfi_msgs.c +1 -1
@@ -261,7 +261,7 @@ sys_get_prop_image_version(struct device *dev, smem_tbl_ptr =qcom_smem_get (QCOM_SMEM_HOST_ANY ,SMEM_IMG_VER_TBL , &smem_blk_sz); -if (smem_tbl_ptr && smem_blk_sz >=SMEM_IMG_OFFSET_VENUS +VER_STR_SZ ) +if (!IS_ERR (smem_tbl_ptr) && smem_blk_sz >=SMEM_IMG_OFFSET_VENUS +VER_STR_SZ )memcpy (smem_tbl_ptr +SMEM_IMG_OFFSET_VENUS , img_ver,VER_STR_SZ ); }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 162/334 media: venus: venc: Fix potential null pointer dereference on pointer fmt
In reply to Greg Kroah-HartmanFrom: Colin Ian King <[email protected]>
[ Upstream commit 09ea9719a423fc675d40dd05407165e161ea0c48 ]
Currently the call to find_format can potentially return a NULL to fmt and the nullpointer is later dereferenced on the assignment of pixmp->num_planes = fmt->num_planes. Fix this by adding a NULL pointer check and returning NULL for the failure case.
Addresses-Coverity: ("Dereference null return")
--- drivers/media/platform/qcom/venus/venc.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/media/platform/qcom/venus/venc.c +2 -0
@@ -183,6 +183,8 @@ venc_try_fmt_common(struct venus_inst *inst, struct v4l2_format *f)else return NULL ; fmt =find_format (inst, pixmp->pixelformat, f->type); +if (!fmt) +return NULL ; } pixmp->width = clamp(pixmp->width, frame_width_min(inst),
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 163/334 media: venus: helper: do not set constrained parameters for UBWC
In reply to Greg Kroah-HartmanFrom: Mansur Alisha Shaik <[email protected]>
[ Upstream commit 1ac61faf6ebbce59fccbb53d7faf25576e9897ab ]
Plane constraints firmware interface is to override the default alignment for a given color format. By default venus hardware has alignments as 128x32, but NV12 was defined differently to meet various usecases. Compressed NV12 has always been aligned as 128x32, hence not needed to override the default alignment.
--- drivers/media/platform/qcom/venus/helpers.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/media/platform/qcom/venus/helpers.c +3 -0
@@ -1137,6 +1137,9 @@ int venus_helper_set_format_constraints(struct venus_inst *inst)if (!IS_V6 (inst->core))return 0 ; +if (inst->opb_fmt ==HFI_COLOR_FORMAT_NV12_UBWC ) +return 0 ; + pconstraint.buffer_type =HFI_BUFFER_OUTPUT2 ; pconstraint.num_planes =2 ; pconstraint.plane_format[0 ].stride_multiples =128 ;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 164/334 soc: mmsys: mediatek: add mask to mmsys routes
In reply to Greg Kroah-HartmanFrom: CK Hu <[email protected]>
[ Upstream commit 7bdcead7a75e3eab5e711c2da78c2a0360e7f2a4 ]
SOUT has many bits and need to be cleared before set new value. Write only could do the clear, but for MOUT, it clears bits that should not be cleared. So use a mask to reset only the needed bits.
this fixes HDMI issues on MT7623/BPI-R2 since 5.13
--- drivers/soc/mediatek/mt8183-mmsys.h | 21 +++-- drivers/soc/mediatek/mtk-mmsys.c | 7 +- drivers/soc/mediatek/mtk-mmsys.h | 133 +++++++++++++++++++--------- 3 files changed, 112 insertions(+), 49 deletions(-)
drivers/soc/mediatek/mt8183-mmsys.h +14 -7
@@ -28,25 +28,32 @@static const struct mtk_mmsys_routes mmsys_mt8183_routing_table[] = { {DDP_COMPONENT_OVL0 ,DDP_COMPONENT_OVL_2L0 , -MT8183_DISP_OVL0_MOUT_EN ,MT8183_OVL0_MOUT_EN_OVL0_2L +MT8183_DISP_OVL0_MOUT_EN ,MT8183_OVL0_MOUT_EN_OVL0_2L , +MT8183_OVL0_MOUT_EN_OVL0_2L }, {DDP_COMPONENT_OVL_2L0 ,DDP_COMPONENT_RDMA0 , -MT8183_DISP_OVL0_2L_MOUT_EN ,MT8183_OVL0_2L_MOUT_EN_DISP_PATH0 +MT8183_DISP_OVL0_2L_MOUT_EN ,MT8183_OVL0_2L_MOUT_EN_DISP_PATH0 , +MT8183_OVL0_2L_MOUT_EN_DISP_PATH0 }, {DDP_COMPONENT_OVL_2L1 ,DDP_COMPONENT_RDMA1 , -MT8183_DISP_OVL1_2L_MOUT_EN ,MT8183_OVL1_2L_MOUT_EN_RDMA1 +MT8183_DISP_OVL1_2L_MOUT_EN ,MT8183_OVL1_2L_MOUT_EN_RDMA1 , +MT8183_OVL1_2L_MOUT_EN_RDMA1 }, {DDP_COMPONENT_DITHER ,DDP_COMPONENT_DSI0 , -MT8183_DISP_DITHER0_MOUT_EN ,MT8183_DITHER0_MOUT_IN_DSI0 +MT8183_DISP_DITHER0_MOUT_EN ,MT8183_DITHER0_MOUT_IN_DSI0 , +MT8183_DITHER0_MOUT_IN_DSI0 }, {DDP_COMPONENT_OVL_2L0 ,DDP_COMPONENT_RDMA0 , -MT8183_DISP_PATH0_SEL_IN ,MT8183_DISP_PATH0_SEL_IN_OVL0_2L +MT8183_DISP_PATH0_SEL_IN ,MT8183_DISP_PATH0_SEL_IN_OVL0_2L , +MT8183_DISP_PATH0_SEL_IN_OVL0_2L }, {DDP_COMPONENT_RDMA1 ,DDP_COMPONENT_DPI0 , -MT8183_DISP_DPI0_SEL_IN ,MT8183_DPI0_SEL_IN_RDMA1 +MT8183_DISP_DPI0_SEL_IN ,MT8183_DPI0_SEL_IN_RDMA1 , +MT8183_DPI0_SEL_IN_RDMA1 }, {DDP_COMPONENT_RDMA0 ,DDP_COMPONENT_COLOR0 , -MT8183_DISP_RDMA0_SOUT_SEL_IN ,MT8183_RDMA0_SOUT_COLOR0 +MT8183_DISP_RDMA0_SOUT_SEL_IN ,MT8183_RDMA0_SOUT_COLOR0 , +MT8183_RDMA0_SOUT_COLOR0 } };
drivers/soc/mediatek/mtk-mmsys.c +5 -2
@@ -68,7 +68,9 @@ void mtk_mmsys_ddp_connect(struct device *dev,for (i =0 ; i < mmsys->data->num_routes; i++)if (cur == routes[i].from_comp && next == routes[i].to_comp) { - reg =readl_relaxed (mmsys->regs + routes[i].addr) | routes[i].val; + reg =readl_relaxed (mmsys->regs + routes[i].addr); + reg &= ~routes[i].mask; + reg |= routes[i].val;writel_relaxed (reg, mmsys->regs + routes[i].addr); } }
@@ -85,7 +87,8 @@ void mtk_mmsys_ddp_disconnect(struct device *dev,for (i =0 ; i < mmsys->data->num_routes; i++)if (cur == routes[i].from_comp && next == routes[i].to_comp) { - reg =readl_relaxed (mmsys->regs + routes[i].addr) & ~routes[i].val; + reg =readl_relaxed (mmsys->regs + routes[i].addr); + reg &= ~routes[i].mask;writel_relaxed (reg, mmsys->regs + routes[i].addr); } }
drivers/soc/mediatek/mtk-mmsys.h +93 -40
258 lines not on this page · raw message
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 165/334 PCI: PM: Avoid forcing PCI_D0 for wakeup reasons inconsistently
In reply to Greg Kroah-HartmanFrom: Rafael J. Wysocki <[email protected]>
[ Upstream commit da9f2150684ea684a7ddd6d7f0e38b2bdf43dcd8 ]
It is inconsistent to return PCI_D0 from pci_target_state() instead of the original target state if 'wakeup' is true and the device cannot signal PME from D0.
This only happens when the device cannot signal PME from the original target state and any shallower power states (including D0) and that case is effectively equivalent to the one in which PME singaling is not supported at all. Since the original target state is returned in the latter case, make the function do that in the former one too.
--- drivers/pci/pci.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-)
drivers/pci/pci.c +10 -6
@@ -2599,16 +2599,20 @@ static pci_power_t pci_target_state(struct pci_dev *dev, bool wakeup)if (dev->current_state == PCI_D3cold) target_state = PCI_D3cold; -if (wakeup) { +if (wakeup && dev->pme_support) { +pci_power_t state = target_state; +/* * Find the deepest state from which the device can generate * PME#. */ -if (dev->pme_support) { -while (target_state - && !(dev->pme_support & (1 << target_state))) - target_state--; - } +while (state && !(dev->pme_support & (1 << state))) + state--; + +if (state) +return state; +else if (dev->pme_support &1 ) +return PCI_D0 ; }return target_state;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 166/334 PCI: PM: Enable PME if it can be signaled from D3cold
In reply to Greg Kroah-HartmanFrom: Rafael J. Wysocki <[email protected]>
[ Upstream commit 0e00392a895c95c6d12d42158236c8862a2f43f2 ]
PME signaling is only enabled by __pci_enable_wake() if the target device can signal PME from the given target power state (to avoid pointless reconfiguration of the device), but if the hierarchy above the device goes into D3cold, the device itself will end up in D3cold too, so if it can signal PME from D3cold, it should be enabled to do so in __pci_enable_wake().
[Note that if the device does not end up in D3cold and it cannot
signal PME from the original target power state, it will not signal PME, so in that case the behavior does not change.]
--- drivers/pci/pci.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
drivers/pci/pci.c +8 -1
@@ -2495,7 +2495,14 @@ static int __pci_enable_wake(struct pci_dev *dev, pci_power_t state, bool enableif (enable) {int error; -if (pci_pme_capable (dev, state)) +/* +* Enable PME signaling if the device can signal PME from +* D3cold regardless of whether or not it can signal PME from +* the current target state, because that will allow it to +* signal PME when the hierarchy above it goes into D3cold and +* the device itself ends up in D3cold as a result of that. +*/ +if (pci_pme_capable (dev, state) ||pci_pme_capable (dev, PCI_D3cold))pci_pme_active (dev, true);else ret =1 ;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 167/334 bpf, samples: Add missing mprog-disable to xdp_redirect_cpus optstring
In reply to Greg Kroah-HartmanFrom: Matthew Cover <[email protected]>
[ Upstream commit 34ad6d9d8c27293e1895b448af7d6cf5d351ad8d ]
Commit ce4dade7f12a ("samples/bpf: xdp_redirect_cpu: Load a eBPF program on cpumap") added the following option, but missed adding it to optstring:
- mprog-disable: disable loading XDP program on cpumap entries
Fix it and add the missing option character.
--- samples/bpf/xdp_redirect_cpu_user.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
samples/bpf/xdp_redirect_cpu_user.c +1 -1
@@ -831,7 +831,7 @@ int main(int argc, char **argv)memset (cpu,0 , n_cpus *sizeof (int ));/* Parse commands line args */ -while ((opt =getopt_long (argc, argv,"hSd:s:p:q:c:xzFf:e:r:m:" , +while ((opt =getopt_long (argc, argv,"hSd:s:p:q:c:xzFf:e:r:m:n" , long_options, &longindex)) !=-1 ) {switch (opt) {case 'd' :
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 168/334 soc: qcom: smsm: Fix missed interrupts if state changes while masked
In reply to Greg Kroah-HartmanFrom: Stephan Gerhold <[email protected]>
[ Upstream commit e3d4571955050736bbf3eda0a9538a09d9fcfce8 ]
The SMSM driver detects interrupt edges by tracking the last state it has seen (and has triggered the interrupt handler for). This works fine, but only if the interrupt does not change state while masked.
For example, if an interrupt is unmasked while the state is HIGH, the stored last_value for that interrupt might still be LOW. Then, when the remote processor triggers smsm_intr() we assume that nothing has changed, even though the state might have changed from HIGH to LOW.
Attempt to fix this by checking the current remote state before unmasking an IRQ. Use atomic operations to avoid the interrupt handler from interfering with the unmask function.
This fixes modem crashes in some edge cases with the BAM-DMUX driver. Specifically, the BAM-DMUX interrupt handler is not called for the HIGH -> LOW smsm state transition if the BAM-DMUX driver is loaded (and therefore unmasks the interrupt) after the modem was already started:
qcom-q6v5-mss 4080000.remoteproc: fatal error received: a2_task.c:3188:
Assert FALSE failed: A2 DL PER deadlock timer expired waiting for Apps ACK
--- drivers/soc/qcom/smsm.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-)
drivers/soc/qcom/smsm.c +8 -3
@@ -109,7 +109,7 @@ struct smsm_entry {DECLARE_BITMAP (irq_enabled,32 );DECLARE_BITMAP (irq_rising,32 );DECLARE_BITMAP (irq_falling,32 ); -u32 last_value; +unsigned long last_value;u32 *remote_state;u32 *subscription;
@@ -204,8 +204,7 @@ static irqreturn_t smsm_intr(int irq, void *data)u32 val; val =readl (entry->remote_state); - changed = val ^ entry->last_value; - entry->last_value = val; + changed = val ^xchg (&entry->last_value, val);for_each_set_bit (i, entry->irq_enabled,32 ) {if (!(changed &BIT (i)))
@@ -264,6 +263,12 @@ static void smsm_unmask_irq(struct irq_data *irqd)struct qcom_smsm *smsm = entry->smsm;u32 val; +/* Make sure our last cached state is up-to-date */ +if (readl (entry->remote_state) &BIT (irq)) +set_bit (irq, &entry->last_value); +else +clear_bit (irq, &entry->last_value); +set_bit (irq, entry->irq_enabled);if (entry->subscription) {
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 169/334 net: dsa: build tag_8021q.c as part of DSA core
In reply to Greg Kroah-HartmanFrom: Vladimir Oltean <[email protected]>
[ Upstream commit 8b6e638b4be2ad77f61fb93b4e1776c6ccc2edab ]
Upcoming patches will add tag_8021q related logic to switch.c and port.c, in order to allow it to make use of cross-chip notifiers. In addition, a struct dsa_8021q_context *ctx pointer will be added to struct dsa_switch.
It seems fairly low-reward to #ifdef the *ctx from struct dsa_switch and to provide shim implementations of the entire tag_8021q.c calling surface (not even clear what to do about the tag_8021q cross-chip notifiers to avoid compiling them). The runtime overhead for switches which don't use tag_8021q is fairly small because all helpers will check for ds->tag_8021q_ctx being a NULL pointer and stop there.
So let's make it part of dsa_core.o.
--- net/dsa/Kconfig | 12 ------------ net/dsa/Makefile | 3 +-- net/dsa/tag_8021q.c | 2 -- 3 files changed, 1 insertion(+), 16 deletions(-)
net/dsa/Kconfig +0 -12
@@ -18,16 +18,6 @@ if NET_DSA # Drivers must select the appropriate tagging format(s) -config NET_DSA_TAG_8021Q - tristate - select VLAN_8021Q - help - Unlike the other tagging protocols, the 802.1Q config option simply - provides helpers for other tagging implementations that might rely on - VLAN in one way or another. It is not a complete solution. - - Drivers which use these helpers should select this as dependency. - config NET_DSA_TAG_AR9331 tristate "Tag driver for Atheros AR9331 SoC with built-in switch" help
@@ -126,7 +116,6 @@ config NET_DSA_TAG_OCELOT_8021Q tristate "Tag driver for Ocelot family of switches, using VLAN" depends on MSCC_OCELOT_SWITCH_LIB || \ (MSCC_OCELOT_SWITCH_LIB=n && COMPILE_TEST) - select NET_DSA_TAG_8021Q help Say Y or M if you want to enable support for tagging frames with a custom VLAN-based header. Frames that require timestamping, such as
@@ -149,7 +138,6 @@ config NET_DSA_TAG_LAN9303 config NET_DSA_TAG_SJA1105 tristate "Tag driver for NXP SJA1105 switches" - select NET_DSA_TAG_8021Q select PACKING help Say Y or M if you want to enable support for tagging frames with the
net/dsa/Makefile +1 -2
@@ -1,10 +1,9 @@ # SPDX-License-Identifier: GPL-2.0 # the core obj-$(CONFIG_NET_DSA) += dsa_core.o -dsa_core-y += dsa.o dsa2.o master.o port.o slave.o switch.o +dsa_core-y += dsa.o dsa2.o master.o port.o slave.o switch.o tag_8021q.o # tagging formats -obj-$(CONFIG_NET_DSA_TAG_8021Q) += tag_8021q.o obj-$(CONFIG_NET_DSA_TAG_AR9331) += tag_ar9331.o obj-$(CONFIG_NET_DSA_TAG_BRCM_COMMON) += tag_brcm.o obj-$(CONFIG_NET_DSA_TAG_DSA_COMMON) += tag_dsa.o
net/dsa/tag_8021q.c +0 -2
@@ -493,5 +493,3 @@ void dsa_8021q_rcv(struct sk_buff *skb, int *source_port, int *switch_id, skb->priority = (tci &VLAN_PRIO_MASK ) >>VLAN_PRIO_SHIFT ; }EXPORT_SYMBOL_GPL (dsa_8021q_rcv); - -MODULE_LICENSE ("GPL v2" );
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 170/334 net: dsa: tag_sja1105: optionally build as module when switch driver is module if PTP is enabled
In reply to Greg Kroah-HartmanFrom: Vladimir Oltean <[email protected]>
[ Upstream commit f8b17a0bd96065e4511858689916bb729dbb881b ]
TX timestamps are sent by SJA1110 as Ethernet packets containing metadata, so they are received by the tagging driver but must be processed by the switch driver - the one that is stateful since it keeps the TX timestamp queue.
This means that there is an sja1110_process_meta_tstamp() symbol exported by the switch driver which is called by the tagging driver.
There is a shim definition for that function when the switch driver is not compiled, which does nothing, but that shim is not effective when the tagging protocol driver is built-in and the switch driver is a module, because built-in code cannot call symbols exported by modules.
So add an optional dependency between the tagger and the switch driver, if PTP support is enabled in the switch driver. If PTP is not enabled, sja1110_process_meta_tstamp() will translate into the shim "do nothing with these meta frames" function.
--- net/dsa/Kconfig | 1 + 1 file changed, 1 insertion(+)
net/dsa/Kconfig +1 -0
@@ -138,6 +138,7 @@ config NET_DSA_TAG_LAN9303 config NET_DSA_TAG_SJA1105 tristate "Tag driver for NXP SJA1105 switches" + depends on (NET_DSA_SJA1105 && NET_DSA_SJA1105_PTP) || !NET_DSA_SJA1105 || !NET_DSA_SJA1105_PTP select PACKING help Say Y or M if you want to enable support for tagging frames with the
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 171/334 debugfs: Return error during {full/open}_proxy_open() on rmmod
In reply to Greg Kroah-HartmanFrom: Sven Eckelmann <[email protected]>
[ Upstream commit 112cedc8e600b668688eb809bf11817adec58ddc ]
If a kernel module gets unloaded then it printed report about a leak before commit 275678e7a9be ("debugfs: Check module state before warning in {full/open}_proxy_open()"). An additional check was added in this commit to avoid this printing. But it was forgotten that the function must return an error in this case because it was not actually opened.
As result, the systems started to crash or to hang when a module was unloaded while something was trying to open a file.
--- fs/debugfs/file.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
fs/debugfs/file.c +6 -2
@@ -179,8 +179,10 @@ static int open_proxy_open(struct inode *inode, struct file *filp)if (!fops_get (real_fops)) {#ifdef CONFIG_MODULES if (real_fops->owner && - real_fops->owner->state ==MODULE_STATE_GOING ) + real_fops->owner->state ==MODULE_STATE_GOING ) { + r = -ENXIO ; goto out; + }#endif /* Huh? Module did not clean up after itself at exit? */
@@ -314,8 +316,10 @@ static int full_proxy_open(struct inode *inode, struct file *filp)if (!fops_get (real_fops)) {#ifdef CONFIG_MODULES if (real_fops->owner && - real_fops->owner->state ==MODULE_STATE_GOING ) + real_fops->owner->state ==MODULE_STATE_GOING ) { + r = -ENXIO ; goto out; + }#endif /* Huh? Module did not cleanup after itself at exit? */
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 172/334 Bluetooth: increase BTNAMSIZ to 21 chars to fix potential buffer overflow
In reply to Greg Kroah-HartmanFrom: Colin Ian King <[email protected]>
[ Upstream commit 713baf3dae8f45dc8ada4ed2f5fdcbf94a5c274d ]
An earlier commit replaced using batostr to using %pMR sprintf for the construction of session->name. Static analysis detected that this new method can use a total of 21 characters (including the trailing '\0') so we need to increase the BTNAMSIZ from 18 to 21 to fix potential buffer overflows.
Addresses-Coverity: ("Out-of-bounds write")
--- net/bluetooth/cmtp/cmtp.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/bluetooth/cmtp/cmtp.h +1 -1
@@ -26,7 +26,7 @@#include <linux/types.h> #include <net/bluetooth/bluetooth.h> -#define BTNAMSIZ 18 +#define BTNAMSIZ 21/* CMTP ioctl defines */ #define CMTPCONNADD _IOW('C', 200, int)
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 173/334 arm64: dts: qcom: sc7280: Fixup the cpufreq node
In reply to Greg Kroah-HartmanFrom: Sibi Sankar <[email protected]>
[ Upstream commit 11e03d692101e484df9322f892a8b6e111a82bfd ]
Fixup the register regions used by the cpufreq node on SC7280 SoC to support per core L3 DCVS.
--- arch/arm64/boot/dts/qcom/sc7280.dtsi | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
arch/arm64/boot/dts/qcom/sc7280.dtsi +3 -3
@@ -1437,9 +1437,9 @@ cpufreq_hw: cpufreq@18591000 { compatible = "qcom,cpufreq-epss"; - reg = <0 0x18591000 0 0x1000>, - <0 0x18592000 0 0x1000>, - <0 0x18593000 0 0x1000>; + reg = <0 0x18591100 0 0x900>, + <0 0x18592100 0 0x900>, + <0 0x18593100 0 0x900>; clocks = <&rpmhcc RPMH_CXO_CLK>, <&gcc GCC_GPLL0>; clock-names = "xo", "alternate"; #freq-domain-cells = <1>;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 174/334 arm64: dts: qcom: sm8350: fix IPA interconnects
In reply to Greg Kroah-HartmanFrom: Alex Elder <[email protected]>
[ Upstream commit 84173ca359787abd720d150d3d0d7edabf9db46c ]
There should only be two interconnects defined for IPA on the QUalcomm SM8350 SoC. The names should also match those specified by the IPA Device Tree binding.
--- arch/arm64/boot/dts/qcom/sm8350.dtsi | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-)
arch/arm64/boot/dts/qcom/sm8350.dtsi +3 -5
@@ -666,12 +666,10 @@ clocks = <&rpmhcc RPMH_IPA_CLK>; clock-names = "core"; - interconnects = <&aggre2_noc MASTER_IPA &gem_noc SLAVE_LLCC>, - <&mc_virt MASTER_LLCC &mc_virt SLAVE_EBI1>, + interconnects = <&aggre2_noc MASTER_IPA &mc_virt SLAVE_EBI1>, <&gem_noc MASTER_APPSS_PROC &config_noc SLAVE_IPA_CFG>; - interconnect-names = "ipa_to_llcc", - "llcc_to_ebi1", - "appss_to_ipa"; + interconnect-names = "memory", + "config"; qcom,smem-states = <&ipa_smp2p_out 0>, <&ipa_smp2p_out 1>;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 175/334 drm: bridge: it66121: Check drm_bridge_attach retval
In reply to Greg Kroah-HartmanFrom: Robert Foss <[email protected]>
[ Upstream commit bd03d440e2589b9c328f40ce60203adf2b19d2e2 ]
The return value of drm_bridge_attach() is ignored during the it66121_bridge_attach() call, which is incorrect.
--- drivers/gpu/drm/bridge/ite-it66121.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/gpu/drm/bridge/ite-it66121.c +2 -0
@@ -536,6 +536,8 @@ static int it66121_bridge_attach(struct drm_bridge *bridge,return -EINVAL ; ret =drm_bridge_attach (bridge->encoder, ctx->next_bridge, bridge, flags); +if (ret) +return ret; ret =regmap_write_bits (ctx->regmap,IT66121_CLK_BANK_REG ,IT66121_CLK_BANK_PWROFF_RCLK ,0 );
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 176/334 net: ti: am65-cpsw-nuss: fix RX IRQ state after .ndo_stop()
In reply to Greg Kroah-HartmanFrom: Vignesh Raghavendra <[email protected]>
[ Upstream commit 47bfc4d128dedd9e828e33b70b87b591a6d59edf ]
On TI K3 am64x platform the issue with RX IRQ is observed - it's become disabled forever after .ndo_stop(). The K3 CPSW driver manipulates RX IRQ by using standard Linux enable_irq()/disable_irq_nosync() API as there is no IRQ enable/disable options in CPSW HW itself, as result during .ndo_stop() following sequence happens
phy_stop()
teardown TX/RX channels
wait for TX tdown complete
napi_disable(TX)
clean up TX channels
(a)
napi_disable(RX)
At point (a) it's not possible to predict if RX IRQ was triggered or not. if RX IRQ was triggered then it also not possible to definitely say if RX NAPI was run or only scheduled and immediately canceled by napi_disable(RX). Actually the last case causes RX IRQ to be permanently disabled.
Another observed issue is that RX IRQ enable counter become unbalanced if (gro_flush_timeout =! 0) while (napi_defer_hard_irqs == 0):
Unbalanced enable for IRQ 44
WARNING: CPU: 0 PID: 10 at ../kernel/irq/manage.c:776 __enable_irq+0x38/0x80 __enable_irq+0x38/0x80 enable_irq+0x54/0xb0 am65_cpsw_nuss_rx_poll+0x2f4/0x368 __napi_poll+0x34/0x1b8 net_rx_action+0xe4/0x220 _stext+0x11c/0x284 run_ksoftirqd+0x4c/0x60
To avoid above issues introduce flag indicating if RX was actually disabled before enabling it in am65_cpsw_nuss_rx_poll() and restore RX IRQ state in .ndo_open()
--- drivers/net/ethernet/ti/am65-cpsw-nuss.c | 13 +++++++++++-- drivers/net/ethernet/ti/am65-cpsw-nuss.h | 2 ++ 2 files changed, 13 insertions(+), 2 deletions(-)
drivers/net/ethernet/ti/am65-cpsw-nuss.c +11 -2
@@ -518,6 +518,10 @@ static int am65_cpsw_nuss_common_open(struct am65_cpsw_common *common, }napi_enable (&common->napi_rx); +if (common->rx_irq_disabled) { + common->rx_irq_disabled = false; +enable_irq (common->rx_chns.irq); + }dev_dbg (common->dev,"cpsw_nuss started\n" );return 0 ;
@@ -871,8 +875,12 @@ static int am65_cpsw_nuss_rx_poll(struct napi_struct *napi_rx, int budget)dev_dbg (common->dev,"%s num_rx:%d %d\n" , __func__, num_rx, budget); -if (num_rx < budget &&napi_complete_done (napi_rx, num_rx)) -enable_irq (common->rx_chns.irq); +if (num_rx < budget &&napi_complete_done (napi_rx, num_rx)) { +if (common->rx_irq_disabled) { + common->rx_irq_disabled = false; +enable_irq (common->rx_chns.irq); + } + }return num_rx; }
@@ -1090,6 +1098,7 @@ static irqreturn_t am65_cpsw_nuss_rx_irq(int irq, void *dev_id) {struct am65_cpsw_common *common = dev_id; + common->rx_irq_disabled = true;disable_irq_nosync (irq);napi_schedule (&common->napi_rx);
drivers/net/ethernet/ti/am65-cpsw-nuss.h +2 -0
@@ -126,6 +126,8 @@ struct am65_cpsw_common {struct am65_cpsw_rx_chn rx_chns;struct napi_struct napi_rx; +bool rx_irq_disabled; +u32 nuss_ver;u32 cpsw_ver;unsigned long bus_freq;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 177/334 net: dsa: stop syncing the bridge mcast_router attribute at join time
In reply to Greg Kroah-HartmanFrom: Vladimir Oltean <[email protected]>
[ Upstream commit 7df4e7449489d82cee6813dccbb4ae4f3f26ef7b ]
Qingfang points out that when a bridge with the default settings is created and a port joins it:
ip link add br0 type bridge
ip link set swp0 master br0
DSA calls br_multicast_router() on the bridge to see if the br0 device is a multicast router port, and if it is, it enables multicast flooding to the CPU port, otherwise it disables it.
If we look through the multicast_router_show() sysfs or at the IFLA_BR_MCAST_ROUTER netlink attribute, we see that the default mrouter attribute for the bridge device is "1" (MDB_RTR_TYPE_TEMP_QUERY).
However, br_multicast_router() will return "0" (MDB_RTR_TYPE_DISABLED), because an mrouter port in the MDB_RTR_TYPE_TEMP_QUERY state may not be actually _active_ until it receives an actual IGMP query. So, the br_multicast_router() function should really have been called br_multicast_router_active() perhaps.
When/if an IGMP query is received, the bridge device will transition via br_multicast_mark_router() into the active state until the ip4_mc_router_timer expires after an multicast_querier_interval.
Of course, this does not happen if the bridge is created with an mcast_router attribute of "2" (MDB_RTR_TYPE_PERM).
The point is that in lack of any IGMP query messages, and in the default bridge configuration, unregistered multicast packets will not be able to reach the CPU port through flooding, and this breaks many use cases (most obviously, IPv6 ND, with its ICMP6 neighbor solicitation multicast messages).
Leave the multicast flooding setting towards the CPU port down to a driver level decision.
--- net/dsa/port.c | 10 ---------- 1 file changed, 10 deletions(-)
net/dsa/port.c +0 -10
@@ -186,10 +186,6 @@ static int dsa_port_switchdev_sync(struct dsa_port *dp,if (err && err != -EOPNOTSUPP )return err; - err =dsa_port_mrouter (dp->cpu_dp,br_multicast_router (br), extack); -if (err && err != -EOPNOTSUPP ) -return err; - err =dsa_port_ageing_time (dp,br_get_ageing_time (br));if (err && err != -EOPNOTSUPP )return err;
@@ -272,12 +268,6 @@ static void dsa_port_switchdev_unsync_attrs(struct dsa_port *dp)/* VLAN filtering is handled by dsa_switch_bridge_leave */ -/* Some drivers treat the notification for having a local multicast -* router by allowing multicast to be flooded to the CPU, so we should -* allow this in standalone mode too. -*/ -dsa_port_mrouter (dp->cpu_dp, true,NULL ); -/* Ageing time may be global to the switch chip, so don't change it * here because we have no good reason (or value) to change it to. */
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 178/334 net: dsa: mt7530: remove the .port_set_mrouter implementation
In reply to Greg Kroah-HartmanFrom: Vladimir Oltean <[email protected]>
[ Upstream commit cbbf09b5771e6e9da268bc0d2fb6e428afa787bc ]
DSA's idea of optimizing out multicast flooding to the CPU port leaves quite a few holes open, so it should be reverted.
The mt7530 driver is the only new driver which added a .port_set_mrouter implementation after the reorg from commit a8b659e7ff75 ("net: dsa: act as passthrough for bridge port flags"), so it needs to be reverted separately so that the other revert commit can go a bit further down the git history.
--- drivers/net/dsa/mt7530.c | 13 ------------- 1 file changed, 13 deletions(-)
drivers/net/dsa/mt7530.c +0 -13
@@ -1185,18 +1185,6 @@ mt7530_port_bridge_flags(struct dsa_switch *ds, int port,return 0 ; } -static int -mt7530_port_set_mrouter (struct dsa_switch *ds,int port,bool mrouter, -struct netlink_ext_ack *extack) -{ -struct mt7530_priv *priv = ds->priv; - -mt7530_rmw (priv,MT7530_MFC ,UNM_FFP (BIT (port)), - mrouter ?UNM_FFP (BIT (port)) :0 ); - -return 0 ; -} -static int mt7530_port_bridge_join (struct dsa_switch *ds,int port,struct net_device *bridge)
@@ -3058,7 +3046,6 @@ static const struct dsa_switch_ops mt7530_switch_ops = { .port_stp_state_set = mt7530_stp_state_set, .port_pre_bridge_flags = mt7530_port_pre_bridge_flags, .port_bridge_flags = mt7530_port_bridge_flags, - .port_set_mrouter = mt7530_port_set_mrouter, .port_bridge_join = mt7530_port_bridge_join, .port_bridge_leave = mt7530_port_bridge_leave, .port_fdb_add = mt7530_port_fdb_add,
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 179/334 net: dsa: dont disable multicast flooding to the CPU even without an IGMP querier
In reply to Greg Kroah-HartmanFrom: Vladimir Oltean <[email protected]>
[ Upstream commit c73c57081b3d59aa99093fbedced32ea02620cd3 ]
Commit 08cc83cc7fd8 ("net: dsa: add support for BRIDGE_MROUTER attribute") added an option for users to turn off multicast flooding towards the CPU if they turn off the IGMP querier on a bridge which already has enslaved ports (echo 0 > /sys/class/net/br0/bridge/multicast_router).
And commit a8b659e7ff75 ("net: dsa: act as passthrough for bridge port flags") simply papered over that issue, because it moved the decision to flood the CPU with multicast (or not) from the DSA core down to individual drivers, instead of taking a more radical position then.
The truth is that disabling multicast flooding to the CPU is simply something we are not prepared to do now, if at all. Some reasons:
- ICMP6 neighbor solicitation messages are unregistered multicast packets as far as the bridge is concerned. So if we stop flooding multicast, the outside world cannot ping the bridge device's IPv6 link-local address.
- There might be foreign interfaces bridged with our DSA switch ports (sending a packet towards the host does not necessarily equal termination, but maybe software forwarding). So if there is no one interested in that multicast traffic in the local network stack, that doesn't mean nobody is.
- PTP over L4 (IPv4, IPv6) is multicast, but is unregistered as far as the bridge is concerned. This should reach the CPU port.
- The switch driver might not do FDB partitioning. And since we don't even bother to do more fine-grained flood disabling (such as "disable flooding _from_port_N_ towards the CPU port" as opposed to "disable flooding _from_any_port_ towards the CPU port"), this breaks standalone ports, or even multiple bridges where one has an IGMP querier and one doesn't.
Reverting the logic makes all of the above work.
--- drivers/net/dsa/b53/b53_common.c | 10 ---------- drivers/net/dsa/b53/b53_priv.h | 2 -- drivers/net/dsa/bcm_sf2.c | 1 - drivers/net/dsa/mv88e6xxx/chip.c | 18 ------------------ include/net/dsa.h | 2 -- net/dsa/dsa_priv.h | 2 -- net/dsa/port.c | 11 ----------- net/dsa/slave.c | 6 ------ 8 files changed, 52 deletions(-)
drivers/net/dsa/b53/b53_common.c +0 -10
@@ -2016,15 +2016,6 @@ int b53_br_flags(struct dsa_switch *ds, int port, }EXPORT_SYMBOL (b53_br_flags); -int b53_set_mrouter (struct dsa_switch *ds,int port,bool mrouter, -struct netlink_ext_ack *extack) -{ -b53_port_set_mcast_flood (ds->priv, port, mrouter); - -return 0 ; -} -EXPORT_SYMBOL (b53_set_mrouter); -static bool b53_possible_cpu_port (struct dsa_switch *ds,int port) {/* Broadcom switches will accept enabling Broadcom tags on the
@@ -2268,7 +2259,6 @@ static const struct dsa_switch_ops b53_switch_ops = { .port_bridge_leave = b53_br_leave, .port_pre_bridge_flags = b53_br_flags_pre, .port_bridge_flags = b53_br_flags, - .port_set_mrouter = b53_set_mrouter, .port_stp_state_set = b53_br_set_stp_state, .port_fast_age = b53_br_fast_age, .port_vlan_filtering = b53_vlan_filtering,
drivers/net/dsa/b53/b53_priv.h +0 -2
@@ -328,8 +328,6 @@ int b53_br_flags_pre(struct dsa_switch *ds, int port,int b53_br_flags (struct dsa_switch *ds,int port,struct switchdev_brport_flags flags,struct netlink_ext_ack *extack); -int b53_set_mrouter (struct dsa_switch *ds,int port,bool mrouter, -struct netlink_ext_ack *extack);int b53_setup_devlink_resources (struct dsa_switch *ds);void b53_port_event (struct dsa_switch *ds,int port); void b53_phylink_validate(struct dsa_switch *ds, int port,
drivers/net/dsa/bcm_sf2.c +0 -1
@@ -1199,7 +1199,6 @@ static const struct dsa_switch_ops bcm_sf2_ops = { .port_pre_bridge_flags = b53_br_flags_pre, .port_bridge_flags = b53_br_flags, .port_stp_state_set = b53_br_set_stp_state, - .port_set_mrouter = b53_set_mrouter, .port_fast_age = b53_br_fast_age, .port_vlan_filtering = b53_vlan_filtering, .port_vlan_add = b53_vlan_add,
drivers/net/dsa/mv88e6xxx/chip.c +0 -18
@@ -5781,23 +5781,6 @@ out:return err; } -static int mv88e6xxx_port_set_mrouter (struct dsa_switch *ds,int port, -bool mrouter, -struct netlink_ext_ack *extack) -{ -struct mv88e6xxx_chip *chip = ds->priv; -int err; - -if (!chip->info->ops->port_set_mcast_flood) -return -EOPNOTSUPP ; - -mv88e6xxx_reg_lock (chip); - err = chip->info->ops->port_set_mcast_flood (chip, port, mrouter); -mv88e6xxx_reg_unlock (chip); - -return err; -} -static bool mv88e6xxx_lag_can_offload (struct dsa_switch *ds,struct net_device *lag,struct netdev_lag_upper_info *info)
@@ -6099,7 +6082,6 @@ static const struct dsa_switch_ops mv88e6xxx_switch_ops = { .port_bridge_leave = mv88e6xxx_port_bridge_leave, .port_pre_bridge_flags = mv88e6xxx_port_pre_bridge_flags, .port_bridge_flags = mv88e6xxx_port_bridge_flags, - .port_set_mrouter = mv88e6xxx_port_set_mrouter, .port_stp_state_set = mv88e6xxx_port_stp_state_set, .port_fast_age = mv88e6xxx_port_fast_age, .port_vlan_filtering = mv88e6xxx_port_vlan_filtering,
include/net/dsa.h +0 -2
@@ -699,8 +699,6 @@ struct dsa_switch_ops {int (*port_bridge_flags)(struct dsa_switch *ds,int port,struct switchdev_brport_flags flags,struct netlink_ext_ack *extack); -int (*port_set_mrouter)(struct dsa_switch *ds,int port,bool mrouter, -struct netlink_ext_ack *extack);/* * VLAN support
net/dsa/dsa_priv.h +0 -2
@@ -234,8 +234,6 @@ int dsa_port_pre_bridge_flags(const struct dsa_port *dp,int dsa_port_bridge_flags (const struct dsa_port *dp,struct switchdev_brport_flags flags,struct netlink_ext_ack *extack); -int dsa_port_mrouter (struct dsa_port *dp,bool mrouter, -struct netlink_ext_ack *extack);int dsa_port_vlan_add (struct dsa_port *dp,const struct switchdev_obj_port_vlan *vlan,struct netlink_ext_ack *extack);
net/dsa/port.c +0 -11
@@ -597,17 +597,6 @@ int dsa_port_bridge_flags(const struct dsa_port *dp,return ds->ops->port_bridge_flags (ds, dp->index, flags, extack); } -int dsa_port_mrouter (struct dsa_port *dp,bool mrouter, -struct netlink_ext_ack *extack) -{ -struct dsa_switch *ds = dp->ds; - -if (!ds->ops->port_set_mrouter) -return -EOPNOTSUPP ; - -return ds->ops->port_set_mrouter (ds, dp->index, mrouter, extack); -} -int dsa_port_mtu_change (struct dsa_port *dp,int new_mtu,bool targeted_match) {
net/dsa/slave.c +0 -6
@@ -314,12 +314,6 @@ static int dsa_slave_port_attr_set(struct net_device *dev, const void *ctx, ret =dsa_port_bridge_flags (dp, attr->u.brport_flags, extack);break ; -case SWITCHDEV_ATTR_ID_BRIDGE_MROUTER : -if (!dsa_port_offloads_bridge (dp, attr->orig_dev)) -return -EOPNOTSUPP ; - - ret =dsa_port_mrouter (dp->cpu_dp, attr->u.mrouter, extack); -break ;default : ret = -EOPNOTSUPP ;break ;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 180/334 PM: EM: Increase energy calculation precision
In reply to Greg Kroah-HartmanFrom: Lukasz Luba <[email protected]>
[ Upstream commit 7fcc17d0cb12938d2b3507973a6f93fc9ed2c7a1 ]
The Energy Model (EM) provides useful information about device power in each performance state to other subsystems like: Energy Aware Scheduler (EAS). The energy calculation in EAS does arithmetic operation based on the EM em_cpu_energy(). Current implementation of that function uses em_perf_state::cost as a pre-computed cost coefficient equal to:
cost = power * max_frequency / frequency.
The 'power' is expressed in milli-Watts (or in abstract scale).
There are corner cases when the EAS energy calculation for two Performance Domains (PDs) return the same value. The EAS compares these values to choose smaller one. It might happen that this values are equal due to rounding error. In such scenario, we need better resolution, e.g. 1000 times better. To provide this possibility increase the resolution in the em_perf_state::cost for 64-bit architectures. The cost of increasing resolution on 32-bit is pretty high (64-bit division) and is not justified since there are no new 32bit big.LITTLE EAS systems expected which would benefit from this higher resolution.
This patch allows to avoid the rounding to milli-Watt errors, which might occur in EAS energy estimation for each PD. The rounding error is common for small tasks which have small utilization value.
There are two places in the code where it makes a difference:
1. In the find_energy_efficient_cpu() where we are searching for best_delta. We might suffer there when two PDs return the same result, like in the example below.
Scenario:
Low utilized system e.g. ~200 sum_util for PD0 and ~220 for PD1. There are quite a few small tasks ~10-15 util. These tasks would suffer for the rounding error. These utilization values are typical when running games on Android. One of our partners has reported 5..10mA less battery drain when running with increased resolution.
Some details:
We have two PDs: PD0 (big) and PD1 (little)
Let's compare w/o patch set ('old') and w/ patch set ('new') We are comparing energy w/ task and w/o task placed in the PDs
a) 'old' w/o patch set, PD0task_util = 13
cost = 480
sum_util_w/o_task = 215sum_util_w_task = 228scale_cpu = 1024
energy_w/o_task = 480 * 215 / 1024 = 100.78 => 100 energy_w_task = 480 * 228 / 1024 = 106.87 => 106 energy_diff = 106 - 100 = 6
(this is equal to 'old' PD1's energy_diff in 'c)')
b) 'new' w/ patch set, PD0task_util = 13
cost = 480 * 1000 = 480000
sum_util_w/o_task = 215sum_util_w_task = 228
energy_w/o_task = 480000 * 215 / 1024 = 100781 energy_w_task = 480000 * 228 / 1024 = 106875 energy_diff = 106875 - 100781 = 6094
(this is not equal to 'new' PD1's energy_diff in 'd)')
c) 'old' w/o patch set, PD1task_util = 13
cost = 160
sum_util_w/o_task = 283sum_util_w_task = 293scale_cpu = 355
energy_w/o_task = 160 * 283 / 355 = 127.55 => 127 energy_w_task = 160 * 296 / 355 = 133.41 => 133 energy_diff = 133 - 127 = 6
(this is equal to 'old' PD0's energy_diff in 'a)')
d) 'new' w/ patch set, PD1task_util = 13
cost = 160 * 1000 = 160000
sum_util_w/o_task = 283sum_util_w_task = 293scale_cpu = 355
energy_w/o_task = 160000 * 283 / 355 = 127549energy_w_task = 160000 * 296 / 355 = 133408energy_diff = 133408 - 127549 = 5859
(this is not equal to 'new' PD0's energy_diff in 'b)')
2. Difference in the 6% energy margin filter at the end of find_energy_efficient_cpu(). With this patch the margin comparison also has better resolution, so it's possible to have better task placement thanks to that.
--- include/linux/energy_model.h | 16 ++++++++++++++++ kernel/power/energy_model.c | 4 +++- 2 files changed, 19 insertions(+), 1 deletion(-)
include/linux/energy_model.h +16 -0
@@ -53,6 +53,22 @@ struct em_perf_domain {#ifdef CONFIG_ENERGY_MODEL #define EM_MAX_POWER 0xFFFF +/* +* Increase resolution of energy estimation calculations for 64-bit +* architectures. The extra resolution improves decision made by EAS for the +* task placement when two Performance Domains might provide similar energy +* estimation values (w/o better resolution the values could be equal). +* +* We increase resolution only if we have enough bits to allow this increased +* resolution (i.e. 64-bit). The costs for increasing resolution when 32-bit +* are pretty high and the returns do not justify the increased costs. +*/ +#ifdef CONFIG_64BIT +#define em_scale_power (p) ((p) * 1000) +#else +#define em_scale_power (p) (p) +#endif + struct em_data_callback {/** * active_power() - Provide power at the next performance state of
kernel/power/energy_model.c +3 -1
@@ -170,7 +170,9 @@ static int em_create_perf_table(struct device *dev, struct em_perf_domain *pd,/* Compute the cost of each performance state. */ fmax = (u64 ) table[nr_states -1 ].frequency;for (i =0 ; i < nr_states; i++) { - table[i].cost =div64_u64 (fmax * table[i].power, +unsigned long power_res =em_scale_power (table[i].power); + + table[i].cost =div64_u64 (fmax * power_res, table[i].frequency); }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 181/334 selftests/bpf: Fix bpf-iter-tcp4 test to print correctly the dest IP
In reply to Greg Kroah-HartmanFrom: Jose Blanquicet <[email protected]>
[ Upstream commit 277b134057036df8c657079ca92c3e5e7d10aeaf ]
Currently, this test is incorrectly printing the destination port in place of the destination IP.
--- tools/testing/selftests/bpf/progs/bpf_iter_tcp4.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/testing/selftests/bpf/progs/bpf_iter_tcp4.c +1 -1
@@ -121,7 +121,7 @@ static int dump_tcp_sock(struct seq_file *seq, struct tcp_sock *tp, }BPF_SEQ_PRINTF (seq,"%4d: %08X:%04X %08X:%04X " , - seq_num, src, srcp, destp, destp); + seq_num, src, srcp, dest, destp); BPF_SEQ_PRINTF(seq, "%02X %08X:%08X %02X:%08lX %08X %5u %8d %lu %d ", state, tp->write_seq - tp->snd_una, rx_queue,
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 182/334 leds: lgm-sso: Propagate error codes from callee to caller
In reply to Greg Kroah-HartmanFrom: Andy Shevchenko <[email protected]>
[ Upstream commit 9cbc861095375793a69858f91f3ac4e817f320f0 ]
The one of the latest change to the driver reveals the problem that the error codes from callee aren't propagated to the caller of __sso_led_dt_parse(). Fix this accordingly.
--- drivers/leds/blink/leds-lgm-sso.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-)
drivers/leds/blink/leds-lgm-sso.c +8 -4
@@ -644,7 +644,7 @@ __sso_led_dt_parse(struct sso_led_priv *priv, struct fwnode_handle *fw_ssoled) fwnode_child, GPIOD_ASIS, NULL);if (IS_ERR (led->gpiod)) { -dev_err_probe (dev,PTR_ERR (led->gpiod),"led: get gpio fail!\n" ); + ret =dev_err_probe (dev,PTR_ERR (led->gpiod),"led: get gpio fail!\n" ); goto __dt_err; }
@@ -664,8 +664,11 @@ __sso_led_dt_parse(struct sso_led_priv *priv, struct fwnode_handle *fw_ssoled) desc->panic_indicator =1 ; ret =fwnode_property_read_u32 (fwnode_child,"reg" , &prop); -if (ret !=0 || prop >=SSO_LED_MAX_NUM ) { +if (ret) + goto __dt_err; +if (prop >=SSO_LED_MAX_NUM ) {dev_err (dev,"invalid LED pin:%u\n" , prop); + ret = -EINVAL ; goto __dt_err; } desc->pin = prop;
@@ -701,7 +704,8 @@ __sso_led_dt_parse(struct sso_led_priv *priv, struct fwnode_handle *fw_ssoled) desc->brightness =LED_FULL ; } -if (sso_create_led (priv, led, fwnode_child)) + ret =sso_create_led (priv, led, fwnode_child); +if (ret) goto __dt_err; }
@@ -715,7 +719,7 @@ __dt_err:sso_led_shutdown (led); } -return -EINVAL ; +return ret; }static int sso_led_dt_parse (struct sso_led_priv *priv)
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 183/334 drm/msm: Fix error return code in msm_drm_init()
In reply to Greg Kroah-HartmanFrom: Wei Li <[email protected]>
[ Upstream commit bfddcfe155a2fe448fee0169c5cbc82c7fa73491 ]
When it fail to create crtc_event kthread, it just jump to err_msm_uninit, while the 'ret' is not updated. So assign the return code before that.
--- drivers/gpu/drm/msm/msm_drv.c | 1 + 1 file changed, 1 insertion(+)
drivers/gpu/drm/msm/msm_drv.c +1 -0
@@ -539,6 +539,7 @@ static int msm_drm_init(struct device *dev, const struct drm_driver *drv)if (IS_ERR (priv->event_thread[i].worker)) { ret =PTR_ERR (priv->event_thread[i].worker);DRM_DEV_ERROR (dev,"failed to create crtc_event kthread\n" ); + ret =PTR_ERR (priv->event_thread[i].worker); goto err_msm_uninit; }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 184/334 drm/msm/mdp4: refactor HW revision detection into read_mdp_hw_revision
In reply to Greg Kroah-HartmanFrom: David Heidelberg <[email protected]>
[ Upstream commit 4d319afe666b0fc9a9855ba9bdf9ae3710ecf431 ]
Inspired by MDP5 code.
Also use DRM_DEV_INFO for MDP version as MDP5 does.
Cosmetic change: uint32_t -> u32 - checkpatch suggestion.
--- drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c | 27 ++++++++++++++++-------- 1 file changed, 18 insertions(+), 9 deletions(-)
drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c +18 -9
@@ -19,20 +19,13 @@ static int mdp4_hw_init(struct msm_kms *kms) {struct mdp4_kms *mdp4_kms =to_mdp4_kms (to_mdp_kms (kms));struct drm_device *dev = mdp4_kms->dev; -uint32_t version, major, minor, dmap_cfg, vg_cfg; +u32 major, minor, dmap_cfg, vg_cfg;unsigned long clk;int ret =0 ;pm_runtime_get_sync (dev->dev); -mdp4_enable (mdp4_kms); - version =mdp4_read (mdp4_kms,REG_MDP4_VERSION ); -mdp4_disable (mdp4_kms); - - major =FIELD (version,MDP4_VERSION_MAJOR ); - minor =FIELD (version,MDP4_VERSION_MINOR ); - -DBG ("found MDP4 version v%d.%d" , major, minor); +read_mdp_hw_revision (mdp4_kms, &major, &minor);if (major !=4 ) { DRM_DEV_ERROR(dev->dev, "unexpected MDP version: v%d.%d\n",
@@ -411,6 +404,22 @@ fail:return ret; } +static void read_mdp_hw_revision (struct mdp4_kms *mdp4_kms, +u32 *major,u32 *minor) +{ +struct drm_device *dev = mdp4_kms->dev; +u32 version; + +mdp4_enable (mdp4_kms); + version =mdp4_read (mdp4_kms,REG_MDP4_VERSION ); +mdp4_disable (mdp4_kms); + + *major =FIELD (version,MDP4_VERSION_MAJOR ); + *minor =FIELD (version,MDP4_VERSION_MINOR ); + +DRM_DEV_INFO (dev->dev,"MDP4 version v%d.%d" , *major, *minor); +} +struct msm_kms *mdp4_kms_init (struct drm_device *dev) {struct platform_device *pdev =to_platform_device (dev->dev);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 185/334 drm/msm/mdp4: move HW revision detection to earlier phase
In reply to Greg Kroah-HartmanFrom: David Heidelberg <[email protected]>
[ Upstream commit 4af4fc92939dc811ef291c0673946555aa4fb71f ]
Fixes if condition, which never worked inside mdp4_kms_init, since HW detection has been done later in mdp4_hw_init.
--- drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c | 45 ++++++++++++------------ 1 file changed, 22 insertions(+), 23 deletions(-)
drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c +22 -23
@@ -19,23 +19,12 @@ static int mdp4_hw_init(struct msm_kms *kms) {struct mdp4_kms *mdp4_kms =to_mdp4_kms (to_mdp_kms (kms));struct drm_device *dev = mdp4_kms->dev; -u32 major, minor, dmap_cfg, vg_cfg; +u32 dmap_cfg, vg_cfg;unsigned long clk;int ret =0 ;pm_runtime_get_sync (dev->dev); -read_mdp_hw_revision (mdp4_kms, &major, &minor); - -if (major !=4 ) { -DRM_DEV_ERROR (dev->dev,"unexpected MDP version: v%d.%d\n" , - major, minor); - ret = -ENXIO ; - goto out; - } - - mdp4_kms->rev = minor; -if (mdp4_kms->rev >1 ) {mdp4_write (mdp4_kms,REG_MDP4_CS_CONTROLLER0 ,0x0707ffff );mdp4_write (mdp4_kms,REG_MDP4_CS_CONTROLLER1 ,0x03073f3f );
@@ -81,7 +70,6 @@ static int mdp4_hw_init(struct msm_kms *kms)if (mdp4_kms->rev >1 )mdp4_write (mdp4_kms,REG_MDP4_RESET_STATUS ,1 ); -out:pm_runtime_put_sync (dev->dev);return ret;
@@ -428,6 +416,7 @@ struct msm_kms *mdp4_kms_init(struct drm_device *dev)struct msm_kms *kms =NULL ;struct msm_gem_address_space *aspace;int irq, ret; +u32 major, minor; mdp4_kms =kzalloc (sizeof (*mdp4_kms),GFP_KERNEL );if (!mdp4_kms) {
@@ -488,15 +477,6 @@ struct msm_kms *mdp4_kms_init(struct drm_device *dev)if (IS_ERR (mdp4_kms->pclk)) mdp4_kms->pclk =NULL ; -if (mdp4_kms->rev >=2 ) { - mdp4_kms->lut_clk =devm_clk_get (&pdev->dev,"lut_clk" ); -if (IS_ERR (mdp4_kms->lut_clk)) { -DRM_DEV_ERROR (dev->dev,"failed to get lut_clk\n" ); - ret =PTR_ERR (mdp4_kms->lut_clk); - goto fail; - } - } - mdp4_kms->axi_clk =devm_clk_get (&pdev->dev,"bus_clk" );if (IS_ERR (mdp4_kms->axi_clk)) {DRM_DEV_ERROR (dev->dev,"failed to get axi_clk\n" );
@@ -505,8 +485,27 @@ struct msm_kms *mdp4_kms_init(struct drm_device *dev) }clk_set_rate (mdp4_kms->clk, config->max_clk); -if (mdp4_kms->lut_clk) + +read_mdp_hw_revision (mdp4_kms, &major, &minor); + +if (major !=4 ) { +DRM_DEV_ERROR (dev->dev,"unexpected MDP version: v%d.%d\n" , + major, minor); + ret = -ENXIO ; + goto fail; + } + + mdp4_kms->rev = minor; + +if (mdp4_kms->rev >=2 ) { + mdp4_kms->lut_clk =devm_clk_get (&pdev->dev,"lut_clk" ); +if (IS_ERR (mdp4_kms->lut_clk)) { +DRM_DEV_ERROR (dev->dev,"failed to get lut_clk\n" ); + ret =PTR_ERR (mdp4_kms->lut_clk); + goto fail; + }clk_set_rate (mdp4_kms->lut_clk, config->max_clk); + }pm_runtime_enable (dev->dev); mdp4_kms->rpm_enabled = true;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 186/334 drm/msm/dp: update is_connected status base on sink count at dp_pm_resume()
In reply to Greg Kroah-HartmanFrom: Kuogee Hsieh <[email protected]>
[ Upstream commit e8a767e04dbc7b201cb17ab99dca723a3488b6d4 ]
Currently at dp_pm_resume() is_connected state is decided base on hpd connection status only. This will put is_connected in wrongly "true" state at the scenario that dongle attached to DUT but without hmdi cable connecting to it. Fix this problem by adding read sink count from dongle and decided is_connected state base on both sink count and hpd connection status.
Changes in v2:
-- remove dp_get_sink_count() cand call drm_dp_read_sink_count()
Changes in v3:
-- delete status local variable from dp_pm_resume()
Changes in v4:
-- delete un necessary comment at dp_pm_resume()
--- drivers/gpu/drm/msm/dp/dp_display.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-)
drivers/gpu/drm/msm/dp/dp_display.c +14 -3
@@ -1286,7 +1286,7 @@ static int dp_pm_resume(struct device *dev)struct platform_device *pdev =to_platform_device (dev);struct msm_dp *dp_display =platform_get_drvdata (pdev);struct dp_display_private *dp; -u32 status; +int sink_count =0 ; dp = container_of(dp_display, struct dp_display_private, dp_display);
@@ -1300,14 +1300,25 @@ static int dp_pm_resume(struct device *dev)dp_catalog_ctrl_hpd_config (dp->catalog); - status =dp_catalog_link_is_connected (dp->catalog); +/* +* set sink to normal operation mode -- D0 +* before dpcd read +*/ +dp_link_psm_config (dp->link, &dp->panel->link_info, false); + +if (dp_catalog_link_is_connected (dp->catalog)) { + sink_count =drm_dp_read_sink_count (dp->aux); +if (sink_count <0 ) + sink_count =0 ; + } + dp->link->sink_count = sink_count;/* * can not declared display is connected unless * HDMI cable is plugged in and sink_count of * dongle become 1 */ -if (status && dp->link->sink_count) +if (dp->link->sink_count) dp->dp_display.is_connected = true;else dp->dp_display.is_connected = false;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 187/334 drm/msm/dpu: make dpu_hw_ctl_clear_all_blendstages clear necessary LMs
In reply to Greg Kroah-HartmanFrom: Dmitry Baryshkov <[email protected]>
[ Upstream commit a41cdb693595ae1904dd793fc15d6954f4295e27 ]
dpu_hw_ctl_clear_all_blendstages() clears settings for the few first LMs instead of mixers actually used for the CTL. Change it to clear necessary data, using provided mixer ids.
--- drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.c +6 -4
@@ -345,10 +345,12 @@ static void dpu_hw_ctl_clear_all_blendstages(struct dpu_hw_ctl *ctx)int i;for (i =0 ; i < ctx->mixer_count; i++) { -DPU_REG_WRITE (c,CTL_LAYER (LM_0 + i),0 ); -DPU_REG_WRITE (c,CTL_LAYER_EXT (LM_0 + i),0 ); -DPU_REG_WRITE (c,CTL_LAYER_EXT2 (LM_0 + i),0 ); -DPU_REG_WRITE (c,CTL_LAYER_EXT3 (LM_0 + i),0 ); +enum dpu_lm mixer_id = ctx->mixer_hw_caps[i].id; + +DPU_REG_WRITE (c,CTL_LAYER (mixer_id),0 ); +DPU_REG_WRITE (c,CTL_LAYER_EXT (mixer_id),0 ); +DPU_REG_WRITE (c,CTL_LAYER_EXT2 (mixer_id),0 ); +DPU_REG_WRITE (c,CTL_LAYER_EXT3 (mixer_id),0 ); }DPU_REG_WRITE (c,CTL_FETCH_PIPE_ACTIVE ,0 );
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 188/334 arm64: dts: exynos: correct GIC CPU interfaces address range on Exynos7
In reply to Greg Kroah-HartmanFrom: Krzysztof Kozlowski <[email protected]>
[ Upstream commit 01c72cad790cb6cd3ccbe4c1402b6cb6c6bbffd0 ]
The GIC-400 CPU interfaces address range is defined as 0x2000-0x3FFF (by ARM).
--- arch/arm64/boot/dts/exynos/exynos7.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm64/boot/dts/exynos/exynos7.dtsi +1 -1
@@ -102,7 +102,7 @@ #address-cells = <0>; interrupt-controller; reg = <0x11001000 0x1000>, - <0x11002000 0x1000>, + <0x11002000 0x2000>, <0x11004000 0x2000>, <0x11006000 0x2000>; };
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 189/334 counter: 104-quad-8: Return error when invalid mode during ceiling_write
In reply to Greg Kroah-HartmanFrom: William Breathitt Gray <[email protected]>
[ Upstream commit 728246e8f7269ecd35a2c6e6795323e6d8f48db7 ]
The 104-QUAD-8 only has two count modes where a ceiling value makes
sense: Range Limit and Modulo-N. Outside of these two modes, setting a ceiling value is an invalid operation -- so let's report it as such by returning -EINVAL.
--- drivers/counter/104-quad-8.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/counter/104-quad-8.c +3 -2
@@ -715,12 +715,13 @@ static ssize_t quad8_count_ceiling_write(struct counter_device *counter,case 1 :case 3 :quad8_preset_register_set (priv, count->id, ceiling); -break ; +mutex_unlock (&priv->lock); +return len; }mutex_unlock (&priv->lock); -return len; +return -EINVAL ; } static ssize_t quad8_count_preset_enable_read(struct counter_device *counter,
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 190/334 cgroup/cpuset: Miscellaneous code cleanup
In reply to Greg Kroah-HartmanFrom: Waiman Long <[email protected]>
[ Upstream commit 0f3adb8a1e5f36e792598c1d77a2cfac9c90a4f9 ]
Use more descriptive variable names for update_prstate(), remove unnecessary code and fix some typos. There is no functional change.
--- kernel/cgroup/cpuset.c | 40 +++++++++++++++++++--------------------- 1 file changed, 19 insertions(+), 21 deletions(-)
kernel/cgroup/cpuset.c +19 -21
@@ -1114,7 +1114,7 @@ enum subparts_cmd {* cpus_allowed can be granted or an error code will be returned. * * For partcmd_disable, the cpuset is being transofrmed from a partition -* root back to a non-partition root. any CPUs in cpus_allowed that are in +* root back to a non-partition root. Any CPUs in cpus_allowed that are in * parent's subparts_cpus will be taken away from that cpumask and put back * into parent's effective_cpus. 0 should always be returned. *
@@ -1225,7 +1225,7 @@ static int update_parent_subparts_cpumask(struct cpuset *cpuset, int cmd,/* * partcmd_update w/o newmask: * -* addmask = cpus_allowed & parent->effectiveb_cpus +* addmask = cpus_allowed & parent->effective_cpus * * Note that parent's subparts_cpus may have been * pre-shrunk in case there is a change in the cpu list.
@@ -1365,12 +1365,12 @@ static void update_cpumasks_hier(struct cpuset *cs, struct tmpmasks *tmp)case PRS_DISABLED :/* * If parent is not a partition root or an -* invalid partition root, clear the state -* state and the CS_CPU_EXCLUSIVE flag. +* invalid partition root, clear its state +* and its CS_CPU_EXCLUSIVE flag. */ WARN_ON_ONCE (cp->partition_root_state !=PRS_ERROR ); - cp->partition_root_state =0 ; + cp->partition_root_state =PRS_DISABLED ;/* * clear_bit() is an atomic operation and
@@ -1937,30 +1937,28 @@ out:/* * update_prstate - update partititon_root_state -* cs: the cpuset to update -* val: 0 - disabled, 1 - enabled +* cs: the cpuset to update +* new_prs: new partition root state * * Call with cpuset_mutex held. */ -static int update_prstate (struct cpuset *cs,int val) +static int update_prstate (struct cpuset *cs,int new_prs) {int err;struct cpuset *parent =parent_cs (cs); -struct tmpmasks tmp; +struct tmpmasks tmpmask; -if ((val !=0 ) && (val !=1 )) -return -EINVAL ; -if (val == cs->partition_root_state) +if (new_prs == cs->partition_root_state)return 0 ;/* * Cannot force a partial or invalid partition root to a full * partition root. */ -if (val && cs->partition_root_state) +if (new_prs && (cs->partition_root_state <0 ))return -EINVAL ; -if (alloc_cpumasks (NULL , &tmp)) +if (alloc_cpumasks (NULL , &tmpmask))return -ENOMEM ; err = -EINVAL ;
@@ -1978,7 +1976,7 @@ static int update_prstate(struct cpuset *cs, int val) goto out; err =update_parent_subparts_cpumask (cs, partcmd_enable, -NULL , &tmp); +NULL , &tmpmask);if (err) {update_flag (CS_CPU_EXCLUSIVE , cs,0 ); goto out;
@@ -1990,18 +1988,18 @@ static int update_prstate(struct cpuset *cs, int val)* CS_CPU_EXCLUSIVE bit. */ if (cs->partition_root_state ==PRS_ERROR ) { - cs->partition_root_state =0 ; + cs->partition_root_state =PRS_DISABLED ;update_flag (CS_CPU_EXCLUSIVE , cs,0 ); err =0 ; goto out; } err =update_parent_subparts_cpumask (cs, partcmd_disable, -NULL , &tmp); +NULL , &tmpmask);if (err) goto out; - cs->partition_root_state =0 ; + cs->partition_root_state =PRS_DISABLED ;/* Turning off CS_CPU_EXCLUSIVE will not return error */ update_flag (CS_CPU_EXCLUSIVE , cs,0 );
@@ -2015,11 +2013,11 @@ static int update_prstate(struct cpuset *cs, int val)update_tasks_cpumask (parent);if (parent->child_ecpus_count) -update_sibling_cpumasks (parent, cs, &tmp); +update_sibling_cpumasks (parent, cs, &tmpmask);rebuild_sched_domains_locked (); out: -free_cpumasks (NULL , &tmp); +free_cpumasks (NULL , &tmpmask);return err; }
@@ -3060,7 +3058,7 @@ retry: goto retry; } - parent =parent_cs (cs); + parent =parent_cs (cs);compute_effective_cpumask (&new_cpus, cs, parent);nodes_and (new_mems, cs->mems_allowed, parent->effective_mems);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 191/334 cgroup/cpuset: Fix violation of cpuset locking rule
In reply to Greg Kroah-HartmanFrom: Waiman Long <[email protected]>
[ Upstream commit 6ba34d3c73674e46d9e126e4f0cee79e5ef2481c ]
The cpuset fields that manage partition root state do not strictly follow the cpuset locking rule that update to cpuset has to be done with both the callback_lock and cpuset_mutex held. This is now fixed by making sure that the locking rule is upheld.
--- kernel/cgroup/cpuset.c | 58 +++++++++++++++++++++++++----------------- 1 file changed, 35 insertions(+), 23 deletions(-)
kernel/cgroup/cpuset.c +35 -23
@@ -1148,6 +1148,7 @@ static int update_parent_subparts_cpumask(struct cpuset *cpuset, int cmd,struct cpuset *parent =parent_cs (cpuset);int adding;/* Moving cpus from effective_cpus to subparts_cpus */ int deleting;/* Moving cpus from subparts_cpus to effective_cpus */ +int new_prs;bool part_error = false;/* Partition error? */ percpu_rwsem_assert_held (&cpuset_rwsem);
@@ -1183,6 +1184,7 @@ static int update_parent_subparts_cpumask(struct cpuset *cpuset, int cmd,* A cpumask update cannot make parent's effective_cpus become empty. */ adding = deleting = false; + new_prs = cpuset->partition_root_state;if (cmd == partcmd_enable) {cpumask_copy (tmp->addmask, cpuset->cpus_allowed); adding = true;
@@ -1247,11 +1249,11 @@ static int update_parent_subparts_cpumask(struct cpuset *cpuset, int cmd,switch (cpuset->partition_root_state) {case PRS_ENABLED :if (part_error) - cpuset->partition_root_state =PRS_ERROR ; + new_prs =PRS_ERROR ;break ;case PRS_ERROR :if (!part_error) - cpuset->partition_root_state =PRS_ENABLED ; + new_prs =PRS_ENABLED ;break ; }/*
@@ -1260,10 +1262,10 @@ static int update_parent_subparts_cpumask(struct cpuset *cpuset, int cmd, part_error = (prev_prs ==PRS_ERROR ); } -if (!part_error && (cpuset->partition_root_state ==PRS_ERROR )) +if (!part_error && (new_prs ==PRS_ERROR ))return 0 ;/* Nothing need to be done */ -if (cpuset->partition_root_state ==PRS_ERROR ) { +if (new_prs ==PRS_ERROR ) {/* * Remove all its cpus from parent's subparts_cpus. */
@@ -1272,7 +1274,7 @@ static int update_parent_subparts_cpumask(struct cpuset *cpuset, int cmd, parent->subparts_cpus); } -if (!adding && !deleting) +if (!adding && !deleting && (new_prs == cpuset->partition_root_state))return 0 ;/*
@@ -1299,6 +1301,9 @@ static int update_parent_subparts_cpumask(struct cpuset *cpuset, int cmd, } parent->nr_subparts_cpus =cpumask_weight (parent->subparts_cpus); + +if (cpuset->partition_root_state != new_prs) + cpuset->partition_root_state = new_prs;spin_unlock_irq (&callback_lock);return cmd == partcmd_update;
@@ -1321,6 +1326,7 @@ static void update_cpumasks_hier(struct cpuset *cs, struct tmpmasks *tmp)struct cpuset *cp;struct cgroup_subsys_state *pos_css;bool need_rebuild_sched_domains = false; +int new_prs;rcu_read_lock ();cpuset_for_each_descendant_pre (cp, pos_css, cs) {
@@ -1360,7 +1366,8 @@ static void update_cpumasks_hier(struct cpuset *cs, struct tmpmasks *tmp)* update_tasks_cpumask() again for tasks in the parent * cpuset if the parent's subparts_cpus changes. */ -if ((cp != cs) && cp->partition_root_state) { + new_prs = cp->partition_root_state; +if ((cp != cs) && new_prs) {switch (parent->partition_root_state) {case PRS_DISABLED :/*
@@ -1370,7 +1377,7 @@ static void update_cpumasks_hier(struct cpuset *cs, struct tmpmasks *tmp)*/ WARN_ON_ONCE (cp->partition_root_state !=PRS_ERROR ); - cp->partition_root_state =PRS_DISABLED ; + new_prs =PRS_DISABLED ;/* * clear_bit() is an atomic operation and
@@ -1391,11 +1398,7 @@ static void update_cpumasks_hier(struct cpuset *cs, struct tmpmasks *tmp)/* * When parent is invalid, it has to be too. */ - cp->partition_root_state =PRS_ERROR ; -if (cp->nr_subparts_cpus) { - cp->nr_subparts_cpus =0 ; -cpumask_clear (cp->subparts_cpus); - } + new_prs =PRS_ERROR ;break ; } }
@@ -1407,8 +1410,7 @@ static void update_cpumasks_hier(struct cpuset *cs, struct tmpmasks *tmp)spin_lock_irq (&callback_lock);cpumask_copy (cp->effective_cpus, tmp->new_cpus); -if (cp->nr_subparts_cpus && - (cp->partition_root_state !=PRS_ENABLED )) { +if (cp->nr_subparts_cpus && (new_prs !=PRS_ENABLED )) { cp->nr_subparts_cpus =0 ;cpumask_clear (cp->subparts_cpus); }else if (cp->nr_subparts_cpus) {
@@ -1435,6 +1437,10 @@ static void update_cpumasks_hier(struct cpuset *cs, struct tmpmasks *tmp) = cpumask_weight(cp->subparts_cpus); } } + +if (new_prs != cp->partition_root_state) + cp->partition_root_state = new_prs; +spin_unlock_irq (&callback_lock); WARN_ON(!is_in_v2_mode() &&
@@ -1944,25 +1950,25 @@ out:*/ static int update_prstate (struct cpuset *cs,int new_prs) { -int err; +int err, old_prs = cs->partition_root_state;struct cpuset *parent =parent_cs (cs);struct tmpmasks tmpmask; -if (new_prs == cs->partition_root_state) +if (old_prs == new_prs)return 0 ;/* * Cannot force a partial or invalid partition root to a full * partition root. */ -if (new_prs && (cs->partition_root_state <0 )) +if (new_prs && (old_prs ==PRS_ERROR ))return -EINVAL ;if (alloc_cpumasks (NULL , &tmpmask))return -ENOMEM ; err = -EINVAL ; -if (!cs->partition_root_state) { +if (!old_prs) {/* * Turning on partition root requires setting the * CS_CPU_EXCLUSIVE bit implicitly as well and cpus_allowed
@@ -1981,14 +1987,12 @@ static int update_prstate(struct cpuset *cs, int new_prs)update_flag (CS_CPU_EXCLUSIVE , cs,0 ); goto out; } - cs->partition_root_state =PRS_ENABLED ; }else {/* * Turning off partition root will clear the * CS_CPU_EXCLUSIVE bit. */ -if (cs->partition_root_state ==PRS_ERROR ) { - cs->partition_root_state =PRS_DISABLED ; +if (old_prs ==PRS_ERROR ) {update_flag (CS_CPU_EXCLUSIVE , cs,0 ); err =0 ; goto out;
@@ -1999,8 +2003,6 @@ static int update_prstate(struct cpuset *cs, int new_prs)if (err) goto out; - cs->partition_root_state =PRS_DISABLED ; -/* Turning off CS_CPU_EXCLUSIVE will not return error */ update_flag (CS_CPU_EXCLUSIVE , cs,0 ); }
@@ -2017,6 +2019,12 @@ static int update_prstate(struct cpuset *cs, int new_prs)rebuild_sched_domains_locked (); out: +if (!err) { +spin_lock_irq (&callback_lock); + cs->partition_root_state = new_prs; +spin_unlock_irq (&callback_lock); + } +free_cpumasks (NULL , &tmpmask);return err; }
@@ -3080,8 +3088,10 @@ retry:if (is_partition_root (cs) && (cpumask_empty (&new_cpus) || (parent->partition_root_state ==PRS_ERROR ))) {if (cs->nr_subparts_cpus) { +spin_lock_irq (&callback_lock); cs->nr_subparts_cpus =0 ;cpumask_clear (cs->subparts_cpus); +spin_unlock_irq (&callback_lock);compute_effective_cpumask (&new_cpus, cs, parent); }
@@ -3095,7 +3105,9 @@ retry: cpumask_empty(&new_cpus)) {update_parent_subparts_cpumask (cs, partcmd_disable,NULL , tmp); +spin_lock_irq (&callback_lock); cs->partition_root_state =PRS_ERROR ; +spin_unlock_irq (&callback_lock); }cpuset_force_rebuild (); }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 192/334 ASoC: Intel: Fix platform ID matching
In reply to Greg Kroah-HartmanFrom: Curtis Malainey <[email protected]>
[ Upstream commit f4eeaed04e861b95f1f2c911263f2fcaa959c078 ]
Sparse warnings triggered truncating the IDs of some platform device tables. Unfortunately some of the IDs in the match tables were missed which breaks audio. The KBL change has been verified to fix audio, the CML change was not tested as it was found through grepping the broken changes and found to match the same situation in anticipation that it should also be fixed.
--- sound/soc/intel/common/soc-acpi-intel-cml-match.c | 2 +- sound/soc/intel/common/soc-acpi-intel-kbl-match.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
sound/soc/intel/common/soc-acpi-intel-cml-match.c +1 -1
@@ -75,7 +75,7 @@ struct snd_soc_acpi_mach snd_soc_acpi_intel_cml_machines[] = { }, { .id = "DLGS7219", - .drv_name = "cml_da7219_max98357a", + .drv_name = "cml_da7219_mx98357a", .machine_quirk = snd_soc_acpi_codec_list, .quirk_data = &max98390_spk_codecs, .sof_fw_filename = "sof-cml.ri",
sound/soc/intel/common/soc-acpi-intel-kbl-match.c +1 -1
@@ -87,7 +87,7 @@ struct snd_soc_acpi_mach snd_soc_acpi_intel_kbl_machines[] = { }, { .id = "DLGS7219", - .drv_name = "kbl_da7219_max98357a", + .drv_name = "kbl_da7219_mx98357a", .fw_filename = "intel/dsp_fw_kbl.bin", .machine_quirk = snd_soc_acpi_codec_list, .quirk_data = &kbl_7219_98357_codecs,
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 193/334 Bluetooth: fix repeated calls to sco_sock_kill
In reply to Greg Kroah-HartmanFrom: Desmond Cheong Zhi Xi <[email protected]>
[ Upstream commit e1dee2c1de2b4dd00eb44004a4bda6326ed07b59 ]
In commit 4e1a720d0312 ("Bluetooth: avoid killing an already killed socket"), a check was added to sco_sock_kill to skip killing a socket if the SOCK_DEAD flag was set.
This was done after a trace for a use-after-free bug showed that the same sock pointer was being killed twice.
Unfortunately, this check prevents sco_sock_kill from running on any socket. sco_sock_kill kills a socket only if it's zapped and orphaned, however sock_orphan announces that the socket is dead before detaching it. i.e., orphaned sockets have the SOCK_DEAD flag set.
To fix this, we remove the check for SOCK_DEAD, and avoid repeated calls to sco_sock_kill by removing incorrect calls in:
1. sco_sock_timeout. The socket should not be killed on timeout as further processing is expected to be done. For example, sco_sock_connect sets the timer then waits for the socket to be connected or for an error to be returned.
2. sco_conn_del. This function should clean up resources for the connection, but the socket itself should be cleaned up in sco_sock_release.
3. sco_sock_close. Calls to sco_sock_close in sco_sock_cleanup_listen and sco_sock_release are followed by sco_sock_kill. Hence the duplicated call should be removed.
--- net/bluetooth/sco.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-)
net/bluetooth/sco.c +1 -5
@@ -85,7 +85,6 @@ static void sco_sock_timeout(struct timer_list *t) sk->sk_state_change (sk);bh_unlock_sock (sk); -sco_sock_kill (sk);sock_put (sk); }
@@ -177,7 +176,6 @@ static void sco_conn_del(struct hci_conn *hcon, int err)sco_sock_clear_timer (sk);sco_chan_del (sk, err);bh_unlock_sock (sk); -sco_sock_kill (sk);sock_put (sk); }
@@ -394,8 +392,7 @@ static void sco_sock_cleanup_listen(struct sock *parent)*/ static void sco_sock_kill (struct sock *sk) { -if (!sock_flag (sk,SOCK_ZAPPED ) || sk->sk_socket || -sock_flag (sk,SOCK_DEAD )) +if (!sock_flag (sk,SOCK_ZAPPED ) || sk->sk_socket)return ;BT_DBG ("sk %p state %d" , sk, sk->sk_state);
@@ -447,7 +444,6 @@ static void sco_sock_close(struct sock *sk)lock_sock (sk);__sco_sock_close (sk);release_sock (sk); -sco_sock_kill (sk); } static void sco_skb_put_cmsg(struct sk_buff *skb, struct msghdr *msg,
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 194/334 drm/msm/dsi: Fix some reference counted resource leaks
In reply to Greg Kroah-HartmanFrom: Christophe JAILLET <[email protected]>
[ Upstream commit 6977cc89c87506ff17e6c05f0e37f46752256e82 ]
'of_find_device_by_node()' takes a reference that must be released when not needed anymore.
This is expected to be done in 'dsi_destroy()'.
However, there are 2 issues in 'dsi_get_phy()'.
First, if 'of_find_device_by_node()' succeeds but 'platform_get_drvdata()' returns NULL, 'msm_dsi->phy_dev' will still be NULL, and the reference won't be released in 'dsi_destroy()'.
Secondly, as 'of_find_device_by_node()' already takes a reference, there is no need for an additional 'get_device()'.
Move the assignment to 'msm_dsi->phy_dev' a few lines above and remove the unneeded 'get_device()' to solve both issues.
--- drivers/gpu/drm/msm/dsi/dsi.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/gpu/drm/msm/dsi/dsi.c +3 -3
@@ -26,8 +26,10 @@ static int dsi_get_phy(struct msm_dsi *msm_dsi) } phy_pdev =of_find_device_by_node (phy_node); -if (phy_pdev) +if (phy_pdev) { msm_dsi->phy =platform_get_drvdata (phy_pdev); + msm_dsi->phy_dev = &phy_pdev->dev; + }of_node_put (phy_node);
@@ -36,8 +38,6 @@ static int dsi_get_phy(struct msm_dsi *msm_dsi)return -EPROBE_DEFER ; } - msm_dsi->phy_dev =get_device (&phy_pdev->dev); -return 0 ; }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 195/334 drm/msm/dp: replug event is converted into an unplug followed by an plug events
In reply to Greg Kroah-HartmanFrom: Kuogee Hsieh <[email protected]>
[ Upstream commit 7e10bf427850f2d7133fd091999abd5fc1755cdb ]
Remove special handling of replug interrupt and instead treat replug event as a sequential unplug followed by a plugin event. This is needed to meet the requirements of DP Link Layer CTS test case 4.2.1.3.
Changes in V2:
-- add fixes statement
Changes in V3:
-- delete EV_HPD_REPLUG_INT
--- drivers/gpu/drm/msm/dp/dp_display.c | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-)
drivers/gpu/drm/msm/dp/dp_display.c +5 -9
@@ -55,7 +55,6 @@ enum {EV_HPD_INIT_SETUP ,EV_HPD_PLUG_INT ,EV_IRQ_HPD_INT , -EV_HPD_REPLUG_INT ,EV_HPD_UNPLUG_INT ,EV_USER_NOTIFICATION , EV_CONNECT_PENDING_TIMEOUT,
@@ -1119,9 +1118,6 @@ static int hpd_event_thread(void *data)case EV_IRQ_HPD_INT :dp_irq_hpd_handle (dp_priv, todo->data);break ; -case EV_HPD_REPLUG_INT : -/* do nothing */ -break ;case EV_USER_NOTIFICATION :dp_display_send_hpd_notification (dp_priv, todo->data);
@@ -1165,10 +1161,8 @@ static irqreturn_t dp_display_irq_handler(int irq, void *dev_id)if (hpd_isr_status &0x0F ) {/* hpd related interrupts */ -if (hpd_isr_status &DP_DP_HPD_PLUG_INT_MASK || - hpd_isr_status &DP_DP_HPD_REPLUG_INT_MASK ) { +if (hpd_isr_status &DP_DP_HPD_PLUG_INT_MASK )dp_add_event (dp,EV_HPD_PLUG_INT ,0 ,0 ); - }if (hpd_isr_status &DP_DP_IRQ_HPD_INT_MASK ) {/* stop sentinel connect pending checking */
@@ -1176,8 +1170,10 @@ static irqreturn_t dp_display_irq_handler(int irq, void *dev_id)dp_add_event (dp,EV_IRQ_HPD_INT ,0 ,0 ); } -if (hpd_isr_status &DP_DP_HPD_REPLUG_INT_MASK ) -dp_add_event (dp,EV_HPD_REPLUG_INT ,0 ,0 ); +if (hpd_isr_status &DP_DP_HPD_REPLUG_INT_MASK ) { +dp_add_event (dp,EV_HPD_UNPLUG_INT ,0 ,0 ); +dp_add_event (dp,EV_HPD_PLUG_INT ,0 ,3 ); + }if (hpd_isr_status &DP_DP_HPD_UNPLUG_INT_MASK )dp_add_event (dp,EV_HPD_UNPLUG_INT ,0 ,0 );
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 196/334 net/mlx5: Fix unpublish devlink parameters
In reply to Greg Kroah-HartmanFrom: Parav Pandit <[email protected]>
[ Upstream commit 6f35723864b42ec9e9bb95a503449633395c4975 ]
Cleanup routine missed to unpublish the parameters. Add it.
--- drivers/net/ethernet/mellanox/mlx5/core/devlink.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/ethernet/mellanox/mlx5/core/devlink.c +1 -0
@@ -670,6 +670,7 @@ params_reg_err:void mlx5_devlink_unregister (struct devlink *devlink) {mlx5_devlink_traps_unregister (devlink); +devlink_params_unpublish (devlink);devlink_params_unregister (devlink, mlx5_devlink_params,ARRAY_SIZE (mlx5_devlink_params));devlink_unregister (devlink);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 197/334 ASoC: rt5682: Properly turn off regulators if wrong device ID
In reply to Greg Kroah-HartmanFrom: Douglas Anderson <[email protected]>
[ Upstream commit 772d44526e203c062171786e514373f129616278 ]
When I booted up on a board that had a slightly different codec stuffed on it, I got this message at bootup:
rt5682 9-001a: Device with ID register 6749 is not rt5682
That's normal/expected, but what wasn't normal was the splat that I got after:
WARNING: CPU: 7 PID: 176 at drivers/regulator/core.c:2151 _regulator_put+0x150/0x158 pc : _regulator_put+0x150/0x158 ... Call trace: _regulator_put+0x150/0x158 regulator_bulk_free+0x48/0x70 devm_regulator_bulk_release+0x20/0x2c release_nodes+0x1cc/0x244 devres_release_all+0x44/0x60 really_probe+0x17c/0x378 ...
This is because the error paths don't turn off the regulator. Let's fix that.
--- sound/soc/codecs/rt5682-i2c.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-)
sound/soc/codecs/rt5682-i2c.c +12 -1
@@ -117,6 +117,13 @@ static struct snd_soc_dai_driver rt5682_dai[] = { }, }; +static void rt5682_i2c_disable_regulators (void *data) +{ +struct rt5682_priv *rt5682 = data; + +regulator_bulk_disable (ARRAY_SIZE (rt5682->supplies), rt5682->supplies); +} +static int rt5682_i2c_probe (struct i2c_client *i2c,const struct i2c_device_id *id) {
@@ -157,6 +164,11 @@ static int rt5682_i2c_probe(struct i2c_client *i2c,return ret; } + ret =devm_add_action_or_reset (&i2c->dev, rt5682_i2c_disable_regulators, + rt5682); +if (ret) +return ret; + ret =regulator_bulk_enable (ARRAY_SIZE (rt5682->supplies), rt5682->supplies);if (ret) {
@@ -285,7 +297,6 @@ static int rt5682_i2c_remove(struct i2c_client *client)struct rt5682_priv *rt5682 =i2c_get_clientdata (client);rt5682_i2c_shutdown (client); -regulator_bulk_disable (ARRAY_SIZE (rt5682->supplies), rt5682->supplies);return 0 ; }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 198/334 drm/bridge: ti-sn65dsi86: Avoid creating multiple connectors
In reply to Greg Kroah-HartmanFrom: Rob Clark <[email protected]>
[ Upstream commit c7782443a88926a4f938f0193041616328cf2db2 ]
If we created our own connector because the driver does not support the NO_CONNECTOR flag, we don't want the downstream bridge to *also* create a connector. And if this driver did pass the NO_CONNECTOR flag (and we supported that mode) this would change nothing.
--- drivers/gpu/drm/bridge/ti-sn65dsi86.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/gpu/drm/bridge/ti-sn65dsi86.c +3 -0
@@ -531,6 +531,9 @@ static int ti_sn_bridge_attach(struct drm_bridge *bridge, } pdata->dsi = dsi; +/* We never want the next bridge to *also* create a connector: */ + flags |=DRM_BRIDGE_ATTACH_NO_CONNECTOR ; +/* Attach the next bridge */ ret =drm_bridge_attach (bridge->encoder, pdata->next_bridge, &pdata->bridge, flags);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 199/334 usb: dwc3: meson-g12a: add IRQ check
In reply to Greg Kroah-HartmanFrom: Sergey Shtylyov <[email protected]>
[ Upstream commit baa2986bda3f7b2386607587a4185e3dff8f98df ]
The driver neglects to check the result of platform_get_irq()'s call and blithely passes the negative error codes to devm_request_threaded_irq() (which takes *unsigned* IRQ #), causing it to fail with -EINVAL, overriding an original error code. Stop calling devm_request_threaded_irq() with the invalid IRQ #s.
--- drivers/usb/dwc3/dwc3-meson-g12a.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/usb/dwc3/dwc3-meson-g12a.c +2 -0
@@ -598,6 +598,8 @@ static int dwc3_meson_g12a_otg_init(struct platform_device *pdev, USB_R5_ID_DIG_IRQ, 0); irq =platform_get_irq (pdev,0 ); +if (irq <0 ) +return irq; ret =devm_request_threaded_irq (&pdev->dev, irq,NULL , dwc3_meson_g12a_irq_thread,IRQF_ONESHOT , pdev->name, priv);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 200/334 usb: dwc3: qcom: add IRQ check
In reply to Greg Kroah-HartmanFrom: Sergey Shtylyov <[email protected]>
[ Upstream commit 175006956740f70ca23394c58f8d7804776741bd ]
In dwc3_qcom_acpi_register_core(), the driver neglects to check the result of platform_get_irq()'s call and blithely assigns the negative error codes to the allocated child device's IRQ resource and then passing this resource to platform_device_add_resources() and later causing dwc3_otg_get_irq() to fail anyway. Stop calling platform_device_add_resources() with the invalid IRQ #s, so that there's less complexity in the IRQ error checking.
--- drivers/usb/dwc3/dwc3-qcom.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/usb/dwc3/dwc3-qcom.c +4 -0
@@ -614,6 +614,10 @@ static int dwc3_qcom_acpi_register_core(struct platform_device *pdev) qcom->acpi_pdata->dwc3_core_base_size; irq =platform_get_irq (pdev_irq,0 ); +if (irq <0 ) { + ret = irq; + goto out; + } child_res[1 ].flags =IORESOURCE_IRQ ; child_res[1 ].start = child_res[1 ].end = irq;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 201/334 usb: gadget: udc: at91: add IRQ check
In reply to Greg Kroah-HartmanFrom: Sergey Shtylyov <[email protected]>
[ Upstream commit 50855c31573b02963f0aa2aacfd4ea41c31ae0e0 ]
The driver neglects to check the result of platform_get_irq()'s call and blithely passes the negative error codes to devm_request_irq() (which takes *unsigned* IRQ #), causing it to fail with -EINVAL, overriding an original error code. Stop calling devm_request_irq() with the invalid IRQ #s.
--- drivers/usb/gadget/udc/at91_udc.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/usb/gadget/udc/at91_udc.c +3 -1
@@ -1876,7 +1876,9 @@ static int at91udc_probe(struct platform_device *pdev)clk_disable (udc->iclk);/* request UDC and maybe VBUS irqs */ - udc->udp_irq =platform_get_irq (pdev,0 ); + udc->udp_irq = retval =platform_get_irq (pdev,0 ); +if (retval <0 ) + goto err_unprepare_iclk; retval =devm_request_irq (dev, udc->udp_irq, at91_udc_irq,0 , driver_name, udc);if (retval) {
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 202/334 usb: gadget: udc: s3c2410: add IRQ check
In reply to Greg Kroah-HartmanFrom: Sergey Shtylyov <[email protected]>
[ Upstream commit ecff88e819e31081d41cd05bb199b9bd10e13e90 ]
The driver neglects to check the result of platform_get_irq()'s call and blithely passes the negative error codes to request_irq() (which takes *unsigned* IRQ #), causing it to fail with -EINVAL, overriding an original error code. Stop calling request_irq() with the invalid IRQ #s.
--- drivers/usb/gadget/udc/s3c2410_udc.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/usb/gadget/udc/s3c2410_udc.c +4 -0
@@ -1784,6 +1784,10 @@ static int s3c2410_udc_probe(struct platform_device *pdev)s3c2410_udc_reinit (udc); irq_usbd =platform_get_irq (pdev,0 ); +if (irq_usbd <0 ) { + retval = irq_usbd; + goto err_udc_clk; + }/* irq setup after old hardware state is cleaned up */ retval = request_irq(irq_usbd, s3c2410_udc_irq,
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 203/334 mac80211: remove unnecessary NULL check in ieee80211_register_hw()
In reply to Greg Kroah-HartmanFrom: Dan Carpenter <[email protected]>
[ Upstream commit 4a11174d6dbd0bde6d5a1d6efb0d70f58811db55 ]
The address "&sband->iftype_data[i]" points to an array at the end of struct. It can't be NULL and so the check can be removed.
--- net/mac80211/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/mac80211/main.c +1 -1
@@ -1020,7 +1020,7 @@ int ieee80211_register_hw(struct ieee80211_hw *hw) iftd = &sband->iftype_data[i]; - supp_he = supp_he || (iftd && iftd->he_cap.has_he); + supp_he = supp_he || iftd->he_cap.has_he; }/* HT, VHT, HE require QoS, thus >= 4 queues */
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 204/334 usb: misc: brcmstb-usb-pinmap: add IRQ check
In reply to Greg Kroah-HartmanFrom: Sergey Shtylyov <[email protected]>
[ Upstream commit 711087f342914e831269438ff42cf59bb0142c71 ]
The driver neglects to check the result of platform_get_irq()'s call and blithely passes the negative error codes to devm_request_irq() (which takes *unsigned* IRQ #), causing it to fail with -EINVAL, overriding an original error code. Stop calling devm_request_irq() with the invalid IRQ #s.
--- drivers/usb/misc/brcmstb-usb-pinmap.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/usb/misc/brcmstb-usb-pinmap.c +2 -0
@@ -293,6 +293,8 @@ static int __init brcmstb_usb_pinmap_probe(struct platform_device *pdev)/* Enable interrupt for out pins */ irq =platform_get_irq (pdev,0 ); +if (irq <0 ) +return irq; err = devm_request_irq(&pdev->dev, irq, brcmstb_usb_pinmap_ovr_isr, IRQF_TRIGGER_RISING,
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 205/334 usb: phy: fsl-usb: add IRQ check
In reply to Greg Kroah-HartmanFrom: Sergey Shtylyov <[email protected]>
[ Upstream commit ecc2f30dbb25969908115c81ec23650ed982b004 ]
The driver neglects to check the result of platform_get_irq()'s call and blithely passes the negative error codes to request_irq() (which takes *unsigned* IRQ #), causing it to fail with -EINVAL, overriding an original error code. Stop calling request_irq() with the invalid IRQ #s.
--- drivers/usb/phy/phy-fsl-usb.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/usb/phy/phy-fsl-usb.c +2 -0
@@ -873,6 +873,8 @@ int usb_otg_start(struct platform_device *pdev)/* request irq */ p_otg->irq =platform_get_irq (pdev,0 ); +if (p_otg->irq <0 ) +return p_otg->irq; status =request_irq (p_otg->irq, fsl_otg_isr,IRQF_SHARED , driver_name, p_otg);if (status) {
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 206/334 usb: phy: twl6030: add IRQ checks
In reply to Greg Kroah-HartmanFrom: Sergey Shtylyov <[email protected]>
[ Upstream commit 0881e22c06e66af0b64773c91c8868ead3d01aa1 ]
The driver neglects to check the result of platform_get_irq()'s calls and blithely passes the negative error codes to request_threaded_irq() (which takes *unsigned* IRQ #), causing them both to fail with -EINVAL, overriding an original error code. Stop calling request_threaded_irq() with the invalid IRQ #s.
--- drivers/usb/phy/phy-twl6030-usb.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/usb/phy/phy-twl6030-usb.c +5 -0
@@ -348,6 +348,11 @@ static int twl6030_usb_probe(struct platform_device *pdev) twl->irq2 =platform_get_irq (pdev,1 ); twl->linkstat =MUSB_UNKNOWN ; +if (twl->irq1 <0 ) +return twl->irq1; +if (twl->irq2 <0 ) +return twl->irq2; + twl->comparator.set_vbus = twl6030_set_vbus; twl->comparator.start_srp = twl6030_start_srp;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 207/334 usb: gadget: udc: renesas_usb3: Fix soc_device_match() abuse
In reply to Greg Kroah-HartmanFrom: Geert Uytterhoeven <[email protected]>
[ Upstream commit cea45a3bd2dd4d9c35581328f571afd32b3c9f48 ]
soc_device_match() is intended as a last resort, to handle e.g. quirks that cannot be handled by matching based on a compatible value.
As the device nodes for the Renesas USB 3.0 Peripheral Controller on R-Car E3 and RZ/G2E do have SoC-specific compatible values, the latter can and should be used to match against these devices.
This also fixes support for the USB 3.0 Peripheral Controller on the R-Car E3e (R8A779M6) SoC, which is a different grading of the R-Car E3 (R8A77990) SoC, using the same SoC-specific compatible value.
--- drivers/usb/gadget/udc/renesas_usb3.c | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-)
drivers/usb/gadget/udc/renesas_usb3.c +7 -10
@@ -2707,10 +2707,15 @@ static const struct renesas_usb3_priv renesas_usb3_priv_r8a77990 = {static const struct of_device_id usb3_of_match[] = { { + .compatible ="renesas,r8a774c0-usb3-peri" , + .data = &renesas_usb3_priv_r8a77990, + }, { .compatible ="renesas,r8a7795-usb3-peri" , .data = &renesas_usb3_priv_gen3, - }, - { + }, { + .compatible ="renesas,r8a77990-usb3-peri" , + .data = &renesas_usb3_priv_r8a77990, + }, { .compatible ="renesas,rcar-gen3-usb3-peri" , .data = &renesas_usb3_priv_gen3, },
@@ -2719,18 +2724,10 @@ static const struct of_device_id usb3_of_match[] = {MODULE_DEVICE_TABLE (of, usb3_of_match);static const struct soc_device_attribute renesas_usb3_quirks_match[] = { - { - .soc_id ="r8a774c0" , - .data = &renesas_usb3_priv_r8a77990, - }, { .soc_id ="r8a7795" , .revision ="ES1.*" , .data = &renesas_usb3_priv_r8a7795_es1, }, - { - .soc_id ="r8a77990" , - .data = &renesas_usb3_priv_r8a77990, - }, {/* sentinel */ }, };
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 208/334 selftests/bpf: Fix test_core_autosize on big-endian machines
In reply to Greg Kroah-HartmanFrom: Ilya Leoshkevich <[email protected]>
[ Upstream commit d164dd9a5c08c16a883b3de97d13948c7be7fa4d ]
The "probed" part of test_core_autosize copies an integer using bpf_core_read() into an integer of a potentially different size. On big-endian machines a destination offset is required for this to produce a sensible result.
--- .../selftests/bpf/progs/test_core_autosize.c | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-)
tools/testing/selftests/bpf/progs/test_core_autosize.c +15 -5
@@ -125,6 +125,16 @@ int handle_downsize(void *ctx)return 0 ; } +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ +#define bpf_core_read_int bpf_core_read +#else +#define bpf_core_read_int(dst, sz, src) ({ \ + /* Prevent "subtraction from stack pointer prohibited" */ \ + volatile long __off = sizeof(*dst) - (sz); \ + bpf_core_read((char *)(dst) + __off, sz, src); \ +}) +#endif + SEC("raw_tp/sys_enter")int handle_probed (void *ctx) {
@@ -132,23 +142,23 @@ int handle_probed(void *ctx)__u64 tmp; tmp =0 ; -bpf_core_read (&tmp,bpf_core_field_size (in->ptr), &in->ptr); +bpf_core_read_int (&tmp,bpf_core_field_size (in->ptr), &in->ptr); ptr_probed = tmp; tmp =0 ; -bpf_core_read (&tmp,bpf_core_field_size (in->val1), &in->val1); +bpf_core_read_int (&tmp,bpf_core_field_size (in->val1), &in->val1); val1_probed = tmp; tmp =0 ; -bpf_core_read (&tmp,bpf_core_field_size (in->val2), &in->val2); +bpf_core_read_int (&tmp,bpf_core_field_size (in->val2), &in->val2); val2_probed = tmp; tmp =0 ; -bpf_core_read (&tmp,bpf_core_field_size (in->val3), &in->val3); +bpf_core_read_int (&tmp,bpf_core_field_size (in->val3), &in->val3); val3_probed = tmp; tmp =0 ; -bpf_core_read (&tmp,bpf_core_field_size (in->val4), &in->val4); +bpf_core_read_int (&tmp,bpf_core_field_size (in->val4), &in->val4); val4_probed = tmp;return 0 ;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 209/334 devlink: Clear whole devlink_flash_notify struct
In reply to Greg Kroah-HartmanFrom: Leon Romanovsky <[email protected]>
[ Upstream commit ed43fbac717882165a2a4bd64f7b1f56f7467bb7 ]
The { 0 } doesn't clear all fields in the struct, but tells to the compiler to set all fields to zero and doesn't touch any sub-fields if they exists.
The {} is an empty initialiser that instructs to fully initialize whole struct including sub-fields, which is error-prone for future devlink_flash_notify extensions.
--- net/core/devlink.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
net/core/devlink.c +2 -2
@@ -4125,7 +4125,7 @@ out_free_msg:static void devlink_flash_update_begin_notify (struct devlink *devlink) { -struct devlink_flash_notify params = {0 }; +struct devlink_flash_notify params = {}; __devlink_flash_update_notify(devlink, DEVLINK_CMD_FLASH_UPDATE,
@@ -4134,7 +4134,7 @@ static void devlink_flash_update_begin_notify(struct devlink *devlink)static void devlink_flash_update_end_notify (struct devlink *devlink) { -struct devlink_flash_notify params = {0 }; +struct devlink_flash_notify params = {}; __devlink_flash_update_notify(devlink, DEVLINK_CMD_FLASH_UPDATE_END,
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 210/334 samples: pktgen: add missing IPv6 option to pktgen scripts
In reply to Greg Kroah-HartmanFrom: Juhee Kang <[email protected]>
[ Upstream commit 0f0c4f1b72e090b23131700bb155944cc28b2a7b ]
Currently, "sample04" and "sample05" are not working properly when running with an IPv6 option("-6"). The commit 0f06a6787e05 ("samples:
Add an IPv6 "-6" option to the pktgen scripts") has omitted the addition of this option at "sample04" and "sample05".
In order to support IPv6 option, this commit adds logic related to IPv6 option.
--- samples/pktgen/pktgen_sample04_many_flows.sh | 12 +++++++----- samples/pktgen/pktgen_sample05_flow_per_thread.sh | 12 +++++++----- 2 files changed, 14 insertions(+), 10 deletions(-)
samples/pktgen/pktgen_sample04_many_flows.sh +7 -5
@@ -13,13 +13,15 @@ root_check_run_with_sudo "$@" # Parameter parsing via include source ${basedir}/parameters.sh # Set some default params, if they didn't get set -[ -z "$DEST_IP" ] && DEST_IP="198.18.0.42" +if [ -z "$DEST_IP" ]; then + [ -z "$IP6" ] && DEST_IP="198.18.0.42" || DEST_IP="FD00::1" +fi [ -z "$DST_MAC" ] && DST_MAC="90:e2:ba:ff:ff:ff" [ -z "$CLONE_SKB" ] && CLONE_SKB="0" [ -z "$COUNT" ] && COUNT="0" # Zero means indefinitely if [ -n "$DEST_IP" ]; then - validate_addr $DEST_IP - read -r DST_MIN DST_MAX <<< $(parse_addr $DEST_IP) + validate_addr${IP6} $DEST_IP + read -r DST_MIN DST_MAX <<< $(parse_addr${IP6} $DEST_IP) fi if [ -n "$DST_PORT" ]; then read -r UDP_DST_MIN UDP_DST_MAX <<< $(parse_ports $DST_PORT)
@@ -62,8 +64,8 @@ for ((thread = $F_THREAD; thread <= $L_THREAD; thread++)); do # Single destination pg_set $dev "dst_mac $DST_MAC" - pg_set $dev "dst_min $DST_MIN" - pg_set $dev "dst_max $DST_MAX" + pg_set $dev "dst${IP6}_min $DST_MIN" + pg_set $dev "dst${IP6}_max $DST_MAX" if [ -n "$DST_PORT" ]; then # Single destination port or random port range
samples/pktgen/pktgen_sample05_flow_per_thread.sh +7 -5
@@ -17,14 +17,16 @@ root_check_run_with_sudo "$@" # Parameter parsing via include source ${basedir}/parameters.sh # Set some default params, if they didn't get set -[ -z "$DEST_IP" ] && DEST_IP="198.18.0.42" +if [ -z "$DEST_IP" ]; then + [ -z "$IP6" ] && DEST_IP="198.18.0.42" || DEST_IP="FD00::1" +fi [ -z "$DST_MAC" ] && DST_MAC="90:e2:ba:ff:ff:ff" [ -z "$CLONE_SKB" ] && CLONE_SKB="0" [ -z "$BURST" ] && BURST=32 [ -z "$COUNT" ] && COUNT="0" # Zero means indefinitely if [ -n "$DEST_IP" ]; then - validate_addr $DEST_IP - read -r DST_MIN DST_MAX <<< $(parse_addr $DEST_IP) + validate_addr${IP6} $DEST_IP + read -r DST_MIN DST_MAX <<< $(parse_addr${IP6} $DEST_IP) fi if [ -n "$DST_PORT" ]; then read -r UDP_DST_MIN UDP_DST_MAX <<< $(parse_ports $DST_PORT)
@@ -52,8 +54,8 @@ for ((thread = $F_THREAD; thread <= $L_THREAD; thread++)); do # Single destination pg_set $dev "dst_mac $DST_MAC" - pg_set $dev "dst_min $DST_MIN" - pg_set $dev "dst_max $DST_MAX" + pg_set $dev "dst${IP6}_min $DST_MIN" + pg_set $dev "dst${IP6}_max $DST_MAX" if [ -n "$DST_PORT" ]; then # Single destination port or random port range
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 211/334 net: stmmac: fix INTR TBU status affecting irq count statistic
In reply to Greg Kroah-HartmanFrom: Voon Weifeng <[email protected]>
[ Upstream commit 1975df880b959e30f28d66148a12d77b458abd76 ]
DMA channel status "Transmit buffer unavailable(TBU)" bit is not considered as a successful dma tx. Hence, it should not affect all the irq count statistic.
--- drivers/net/ethernet/stmicro/stmmac/dwmac4_lib.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/net/ethernet/stmicro/stmmac/dwmac4_lib.c +3 -2
@@ -172,11 +172,12 @@ int dwmac4_dma_interrupt(void __iomem *ioaddr, x->rx_normal_irq_n++; ret |= handle_rx; } -if (likely (intr_status & (DMA_CHAN_STATUS_TI | -DMA_CHAN_STATUS_TBU ))) { +if (likely (intr_status &DMA_CHAN_STATUS_TI )) { x->tx_normal_irq_n++; ret |= handle_tx; } +if (unlikely (intr_status &DMA_CHAN_STATUS_TBU )) + ret |= handle_tx;if (unlikely (intr_status &DMA_CHAN_STATUS_ERI )) x->rx_early_irq++;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 212/334 Bluetooth: Move shutdown callback before flushing tx and rx queue
In reply to Greg Kroah-HartmanFrom: Kai-Heng Feng <[email protected]>
[ Upstream commit 0ea53674d07fb6db2dd7a7ec2fdc85a12eb246c2 ]
Commit 0ea9fd001a14 ("Bluetooth: Shutdown controller after workqueues are flushed or cancelled") introduced a regression that makes mtkbtsdio driver stops working:
[ 36.593956] Bluetooth: hci0: Firmware already downloaded [ 46.814613] Bluetooth: hci0: Execution of wmt command timed out [ 46.814619] Bluetooth: hci0: Failed to send wmt func ctrl (-110)
The shutdown callback depends on the result of hdev->rx_work, so we should call it before flushing rx_work:
-> btmtksdio_shutdown()
-> mtk_hci_wmt_sync()
-> __hci_cmd_send()
-> wait for BTMTKSDIO_TX_WAIT_VND_EVT gets cleared
-> btmtksdio_recv_event()
-> hci_recv_frame()
-> queue_work(hdev->workqueue, &hdev->rx_work)
-> clears BTMTKSDIO_TX_WAIT_VND_EVT
So move the shutdown callback before flushing TX/RX queue to resolve the issue.
--- net/bluetooth/hci_core.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-)
net/bluetooth/hci_core.c +8 -8
@@ -1727,6 +1727,14 @@ int hci_dev_do_close(struct hci_dev *hdev)hci_request_cancel_all (hdev);hci_req_sync_lock (hdev); +if (!hci_dev_test_flag (hdev,HCI_UNREGISTER ) && + !hci_dev_test_flag (hdev,HCI_USER_CHANNEL ) && +test_bit (HCI_UP , &hdev->flags)) { +/* Execute vendor specific shutdown routine */ +if (hdev->shutdown) + hdev->shutdown (hdev); + } +if (!test_and_clear_bit (HCI_UP , &hdev->flags)) {cancel_delayed_work_sync (&hdev->cmd_timer);hci_req_sync_unlock (hdev);
@@ -1798,14 +1806,6 @@ int hci_dev_do_close(struct hci_dev *hdev)clear_bit (HCI_INIT , &hdev->flags); } -if (!hci_dev_test_flag (hdev,HCI_UNREGISTER ) && - !hci_dev_test_flag (hdev,HCI_USER_CHANNEL ) && -test_bit (HCI_UP , &hdev->flags)) { -/* Execute vendor specific shutdown routine */ -if (hdev->shutdown) - hdev->shutdown (hdev); - } -/* flush cmd work */ flush_work (&hdev->cmd_work);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 213/334 PM: cpu: Make notifier chain use a raw_spinlock_t
In reply to Greg Kroah-HartmanFrom: Valentin Schneider <[email protected]>
[ Upstream commit b2f6662ac08d0e7c25574ce53623c71bdae9dd78 ]
Invoking atomic_notifier_chain_notify() requires acquiring a spinlock_t, which can block under CONFIG_PREEMPT_RT. Notifications for members of the cpu_pm notification chain will be issued by the idle task, which can never block.
Making *all* atomic_notifiers use a raw_spinlock is too big of a hammer, as only notifications issued by the idle task are problematic.
Special-case cpu_pm_notifier_chain by kludging a raw_notifier and raw_spinlock_t together, matching the atomic_notifier behavior with a raw_spinlock_t.
--- kernel/cpu_pm.c | 50 +++++++++++++++++++++++++++++++++++++------------ 1 file changed, 38 insertions(+), 12 deletions(-)
kernel/cpu_pm.c +38 -12
@@ -13,19 +13,32 @@#include <linux/spinlock.h> #include <linux/syscore_ops.h> -static ATOMIC_NOTIFIER_HEAD (cpu_pm_notifier_chain); +/* +* atomic_notifiers use a spinlock_t, which can block under PREEMPT_RT. +* Notifications for cpu_pm will be issued by the idle task itself, which can +* never block, IOW it requires using a raw_spinlock_t. +*/ +static struct { +struct raw_notifier_head chain; +raw_spinlock_t lock; +} cpu_pm_notifier = { + .chain =RAW_NOTIFIER_INIT (cpu_pm_notifier.chain), + .lock =__RAW_SPIN_LOCK_UNLOCKED (cpu_pm_notifier.lock), +};static int cpu_pm_notify (enum cpu_pm_event event) {int ret;/* -* atomic_notifier_call_chain has a RCU read critical section, which -* could be disfunctional in cpu idle. Copy RCU_NONIDLE code to let -* RCU know this. +* This introduces a RCU read critical section, which could be +* disfunctional in cpu idle. Copy RCU_NONIDLE code to let RCU know +* this. */ rcu_irq_enter_irqson (); - ret =atomic_notifier_call_chain (&cpu_pm_notifier_chain, event,NULL ); +rcu_read_lock (); + ret =raw_notifier_call_chain (&cpu_pm_notifier.chain, event,NULL ); +rcu_read_unlock ();rcu_irq_exit_irqson ();return notifier_to_errno (ret);
@@ -33,10 +46,13 @@ static int cpu_pm_notify(enum cpu_pm_event event)static int cpu_pm_notify_robust (enum cpu_pm_event event_up,enum cpu_pm_event event_down) { +unsigned long flags;int ret;rcu_irq_enter_irqson (); - ret =atomic_notifier_call_chain_robust (&cpu_pm_notifier_chain, event_up, event_down,NULL ); +raw_spin_lock_irqsave (&cpu_pm_notifier.lock, flags); + ret =raw_notifier_call_chain_robust (&cpu_pm_notifier.chain, event_up, event_down,NULL ); +raw_spin_unlock_irqrestore (&cpu_pm_notifier.lock, flags);rcu_irq_exit_irqson ();return notifier_to_errno (ret);
@@ -49,12 +65,17 @@ static int cpu_pm_notify_robust(enum cpu_pm_event event_up, enum cpu_pm_event ev* Add a driver to a list of drivers that are notified about * CPU and CPU cluster low power entry and exit. * -* This function may sleep, and has the same return conditions as -* raw_notifier_chain_register. +* This function has the same return conditions as raw_notifier_chain_register. */ int cpu_pm_register_notifier (struct notifier_block *nb) { -return atomic_notifier_chain_register (&cpu_pm_notifier_chain, nb); +unsigned long flags; +int ret; + +raw_spin_lock_irqsave (&cpu_pm_notifier.lock, flags); + ret =raw_notifier_chain_register (&cpu_pm_notifier.chain, nb); +raw_spin_unlock_irqrestore (&cpu_pm_notifier.lock, flags); +return ret; }EXPORT_SYMBOL_GPL (cpu_pm_register_notifier);
@@ -64,12 +85,17 @@ EXPORT_SYMBOL_GPL(cpu_pm_register_notifier);* * Remove a driver from the CPU PM notifier list. * -* This function may sleep, and has the same return conditions as -* raw_notifier_chain_unregister. +* This function has the same return conditions as raw_notifier_chain_unregister. */ int cpu_pm_unregister_notifier (struct notifier_block *nb) { -return atomic_notifier_chain_unregister (&cpu_pm_notifier_chain, nb); +unsigned long flags; +int ret; + +raw_spin_lock_irqsave (&cpu_pm_notifier.lock, flags); + ret =raw_notifier_chain_unregister (&cpu_pm_notifier.chain, nb); +raw_spin_unlock_irqrestore (&cpu_pm_notifier.lock, flags); +return ret; }EXPORT_SYMBOL_GPL (cpu_pm_unregister_notifier);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 214/334 usb: host: ohci-tmio: add IRQ check
In reply to Greg Kroah-HartmanFrom: Sergey Shtylyov <[email protected]>
[ Upstream commit 4ac5132e8a4300637a2da8f5d6bc7650db735b8a ]
The driver neglects to check the result of platform_get_irq()'s call and blithely passes the negative error codes to usb_add_hcd() (which takes *unsigned* IRQ #), causing request_irq() that it calls to fail with -EINVAL, overriding an original error code. Stop calling usb_add_hcd() with the invalid IRQ #s.
--- drivers/usb/host/ohci-tmio.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/usb/host/ohci-tmio.c +3 -0
@@ -202,6 +202,9 @@ static int ohci_hcd_tmio_drv_probe(struct platform_device *dev)if (!cell)return -EINVAL ; +if (irq <0 ) +return irq; + hcd =usb_create_hcd (&ohci_tmio_hc_driver, &dev->dev,dev_name (&dev->dev));if (!hcd) { ret = -ENOMEM ;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 215/334 usb: phy: tahvo: add IRQ check
In reply to Greg Kroah-HartmanFrom: Sergey Shtylyov <[email protected]>
[ Upstream commit 0d45a1373e669880b8beaecc8765f44cb0241e47 ]
The driver neglects to check the result of platform_get_irq()'s call and blithely passes the negative error codes to request_threaded_irq() (which takes *unsigned* IRQ #), causing it to fail with -EINVAL, overriding an original error code. Stop calling request_threaded_irq() with the invalid IRQ #s.
--- drivers/usb/phy/phy-tahvo.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/usb/phy/phy-tahvo.c +3 -1
@@ -393,7 +393,9 @@ static int tahvo_usb_probe(struct platform_device *pdev)dev_set_drvdata (&pdev->dev, tu); - tu->irq =platform_get_irq (pdev,0 ); + tu->irq = ret =platform_get_irq (pdev,0 ); +if (ret <0 ) +return ret; ret =request_threaded_irq (tu->irq,NULL , tahvo_usb_vbus_interrupt,IRQF_ONESHOT ,"tahvo-vbus" , tu);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 216/334 libbpf: Re-build libbpf.so when libbpf.map changes
In reply to Greg Kroah-HartmanFrom: Andrii Nakryiko <[email protected]>
[ Upstream commit 61c7aa5020e98ac2fdcf07d07eec1baf2e9f0a08 ]
Ensure libbpf.so is re-built whenever libbpf.map is modified. Without this, changes to libbpf.map are not detected and versioned symbols mismatch error will be reported until make clean && make is used, which is a suboptimal developer experience.
--- tools/lib/bpf/Makefile | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
tools/lib/bpf/Makefile +5 -5
@@ -4,8 +4,9 @@ RM ?= rm srctree = $(abs_srctree) +VERSION_SCRIPT := libbpf.map LIBBPF_VERSION := $(shell \ - grep -oE '^LIBBPF_([0-9.]+)' libbpf.map | \ + grep -oE '^LIBBPF_([0-9.]+)' $(VERSION_SCRIPT) | \ sort -rV | head -n1 | cut -d'_' -f2) LIBBPF_MAJOR_VERSION := $(firstword $(subst ., ,$(LIBBPF_VERSION)))
@@ -110,7 +111,6 @@ SHARED_OBJDIR := $(OUTPUT)sharedobjs/ STATIC_OBJDIR := $(OUTPUT)staticobjs/ BPF_IN_SHARED := $(SHARED_OBJDIR)libbpf-in.o BPF_IN_STATIC := $(STATIC_OBJDIR)libbpf-in.o -VERSION_SCRIPT := libbpf.map BPF_HELPER_DEFS := $(OUTPUT)bpf_helper_defs.h LIB_TARGET := $(addprefix $(OUTPUT),$(LIB_TARGET))
@@ -163,10 +163,10 @@ $(BPF_HELPER_DEFS): $(srctree)/tools/include/uapi/linux/bpf.h $(OUTPUT)libbpf.so: $(OUTPUT)libbpf.so.$(LIBBPF_VERSION) -$(OUTPUT)libbpf.so.$(LIBBPF_VERSION): $(BPF_IN_SHARED) +$(OUTPUT)libbpf.so.$(LIBBPF_VERSION): $(BPF_IN_SHARED) $(VERSION_SCRIPT) $(QUIET_LINK)$(CC) $(LDFLAGS) \ --shared -Wl,-soname,libbpf.so.$(LIBBPF_MAJOR_VERSION) \ - -Wl,--version-script=$(VERSION_SCRIPT) $^ -lelf -lz -o $@ + -Wl,--version-script=$(VERSION_SCRIPT) $< -lelf -lz -o $@ @ln -sf $(@F) $(OUTPUT)libbpf.so @ln -sf $(@F) $(OUTPUT)libbpf.so.$(LIBBPF_MAJOR_VERSION)
@@ -181,7 +181,7 @@ $(OUTPUT)libbpf.pc: check: check_abi -check_abi: $(OUTPUT)libbpf.so +check_abi: $(OUTPUT)libbpf.so $(VERSION_SCRIPT) @if [ "$(GLOBAL_SYM_COUNT)" != "$(VERSIONED_SYM_COUNT)" ]; then \ echo "Warning: Num of global symbols in $(BPF_IN_SHARED)" \ "($(GLOBAL_SYM_COUNT)) does NOT match with num of" \
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 217/334 mac80211: Fix insufficient headroom issue for AMSDU
In reply to Greg Kroah-HartmanFrom: Chih-Kang Chang <[email protected]>
[ Upstream commit f50d2ff8f016b79a2ff4acd5943a1eda40c545d4 ]
ieee80211_amsdu_realloc_pad() fails to account for extra_tx_headroom, the original reserved headroom might be eaten. Add the necessary extra_tx_headroom.
--- net/mac80211/tx.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
net/mac80211/tx.c +3 -1
@@ -3242,7 +3242,9 @@ static bool ieee80211_amsdu_prepare_head(struct ieee80211_sub_if_data *sdata,if (info->control.flags &IEEE80211_TX_CTRL_AMSDU )return true; -if (!ieee80211_amsdu_realloc_pad (local, skb,sizeof (*amsdu_hdr))) +if (!ieee80211_amsdu_realloc_pad (local, skb, +sizeof (*amsdu_hdr) + + local->hw.extra_tx_headroom))return false; data =skb_push (skb,sizeof (*amsdu_hdr));
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 218/334 locking/local_lock: Add missing owner initialization
In reply to Greg Kroah-HartmanFrom: Thomas Gleixner <[email protected]>
[ Upstream commit d8bbd97ad0b99a9394f2cd8410b884c48e218cf0 ]
If CONFIG_DEBUG_LOCK_ALLOC=y is enabled then local_lock_t has an 'owner' member which is checked for consistency, but nothing initialized it to zero explicitly.
The static initializer does so implicit, and the run time allocated per CPU storage is usually zero initialized as well, but relying on that is not really good practice.
--- include/linux/local_lock_internal.h | 42 ++++++++++++++++------------- 1 file changed, 23 insertions(+), 19 deletions(-)
include/linux/local_lock_internal.h +23 -19
@@ -14,29 +14,14 @@ typedef struct { } local_lock_t;#ifdef CONFIG_DEBUG_LOCK_ALLOC -# define LL_DEP_MAP_INIT (lockname) \ +# define LOCAL_LOCK_DEBUG_INIT (lockname) \ .dep_map = { \ .name = #lockname, \ .wait_type_inner = LD_WAIT_CONFIG, \ - .lock_type = LD_LOCK_PERCPU, \ - } -#else -# define LL_DEP_MAP_INIT (lockname) -#endif - -#define INIT_LOCAL_LOCK (lockname) { LL_DEP_MAP_INIT(lockname) } - -#define __local_lock_init (lock) \ -do { \ - static struct lock_class_key __key; \ - \ - debug_check_no_locks_freed((void *)lock, sizeof(*lock));\ - lockdep_init_map_type(&(lock)->dep_map, #lock, &__key, 0, \ - LD_WAIT_CONFIG, LD_WAIT_INV, \ - LD_LOCK_PERCPU); \ -} while (0) + .lock_type = LD_LOCK_PERCPU, \ + }, \ + .owner = NULL, -#ifdef CONFIG_DEBUG_LOCK_ALLOC static inline void local_lock_acquire (local_lock_t *l) {lock_map_acquire (&l->dep_map);
@@ -51,11 +36,30 @@ static inline void local_lock_release(local_lock_t *l)lock_map_release (&l->dep_map); } +static inline void local_lock_debug_init (local_lock_t *l) +{ + l->owner =NULL ; +}#else /* CONFIG_DEBUG_LOCK_ALLOC */ +# define LOCAL_LOCK_DEBUG_INIT (lockname)static inline void local_lock_acquire (local_lock_t *l) { }static inline void local_lock_release (local_lock_t *l) { } +static inline void local_lock_debug_init (local_lock_t *l) { }#endif /* !CONFIG_DEBUG_LOCK_ALLOC */ +#define INIT_LOCAL_LOCK (lockname) { LOCAL_LOCK_DEBUG_INIT(lockname) } + +#define __local_lock_init (lock) \ +do { \ + static struct lock_class_key __key; \ + \ + debug_check_no_locks_freed((void *)lock, sizeof(*lock));\ + lockdep_init_map_type(&(lock)->dep_map, #lock, &__key, \ + 0, LD_WAIT_CONFIG, LD_WAIT_INV, \ + LD_LOCK_PERCPU); \ + local_lock_debug_init(lock); \ +} while (0) +#define __local_lock (lock) \ do { \ preempt_disable(); \
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 219/334 lockd: Fix invalid lockowner cast after vfs_test_lock
In reply to Greg Kroah-HartmanFrom: Benjamin Coddington <[email protected]>
[ Upstream commit cd2d644ddba183ec7b451b7c20d5c7cc06fcf0d7 ]
After calling vfs_test_lock() the pointer to a conflicting lock can be returned, and that lock is not guarunteed to be owned by nlm. In that case, we cannot cast it to struct nlm_lockowner. Instead return the pid of that conflicting lock.
--- fs/lockd/svclock.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/lockd/svclock.c +1 -1
@@ -634,7 +634,7 @@ nlmsvc_testlock(struct svc_rqst *rqstp, struct nlm_file *file, conflock->caller ="somehost" ;/* FIXME */ conflock->len =strlen (conflock->caller); conflock->oh.len =0 ;/* don't return OH info */ - conflock->svid = ((struct nlm_lockowner *)lock->fl.fl_owner)->pid; + conflock->svid = lock->fl.fl_pid; conflock->fl.fl_type = lock->fl.fl_type; conflock->fl.fl_start = lock->fl.fl_start; conflock->fl.fl_end = lock->fl.fl_end;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 220/334 SUNRPC: Fix a NULL pointer deref in trace_svc_stats_latency()
In reply to Greg Kroah-HartmanFrom: Chuck Lever <[email protected]>
[ Upstream commit 5c11720767f70d34357d00a15ba5a0ad052c40fe ]
Some paths through svc_process() leave rqst->rq_procinfo set to NULL, which triggers a crash if tracing happens to be enabled.
--- include/linux/sunrpc/svc.h | 1 + include/trace/events/sunrpc.h | 8 ++++---- net/sunrpc/svc.c | 15 +++++++++++++++ 3 files changed, 20 insertions(+), 4 deletions(-)
include/linux/sunrpc/svc.h +1 -0
@@ -523,6 +523,7 @@ void svc_wake_up(struct svc_serv *);void svc_reserve (struct svc_rqst *rqstp,int space);struct svc_pool *svc_pool_for_cpu (struct svc_serv *serv,int cpu);char *svc_print_addr (struct svc_rqst *,char *,size_t ); +const char *svc_proc_name (const struct svc_rqst *rqstp);int svc_encode_result_payload (struct svc_rqst *rqstp,unsigned int offset,unsigned int length);
include/trace/events/sunrpc.h +4 -4
@@ -1642,7 +1642,7 @@ TRACE_EVENT(svc_process, __field(u32, vers) __field(u32, proc) __string(service, name) - __string(procedure, rqst->rq_procinfo->pc_name) + __string(procedure, svc_proc_name(rqst))__string (addr, rqst->rq_xprt ? rqst->rq_xprt->xpt_remotebuf :"(null)" ) ),
@@ -1652,7 +1652,7 @@ TRACE_EVENT(svc_process, __entry->vers = rqst->rq_vers; __entry->proc = rqst->rq_proc;__assign_str (service, name); -__assign_str (procedure, rqst->rq_procinfo->pc_name); +__assign_str (procedure,svc_proc_name (rqst));__assign_str (addr, rqst->rq_xprt ? rqst->rq_xprt->xpt_remotebuf :"(null)" ); ),
@@ -1918,7 +1918,7 @@ TRACE_EVENT(svc_stats_latency,TP_STRUCT__entry (__field (u32 ,xid ) __field(unsigned long, execute) - __string(procedure, rqst->rq_procinfo->pc_name) +__string (procedure,svc_proc_name (rqst)) __string(addr, rqst->rq_xprt->xpt_remotebuf) ),
@@ -1926,7 +1926,7 @@ TRACE_EVENT(svc_stats_latency, __entry->xid =be32_to_cpu (rqst->rq_xid); __entry->execute =ktime_to_us (ktime_sub (ktime_get (), rqst->rq_stime)); -__assign_str (procedure, rqst->rq_procinfo->pc_name); +__assign_str (procedure,svc_proc_name (rqst));__assign_str (addr, rqst->rq_xprt->xpt_remotebuf); ),
net/sunrpc/svc.c +15 -0
@@ -1629,6 +1629,21 @@ u32 svc_max_payload(const struct svc_rqst *rqstp) }EXPORT_SYMBOL_GPL (svc_max_payload); +/** +* svc_proc_name - Return RPC procedure name in string form +* @rqstp: svc_rqst to operate on +* +* Return value: +* Pointer to a NUL-terminated string +*/ +const char *svc_proc_name (const struct svc_rqst *rqstp) +{ +if (rqstp && rqstp->rq_procinfo) +return rqstp->rq_procinfo->pc_name; +return "unknown" ; +} + +/** * svc_encode_result_payload - mark a range of bytes as a result payload * @rqstp: svc_rqst to operate on
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 221/334 nfsd4: Fix forced-expiry locking
In reply to Greg Kroah-HartmanFrom: J. Bruce Fields <[email protected]>
[ Upstream commit f7104cc1a9159cd0d3e8526cb638ae0301de4b61 ]
This should use the network-namespace-wide client_lock, not the per-client cl_lock.
You shouldn't see any bugs unless you're actually using the forced-expiry interface introduced by 89c905beccbb.
--- fs/nfsd/nfs4state.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
fs/nfsd/nfs4state.c +2 -2
@@ -2687,9 +2687,9 @@ static void force_expire_client(struct nfs4_client *clp)trace_nfsd_clid_admin_expired (&clp->cl_clientid); -spin_lock (&clp->cl_lock); +spin_lock (&nn->client_lock); clp->cl_time =0 ; -spin_unlock (&clp->cl_lock); +spin_unlock (&nn->client_lock);wait_event (expiry_wq,atomic_read (&clp->cl_rpc_users) ==0 );spin_lock (&nn->client_lock);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 222/334 arm64: dts: marvell: armada-37xx: Extend PCIe MEM space
In reply to Greg Kroah-HartmanFrom: Pali Rohár <[email protected]>
[ Upstream commit 514ef1e62d6521c2199d192b1c71b79d2aa21d5a ]
Current PCIe MEM space of size 16 MB is not enough for some combination of PCIe cards (e.g. NVMe disk together with ath11k wifi card). ARM Trusted Firmware for Armada 3700 platform already assigns 128 MB for PCIe window, so extend PCIe MEM space to the end of 128 MB PCIe window which allows to allocate more PCIe BARs for more PCIe cards.
Without this change some combination of PCIe cards cannot be used and kernel show error messages in dmesg during initialization:
pci 0000:00:00.0: BAR 8: no space for [mem size 0x01800000]
pci 0000:00:00.0: BAR 8: failed to assign [mem size 0x01800000]
pci 0000:00:00.0: BAR 6: assigned [mem 0xe8000000-0xe80007ff pref]
pci 0000:01:00.0: BAR 8: no space for [mem size 0x01800000]
pci 0000:01:00.0: BAR 8: failed to assign [mem size 0x01800000]
pci 0000:02:03.0: BAR 8: no space for [mem size 0x01000000]
pci 0000:02:03.0: BAR 8: failed to assign [mem size 0x01000000]
pci 0000:02:07.0: BAR 8: no space for [mem size 0x00100000]
pci 0000:02:07.0: BAR 8: failed to assign [mem size 0x00100000]
pci 0000:03:00.0: BAR 0: no space for [mem size 0x01000000 64bit]
pci 0000:03:00.0: BAR 0: failed to assign [mem size 0x01000000 64bit]Due to bugs in U-Boot port for Turris Mox, the second range in Turris Mox kernel DTS file for PCIe must start at 16 MB offset. Otherwise U-Boot crashes during loading of kernel DTB file. This bug is present only in U-Boot code for Turris Mox and therefore other Armada 3700 devices are not affected by this bug. Bug is fixed in U-Boot version 2021.07.
To not break booting new kernels on existing versions of U-Boot on Turris Mox, use first 16 MB range for IO and second range with rest of PCIe window for MEM.
--- .../boot/dts/marvell/armada-3720-turris-mox.dts | 17 +++++++++++++++++ arch/arm64/boot/dts/marvell/armada-37xx.dtsi | 11 +++++++++-- 2 files changed, 26 insertions(+), 2 deletions(-)
arch/arm64/boot/dts/marvell/armada-3720-turris-mox.dts +17 -0
@@ -135,6 +135,23 @@ pinctrl-0 = <&pcie_reset_pins &pcie_clkreq_pins>; status = "okay"; reset-gpios = <&gpiosb 3 GPIO_ACTIVE_LOW>; + /* + * U-Boot port for Turris Mox has a bug which always expects that "ranges" DT property + * contains exactly 2 ranges with 3 (child) address cells, 2 (parent) address cells and + * 2 size cells and also expects that the second range starts at 16 MB offset. If these + * conditions are not met then U-Boot crashes during loading kernel DTB file. PCIe address + * space is 128 MB long, so the best split between MEM and IO is to use fixed 16 MB window + * for IO and the rest 112 MB (64+32+16) for MEM, despite that maximal IO size is just 64 kB. + * This bug is not present in U-Boot ports for other Armada 3700 devices and is fixed in + * U-Boot version 2021.07. See relevant U-Boot commits (the last one contains fix): + * https://source.denx.de/u-boot/u-boot/-/commit/cb2ddb291ee6fcbddd6d8f4ff49089dfe580f5d7 + * https://source.denx.de/u-boot/u-boot/-/commit/c64ac3b3185aeb3846297ad7391fc6df8ecd73bf + * https://source.denx.de/u-boot/u-boot/-/commit/4a82fca8e330157081fc132a591ebd99ba02ee33 + */ + #address-cells = <3>; + #size-cells = <2>; + ranges = <0x81000000 0 0xe8000000 0 0xe8000000 0 0x01000000 /* Port 0 IO */ + 0x82000000 0 0xe9000000 0 0xe9000000 0 0x07000000>; /* Port 0 MEM */ /* enabled by U-Boot if PCIe module is present */ status = "disabled";
arch/arm64/boot/dts/marvell/armada-37xx.dtsi +9 -2
@@ -489,8 +489,15 @@ #interrupt-cells = <1>; msi-parent = <&pcie0>; msi-controller; - ranges = <0x82000000 0 0xe8000000 0 0xe8000000 0 0x1000000 /* Port 0 MEM */ - 0x81000000 0 0xe9000000 0 0xe9000000 0 0x10000>; /* Port 0 IO*/ + /* + * The 128 MiB address range [0xe8000000-0xf0000000] is + * dedicated for PCIe and can be assigned to 8 windows + * with size a power of two. Use one 64 KiB window for + * IO at the end and the remaining seven windows + * (totaling 127 MiB) for MEM. + */ + ranges = <0x82000000 0 0xe8000000 0 0xe8000000 0 0x07f00000 /* Port 0 MEM */ + 0x81000000 0 0xefff0000 0 0xefff0000 0 0x00010000>; /* Port 0 IO */ interrupt-map-mask = <0 0 0 7>; interrupt-map = <0 0 0 1 &pcie_intc 0>, <0 0 0 2 &pcie_intc 1>,
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 223/334 clk: staging: correct reference to config IOMEM to config HAS_IOMEM
In reply to Greg Kroah-HartmanFrom: Lukas Bulwahn <[email protected]>
[ Upstream commit cbfa6f33e3a685c329d78e06b0cf1dcb23c9d849 ]
Commit 0a0a66c984b3 ("clk: staging: Specify IOMEM dependency for Xilinx Clocking Wizard driver") introduces a dependency on the non-existing config IOMEM, which basically makes it impossible to include this driver into any build. Fortunately, ./scripts/checkkconfigsymbols.py warns:
IOMEM
Referencing files: drivers/staging/clocking-wizard/Kconfig
The config for IOMEM support is called HAS_IOMEM. Correct this reference to the intended config.
--- drivers/staging/clocking-wizard/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/staging/clocking-wizard/Kconfig +1 -1
@@ -5,6 +5,6 @@ config COMMON_CLK_XLNX_CLKWZRD tristate "Xilinx Clocking Wizard" - depends on COMMON_CLK && OF && IOMEM + depends on COMMON_CLK && OF && HAS_IOMEM help Support for the Xilinx Clocking Wizard IP core clock generator.
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 224/334 i2c: synquacer: fix deferred probing
In reply to Greg Kroah-HartmanFrom: Sergey Shtylyov <[email protected]>
[ Upstream commit 8d744da241b81f4211f4813b0d3c1981326fa9ca ]
The driver overrides the error codes returned by platform_get_irq() to -ENODEV, so if it returns -EPROBE_DEFER, the driver will fail the probe permanently instead of the deferred probing. Switch to propagating the error codes upstream.
--- drivers/i2c/busses/i2c-synquacer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/i2c/busses/i2c-synquacer.c +1 -1
@@ -578,7 +578,7 @@ static int synquacer_i2c_probe(struct platform_device *pdev) i2c->irq =platform_get_irq (pdev,0 );if (i2c->irq <0 ) -return -ENODEV ; +return i2c->irq; ret =devm_request_irq (&pdev->dev, i2c->irq, synquacer_i2c_isr,0 ,dev_name (&pdev->dev), i2c);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 225/334 hwmon: (pmbus/bpa-rs600) Dont use rated limits as warn limits
In reply to Greg Kroah-HartmanFrom: Chris Packham <[email protected]>
[ Upstream commit 7a8c68c57fd09541377f6971f25efdeb9a926c37 ]
In the initial implementation a number of PMBUS_x_WARN_LIMITs were mapped to MFR fields. This was incorrect as these MFR limits reflect the rated limit as opposed to a limit which will generate warning. Instead return -ENXIO like we were already doing for other WARN_LIMITs.
Subsequently these rated limits have been exposed generically as new fields in the sysfs ABI so the values are still available.
--- drivers/hwmon/pmbus/bpa-rs600.c | 25 ------------------------- 1 file changed, 25 deletions(-)
drivers/hwmon/pmbus/bpa-rs600.c +0 -25
@@ -12,15 +12,6 @@#include <linux/pmbus.h> #include "pmbus.h" -#define BPARS600_MFR_VIN_MIN 0xa0 -#define BPARS600_MFR_VIN_MAX 0xa1 -#define BPARS600_MFR_IIN_MAX 0xa2 -#define BPARS600_MFR_PIN_MAX 0xa3 -#define BPARS600_MFR_VOUT_MIN 0xa4 -#define BPARS600_MFR_VOUT_MAX 0xa5 -#define BPARS600_MFR_IOUT_MAX 0xa6 -#define BPARS600_MFR_POUT_MAX 0xa7 -static int bpa_rs600_read_byte_data (struct i2c_client *client,int page,int reg) {int ret;
@@ -81,29 +72,13 @@ static int bpa_rs600_read_word_data(struct i2c_client *client, int page, int phaswitch (reg) {case PMBUS_VIN_UV_WARN_LIMIT : - ret =pmbus_read_word_data (client,0 ,0xff ,BPARS600_MFR_VIN_MIN ); -break ;case PMBUS_VIN_OV_WARN_LIMIT : - ret =pmbus_read_word_data (client,0 ,0xff ,BPARS600_MFR_VIN_MAX ); -break ;case PMBUS_VOUT_UV_WARN_LIMIT : - ret =pmbus_read_word_data (client,0 ,0xff ,BPARS600_MFR_VOUT_MIN ); -break ;case PMBUS_VOUT_OV_WARN_LIMIT : - ret =pmbus_read_word_data (client,0 ,0xff ,BPARS600_MFR_VOUT_MAX ); -break ;case PMBUS_IIN_OC_WARN_LIMIT : - ret =pmbus_read_word_data (client,0 ,0xff ,BPARS600_MFR_IIN_MAX ); -break ;case PMBUS_IOUT_OC_WARN_LIMIT : - ret =pmbus_read_word_data (client,0 ,0xff ,BPARS600_MFR_IOUT_MAX ); -break ;case PMBUS_PIN_OP_WARN_LIMIT : - ret =pmbus_read_word_data (client,0 ,0xff ,BPARS600_MFR_PIN_MAX ); -break ;case PMBUS_POUT_OP_WARN_LIMIT : - ret =pmbus_read_word_data (client,0 ,0xff ,BPARS600_MFR_POUT_MAX ); -break ;case PMBUS_VIN_UV_FAULT_LIMIT :case PMBUS_VIN_OV_FAULT_LIMIT :case PMBUS_VOUT_UV_FAULT_LIMIT :
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 226/334 hwmon: remove amd_energy driver in Makefile
In reply to Greg Kroah-HartmanFrom: Lukas Bulwahn <[email protected]>
[ Upstream commit b3a7ab2d4376726178909e27b6956c012277ac4e ]
Commit 9049572fb145 ("hwmon: Remove amd_energy driver") removes the driver, but misses to adjust the Makefile.
Hence, ./scripts/checkkconfigsymbols.py warns:
SENSORS_AMD_ENERGY
Referencing files: drivers/hwmon/Makefile
Remove the missing piece of this driver removal.
--- drivers/hwmon/Makefile | 1 - 1 file changed, 1 deletion(-)
drivers/hwmon/Makefile +0 -1
@@ -45,7 +45,6 @@ obj-$(CONFIG_SENSORS_ADT7462) += adt7462.o obj-$(CONFIG_SENSORS_ADT7470) += adt7470.o obj-$(CONFIG_SENSORS_ADT7475) += adt7475.o obj-$(CONFIG_SENSORS_AHT10) += aht10.o -obj-$(CONFIG_SENSORS_AMD_ENERGY) += amd_energy.o obj-$(CONFIG_SENSORS_APPLESMC) += applesmc.o obj-$(CONFIG_SENSORS_ARM_SCMI) += scmi-hwmon.o obj-$(CONFIG_SENSORS_ARM_SCPI) += scpi-hwmon.o
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 227/334 ASoC: fsl_rpmsg: Check -EPROBE_DEFER for getting clocks
In reply to Greg Kroah-HartmanFrom: Shengjiu Wang <[email protected]>
[ Upstream commit 2fbbcffea5b6adbfe90ffc842a6b3eb2d7e381ed ]
The devm_clk_get() may return -EPROBE_DEFER, then clocks will be assigned to NULL wrongly. As the clocks are optional so we can use devm_clk_get_optional() instead of devm_clk_get().
--- sound/soc/fsl/fsl_rpmsg.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-)
sound/soc/fsl/fsl_rpmsg.c +10 -10
@@ -165,25 +165,25 @@ static int fsl_rpmsg_probe(struct platform_device *pdev) }/* Get the optional clocks */ - rpmsg->ipg =devm_clk_get (&pdev->dev,"ipg" ); + rpmsg->ipg =devm_clk_get_optional (&pdev->dev,"ipg" );if (IS_ERR (rpmsg->ipg)) - rpmsg->ipg =NULL ; +return PTR_ERR (rpmsg->ipg); - rpmsg->mclk =devm_clk_get (&pdev->dev,"mclk" ); + rpmsg->mclk =devm_clk_get_optional (&pdev->dev,"mclk" );if (IS_ERR (rpmsg->mclk)) - rpmsg->mclk =NULL ; +return PTR_ERR (rpmsg->mclk); - rpmsg->dma =devm_clk_get (&pdev->dev,"dma" ); + rpmsg->dma =devm_clk_get_optional (&pdev->dev,"dma" );if (IS_ERR (rpmsg->dma)) - rpmsg->dma =NULL ; +return PTR_ERR (rpmsg->dma); - rpmsg->pll8k =devm_clk_get (&pdev->dev,"pll8k" ); + rpmsg->pll8k =devm_clk_get_optional (&pdev->dev,"pll8k" );if (IS_ERR (rpmsg->pll8k)) - rpmsg->pll8k =NULL ; +return PTR_ERR (rpmsg->pll8k); - rpmsg->pll11k =devm_clk_get (&pdev->dev,"pll11k" ); + rpmsg->pll11k =devm_clk_get_optional (&pdev->dev,"pll11k" );if (IS_ERR (rpmsg->pll11k)) - rpmsg->pll11k =NULL ; +return PTR_ERR (rpmsg->pll11k);platform_set_drvdata (pdev, rpmsg);pm_runtime_enable (&pdev->dev);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 228/334 firmware: raspberrypi: Fix a leak in rpi_firmware_get()
In reply to Greg Kroah-HartmanFrom: Christophe JAILLET <[email protected]>
[ Upstream commit 09cbd1df7d2615c19e40facbe31fdcb5f1ebfa96 ]
The reference taken by 'of_find_device_by_node()' must be released when not needed anymore.
Add the corresponding 'put_device()' in the normal and error handling paths.
--- drivers/firmware/raspberrypi.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
drivers/firmware/raspberrypi.c +8 -2
@@ -329,12 +329,18 @@ struct rpi_firmware *rpi_firmware_get(struct device_node *firmware_node) fw =platform_get_drvdata (pdev);if (!fw) -return NULL ; + goto err_put_device;if (!kref_get_unless_zero (&fw->consumers)) -return NULL ; + goto err_put_device; + +put_device (&pdev->dev);return fw; + +err_put_device: +put_device (&pdev->dev); +return NULL ; }EXPORT_SYMBOL_GPL (rpi_firmware_get);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 229/334 usb: gadget: mv_u3d: request_irq() after initializing UDC
In reply to Greg Kroah-HartmanFrom: Nadezda Lutovinova <[email protected]>
[ Upstream commit 2af0c5ffadaf9d13eca28409d4238b4e672942d3 ]
If IRQ occurs between calling request_irq() and mv_u3d_eps_init(), then null pointer dereference occurs since u3d->eps[] wasn't initialized yet but used in mv_u3d_nuke().
The patch puts registration of the interrupt handler after initializing of neccesery data.
Found by Linux Driver Verification project (linuxtesting.org).
--- drivers/usb/gadget/udc/mv_u3d_core.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-)
drivers/usb/gadget/udc/mv_u3d_core.c +10 -9
@@ -1921,14 +1921,6 @@ static int mv_u3d_probe(struct platform_device *dev) goto err_get_irq; } u3d->irq = r->start; -if (request_irq (u3d->irq, mv_u3d_irq, -IRQF_SHARED , driver_name, u3d)) { - u3d->irq =0 ; -dev_err (&dev->dev,"Request irq %d for u3d failed\n" , - u3d->irq); - retval = -ENODEV ; - goto err_request_irq; - }/* initialize gadget structure */ u3d->gadget.ops = &mv_u3d_ops;/* usb_gadget_ops */
@@ -1941,6 +1933,15 @@ static int mv_u3d_probe(struct platform_device *dev)mv_u3d_eps_init (u3d); +if (request_irq (u3d->irq, mv_u3d_irq, +IRQF_SHARED , driver_name, u3d)) { + u3d->irq =0 ; +dev_err (&dev->dev,"Request irq %d for u3d failed\n" , + u3d->irq); + retval = -ENODEV ; + goto err_request_irq; + } +/* external vbus detection */ if (u3d->vbus) { u3d->clock_gating =1 ;
@@ -1964,8 +1965,8 @@ static int mv_u3d_probe(struct platform_device *dev) err_unregister:free_irq (u3d->irq, u3d); -err_request_irq: err_get_irq: +err_request_irq:kfree (u3d->status_req); err_alloc_status_req:kfree (u3d->eps);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 230/334 mm/swap: consider max pages in iomap_swapfile_add_extent
In reply to Greg Kroah-HartmanFrom: Xu Yu <[email protected]>
[ Upstream commit 36ca7943ac18aebf8aad4c50829eb2ea5ec847df ]
When the max pages (last_page in the swap header + 1) is smaller than the total pages (inode size) of the swapfile, iomap_swapfile_activate overwrites sis->max with total pages.
However, frontswap_map is a swap page state bitmap allocated using the initial sis->max page count read from the swap header. If swapfile activation increases sis->max, it's possible for the frontswap code to walk off the end of the bitmap, thereby corrupting kernel memory.
[djwong: modify the description a bit; the original paragraph reads:
"However, frontswap_map is allocated using max pages. When test and clear the sis offset, which is larger than max pages, of frontswap_map in __frontswap_invalidate_page(), neighbors of frontswap_map may be overwritten, i.e., slab is polluted."
Note also that this bug resulted in a behavioral change: activating a swap file that was formatted and later extended results in all pages being activated, not the number of pages recorded in the swap header.]
This fixes the issue by considering the limitation of max pages of swap info in iomap_swapfile_add_extent().
To reproduce the case, compile kernel with slub RED ZONE, then run test:
$ sudo stress-ng -a 1 -x softlockup,resources -t 72h --metrics --times \ --verify -v -Y /root/tmpdir/stress-ng/stress-statistic-12.yaml \ --log-file /root/tmpdir/stress-ng/stress-logfile-12.txt \ --temp-path /root/tmpdir/stress-ng/
We'll get the error log as below:
[ 1151.015141] ============================================================================= [ 1151.016489] BUG kmalloc-16 (Not tainted): Right Redzone overwritten [ 1151.017486] ----------------------------------------------------------------------------- [ 1151.017486] [ 1151.018997] Disabling lock debugging due to kernel taint [ 1151.019873] INFO: 0x0000000084e43932-0x0000000098d17cae @offset=7392. First byte 0x0 instead of 0xcc [ 1151.021303] INFO: Allocated in __do_sys_swapon+0xcf6/0x1170 age=43417 cpu=9 pid=3816 [ 1151.022538] __slab_alloc+0xe/0x20 [ 1151.023069] __kmalloc_node+0xfd/0x4b0 [ 1151.023704] __do_sys_swapon+0xcf6/0x1170 [ 1151.024346] do_syscall_64+0x33/0x40 [ 1151.024925] entry_SYSCALL_64_after_hwframe+0x44/0xa9 [ 1151.025749] INFO: Freed in put_cred_rcu+0xa1/0xc0 age=43424 cpu=3 pid=2041 [ 1151.026889] kfree+0x276/0x2b0 [ 1151.027405] put_cred_rcu+0xa1/0xc0 [ 1151.027949] rcu_do_batch+0x17d/0x410 [ 1151.028566] rcu_core+0x14e/0x2b0 [ 1151.029084] __do_softirq+0x101/0x29e [ 1151.029645] asm_call_irq_on_stack+0x12/0x20 [ 1151.030381] do_softirq_own_stack+0x37/0x40 [ 1151.031037] do_softirq.part.15+0x2b/0x30 [ 1151.031710] __local_bh_enable_ip+0x4b/0x50 [ 1151.032412] copy_fpstate_to_sigframe+0x111/0x360 [ 1151.033197] __setup_rt_frame+0xce/0x480 [ 1151.033809] arch_do_signal+0x1a3/0x250 [ 1151.034463] exit_to_user_mode_prepare+0xcf/0x110 [ 1151.035242] syscall_exit_to_user_mode+0x27/0x190 [ 1151.035970] entry_SYSCALL_64_after_hwframe+0x44/0xa9 [ 1151.036795] INFO: Slab 0x000000003b9de4dc objects=44 used=9 fp=0x00000000539e349e flags=0xfffffc0010201 [ 1151.038323] INFO: Object 0x000000004855ba01 @offset=7376 fp=0x0000000000000000 [ 1151.038323] [ 1151.039683] Redzone 000000008d0afd3d: cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc ................ [ 1151.041180] Object 000000004855ba01: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ [ 1151.042714] Redzone 0000000084e43932: 00 00 00 c0 cc cc cc cc ........ [ 1151.044120] Padding 000000000864c042: 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a ZZZZZZZZZZZZZZZZ [ 1151.045615] CPU: 5 PID: 3816 Comm: stress-ng Tainted: G B 5.10.50+ #7 [ 1151.046846] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.12.1-0-ga5cab58e9a3f-prebuilt.qemu.org 04/01/2014 [ 1151.048633] Call Trace: [ 1151.049072] dump_stack+0x57/0x6a [ 1151.049585] check_bytes_and_report+0xed/0x110 [ 1151.050320] check_object+0x1eb/0x290 [ 1151.050924] ? __x64_sys_swapoff+0x39a/0x540 [ 1151.051646] free_debug_processing+0x151/0x350 [ 1151.052333] __slab_free+0x21a/0x3a0 [ 1151.052938] ? _cond_resched+0x2d/0x40 [ 1151.053529] ? __vunmap+0x1de/0x220 [ 1151.054139] ? __x64_sys_swapoff+0x39a/0x540 [ 1151.054796] ? kfree+0x276/0x2b0 [ 1151.055307] kfree+0x276/0x2b0 [ 1151.055832] __x64_sys_swapoff+0x39a/0x540 [ 1151.056466] do_syscall_64+0x33/0x40 [ 1151.057084] entry_SYSCALL_64_after_hwframe+0x44/0xa9 [ 1151.057866] RIP: 0033:0x150340b0ffb7 [ 1151.058481] Code: Unable to access opcode bytes at RIP 0x150340b0ff8d. [ 1151.059537] RSP: 002b:00007fff7f4ee238 EFLAGS: 00000246 ORIG_RAX: 00000000000000a8 [ 1151.060768] RAX: ffffffffffffffda RBX: 00007fff7f4ee66c RCX: 0000150340b0ffb7 [ 1151.061904] RDX: 000000000000000a RSI: 0000000000018094 RDI: 00007fff7f4ee860 [ 1151.063033] RBP: 00007fff7f4ef980 R08: 0000000000000000 R09: 0000150340a672bd [ 1151.064135] R10: 00007fff7f4edca0 R11: 0000000000000246 R12: 0000000000018094 [ 1151.065253] R13: 0000000000000005 R14: 000000000160d930 R15: 00007fff7f4ee66c [ 1151.066413] FIX kmalloc-16: Restoring 0x0000000084e43932-0x0000000098d17cae=0xcc [ 1151.066413] [ 1151.067890] FIX kmalloc-16: Object at 0x000000004855ba01 not freed
--- fs/iomap/swapfile.c | 6 ++++++ 1 file changed, 6 insertions(+)
fs/iomap/swapfile.c +6 -0
@@ -31,11 +31,16 @@ static int iomap_swapfile_add_extent(struct iomap_swapfile_info *isi) {struct iomap *iomap = &isi->iomap;unsigned long nr_pages; +unsigned long max_pages;uint64_t first_ppage;uint64_t first_ppage_reported;uint64_t next_ppage;int error; +if (unlikely (isi->nr_pages >= isi->sis->max)) +return 0 ; + max_pages = isi->sis->max - isi->nr_pages; +/* * Round the start up and the end down so that the physical * extent aligns to a page boundary.
@@ -48,6 +53,7 @@ static int iomap_swapfile_add_extent(struct iomap_swapfile_info *isi)if (first_ppage >= next_ppage)return 0 ; nr_pages = next_ppage - first_ppage; + nr_pages =min (nr_pages, max_pages);/* * Calculate how much swap space we're adding; the first page contains
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 231/334 lkdtm: replace SCSI_DISPATCH_CMD with SCSI_QUEUE_RQ
In reply to Greg Kroah-HartmanFrom: Kevin Mitchell <[email protected]>
[ Upstream commit d1f278da6b11585f05b2755adfc8851cbf14a1ec ]
When scsi_dispatch_cmd was moved to scsi_lib.c and made static, some compilers (i.e., at least gcc 8.4.0) decided to compile this inline. This is a problem for lkdtm.ko, which inserted a kprobe on this function for the SCSI_DISPATCH_CMD crashpoint.
Move this crashpoint one function up the call chain to scsi_queue_rq. Though this is also a static function, it should never be inlined because it is assigned as a structure entry. Therefore, kprobe_register should always be able to find it.
--- Documentation/fault-injection/provoke-crashes.rst | 2 +- drivers/misc/lkdtm/core.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
Documentation/fault-injection/provoke-crashes.rst +1 -1
@@ -29,7 +29,7 @@ recur_count cpoint_name Where in the kernel to trigger the action. It can be one of INT_HARDWARE_ENTRY, INT_HW_IRQ_EN, INT_TASKLET_ENTRY, - FS_DEVRW, MEM_SWAPOUT, TIMERADD, SCSI_DISPATCH_CMD, + FS_DEVRW, MEM_SWAPOUT, TIMERADD, SCSI_QUEUE_RQ, IDE_CORE_CP, or DIRECT cpoint_type
drivers/misc/lkdtm/core.c +1 -1
@@ -82,7 +82,7 @@ static struct crashpoint crashpoints[] = {CRASHPOINT ("FS_DEVRW" ,"ll_rw_block" ),CRASHPOINT ("MEM_SWAPOUT" ,"shrink_inactive_list" ),CRASHPOINT ("TIMERADD" ,"hrtimer_start" ), -CRASHPOINT ("SCSI_DISPATCH_CMD" ,"scsi_dispatch_cmd" ), +CRASHPOINT ("SCSI_QUEUE_RQ" ,"scsi_queue_rq" ), CRASHPOINT("IDE_CORE_CP", "generic_ide_ioctl"), #endif };
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 232/334 Bluetooth: add timeout sanity check to hci_inquiry
In reply to Greg Kroah-HartmanFrom: Pavel Skripkin <[email protected]>
[ Upstream commit f41a4b2b5eb7872109723dab8ae1603bdd9d9ec1 ]
Syzbot hit "task hung" bug in hci_req_sync(). The problem was in unreasonable huge inquiry timeout passed from userspace. Fix it by adding sanity check for timeout value to hci_inquiry().
Since hci_inquiry() is the only user of hci_req_sync() with user controlled timeout value, it makes sense to check timeout value in hci_inquiry() and don't touch hci_req_sync().
--- net/bluetooth/hci_core.c | 6 ++++++ 1 file changed, 6 insertions(+)
net/bluetooth/hci_core.c +6 -0
@@ -1343,6 +1343,12 @@ int hci_inquiry(void __user *arg) goto done; } +/* Restrict maximum inquiry length to 60 seconds */ +if (ir.length >60 ) { + err = -EINVAL ; + goto done; + } +hci_dev_lock (hdev);if (inquiry_cache_age (hdev) >INQUIRY_CACHE_AGE_MAX ||inquiry_cache_empty (hdev) || ir.flags &IREQ_CACHE_FLUSH ) {
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 233/334 i2c: iop3xx: fix deferred probing
In reply to Greg Kroah-HartmanFrom: Sergey Shtylyov <[email protected]>
[ Upstream commit a1299505162ad00def3573260c2c68b9c8e8d697 ]
When adding the code to handle platform_get_irq*() errors in the commit 489447380a29 ("handle errors returned by platform_get_irq*()"), the actual error code was enforced to be -ENXIO in the driver for some strange reason. This didn't matter much until the deferred probing was introduced -- which requires an actual error code to be propagated upstream from the failure site.
While fixing this, also stop overriding the errors from request_irq() to -EIO (done since the pre-git era).
--- drivers/i2c/busses/i2c-iop3xx.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-)
drivers/i2c/busses/i2c-iop3xx.c +2 -4
@@ -469,16 +469,14 @@ iop3xx_i2c_probe(struct platform_device *pdev) irq =platform_get_irq (pdev,0 );if (irq <0 ) { - ret = -ENXIO ; + ret = irq; goto unmap; } ret =request_irq (irq, iop3xx_i2c_irq_handler,0 , pdev->name, adapter_data); -if (ret) { - ret = -EIO ; +if (ret) goto unmap; - }memcpy (new_adapter->name, pdev->name,strlen (pdev->name)); new_adapter->owner =THIS_MODULE ;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 234/334 i2c: s3c2410: fix IRQ check
In reply to Greg Kroah-HartmanFrom: Sergey Shtylyov <[email protected]>
[ Upstream commit d6840a5e370b7ea4fde16ce2caf431bcc87f9a75 ]
Iff platform_get_irq() returns 0, the driver's probe() method will return 0 early (as if the method's call was successful). Let's consider IRQ0 valid for simplicity -- devm_request_irq() can always override that decision...
--- drivers/i2c/busses/i2c-s3c2410.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/i2c/busses/i2c-s3c2410.c +1 -1
@@ -1137,7 +1137,7 @@ static int s3c24xx_i2c_probe(struct platform_device *pdev)*/ if (!(i2c->quirks &QUIRK_POLL )) { i2c->irq = ret =platform_get_irq (pdev,0 ); -if (ret <=0 ) { +if (ret <0 ) {dev_err (&pdev->dev,"cannot find IRQ\n" );clk_unprepare (i2c->clk);return ret;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 235/334 i2c: hix5hd2: fix IRQ check
In reply to Greg Kroah-HartmanFrom: Sergey Shtylyov <[email protected]>
[ Upstream commit f9b459c2ba5edfe247e86b45ad5dea8da542f3ea ]
Iff platform_get_irq() returns 0, the driver's probe() method will return 0 early (as if the method's call was successful). Let's consider IRQ0 valid for simplicity -- devm_request_irq() can always override that decision...
--- drivers/i2c/busses/i2c-hix5hd2.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/i2c/busses/i2c-hix5hd2.c +1 -1
@@ -413,7 +413,7 @@ static int hix5hd2_i2c_probe(struct platform_device *pdev)return PTR_ERR (priv->regs); irq =platform_get_irq (pdev,0 ); -if (irq <=0 ) +if (irq <0 )return irq; priv->clk =devm_clk_get (&pdev->dev,NULL );
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 236/334 gfs2: init system threads before freeze lock
In reply to Greg Kroah-HartmanFrom: Bob Peterson <[email protected]>
[ Upstream commit a28dc123fa66ba7f3eca7cffc4b01d96bfd35c27 ]
Patch 96b1454f2e ("gfs2: move freeze glock outside the make_fs_rw and _ro functions") changed the gfs2 mount sequence so that it holds the freeze lock before calling gfs2_make_fs_rw. Before this patch, gfs2_make_fs_rw called init_threads to initialize the quotad and logd threads. That is a problem if the system needs to withdraw due to IO errors early in the mount sequence, for example, while initializing the system statfs inode:
1. An IO error causes the statfs glock to not sync properly after recovery, and leaves items on the ail list.
2. The leftover items on the ail list causes its do_xmote call to fail, which makes it want to withdraw. But since the glock code cannot withdraw (because the withdraw sequence uses glocks) it relies upon the logd daemon to initiate the withdraw.
3. The withdraw can never be performed by the logd daemon because all this takes place before the logd daemon is started.
This patch moves function init_threads from super.c to ops_fstype.c and it changes gfs2_fill_super to start its threads before holding the freeze lock, and if there's an error, stop its threads after releasing it. This allows the logd to run unblocked by the freeze lock. Thus, the logd daemon can perform its withdraw sequence properly.
--- fs/gfs2/ops_fstype.c | 42 ++++++++++++++++++++++++++++++ fs/gfs2/super.c | 61 +++++--------------------------------------- 2 files changed, 48 insertions(+), 55 deletions(-)
fs/gfs2/ops_fstype.c +42 -0
@@ -1089,6 +1089,34 @@ void gfs2_online_uevent(struct gfs2_sbd *sdp)kobject_uevent_env (&sdp->sd_kobj,KOBJ_ONLINE , envp); } +static int init_threads (struct gfs2_sbd *sdp) +{ +struct task_struct *p; +int error =0 ; + + p =kthread_run (gfs2_logd, sdp,"gfs2_logd" ); +if (IS_ERR (p)) { + error =PTR_ERR (p); +fs_err (sdp,"can't start logd thread: %d\n" , error); +return error; + } + sdp->sd_logd_process = p; + + p =kthread_run (gfs2_quotad, sdp,"gfs2_quotad" ); +if (IS_ERR (p)) { + error =PTR_ERR (p); +fs_err (sdp,"can't start quotad thread: %d\n" , error); + goto fail; + } + sdp->sd_quotad_process = p; +return 0 ; + +fail: +kthread_stop (sdp->sd_logd_process); + sdp->sd_logd_process =NULL ; +return error; +} +/** * gfs2_fill_super - Read in superblock * @sb: The VFS superblock
@@ -1217,6 +1245,14 @@ static int gfs2_fill_super(struct super_block *sb, struct fs_context *fc) goto fail_per_node; } +if (!sb_rdonly (sb)) { + error =init_threads (sdp); +if (error) { +gfs2_withdraw_delayed (sdp); + goto fail_per_node; + } + } + error =gfs2_freeze_lock (sdp, &freeze_gh,0 );if (error) goto fail_per_node;
@@ -1226,6 +1262,12 @@ static int gfs2_fill_super(struct super_block *sb, struct fs_context *fc)gfs2_freeze_unlock (&freeze_gh);if (error) { +if (sdp->sd_quotad_process) +kthread_stop (sdp->sd_quotad_process); + sdp->sd_quotad_process =NULL ; +if (sdp->sd_logd_process) +kthread_stop (sdp->sd_logd_process); + sdp->sd_logd_process =NULL ;fs_err (sdp,"can't make FS RW: %d\n" , error); goto fail_per_node; }
fs/gfs2/super.c +6 -55
86 lines not on this page · raw message
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 237/334 drm/exynos: g2d: fix missing unlock on error in g2d_runqueue_worker()
In reply to Greg Kroah-HartmanFrom: Wei Yongjun <[email protected]>
[ Upstream commit b74a29fac6de62f39b594e8f545b3a26db7edb5e ]
Add the missing unlock before return from function g2d_runqueue_worker() in the error handling case.
--- drivers/gpu/drm/exynos/exynos_drm_g2d.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/gpu/drm/exynos/exynos_drm_g2d.c +2 -1
@@ -897,13 +897,14 @@ static void g2d_runqueue_worker(struct work_struct *work) ret =pm_runtime_resume_and_get (g2d->dev);if (ret <0 ) {dev_err (g2d->dev,"failed to enable G2D device.\n" ); -return ; + goto out; }g2d_dma_start (g2d, g2d->runqueue_node); } } +out:mutex_unlock (&g2d->runqueue_mutex); }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 238/334 rsi: fix error code in rsi_load_9116_firmware()
In reply to Greg Kroah-HartmanFrom: Dan Carpenter <[email protected]>
[ Upstream commit d0f8430332a16c7baa80ce2886339182c5d85f37 ]
This code returns success if the kmemdup() fails, but obviously it should return -ENOMEM instead.
--- drivers/net/wireless/rsi/rsi_91x_hal.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/net/wireless/rsi/rsi_91x_hal.c +3 -1
@@ -1038,8 +1038,10 @@ static int rsi_load_9116_firmware(struct rsi_hw *adapter) } ta_firmware =kmemdup (fw_entry->data, fw_entry->size,GFP_KERNEL ); -if (!ta_firmware) +if (!ta_firmware) { + status = -ENOMEM ; goto fail_release_fw; + } fw_p = ta_firmware; instructions_sz = fw_entry->size;rsi_dbg (INFO_ZONE ,"FW Length = %d bytes\n" , instructions_sz);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 239/334 rsi: fix an error code in rsi_probe()
In reply to Greg Kroah-HartmanFrom: Dan Carpenter <[email protected]>
[ Upstream commit 9adcdf6758d7c4c9bdaf22d78eb9fcae260ed113 ]
Return -ENODEV instead of success for unsupported devices.
--- drivers/net/wireless/rsi/rsi_91x_usb.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/wireless/rsi/rsi_91x_usb.c +1 -0
@@ -816,6 +816,7 @@ static int rsi_probe(struct usb_interface *pfunction, }else {rsi_dbg (ERR_ZONE ,"%s: Unsupported RSI device id 0x%x\n" , __func__, id->idProduct); + status = -ENODEV ; goto err1; }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 240/334 octeontx2-af: cn10k: Fix SDP base channel number
In reply to Greg Kroah-HartmanFrom: Subbaraya Sundeep <[email protected]>
[ Upstream commit 477b53f3f95ba5341b4320f8b7a92cedc5a67650 ]
As per hardware the base channel number configured for programmable channels of a block must be multiple of number of channels of that block. This condition is not met for SDP base channel currently. Hence this patch ensures all the base channel numbers of all blocks are multiple of number of channels present in the blocks. Also instead of hardcoding SDP number of channels the same is read from the NIX_AF_CONST1 register.
--- .../ethernet/marvell/octeontx2/af/common.h | 2 -- .../ethernet/marvell/octeontx2/af/rvu_cn10k.c | 31 +++++++++++++------ 2 files changed, 22 insertions(+), 11 deletions(-)
drivers/net/ethernet/marvell/octeontx2/af/common.h +0 -2
@@ -195,8 +195,6 @@ enum nix_scheduler {#define NIX_CHAN_LBK_CHX (a, b) (0 + 0x100 * (a) + (b))#define NIX_CHAN_SDP_CH_START (0x700ull) -#define SDP_CHANNELS 256 -/* The mask is to extract lower 10-bits of channel number * which CPT will pass to X2P. */
drivers/net/ethernet/marvell/octeontx2/af/rvu_cn10k.c +22 -9
@@ -212,9 +212,10 @@ void rvu_reset_lmt_map_tbl(struct rvu *rvu, u16 pcifunc)int rvu_set_channels_base (struct rvu *rvu) { +u16 nr_lbk_chans, nr_sdp_chans, nr_cgx_chans, nr_cpt_chans; +u16 sdp_chan_base, cgx_chan_base, cpt_chan_base;struct rvu_hwinfo *hw = rvu->hw; -u16 cpt_chan_base; -u64 nix_const; +u64 nix_const, nix_const1;int blkaddr; blkaddr =rvu_get_blkaddr (rvu,BLKTYPE_NIX ,0 );
@@ -222,6 +223,7 @@ int rvu_set_channels_base(struct rvu *rvu)return blkaddr; nix_const =rvu_read64 (rvu, blkaddr,NIX_AF_CONST ); + nix_const1 =rvu_read64 (rvu, blkaddr,NIX_AF_CONST1 ); hw->cgx = (nix_const >>12 ) &0xFULL ; hw->lmac_per_cgx = (nix_const >>8 ) &0xFULL ;
@@ -244,14 +246,24 @@ int rvu_set_channels_base(struct rvu *rvu)* channels such that all channel numbers are contiguous * leaving no holes. This way the new CPT channels can be * accomodated. The order of channel numbers assigned is -* LBK, SDP, CGX and CPT. +* LBK, SDP, CGX and CPT. Also the base channel number +* of a block must be multiple of number of channels +* of the block. */ - hw->sdp_chan_base = hw->lbk_chan_base + hw->lbk_links * - ((nix_const >>16 ) &0xFFULL ); - hw->cgx_chan_base = hw->sdp_chan_base + hw->sdp_links *SDP_CHANNELS ; + nr_lbk_chans = (nix_const >>16 ) &0xFFULL ; + nr_sdp_chans = nix_const1 &0xFFFULL ; + nr_cgx_chans = nix_const &0xFFULL ; + nr_cpt_chans = (nix_const >>32 ) &0xFFFULL ; - cpt_chan_base = hw->cgx_chan_base + hw->cgx_links * - (nix_const &0xFFULL ); + sdp_chan_base = hw->lbk_chan_base + hw->lbk_links * nr_lbk_chans; +/* Round up base channel to multiple of number of channels */ + hw->sdp_chan_base =ALIGN (sdp_chan_base, nr_sdp_chans); + + cgx_chan_base = hw->sdp_chan_base + hw->sdp_links * nr_sdp_chans; + hw->cgx_chan_base =ALIGN (cgx_chan_base, nr_cgx_chans); + + cpt_chan_base = hw->cgx_chan_base + hw->cgx_links * nr_cgx_chans; + hw->cpt_chan_base =ALIGN (cpt_chan_base, nr_cpt_chans);/* Out of 4096 channels start CPT from 2048 so * that MSB for CPT channels is always set
@@ -355,6 +367,7 @@ err_put:static void __rvu_nix_set_channels (struct rvu *rvu,int blkaddr) { +u64 nix_const1 =rvu_read64 (rvu, blkaddr,NIX_AF_CONST1 );u64 nix_const =rvu_read64 (rvu, blkaddr,NIX_AF_CONST );u16 cgx_chans, lbk_chans, sdp_chans, cpt_chans;struct rvu_hwinfo *hw = rvu->hw;
@@ -364,7 +377,7 @@ static void __rvu_nix_set_channels(struct rvu *rvu, int blkaddr) cgx_chans = nix_const &0xFFULL ; lbk_chans = (nix_const >>16 ) &0xFFULL ; - sdp_chans =SDP_CHANNELS ; + sdp_chans = nix_const1 &0xFFFULL ; cpt_chans = (nix_const >>32 ) &0xFFFULL ; start = hw->cgx_chan_base;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 241/334 octeontx2-pf: send correct vlan priority mask to npc_install_flow_req
In reply to Greg Kroah-HartmanFrom: Naveen Mamindlapalli <[email protected]>
[ Upstream commit 10df5a13ac6785b409ad749c4b10d4b220cc7e71 ]
This patch corrects the erroneous vlan priority mask field that was send to npc_install_flow_req.
--- drivers/net/ethernet/marvell/octeontx2/nic/otx2_tc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/ethernet/marvell/octeontx2/nic/otx2_tc.c +2 -2
@@ -485,8 +485,8 @@ static int otx2_tc_prepare_flow(struct otx2_nic *nic, struct otx2_tc_flow *node, match.key->vlan_priority <<13 ; vlan_tci_mask = match.mask->vlan_id | - match.key->vlan_dei <<12 | - match.key->vlan_priority <<13 ; + match.mask->vlan_dei <<12 | + match.mask->vlan_priority <<13 ; flow_spec->vlan_tci =htons (vlan_tci); flow_mask->vlan_tci =htons (vlan_tci_mask);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 242/334 octeontx2-af: Check capability flag while freeing ipolicer memory
In reply to Greg Kroah-HartmanFrom: Geetha sowjanya <[email protected]>
[ Upstream commit 07cccffdbdd37820ba13c645af8e74a78a266557 ]
Bandwidth profiles (ipolicer structure)is implemented only on CN10K platform. But current code try to free the ipolicer memory without checking the capibility flag leading to driver crash on OCTEONTX2 platform. This patch fixes the issue by add capability flag check.
--- drivers/net/ethernet/marvell/octeontx2/af/rvu_nix.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
drivers/net/ethernet/marvell/octeontx2/af/rvu_nix.c +6 -3
@@ -25,7 +25,7 @@ static int nix_update_mce_rule(struct rvu *rvu, u16 pcifunc, int type, bool add);static int nix_setup_ipolicers (struct rvu *rvu,struct nix_hw *nix_hw,int blkaddr); -static void nix_ipolicer_freemem (struct nix_hw *nix_hw); +static void nix_ipolicer_freemem (struct rvu *rvu,struct nix_hw *nix_hw);static int nix_verify_bandprof (struct nix_cn10k_aq_enq_req *req,struct nix_hw *nix_hw,u16 pcifunc);static int nix_free_all_bandprof (struct rvu *rvu,u16 pcifunc);
@@ -3849,7 +3849,7 @@ static void rvu_nix_block_freemem(struct rvu *rvu, int blkaddr,kfree (txsch->schq.bmap); } -nix_ipolicer_freemem (nix_hw); +nix_ipolicer_freemem (rvu, nix_hw); vlan = &nix_hw->txvlan;kfree (vlan->rsrc.bmap);
@@ -4225,11 +4225,14 @@ static int nix_setup_ipolicers(struct rvu *rvu,return 0 ; } -static void nix_ipolicer_freemem (struct nix_hw *nix_hw) +static void nix_ipolicer_freemem (struct rvu *rvu,struct nix_hw *nix_hw) {struct nix_ipolicer *ipolicer;int layer; +if (!rvu->hw->cap.ipolicer) +return ; +for (layer =0 ; layer <BAND_PROF_NUM_LAYERS ; layer++) { ipolicer = &nix_hw->ipolicer[layer];
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 243/334 octeontx2-pf: Dont install VLAN offload rule if netdev is down
In reply to Greg Kroah-HartmanFrom: Sunil Goutham <[email protected]>
[ Upstream commit 05209e3570e452cdaa644e8398a8875b6a91051d ]
Whenever user changes interface MAC address both default DMAC based MCAM rule and VLAN offload (for strip) rules are updated with new MAC address. To update or install VLAN offload rule PF driver needs interface's receive channel info, which is retrieved from admin function at the time of NIXLF initialization.
If user changes MAC address before interface is UP, VLAN offload rule installation will fail and throw error as receive channel is not valid. To avoid this, skip VLAN offload rule installation if netdev is not UP. This rule will anyway be reinslatted as part of open() call.
--- drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.c +2 -1
@@ -208,7 +208,8 @@ int otx2_set_mac_address(struct net_device *netdev, void *p)if (!otx2_hw_set_mac_addr (pfvf, addr->sa_data)) {memcpy (netdev->dev_addr, addr->sa_data, netdev->addr_len);/* update dmac field in vlan offload rule */ -if (pfvf->flags &OTX2_FLAG_RX_VLAN_SUPPORT ) +if (netif_running (netdev) && + pfvf->flags &OTX2_FLAG_RX_VLAN_SUPPORT )otx2_install_rxvlan_offload_flow (pfvf);/* update dmac address in ntuple and DMAC filter list */ if (pfvf->flags &OTX2_FLAG_DMACFLTR_SUPPORT )
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 244/334 octeontx2-pf: Fix algorithm index in MCAM rules with RSS action
In reply to Greg Kroah-HartmanFrom: Sunil Goutham <[email protected]>
[ Upstream commit e7938365459f3a6d4edf212f435c4ad635621450 ]
Otherthan setting action as RSS in NPC MCAM entry, RSS flowkey algorithm index also needs to be set. Otherwise whatever algorithm is defined at flowkey index '0' will be considered by HW and pkt flows will be distributed as such.
Fix this by saving the flowkey index sent by admin function while initializing RSS and then use it when framing MCAM rules.
--- .../net/ethernet/marvell/octeontx2/nic/otx2_common.c | 11 +++++++++++ .../net/ethernet/marvell/octeontx2/nic/otx2_common.h | 3 +++ .../net/ethernet/marvell/octeontx2/nic/otx2_flows.c | 1 + 3 files changed, 15 insertions(+)
drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.c +11 -0
@@ -269,6 +269,7 @@ unlock:int otx2_set_flowkey_cfg (struct otx2_nic *pfvf) {struct otx2_rss_info *rss = &pfvf->hw.rss_info; +struct nix_rss_flowkey_cfg_rsp *rsp;struct nix_rss_flowkey_cfg *req;int err;
@@ -283,6 +284,16 @@ int otx2_set_flowkey_cfg(struct otx2_nic *pfvf) req->group =DEFAULT_RSS_CONTEXT_GROUP ; err =otx2_sync_mbox_msg (&pfvf->mbox); +if (err) + goto fail; + + rsp = (struct nix_rss_flowkey_cfg_rsp *) +otx2_mbox_get_rsp (&pfvf->mbox.mbox,0 , &req->hdr); +if (IS_ERR (rsp)) + goto fail; + + pfvf->hw.flowkey_alg_idx = rsp->alg_idx; +fail:mutex_unlock (&pfvf->mbox.lock);return err; }
drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.h +3 -0
@@ -196,6 +196,9 @@ struct otx2_hw {u8 lso_udpv4_idx;u8 lso_udpv6_idx; +/* RSS */ +u8 flowkey_alg_idx; +/* MSI-X */ u8 cint_cnt;/* CQ interrupt count */ u16 npa_msixoff;/* Offset of NPA vectors */
drivers/net/ethernet/marvell/octeontx2/nic/otx2_flows.c +1 -0
@@ -858,6 +858,7 @@ static int otx2_add_flow_msg(struct otx2_nic *pfvf, struct otx2_flow *flow)if (flow->flow_spec.flow_type &FLOW_RSS ) { req->op =NIX_RX_ACTIONOP_RSS ; req->index = flow->rss_ctx_id; + req->flow_key_alg = pfvf->hw.flowkey_alg_idx; }else { req->op =NIX_RX_ACTIONOP_UCAST ; req->index =ethtool_get_flow_spec_ring (ring_cookie);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 245/334 octeontx2-af: cn10k: Use FLIT0 register instead of FLIT1
In reply to Greg Kroah-HartmanFrom: Geetha sowjanya <[email protected]>
[ Upstream commit 623da5ca70b70f01cd483585f5cd4c463cf2f2da ]
RVU SMMU widget stores the final translated PA at RVU_AF_SMMU_TLN_FLIT0<57:18> instead of FLIT1 register. This patch fixes the address translation logic to use the correct register.
--- drivers/net/ethernet/marvell/octeontx2/af/rvu_cn10k.c | 4 ++-- drivers/net/ethernet/marvell/octeontx2/af/rvu_reg.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-)
drivers/net/ethernet/marvell/octeontx2/af/rvu_cn10k.c +2 -2
@@ -82,10 +82,10 @@ static int rvu_get_lmtaddr(struct rvu *rvu, u16 pcifunc,dev_err (rvu->dev,"%s LMTLINE iova transulation failed err:%llx\n" , __func__, val);return -EIO ; } -/* PA[51:12] = RVU_AF_SMMU_TLN_FLIT1[60:21] +/* PA[51:12] = RVU_AF_SMMU_TLN_FLIT0[57:18] * PA[11:0] = IOVA[11:0] */ - pa =rvu_read64 (rvu,BLKADDR_RVUM ,RVU_AF_SMMU_TLN_FLIT1 ) >>21 ; + pa =rvu_read64 (rvu,BLKADDR_RVUM ,RVU_AF_SMMU_TLN_FLIT0 ) >>18 ; pa &=GENMASK_ULL (39 ,0 ); *lmt_addr = (pa <<12 ) | (iova &0xFFF );
drivers/net/ethernet/marvell/octeontx2/af/rvu_reg.h +1 -1
@@ -53,7 +53,7 @@#define RVU_AF_SMMU_TXN_REQ (0x6008)#define RVU_AF_SMMU_ADDR_RSP_STS (0x6010)#define RVU_AF_SMMU_ADDR_TLN (0x6018) -#define RVU_AF_SMMU_TLN_FLIT1 (0x6030) +#define RVU_AF_SMMU_TLN_FLIT0 (0x6020)/* Admin function's privileged PF/VF registers */ #define RVU_PRIV_CONST (0x8000000)
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 246/334 m68k: coldfire: return success for clk_enable(NULL)
In reply to Greg Kroah-HartmanFrom: Dan Carpenter <[email protected]>
[ Upstream commit f6a4f0b424df957d84fa7b9f2d02981234ff5828 ]
The clk_enable is supposed work when CONFIG_HAVE_CLK is false, but it returns -EINVAL. That means some drivers fail during probe.
[ 1.680000] flexcan: probe of flexcan.0 failed with error -22
--- arch/m68k/coldfire/clk.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/m68k/coldfire/clk.c +1 -1
@@ -78,7 +78,7 @@ int clk_enable(struct clk *clk)unsigned long flags;if (!clk) -return -EINVAL ; +return 0 ;spin_lock_irqsave (&clk_lock, flags);if ((clk->enabled++ ==0 ) && clk->clk_ops)
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 247/334 ASoC: Intel: kbl_da7219_max98927: Fix format selection for max98373
In reply to Greg Kroah-HartmanFrom: Cezary Rojewski <[email protected]>
[ Upstream commit 6d41bbf2fd3615c56dbf2b67f6cbf9e83d14a2e2 ]
Contrary to what is said in board's file, topology targeting kbl_da7219_max98373 expects format 16b, not 24/32b. Partially revert changes added in 'ASoC: Intel: Boards: Add Maxim98373 support' to bring old behavior back, aligning with topology expectations.
--- sound/soc/intel/boards/kbl_da7219_max98927.c | 55 +++----------------- 1 file changed, 7 insertions(+), 48 deletions(-)
sound/soc/intel/boards/kbl_da7219_max98927.c +7 -48
@@ -199,7 +199,7 @@ static int kabylake_ssp0_hw_params(struct snd_pcm_substream *substream, }if (!strcmp (codec_dai->component->name,MAX98373_DEV0_NAME )) { ret =snd_soc_dai_set_tdm_slot (codec_dai, -0x03 ,3 ,8 ,24 ); +0x30 ,3 ,8 ,16 );if (ret <0 ) {dev_err (runtime->dev,"DEV0 TDM slot err:%d\n" , ret);
@@ -208,10 +208,10 @@ static int kabylake_ssp0_hw_params(struct snd_pcm_substream *substream, }if (!strcmp (codec_dai->component->name,MAX98373_DEV1_NAME )) { ret =snd_soc_dai_set_tdm_slot (codec_dai, -0x0C ,3 ,8 ,24 ); +0xC0 ,3 ,8 ,16 );if (ret <0 ) {dev_err (runtime->dev, -"DEV0 TDM slot err:%d\n" , ret); +"DEV1 TDM slot err:%d\n" , ret);return ret; } }
@@ -311,24 +311,6 @@ static int kabylake_ssp_fixup(struct snd_soc_pcm_runtime *rtd,* The above 2 loops are mutually exclusive based on the stream direction, * thus rtd_dpcm variable will never be overwritten */ -/* -* Topology for kblda7219m98373 & kblmax98373 supports only S24_LE, -* where as kblda7219m98927 & kblmax98927 supports S16_LE by default. -* Skipping the port wise FE and BE configuration for kblda7219m98373 & -* kblmax98373 as the topology (FE & BE) supports S24_LE only. -*/ - -if (!strcmp (rtd->card->name,"kblda7219m98373" ) || - !strcmp (rtd->card->name,"kblmax98373" )) { -/* The ADSP will convert the FE rate to 48k, stereo */ - rate->min = rate->max =48000 ; - chan->min = chan->max =DUAL_CHANNEL ; - -/* set SSP to 24 bit */ -snd_mask_none (fmt); -snd_mask_set_format (fmt,SNDRV_PCM_FORMAT_S24_LE ); -return 0 ; - }/* * The ADSP will convert the FE rate to 48k, stereo, 24 bit
@@ -479,31 +461,20 @@ static struct snd_pcm_hw_constraint_list constraints_channels_quad = {static int kbl_fe_startup (struct snd_pcm_substream *substream) {struct snd_pcm_runtime *runtime = substream->runtime; -struct snd_soc_pcm_runtime *soc_rt =asoc_substream_to_rtd (substream);/* * On this platform for PCM device we support, * 48Khz * stereo +* 16 bit audio */ runtime->hw.channels_max =DUAL_CHANNEL ;snd_pcm_hw_constraint_list (runtime,0 ,SNDRV_PCM_HW_PARAM_CHANNELS , &constraints_channels); -/* -* Setup S24_LE (32 bit container and 24 bit valid data) for -* kblda7219m98373 & kblmax98373. For kblda7219m98927 & -* kblmax98927 keeping it as 16/16 due to topology FW dependency. -*/ -if (!strcmp (soc_rt->card->name,"kblda7219m98373" ) || - !strcmp (soc_rt->card->name,"kblmax98373" )) { - runtime->hw.formats =SNDRV_PCM_FMTBIT_S24_LE ; -snd_pcm_hw_constraint_msbits (runtime,0 ,32 ,24 ); - - }else { - runtime->hw.formats =SNDRV_PCM_FMTBIT_S16_LE ; -snd_pcm_hw_constraint_msbits (runtime,0 ,16 ,16 ); - } + + runtime->hw.formats =SNDRV_PCM_FMTBIT_S16_LE ; +snd_pcm_hw_constraint_msbits (runtime,0 ,16 ,16 );snd_pcm_hw_constraint_list (runtime,0 ,SNDRV_PCM_HW_PARAM_RATE , &constraints_rates);
@@ -536,23 +507,11 @@ static int kabylake_dmic_fixup(struct snd_soc_pcm_runtime *rtd,static int kabylake_dmic_startup (struct snd_pcm_substream *substream) {struct snd_pcm_runtime *runtime = substream->runtime; -struct snd_soc_pcm_runtime *soc_rt =asoc_substream_to_rtd (substream); runtime->hw.channels_min = runtime->hw.channels_max =QUAD_CHANNEL ;snd_pcm_hw_constraint_list (runtime,0 ,SNDRV_PCM_HW_PARAM_CHANNELS , &constraints_channels_quad); -/* -* Topology for kblda7219m98373 & kblmax98373 supports only S24_LE. -* The DMIC also configured for S24_LE. Forcing the DMIC format to -* S24_LE due to the topology FW dependency. -*/ -if (!strcmp (soc_rt->card->name,"kblda7219m98373" ) || - !strcmp (soc_rt->card->name,"kblmax98373" )) { - runtime->hw.formats =SNDRV_PCM_FMTBIT_S24_LE ; -snd_pcm_hw_constraint_msbits (runtime,0 ,32 ,24 ); - } -return snd_pcm_hw_constraint_list (substream->runtime,0 ,SNDRV_PCM_HW_PARAM_RATE , &constraints_rates); }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 248/334 ASoC: Intel: Skylake: Leave data as is when invoking TLV IPCs
In reply to Greg Kroah-HartmanFrom: Cezary Rojewski <[email protected]>
[ Upstream commit 126b3422adc80f29d2129db7f61e0113a8a526c6 ]
Advancing pointer initially fixed issue for some users but caused regression for others. Leave data as it to make it easier for end users to adjust their topology files if needed.
--- sound/soc/intel/skylake/skl-topology.c | 6 ------ 1 file changed, 6 deletions(-)
sound/soc/intel/skylake/skl-topology.c +0 -6
@@ -1463,12 +1463,6 @@ static int skl_tplg_tlv_control_set(struct snd_kcontrol *kcontrol,struct skl_dev *skl =get_skl_ctx (w->dapm->dev);if (ac->params) { -/* -* Widget data is expected to be stripped of T and L -*/ - size -=2 *sizeof (unsigned int ); - data +=2 ; -if (size > ac->max)return -EINVAL ; ac->size = size;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 249/334 ASoC: Intel: Skylake: Fix module resource and format selection
In reply to Greg Kroah-HartmanFrom: Cezary Rojewski <[email protected]>
[ Upstream commit e8b374b649afe756c2470e0e6668022e90bf8518 ]
Module configuration may differ between its instances depending on resources required and input and output audio format. Available parameters to select from are stored in module resource and interface (format) lists. These come from topology, together with description of each of pipe's modules.
Ignoring index value provided by topology and relying always on 0th entry leads to unexpected module behavior due to under/overbudged resources assigned or impropper format selection. Fix by taking entry at index specified by topology.
--- sound/soc/intel/skylake/skl-topology.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-)
sound/soc/intel/skylake/skl-topology.c +10 -9
@@ -113,7 +113,7 @@ static int is_skl_dsp_widget_type(struct snd_soc_dapm_widget *w,static void skl_dump_mconfig (struct skl_dev *skl,struct skl_module_cfg *mcfg) { -struct skl_module_iface *iface = &mcfg->module->formats[0 ]; +struct skl_module_iface *iface = &mcfg->module->formats[mcfg->fmt_idx];dev_dbg (skl->dev,"Dumping config\n" );dev_dbg (skl->dev,"Input Format:\n" );
@@ -195,8 +195,8 @@ static void skl_tplg_update_params_fixup(struct skl_module_cfg *m_cfg,struct skl_module_fmt *in_fmt, *out_fmt;/* Fixups will be applied to pin 0 only */ - in_fmt = &m_cfg->module->formats[0 ].inputs[0 ].fmt; - out_fmt = &m_cfg->module->formats[0 ].outputs[0 ].fmt; + in_fmt = &m_cfg->module->formats[m_cfg->fmt_idx].inputs[0 ].fmt; + out_fmt = &m_cfg->module->formats[m_cfg->fmt_idx].outputs[0 ].fmt;if (params->stream ==SNDRV_PCM_STREAM_PLAYBACK ) {if (is_fe) {
@@ -239,9 +239,9 @@ static void skl_tplg_update_buffer_size(struct skl_dev *skl,/* Since fixups is applied to pin 0 only, ibs, obs needs * change for pin 0 only */ - res = &mcfg->module->resources[0 ]; - in_fmt = &mcfg->module->formats[0 ].inputs[0 ].fmt; - out_fmt = &mcfg->module->formats[0 ].outputs[0 ].fmt; + res = &mcfg->module->resources[mcfg->res_idx]; + in_fmt = &mcfg->module->formats[mcfg->fmt_idx].inputs[0 ].fmt; + out_fmt = &mcfg->module->formats[mcfg->fmt_idx].outputs[0 ].fmt;if (mcfg->m_type ==SKL_MODULE_TYPE_SRCINT ) multiplier =5 ;
@@ -1631,11 +1631,12 @@ int skl_tplg_update_pipe_params(struct device *dev,struct skl_module_cfg *mconfig, struct skl_pipe_params *params) { - struct skl_module_res *res = &mconfig->module->resources[0]; + struct skl_module_res *res;struct skl_dev *skl =get_skl_ctx (dev);struct skl_module_fmt *format =NULL ;u8 cfg_idx = mconfig->pipe->cur_config_idx; + res = &mconfig->module->resources[mconfig->res_idx];skl_tplg_fill_dma_id (mconfig, params); mconfig->fmt_idx = mconfig->mod_cfg[cfg_idx].fmt_idx; mconfig->res_idx = mconfig->mod_cfg[cfg_idx].res_idx;
@@ -1644,9 +1645,9 @@ int skl_tplg_update_pipe_params(struct device *dev,return 0 ;if (params->stream ==SNDRV_PCM_STREAM_PLAYBACK ) - format = &mconfig->module->formats[0 ].inputs[0 ].fmt; + format = &mconfig->module->formats[mconfig->fmt_idx].inputs[0 ].fmt;else - format = &mconfig->module->formats[0 ].outputs[0 ].fmt; + format = &mconfig->module->formats[mconfig->fmt_idx].outputs[0 ].fmt;/* set the hw_params */ format->s_freq = params->s_freq;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 250/334 mmc: sdhci: Fix issue with uninitialized dma_slave_config
In reply to Greg Kroah-HartmanFrom: Tony Lindgren <[email protected]>
[ Upstream commit 522654d534d315d540710124c57b49ca22ac5f72 ]
Depending on the DMA driver being used, the struct dma_slave_config may need to be initialized to zero for the unused data.
For example, we have three DMA drivers using src_port_window_size and dst_port_window_size. If these are left uninitialized, it can cause DMA failures at least if external TI SDMA is ever configured for sdhci.
For other external DMA cases, this is probably not currently an issue but is still good to fix though.
--- drivers/mmc/host/sdhci.c | 1 + 1 file changed, 1 insertion(+)
drivers/mmc/host/sdhci.c +1 -0
@@ -1222,6 +1222,7 @@ static int sdhci_external_dma_setup(struct sdhci_host *host,if (!host->mapbase)return -EINVAL ; +memset (&cfg,0 ,sizeof (cfg)); cfg.src_addr = host->mapbase +SDHCI_BUFFER ; cfg.dst_addr = host->mapbase +SDHCI_BUFFER ; cfg.src_addr_width =DMA_SLAVE_BUSWIDTH_4_BYTES ;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 251/334 mmc: dw_mmc: Fix issue with uninitialized dma_slave_config
In reply to Greg Kroah-HartmanFrom: Tony Lindgren <[email protected]>
[ Upstream commit c3ff0189d3bc9c03845fe37472c140f0fefd0c79 ]
Depending on the DMA driver being used, the struct dma_slave_config may need to be initialized to zero for the unused data.
For example, we have three DMA drivers using src_port_window_size and dst_port_window_size. If these are left uninitialized, it can cause DMA failures.
For dw_mmc, this is probably not currently an issue but is still good to fix though.
--- drivers/mmc/host/dw_mmc.c | 1 + 1 file changed, 1 insertion(+)
drivers/mmc/host/dw_mmc.c +1 -0
@@ -782,6 +782,7 @@ static int dw_mci_edmac_start_dma(struct dw_mci *host,int ret =0 ;/* Set external dma config: burst size, burst width */ +memset (&cfg,0 ,sizeof (cfg)); cfg.dst_addr = host->phy_regs + fifo_offset; cfg.src_addr = cfg.dst_addr; cfg.dst_addr_width =DMA_SLAVE_BUSWIDTH_4_BYTES ;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 252/334 mmc: moxart: Fix issue with uninitialized dma_slave_config
In reply to Greg Kroah-HartmanFrom: Tony Lindgren <[email protected]>
[ Upstream commit ee5165354d498e5bceb0b386e480ac84c5f8c28c ]
Depending on the DMA driver being used, the struct dma_slave_config may need to be initialized to zero for the unused data.
For example, we have three DMA drivers using src_port_window_size and dst_port_window_size. If these are left uninitialized, it can cause DMA failures.
For moxart, this is probably not currently an issue but is still good to fix though.
--- drivers/mmc/host/moxart-mmc.c | 1 + 1 file changed, 1 insertion(+)
drivers/mmc/host/moxart-mmc.c +1 -0
@@ -628,6 +628,7 @@ static int moxart_probe(struct platform_device *pdev) host->dma_chan_tx, host->dma_chan_rx); host->have_dma = true; +memset (&cfg,0 ,sizeof (cfg)); cfg.src_addr_width =DMA_SLAVE_BUSWIDTH_4_BYTES ; cfg.dst_addr_width =DMA_SLAVE_BUSWIDTH_4_BYTES ;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 253/334 ASoC: wm_adsp: Put debugfs_remove_recursive back in
In reply to Greg Kroah-HartmanFrom: Charles Keepax <[email protected]>
[ Upstream commit e6d0b92ac00b53121a35b2a1ce8d393dc9179fdf ]
This patch reverts commit acbf58e53041 ("ASoC: wm_adsp: Let soc_cleanup_component_debugfs remove debugfs"), and adds an alternate solution to the issue. That patch removes the call to debugfs_remove_recursive, which cleans up the DSPs debugfs. The intention was to avoid an unbinding issue on an out of tree driver/platform.
The issue with the patch is it means the driver no longer cleans up its own debugfs, instead relying on ASoC to remove recurive on the parent debugfs node. This is conceptually rather unclean, but also it would prevent DSPs being added/removed independently of ASoC and soon we are going to be upstreaming some non-audio parts with these DSPs, which will require this.
Finally, it seems the issue on the platform is a result of the wm_adsp2_cleanup_debugfs getting called twice. This is very likely a problem on the platform side and will be resolved there. But in the mean time make the code a little more robust to such issues, and again conceptually a bit nicer, but clearing the debugfs_root variable in the DSP structure when the debugfs is removed.
--- sound/soc/codecs/wm_adsp.c | 2 ++ 1 file changed, 2 insertions(+)
sound/soc/codecs/wm_adsp.c +2 -0
@@ -747,6 +747,8 @@ static void wm_adsp2_init_debugfs(struct wm_adsp *dsp,static void wm_adsp2_cleanup_debugfs (struct wm_adsp *dsp) {wm_adsp_debugfs_clear (dsp); +debugfs_remove_recursive (dsp->debugfs_root); + dsp->debugfs_root =NULL ; }#else static inline void wm_adsp2_init_debugfs(struct wm_adsp *dsp,
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 254/334 bpf: Fix possible out of bound write in narrow load handling
In reply to Greg Kroah-HartmanFrom: Andrey Ignatov <[email protected]>
[ Upstream commit d7af7e497f0308bc97809cc48b58e8e0f13887e1 ]
Fix a verifier bug found by smatch static checker in [0].
This problem has never been seen in prod to my best knowledge. Fixing it still seems to be a good idea since it's hard to say for sure whether it's possible or not to have a scenario where a combination of convert_ctx_access() and a narrow load would lead to an out of bound write.
When narrow load is handled, one or two new instructions are added to insn_buf array, but before it was only checked that
cnt >= ARRAY_SIZE(insn_buf)
And it's safe to add a new instruction to insn_buf[cnt++] only once. The second try will lead to out of bound write. And this is what can happen if shift is set.
Fix it by making sure that if the BPF_RSH instruction has to be added in addition to BPF_AND then there is enough space for two more instructions in insn_buf.
The full report [0] is below:
kernel/bpf/verifier.c:12304 convert_ctx_accesses() warn: offset 'cnt' incremented past end of array kernel/bpf/verifier.c:12311 convert_ctx_accesses() warn: offset 'cnt' incremented past end of array
kernel/bpf/verifier.c
12282
12283 insn->off = off & ~(size_default - 1);
12284 insn->code = BPF_LDX | BPF_MEM | size_code;
12285 }
12286
12287 target_size = 0;
12288 cnt = convert_ctx_access(type, insn, insn_buf, env->prog,
12289 &target_size);
12290 if (cnt == 0 || cnt >= ARRAY_SIZE(insn_buf) ||
^^^^^^^^^^^^^^^^^^^^^^^^^^^Bounds check.
12291 (ctx_field_size && !target_size)) {
12292 verbose(env, "bpf verifier is misconfigured\n");
12293 return -EINVAL;
12294 }
12295
12296 if (is_narrower_load && size < target_size) {
12297 u8 shift = bpf_ctx_narrow_access_offset(
12298 off, size, size_default) * 8;
12299 if (ctx_field_size <= 4) {
12300 if (shift)
12301 insn_buf[cnt++] = BPF_ALU32_IMM(BPF_RSH,
^^^^^increment beyond end of array
12302 insn->dst_reg,
12303 shift);
--> 12304 insn_buf[cnt++] = BPF_ALU32_IMM(BPF_AND, insn->dst_reg,
^^^^^out of bounds write
12305 (1 << size * 8) - 1);
12306 } else {
12307 if (shift)
12308 insn_buf[cnt++] = BPF_ALU64_IMM(BPF_RSH,
12309 insn->dst_reg,
12310 shift);
12311 insn_buf[cnt++] = BPF_ALU64_IMM(BPF_AND, insn->dst_reg,
^^^^^^^^^^^^^^^Same.
12312 (1ULL << size * 8) - 1);
12313 }
12314 }
12315
12316 new_prog = bpf_patch_insn_data(env, i + delta, insn_buf, cnt);
12317 if (!new_prog)
12318 return -ENOMEM;
12319
12320 delta += cnt - 1;
12321
12322 /* keep walking new program and skip insns we just inserted */
12323 env->prog = new_prog;
12324 insn = new_prog->insnsi + i + delta;
12325 }
12326
12327 return 0;
12328 }[0] https://lore.kernel.org/bpf/20210817050843.GA21456@kili/
v1->v2:
- clarify that problem was only seen by static checker but not in prod;
--- kernel/bpf/verifier.c | 4 ++++ 1 file changed, 4 insertions(+)
kernel/bpf/verifier.c +4 -0
@@ -12013,6 +12013,10 @@ static int convert_ctx_accesses(struct bpf_verifier_env *env)if (is_narrower_load && size < target_size) {u8 shift =bpf_ctx_narrow_access_offset ( off, size, size_default) *8 ; +if (shift && cnt +1 >=ARRAY_SIZE (insn_buf)) { +verbose (env,"bpf verifier narrow ctx load misconfigured\n" ); +return -EINVAL ; + }if (ctx_field_size <=4 ) {if (shift) insn_buf[cnt++] = BPF_ALU32_IMM(BPF_RSH,
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 255/334 hv_utils: Set the maximum packet size for VSS driver to the length of the receive buffer
In reply to Greg Kroah-HartmanFrom: Vitaly Kuznetsov <[email protected]>
[ Upstream commit 9d68cd9120e4e3af38f843e165631c323b86b4e4 ]
Commit adae1e931acd ("Drivers: hv: vmbus: Copy packets sent by Hyper-V out of the ring buffer") introduced a notion of maximum packet size and for KVM and FCOPY drivers set it to the length of the receive buffer. VSS driver wasn't updated, this means that the maximum packet size is now VMBUS_DEFAULT_MAX_PKT_SIZE (4k). Apparently, this is not enough. I'm observing a packet of 6304 bytes which is being truncated to 4096. When VSS driver tries to read next packet from ring buffer it starts from the wrong offset and receives garbage.
Set the maximum packet size to 'HV_HYP_PAGE_SIZE * 2' in VSS driver. This matches the length of the receive buffer and is in line with other utils drivers.
--- drivers/hv/hv_snapshot.c | 1 + 1 file changed, 1 insertion(+)
drivers/hv/hv_snapshot.c +1 -0
@@ -375,6 +375,7 @@ hv_vss_init(struct hv_util_service *srv) } recv_buffer = srv->recv_buffer; vss_transaction.recv_channel = srv->channel; + vss_transaction.recv_channel->max_pkt_size =HV_HYP_PAGE_SIZE *2 ;/* * When this driver loads, the user level daemon that
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 256/334 CIFS: Fix a potencially linear read overflow
In reply to Greg Kroah-HartmanFrom: Len Baker <[email protected]>
[ Upstream commit f980d055a0f858d73d9467bb0b570721bbfcdfb8 ]
strlcpy() reads the entire source buffer first. This read may exceed the destination size limit. This is both inefficient and can lead to linear read overflows if a source string is not NUL-terminated.
Also, the strnlen() call does not avoid the read overflow in the strlcpy function when a not NUL-terminated string is passed.
So, replace this block by a call to kstrndup() that avoids this type of overflow and does the same.
--- fs/cifs/cifs_unicode.c | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-)
fs/cifs/cifs_unicode.c +2 -7
@@ -358,14 +358,9 @@ cifs_strndup_from_utf16(const char *src, const int maxlen,if (!dst)return NULL ;cifs_from_utf16 (dst, (__le16 *) src, len, maxlen, codepage, -NO_MAP_UNI_RSVD ); +NO_MAP_UNI_RSVD ); }else { - len =strnlen (src, maxlen); - len++; - dst =kmalloc (len,GFP_KERNEL ); -if (!dst) -return NULL ; -strlcpy (dst, src, len); + dst =kstrndup (src, maxlen,GFP_KERNEL ); }return dst;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 257/334 i2c: mt65xx: fix IRQ check
In reply to Greg Kroah-HartmanFrom: Sergey Shtylyov <[email protected]>
[ Upstream commit 58fb7c643d346e2364404554f531cfa6a1a3917c ]
Iff platform_get_irq() returns 0, the driver's probe() method will return 0 early (as if the method's call was successful). Let's consider IRQ0 valid for simplicity -- devm_request_irq() can always override that decision...
--- drivers/i2c/busses/i2c-mt65xx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/i2c/busses/i2c-mt65xx.c +1 -1
@@ -1211,7 +1211,7 @@ static int mtk_i2c_probe(struct platform_device *pdev)return PTR_ERR (i2c->pdmabase); irq =platform_get_irq (pdev,0 ); -if (irq <=0 ) +if (irq <0 )return irq;init_completion (&i2c->msg_complete);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 258/334 i2c: xlp9xx: fix main IRQ check
In reply to Greg Kroah-HartmanFrom: Sergey Shtylyov <[email protected]>
[ Upstream commit 661e8a88e8317eb9ffe69c69d6cb4876370fe7e2 ]
Iff platform_get_irq() returns 0 for the main IRQ, the driver's probe() method will return 0 early (as if the method's call was successful). Let's consider IRQ0 valid for simplicity -- devm_request_irq() can always override that decision...
--- drivers/i2c/busses/i2c-xlp9xx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/i2c/busses/i2c-xlp9xx.c +1 -1
@@ -517,7 +517,7 @@ static int xlp9xx_i2c_probe(struct platform_device *pdev)return PTR_ERR (priv->base); priv->irq =platform_get_irq (pdev,0 ); -if (priv->irq <=0 ) +if (priv->irq <0 )return priv->irq;/* SMBAlert irq */ priv->alert_data.irq =platform_get_irq (pdev,1 );
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 259/334 octeontx2-pf: cn10k: Fix error return code in otx2_set_flowkey_cfg()
In reply to Greg Kroah-HartmanFrom: Yang Yingliang <[email protected]>
[ Upstream commit 5e8243e66b4d80eeaf9ed8cb0235ff133630a014 ]
If otx2_mbox_get_rsp() fails, otx2_set_flowkey_cfg() need return an error code.
--- drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.c +3 -1
@@ -289,8 +289,10 @@ int otx2_set_flowkey_cfg(struct otx2_nic *pfvf) rsp = (struct nix_rss_flowkey_cfg_rsp *)otx2_mbox_get_rsp (&pfvf->mbox.mbox,0 , &req->hdr); -if (IS_ERR (rsp)) +if (IS_ERR (rsp)) { + err =PTR_ERR (rsp); goto fail; + } pfvf->hw.flowkey_alg_idx = rsp->alg_idx; fail:
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 260/334 usb: ehci-orion: Handle errors of clk_prepare_enable() in probe
In reply to Greg Kroah-HartmanFrom: Evgeny Novikov <[email protected]>
[ Upstream commit 4720f1bf4ee4a784d9ece05420ba33c9222a3004 ]
ehci_orion_drv_probe() did not account for possible errors of clk_prepare_enable() that in particular could cause invocation of clk_disable_unprepare() on clocks that were not prepared/enabled yet, e.g. in remove or on handling errors of usb_add_hcd() in probe. Though, there were several patches fixing different issues with clocks in this driver, they did not solve this problem.
Add handling of errors of clk_prepare_enable() in ehci_orion_drv_probe() to avoid calls of clk_disable_unprepare() without previous successful invocation of clk_prepare_enable().
Found by Linux Driver Verification project (linuxtesting.org).
--- drivers/usb/host/ehci-orion.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
drivers/usb/host/ehci-orion.c +6 -2
@@ -264,8 +264,11 @@ static int ehci_orion_drv_probe(struct platform_device *pdev)* the clock does not exists. */ priv->clk =devm_clk_get (&pdev->dev,NULL ); -if (!IS_ERR (priv->clk)) -clk_prepare_enable (priv->clk); +if (!IS_ERR (priv->clk)) { + err =clk_prepare_enable (priv->clk); +if (err) + goto err_put_hcd; + } priv->phy =devm_phy_optional_get (&pdev->dev,"usb" );if (IS_ERR (priv->phy)) {
@@ -311,6 +314,7 @@ static int ehci_orion_drv_probe(struct platform_device *pdev) err_dis_clk:if (!IS_ERR (priv->clk))clk_disable_unprepare (priv->clk); +err_put_hcd:usb_put_hcd (hcd); err: dev_err(&pdev->dev, "init %s fail, %d\n",
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 261/334 usb: bdc: Fix an error handling path in bdc_probe() when no suitable DMA config is available
In reply to Greg Kroah-HartmanFrom: Christophe JAILLET <[email protected]>
[ Upstream commit d2f42e09393c774ab79088d8e3afcc62b3328fc9 ]
If no suitable DMA configuration is available, a previous 'bdc_phy_init()' call must be undone by a corresponding 'bdc_phy_exit()' call.
Branch to the existing error handling path instead of returning directly.
--- drivers/usb/gadget/udc/bdc/bdc_core.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/usb/gadget/udc/bdc/bdc_core.c +2 -1
@@ -560,7 +560,8 @@ static int bdc_probe(struct platform_device *pdev)if (ret) {dev_err (dev,"No suitable DMA config available, abort\n" ); -return -ENOTSUPP ; + ret = -ENOTSUPP ; + goto phycleanup; }dev_dbg (dev,"Using 32-bit address\n" ); }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 262/334 usb: bdc: Fix a resource leak in the error handling path of bdc_probe()
In reply to Greg Kroah-HartmanFrom: Christophe JAILLET <[email protected]>
[ Upstream commit 6f15a2a09cecb7a2faba4a75bbd101f6f962294b ]
If an error occurs after a successful 'clk_prepare_enable()' call, it must be undone by a corresponding 'clk_disable_unprepare()' call. This call is already present in the remove function.
Add this call in the error handling path and reorder the code so that the 'clk_prepare_enable()' call happens later in the function.
The goal is to have as much managed resources functions as possible before the 'clk_prepare_enable()' call in order to keep the error handling path simple.
While at it, remove the now unneeded 'clk' variable.
--- drivers/usb/gadget/udc/bdc/bdc_core.c | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-)
drivers/usb/gadget/udc/bdc/bdc_core.c +13 -14
@@ -488,27 +488,14 @@ static int bdc_probe(struct platform_device *pdev)int irq;u32 temp;struct device *dev = &pdev->dev; -struct clk *clk;int phy_num;dev_dbg (dev,"%s()\n" , __func__); - clk =devm_clk_get_optional (dev,"sw_usbd" ); -if (IS_ERR (clk)) -return PTR_ERR (clk); - - ret =clk_prepare_enable (clk); -if (ret) { -dev_err (dev,"could not enable clock\n" ); -return ret; - } - bdc =devm_kzalloc (dev,sizeof (*bdc),GFP_KERNEL );if (!bdc)return -ENOMEM ; - bdc->clk = clk; - bdc->regs =devm_platform_ioremap_resource (pdev,0 );if (IS_ERR (bdc->regs))return PTR_ERR (bdc->regs);
@@ -545,10 +532,20 @@ static int bdc_probe(struct platform_device *pdev) } } + bdc->clk =devm_clk_get_optional (dev,"sw_usbd" ); +if (IS_ERR (bdc->clk)) +return PTR_ERR (bdc->clk); + + ret =clk_prepare_enable (bdc->clk); +if (ret) { +dev_err (dev,"could not enable clock\n" ); +return ret; + } + ret =bdc_phy_init (bdc);if (ret) {dev_err (bdc->dev,"BDC phy init failure:%d\n" , ret); -return ret; + goto disable_clk; } temp =bdc_readl (bdc->regs,BDC_BDCCAP1 );
@@ -581,6 +578,8 @@ cleanup:bdc_hw_exit (bdc); phycleanup:bdc_phy_exit (bdc); +disable_clk: +clk_disable_unprepare (bdc->clk);return ret; }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 263/334 tty: serial: fsl_lpuart: fix the wrong mapbase value
In reply to Greg Kroah-HartmanFrom: Andy Duan <[email protected]>
[ Upstream commit d5c38948448abc2bb6b36dbf85a554bf4748885e ]
Register offset needs to be applied on mapbase also. dma_tx/rx_request use the physical address of UARTDATA. Register offset is currently only applied to membase (the corresponding virtual addr) but not on mapbase.
--- drivers/tty/serial/fsl_lpuart.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/tty/serial/fsl_lpuart.c +1 -1
@@ -2611,7 +2611,7 @@ static int lpuart_probe(struct platform_device *pdev)return PTR_ERR (sport->port.membase); sport->port.membase += sdata->reg_off; - sport->port.mapbase = res->start; + sport->port.mapbase = res->start + sdata->reg_off; sport->port.dev = &pdev->dev; sport->port.type =PORT_LPUART ; sport->devtype = sdata->devtype;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 264/334 ASoC: wcd9335: Fix a double irq free in the remove function
In reply to Greg Kroah-HartmanFrom: Christophe JAILLET <[email protected]>
[ Upstream commit 7a6a723e98aa45f393e6add18f7309dfffa1b0e2 ]
There is no point in calling 'free_irq()' explicitly for 'WCD9335_IRQ_SLIMBUS' in the remove function.
The irqs are requested in 'wcd9335_setup_irqs()' using a resource managed function (i.e. 'devm_request_threaded_irq()'). 'wcd9335_setup_irqs()' requests all what is defined in the 'wcd9335_irqs' structure.
This structure has only one entry for 'WCD9335_IRQ_SLIMBUS'.
So 'devm_request...irq()' + explicit 'free_irq()' would lead to a double free.
Remove the unneeded 'free_irq()' from the remove function.
Message-Id: <0614d63bc00edd7e81dd367504128f3d84f72efa.1629091028.git.christophe.jaillet@wanadoo.fr>
--- sound/soc/codecs/wcd9335.c | 1 - 1 file changed, 1 deletion(-)
sound/soc/codecs/wcd9335.c +0 -1
@@ -4869,7 +4869,6 @@ static void wcd9335_codec_remove(struct snd_soc_component *comp)struct wcd9335_codec *wcd =dev_get_drvdata (comp->dev);wcd_clsh_ctrl_free (wcd->clsh_ctrl); -free_irq (regmap_irq_get_virq (wcd->irq_data,WCD9335_IRQ_SLIMBUS ), wcd); } static int wcd9335_codec_set_sysclk(struct snd_soc_component *comp,
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 265/334 ASoC: wcd9335: Fix a memory leak in the error handling path of the probe function
In reply to Greg Kroah-HartmanFrom: Christophe JAILLET <[email protected]>
[ Upstream commit fc6fc81caa63900cef9ebb8b2e365c3ed5a9effb ]
If 'wcd9335_setup_irqs()' fails, me must release the memory allocated in 'wcd_clsh_ctrl_alloc()', as already done in the remove function.
Add an error handling path and the missing 'wcd_clsh_ctrl_free()' call.
Message-Id: <6dc12372f09fabb70bf05941dbe6a1382dc93e43.1629091028.git.christophe.jaillet@wanadoo.fr>
--- sound/soc/codecs/wcd9335.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-)
sound/soc/codecs/wcd9335.c +10 -1
@@ -4844,6 +4844,7 @@ static void wcd9335_codec_init(struct snd_soc_component *component)static int wcd9335_codec_probe (struct snd_soc_component *component) {struct wcd9335_codec *wcd =dev_get_drvdata (component->dev); +int ret;int i;snd_soc_component_init_regmap (component, wcd->regmap);
@@ -4861,7 +4862,15 @@ static int wcd9335_codec_probe(struct snd_soc_component *component)for (i =0 ; i <NUM_CODEC_DAIS ; i++)INIT_LIST_HEAD (&wcd->dai[i].slim_ch_list); -return wcd9335_setup_irqs (wcd); + ret =wcd9335_setup_irqs (wcd); +if (ret) + goto free_clsh_ctrl; + +return 0 ; + +free_clsh_ctrl: +wcd_clsh_ctrl_free (wcd->clsh_ctrl); +return ret; }static void wcd9335_codec_remove (struct snd_soc_component *comp)
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 266/334 ASoC: wcd9335: Disable irq on slave ports in the remove function
In reply to Greg Kroah-HartmanFrom: Christophe JAILLET <[email protected]>
[ Upstream commit d3efd26af2e044ff2b48d38bb871630282d77e60 ]
The probe calls 'wcd9335_setup_irqs()' to enable interrupts on all slave ports.
This must be undone in the remove function.
Add a 'wcd9335_teardown_irqs()' function that undoes 'wcd9335_setup_irqs()' function, and call it from the remove function.
Message-Id: <8f761244d79bd4c098af8a482be9121d3a486d1b.1629091028.git.christophe.jaillet@wanadoo.fr>
--- sound/soc/codecs/wcd9335.c | 11 +++++++++++ 1 file changed, 11 insertions(+)
sound/soc/codecs/wcd9335.c +11 -0
@@ -4076,6 +4076,16 @@ static int wcd9335_setup_irqs(struct wcd9335_codec *wcd)return ret; } +static void wcd9335_teardown_irqs (struct wcd9335_codec *wcd) +{ +int i; + +/* disable interrupts on all slave ports */ +for (i =0 ; i <WCD9335_SLIM_NUM_PORT_REG ; i++) +regmap_write (wcd->if_regmap,WCD9335_SLIM_PGD_PORT_INT_EN0 + i, +0x00 ); +} +static void wcd9335_cdc_sido_ccl_enable (struct wcd9335_codec *wcd,bool ccl_flag) {
@@ -4878,6 +4888,7 @@ static void wcd9335_codec_remove(struct snd_soc_component *comp)struct wcd9335_codec *wcd =dev_get_drvdata (comp->dev);wcd_clsh_ctrl_free (wcd->clsh_ctrl); +wcd9335_teardown_irqs (wcd); } static int wcd9335_codec_set_sysclk(struct snd_soc_component *comp,
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 267/334 iwlwifi: skip first element in the WTAS ACPI table
In reply to Greg Kroah-HartmanFrom: Abhishek Naik <[email protected]>
[ Upstream commit 19426d54302e199b3fd2d575f926a13af66be2b9 ]
By mistake we were considering the first element of the WTAS wifi package as part of the data we want to rid, but that element is the wifi package signature (always 0x07), so it should be skipped.
Change the code to read the data starting from element 1 instead.
--- drivers/net/wireless/intel/iwlwifi/fw/acpi.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-)
drivers/net/wireless/intel/iwlwifi/fw/acpi.c +7 -7
@@ -264,7 +264,7 @@ int iwl_acpi_get_tas(struct iwl_fw_runtime *fwrt, goto out_free; } - enabled = !!wifi_pkg->package.elements[0 ].integer.value; + enabled = !!wifi_pkg->package.elements[1 ].integer.value;if (!enabled) { *block_list_size =-1 ;
@@ -273,15 +273,15 @@ int iwl_acpi_get_tas(struct iwl_fw_runtime *fwrt, goto out_free; } -if (wifi_pkg->package.elements[1 ].type !=ACPI_TYPE_INTEGER || - wifi_pkg->package.elements[1 ].integer.value > +if (wifi_pkg->package.elements[2 ].type !=ACPI_TYPE_INTEGER || + wifi_pkg->package.elements[2 ].integer.value >APCI_WTAS_BLACK_LIST_MAX ) {IWL_DEBUG_RADIO (fwrt,"TAS invalid array size %llu\n" , wifi_pkg->package.elements[1 ].integer.value); ret = -EINVAL ; goto out_free; } - *block_list_size = wifi_pkg->package.elements[1 ].integer.value; + *block_list_size = wifi_pkg->package.elements[2 ].integer.value;IWL_DEBUG_RADIO (fwrt,"TAS array size %d\n" , *block_list_size);if (*block_list_size >APCI_WTAS_BLACK_LIST_MAX ) {
@@ -294,15 +294,15 @@ int iwl_acpi_get_tas(struct iwl_fw_runtime *fwrt,for (i =0 ; i < *block_list_size; i++) {u32 country; -if (wifi_pkg->package.elements[2 + i].type != +if (wifi_pkg->package.elements[3 + i].type !=ACPI_TYPE_INTEGER ) {IWL_DEBUG_RADIO (fwrt, -"TAS invalid array elem %d\n" ,2 + i); +"TAS invalid array elem %d\n" ,3 + i); ret = -EINVAL ; goto out_free; } - country = wifi_pkg->package.elements[2 + i].integer.value; + country = wifi_pkg->package.elements[3 + i].integer.value; block_list_array[i] =cpu_to_le32 (country);IWL_DEBUG_RADIO (fwrt,"TAS block list country %d\n" , country); }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 268/334 net/mlx5: Lag, fix multipath lag activation
In reply to Greg Kroah-HartmanFrom: Dima Chumak <[email protected]>
[ Upstream commit 2f8b6161cca5fb34b0065e2eac8bb2b61b7bfe87 ]
When handling FIB_EVENT_ENTRY_REPLACE event for a new multipath route, lag activation can be missed if a stale (struct lag_mp)->mfi pointer exists, which was associated with an older multipath route that had been removed.
Normally, when a route is removed, it triggers mlx5_lag_fib_event(), which handles FIB_EVENT_ENTRY_DEL and clears mfi pointer. But, if mlx5_lag_check_prereq() condition isn't met, for example when eswitch is in legacy mode, the fib event is skipped and mfi pointer becomes stale.
Fix by resetting mfi pointer to NULL in mlx5_deactivate_lag().
--- drivers/net/ethernet/mellanox/mlx5/core/lag.c | 1 + drivers/net/ethernet/mellanox/mlx5/core/lag_mp.c | 8 ++++++++ drivers/net/ethernet/mellanox/mlx5/core/lag_mp.h | 2 ++ 3 files changed, 11 insertions(+)
drivers/net/ethernet/mellanox/mlx5/core/lag.c +1 -0
@@ -277,6 +277,7 @@ static int mlx5_deactivate_lag(struct mlx5_lag *ldev)int err; ldev->flags &= ~MLX5_LAG_MODE_FLAGS ; +mlx5_lag_mp_reset (ldev);MLX5_SET (destroy_lag_in, in, opcode,MLX5_CMD_OP_DESTROY_LAG ); err =mlx5_cmd_exec_in (dev0, destroy_lag, in);
drivers/net/ethernet/mellanox/mlx5/core/lag_mp.c +8 -0
@@ -302,6 +302,14 @@ static int mlx5_lag_fib_event(struct notifier_block *nb,return NOTIFY_DONE ; } +void mlx5_lag_mp_reset (struct mlx5_lag *ldev) +{ +/* Clear mfi, as it might become stale when a route delete event +* has been missed, see mlx5_lag_fib_route_event(). +*/ + ldev->lag_mp.mfi =NULL ; +} +int mlx5_lag_mp_init (struct mlx5_lag *ldev) {struct lag_mp *mp = &ldev->lag_mp;
drivers/net/ethernet/mellanox/mlx5/core/lag_mp.h +2 -0
@@ -21,11 +21,13 @@ struct lag_mp {#ifdef CONFIG_MLX5_ESWITCH +void mlx5_lag_mp_reset (struct mlx5_lag *ldev);int mlx5_lag_mp_init (struct mlx5_lag *ldev);void mlx5_lag_mp_cleanup (struct mlx5_lag *ldev);#else /* CONFIG_MLX5_ESWITCH */ +static inline void mlx5_lag_mp_reset (struct mlx5_lag *ldev) {};static inline int mlx5_lag_mp_init (struct mlx5_lag *ldev) {return 0 ; }static inline void mlx5_lag_mp_cleanup (struct mlx5_lag *ldev) {}
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 269/334 net/mlx5: Remove all auxiliary devices at the unregister event
In reply to Greg Kroah-HartmanFrom: Leon Romanovsky <[email protected]>
[ Upstream commit 8e7e2e8ed0e251138926838b7933f8eb6dd56b12 ]
The call to mlx5_unregister_device() means that mlx5_core driver is removed. In such scenario, we need to disregard all other flags like attach/detach and forcibly remove all auxiliary devices.
--- drivers/net/ethernet/mellanox/mlx5/core/dev.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/mellanox/mlx5/core/dev.c +1 -1
@@ -397,7 +397,7 @@ int mlx5_register_device(struct mlx5_core_dev *dev)void mlx5_unregister_device (struct mlx5_core_dev *dev) {mutex_lock (&mlx5_intf_mutex); - dev->priv.flags |=MLX5_PRIV_FLAGS_DISABLE_ALL_ADEV ; + dev->priv.flags =MLX5_PRIV_FLAGS_DISABLE_ALL_ADEV ;mlx5_rescan_drivers_locked (dev);mutex_unlock (&mlx5_intf_mutex); }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 270/334 net/mlx5e: Fix possible use-after-free deleting fdb rule
In reply to Greg Kroah-HartmanFrom: Roi Dayan <[email protected]>
[ Upstream commit 9a5f9cc794e17cf6ed2a5bb215d2e8b6832db444 ]
After neigh-update-add failure we are still with a slow path rule but the driver always assume the rule is an fdb rule.
Fix neigh-update-del by checking slow path tc flag on the flow. Also fix neigh-update-add for when neigh-update-del fails the same.
--- drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun_encap.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun_encap.c +2 -2
@@ -147,7 +147,7 @@ void mlx5e_tc_encap_flows_add(struct mlx5e_priv *priv,mlx5e_rep_queue_neigh_stats_work (priv);list_for_each_entry (flow, flow_list, tmp_list) { -if (!mlx5e_is_offloaded_flow (flow)) +if (!mlx5e_is_offloaded_flow (flow) || !flow_flag_test (flow,SLOW ))continue ; attr = flow->attr; esw_attr = attr->esw_attr;
@@ -188,7 +188,7 @@ void mlx5e_tc_encap_flows_del(struct mlx5e_priv *priv,int err;list_for_each_entry (flow, flow_list, tmp_list) { -if (!mlx5e_is_offloaded_flow (flow)) +if (!mlx5e_is_offloaded_flow (flow) ||flow_flag_test (flow,SLOW ))continue ; attr = flow->attr; esw_attr = attr->esw_attr;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 271/334 net/mlx5: E-Switch, Set vhca id valid flag when creating indir fwd group
In reply to Greg Kroah-HartmanFrom: Maor Dickman <[email protected]>
[ Upstream commit ca6891f9b27db7764bba0798202b0a21d0dc909c ]
When indirect forward group is created, flow is added with vhca id but without setting vhca id valid flag which violates the PRM.
Fix by setting the missing flag, vhca id valid.
--- drivers/net/ethernet/mellanox/mlx5/core/esw/indir_table.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/ethernet/mellanox/mlx5/core/esw/indir_table.c +1 -0
@@ -364,6 +364,7 @@ static int mlx5_create_indir_fwd_group(struct mlx5_eswitch *esw, dest.type =MLX5_FLOW_DESTINATION_TYPE_VPORT ; dest.vport.num = e->vport; dest.vport.vhca_id =MLX5_CAP_GEN (esw->dev, vhca_id); + dest.vport.flags =MLX5_FLOW_DEST_VPORT_VHCA_ID ; e->fwd_rule =mlx5_add_flow_rules (e->ft, spec, &flow_act, &dest,1 );if (IS_ERR (e->fwd_rule)) {mlx5_destroy_flow_group (e->fwd_grp);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 272/334 net/mlx5e: Use correct eswitch for stack devices with lag
In reply to Greg Kroah-HartmanFrom: Dmytro Linkin <[email protected]>
[ Upstream commit f9d196bd632b8b79261ec3366c30ec3923ea9a02 ]
If link aggregation is used within stack devices driver rejects encap rules if PF of the VF tunnel device is down. This happens because route resolved for other PF and its eswitch instance is used to determine correct vport.
To fix that use devcom feature to retrieve other eswitch instance if failed to find vport for the 1st eswitch and LAG is active.
--- .../net/ethernet/mellanox/mlx5/core/en_tc.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+)
drivers/net/ethernet/mellanox/mlx5/core/en_tc.c +18 -0
@@ -1338,6 +1338,7 @@ bool mlx5e_tc_is_vf_tunnel(struct net_device *out_dev, struct net_device *route_int mlx5e_tc_query_route_vport (struct net_device *out_dev,struct net_device *route_dev,u16 *vport) {struct mlx5e_priv *out_priv, *route_priv; +struct mlx5_devcom *devcom =NULL ;struct mlx5_core_dev *route_mdev;struct mlx5_eswitch *esw;u16 vhca_id;
@@ -1349,7 +1350,24 @@ int mlx5e_tc_query_route_vport(struct net_device *out_dev, struct net_device *ro route_mdev = route_priv->mdev; vhca_id =MLX5_CAP_GEN (route_mdev, vhca_id); +if (mlx5_lag_is_active (out_priv->mdev)) { +/* In lag case we may get devices from different eswitch instances. +* If we failed to get vport num, it means, mostly, that we on the wrong +* eswitch. +*/ + err =mlx5_eswitch_vhca_id_to_vport (esw, vhca_id, vport); +if (err != -ENOENT ) +return err; + + devcom = out_priv->mdev->priv.devcom; + esw =mlx5_devcom_get_peer_data (devcom,MLX5_DEVCOM_ESW_OFFLOADS ); +if (!esw) +return -ENODEV ; + } + err =mlx5_eswitch_vhca_id_to_vport (esw, vhca_id, vport); +if (devcom) +mlx5_devcom_release_peer_data (devcom,MLX5_DEVCOM_ESW_OFFLOADS );return err; }
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 273/334 misc/pvpanic: fix set driver data
In reply to Greg Kroah-HartmanFrom: Mihai Carabas <[email protected]>
[ Upstream commit a99009bc4f2f0b46e6c553704fda0b67e04395f5 ]
Add again dev_set_drvdata(), but this time in devm_pvpanic_probe(), in order for dev_get_drvdata() to not return NULL.
--- drivers/misc/pvpanic/pvpanic.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/misc/pvpanic/pvpanic.c +2 -0
@@ -85,6 +85,8 @@ int devm_pvpanic_probe(struct device *dev, struct pvpanic_instance *pi)list_add (&pi->list, &pvpanic_list);spin_unlock (&pvpanic_lock); +dev_set_drvdata (dev, pi); +return devm_add_action_or_reset (dev, pvpanic_remove, pi); }EXPORT_SYMBOL_GPL (devm_pvpanic_probe);
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 274/334 ice: fix Tx queue iteration for Tx timestamp enablement
In reply to Greg Kroah-HartmanFrom: Jacob Keller <[email protected]>
[ Upstream commit 84c5fb8c4264ec12ef9d21905c562d2297a0234e ]
The driver accidentally copied the ice_for_each_rxq iterator when implementing enablement of the ptp_tx bit for the Tx rings. We still load the Tx rings and set the ptp_tx field, but we iterate over the count of the num_rxq.
If the number of Tx and Rx queues differ, this could either cause a buffer overrun when accessing the tx_rings list if num_txq is greater than num_rxq, or it could cause us to fail to enable Tx timestamps for some rings.
This was not noticed originally as we generally have the same number of Tx and Rx queues.
--- drivers/net/ethernet/intel/ice/ice_ptp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/intel/ice/ice_ptp.c +1 -1
@@ -22,7 +22,7 @@ static void ice_set_tx_tstamp(struct ice_pf *pf, bool on)return ;/* Set the timestamp enable flag for all the Tx rings */ -ice_for_each_rxq (vsi, i) { +ice_for_each_txq (vsi, i) {if (!vsi->tx_rings[i])continue ; vsi->tx_rings[i]->ptp_tx = on;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 275/334 ice: add lock around Tx timestamp tracker flush
In reply to Greg Kroah-HartmanFrom: Jacob Keller <[email protected]>
[ Upstream commit 4dd0d5c33c3ebf24a07cae6141648aeb7ba56072 ]
The driver didn't take the lock while flushing the Tx tracker, which could cause a race where one thread is trying to read timestamps out while another thread is trying to read the tracker to check the timestamps.
Avoid this by ensuring that flushing is locked against read accesses.
--- drivers/net/ethernet/intel/ice/ice_ptp.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/net/ethernet/intel/ice/ice_ptp.c +4 -0
@@ -1278,6 +1278,8 @@ ice_ptp_flush_tx_tracker(struct ice_pf *pf, struct ice_ptp_tx *tx) {u8 idx; +spin_lock (&tx->lock); +for (idx =0 ; idx < tx->len; idx++) {u8 phy_idx = idx + tx->quad_offset;
@@ -1290,6 +1292,8 @@ ice_ptp_flush_tx_tracker(struct ice_pf *pf, struct ice_ptp_tx *tx) tx->tstamps[idx].skb =NULL ; } } + +spin_unlock (&tx->lock); }/**
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 276/334 ice: restart periodic outputs around time changes
In reply to Greg Kroah-HartmanFrom: Jacob Keller <[email protected]>
[ Upstream commit 9ee313433c483e4a6ecd517c38c0f8aee1962c53 ]
When we enabled auxiliary input/output support for the E810 device, we forgot to add logic to restart the output when we change time. This is important as the periodic output will be incorrect after a time change otherwise.
This unfortunately includes the adjust time function, even though it uses an atomic hardware interface. The atomic adjustment can still cause the pin output to stall permanently, so we need to stop and restart it.
Introduce wrapper functions to temporarily disable and then re-enable the clock outputs.
--- drivers/net/ethernet/intel/ice/ice_ptp.c | 49 ++++++++++++++++++++++++ 1 file changed, 49 insertions(+)
drivers/net/ethernet/intel/ice/ice_ptp.c +49 -0
@@ -688,6 +688,41 @@ err:return -EFAULT ; } +/** +* ice_ptp_disable_all_clkout - Disable all currently configured outputs +* @pf: pointer to the PF structure +* +* Disable all currently configured clock outputs. This is necessary before +* certain changes to the PTP hardware clock. Use ice_ptp_enable_all_clkout to +* re-enable the clocks again. +*/ +static void ice_ptp_disable_all_clkout (struct ice_pf *pf) +{ +uint i; + +for (i =0 ; i < pf->ptp.info.n_per_out; i++) +if (pf->ptp.perout_channels[i].ena) +ice_ptp_cfg_clkout (pf, i,NULL , false); +} + +/** +* ice_ptp_enable_all_clkout - Enable all configured periodic clock outputs +* @pf: pointer to the PF structure +* +* Enable all currently configured clock outputs. Use this after +* ice_ptp_disable_all_clkout to reconfigure the output signals according to +* their configuration. +*/ +static void ice_ptp_enable_all_clkout (struct ice_pf *pf) +{ +uint i; + +for (i =0 ; i < pf->ptp.info.n_per_out; i++) +if (pf->ptp.perout_channels[i].ena) +ice_ptp_cfg_clkout (pf, i, &pf->ptp.perout_channels[i], + false); +} +/** * ice_ptp_gpio_enable_e810 - Enable/disable ancillary features of PHC * @info: the driver's PTP info structure
@@ -783,12 +818,17 @@ ice_ptp_settime64(struct ptp_clock_info *info, const struct timespec64 *ts) goto exit; } +/* Disable periodic outputs */ +ice_ptp_disable_all_clkout (pf); + err =ice_ptp_write_init (pf, &ts64);ice_ptp_unlock (hw);if (!err)ice_ptp_update_cached_phctime (pf); +/* Reenable periodic outputs */ +ice_ptp_enable_all_clkout (pf); exit:if (err) {dev_err (ice_pf_to_dev (pf),"PTP failed to set time %d\n" , err);
@@ -842,8 +882,14 @@ static int ice_ptp_adjtime(struct ptp_clock_info *info, s64 delta)return -EBUSY ; } +/* Disable periodic outputs */ +ice_ptp_disable_all_clkout (pf); + err =ice_ptp_write_adj (pf, delta); +/* Reenable periodic outputs */ +ice_ptp_enable_all_clkout (pf); +ice_ptp_unlock (hw);if (err) {
@@ -1554,6 +1600,9 @@ void ice_ptp_release(struct ice_pf *pf)if (!pf->ptp.clock)return ; +/* Disable periodic outputs */ +ice_ptp_disable_all_clkout (pf); +ice_clear_ptp_clock_index (pf);ptp_clock_unregister (pf->ptp.clock); pf->ptp.clock =NULL ;
Signature · 1 line
2.30.2
Greg Kroah-Hartman
maintainerPATCH 277/334 ice: Only lock to update netdev dev_addr
In reply to Greg Kroah-HartmanFrom: Brett Creeley <[email protected]>
[ Upstream commit b357d9717be7f95fde2c6c4650b186a995b71e59 ]
commit 3ba7f53f8bf1 ("ice: don't remove netdev->dev_addr from uc sync list") introduced calls to netif_addr_lock_bh() and netif_addr_unlock_bh() in the driver's ndo_set_mac() callback. This is fine since the driver is updated the netdev's dev_addr, but since this is a spinlock, the driver cannot sleep when the lock is held. Unfortunately the functions to add/delete MAC filters depend on a mutex. This was causing a trace with the lock debug kernel config options enabled when changing the mac address via iproute.
[ 203.273059] BUG: sleeping function called from invalid context at kernel/locking/mutex.c:281 [ 203.273065] in_atomic(): 1, irqs_disabled(): 0, non_block: 0, pid: 6698, name: ip [ 203.273068] Preemption disabled at: [ 203.273068] [<ffffffffc04aaeab>] ice_set_mac_address+0x8b/0x1c0 [ice] [ 203.273097] CPU: 31 PID: 6698 Comm: ip Tainted: G S W I 5.14.0-rc4 #2 [ 203.273100] Hardware name: Intel Corporation S2600WFT/S2600WFT, BIOS SE5C620.86B.02.01.0010.010620200716 01/06/2020 [ 203.273102] Call Trace: [ 203.273107] dump_stack_lvl+0x33/0x42 [ 203.273113] ? ice_set_mac_address+0x8b/0x1c0 [ice] [ 203.273124] ___might_sleep.cold.150+0xda/0xea [ 203.273131] mutex_lock+0x1c/0x40 [ 203.273136] ice_remove_mac+0xe3/0x180 [ice] [ 203.273155] ? ice_fltr_add_mac_list+0x20/0x20 [ice] [ 203.273175] ice_fltr_prepare_mac+0x43/0xa0 [ice] [ 203.273194] ice_set_mac_address+0xab/0x1c0 [ice] [ 203.273206] dev_set_mac_address+0xb8/0x120 [ 203.273210] dev_set_mac_address_user+0x2c/0x50 [ 203.273212] do_setlink+0x1dd/0x10e0 [ 203.273217] ? __nla_validate_parse+0x12d/0x1a0 [ 203.273221] __rtnl_newlink+0x530/0x910 [ 203.273224] ? __kmalloc_node_track_caller+0x17f/0x380 [ 203.273230] ? preempt_count_add+0x68/0xa0 [ 203.273236] ? _raw_spin_lock_irqsave+0x1f/0x30 [ 203.273241] ? kmem_cache_alloc_trace+0x4d/0x440 [ 203.273244] rtnl_newlink+0x43/0x60 [ 203.273245] rtnetlink_rcv_msg+0x13a/0x380 [ 203.273248] ? rtnl_calcit.isra.40+0x130/0x130 [ 203.273250] netlink_rcv_skb+0x4e/0x100 [ 203.273256] netlink_unicast+0x1a2/0x280 [ 203.273258] netlink_sendmsg+0x242/0x490 [ 203.273260] sock_sendmsg+0x58/0x60 [ 203.273263] ____sys_sendmsg+0x1ef/0x260 [ 203.273265] ? copy_msghdr_from_user+0x5c/0x90 [ 203.273268] ? ____sys_recvmsg+0xe6/0x170 [ 203.273270] ___sys_sendmsg+0x7c/0xc0 [ 203.273272] ? copy_msghdr_from_user+0x5c/0x90 [ 203.273274] ? ___sys_recvmsg+0x89/0xc0 [ 203.273276] ? __netlink_sendskb+0x50/0x50 [ 203.273278] ? mod_objcg_state+0xee/0x310 [ 203.273282] ? __dentry_kill+0x114/0x170 [ 203.273286] ? get_max_files+0x10/0x10 [ 203.273288] __sys_sendmsg+0x57/0xa0 [ 203.273290] do_syscall_64+0x37/0x80 [ 203.273295] entry_SYSCALL_64_after_hwframe+0x44/0xae [ 203.273296] RIP: 0033:0x7f8edf96e278 [ 203.273298] Code: 89 02 48 c7 c0 ff ff ff ff eb b5 0f 1f 80 00 00 00 00 f3 0f 1e fa 48 8d 05 25 63 2c 00 8b 00 85 c0 75 17 b8 2e 00 00 00 0f 05 <48> 3d 00 f0 ff ff 77 58 c3 0f 1f 80 00 00 00 00 41 54 41 89 d4 55 [ 203.273300] RSP: 002b:00007ffcb8bdac08 EFLAGS: 00000246 ORIG_RAX: 000000000000002e [ 203.273303] RAX: ffffffffffffffda RBX: 000000006115e0ae RCX: 00007f8edf96e278 [ 203.273304] RDX: 0000000000000000 RSI: 00007ffcb8bdac70 RDI: 0000000000000003 [ 203.273305] RBP: 0000000000000000 R08: 0000000000000001 R09: 00007ffcb8bda5b0 [ 203.273306] R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000000001 [ 203.273306] R13: 0000555e10092020 R14: 0000000000000000 R15: 0000000000000005
Fix this by only locking when changing the netdev->dev_addr. Also, make sure to restore the old netdev->dev_addr on any failures.
--- drivers/net/ethernet/intel/ice/ice_main.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-)
drivers/net/ethernet/intel/ice/ice_main.c +9 -4
@@ -5122,6 +5122,7 @@ static int ice_set_mac_address(struct net_device *netdev, void *pi)struct ice_hw *hw = &pf->hw;struct sockaddr *addr = pi;enum ice_status status; +u8 old_mac[ETH_ALEN ];u8 flags =0 ;int err =0 ;u8 *mac;
@@ -5144,8 +5145,13 @@ static int ice_set_mac_address(struct net_device *netdev, void *pi) }netif_addr_lock_bh (netdev); +ether_addr_copy (old_mac, netdev->dev_addr); +/* change the netdev's MAC address */ +memcpy (netdev->dev_addr, mac, netdev->addr_len); +netif_addr_unlock_bh (netdev); +/* Clean up old MAC filter. Not an error if old filter doesn't exist */ - status =ice_fltr_remove_mac (vsi, netdev->dev_addr,ICE_FWD_TO_VSI ); + status =ice_fltr_remove_mac (vsi, old_mac,ICE_FWD_TO_VSI );if (status && status !=ICE_ERR_DOES_NOT_EXIST ) { err = -EADDRNOTAVAIL ; goto err_update_filters;
@@ -5168,13 +5174,12 @@ err_update_filters:if (err) {netdev_err (netdev,"can't set MAC %pM. filter update failed\n" , mac); +netif_addr_lock_bh (netdev); +ether_addr_copy (netdev->dev_addr, old_mac);netif_addr_unlock_bh (netdev);return err; } -/* change the netdev's MAC address */ -memcpy (netdev->dev_addr, mac, netdev->addr_len); -netif_addr_unlock_bh (netdev);netdev_dbg (vsi->netdev,"updated MAC address to %pM\n" , netdev->dev_addr);
Signature · 1 line
2.30.2