Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bbb27fc3 authored by Ricardo Ribalda Delgado's avatar Ricardo Ribalda Delgado Committed by Wolfram Sang
Browse files

i2c: piix4: Request the SMBUS semaphore inside the mutex



SMBSLVCNT must be protected with the piix4_mutex_sb800 in order to avoid
multiple buses accessing to the semaphore at the same time.

Fixes: 701dc207 ("i2c: piix4: Avoid race conditions with IMC")
Reported-by: default avatarJean Delvare <jdelvare@suse.de>
Signed-off-by: default avatarRicardo Ribalda Delgado <ricardo.ribalda@gmail.com>
Signed-off-by: default avatarJean Delvare <jdelvare@suse.de>
Signed-off-by: default avatarWolfram Sang <wsa@the-dreams.de>
parent f43128c7
Loading
Loading
Loading
Loading
+7 −5
Original line number Diff line number Diff line
@@ -592,6 +592,8 @@ static s32 piix4_access_sb800(struct i2c_adapter *adap, u16 addr,
	u8 port;
	int retval;

	mutex_lock(&piix4_mutex_sb800);

	/* Request the SMBUS semaphore, avoid conflicts with the IMC */
	smbslvcnt  = inb_p(SMBSLVCNT);
	do {
@@ -605,10 +607,10 @@ static s32 piix4_access_sb800(struct i2c_adapter *adap, u16 addr,
		usleep_range(1000, 2000);
	} while (--retries);
	/* SMBus is still owned by the IMC, we give up */
	if (!retries)
	if (!retries) {
		mutex_unlock(&piix4_mutex_sb800);
		return -EBUSY;

	mutex_lock(&piix4_mutex_sb800);
	}

	outb_p(piix4_port_sel_sb800, SB800_PIIX4_SMB_IDX);
	smba_en_lo = inb_p(SB800_PIIX4_SMB_IDX + 1);
@@ -623,11 +625,11 @@ static s32 piix4_access_sb800(struct i2c_adapter *adap, u16 addr,

	outb_p(smba_en_lo, SB800_PIIX4_SMB_IDX + 1);

	mutex_unlock(&piix4_mutex_sb800);

	/* Release the semaphore */
	outb_p(smbslvcnt | 0x20, SMBSLVCNT);

	mutex_unlock(&piix4_mutex_sb800);

	return retval;
}