intpm: clean up intsmb_bread and intsmb_pcall
The hardware does not implement SMBus Process Call command, so remove ifdef-ed out code from intsmb_pcall. The code used exactly the same start sequence as for Write Word command. intsmb_bread code used to access an in value of the count parameter, but that parameter is supposed to be an out only parameter. For example, smb(4) does not initialize it before calling smbus_bread. MFC after: 3 weeks
This commit is contained in:
parent
cf3a35a755
commit
678d569fc2
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=308529
@ -785,39 +785,11 @@ intsmb_readw(device_t dev, u_char slave, char cmd, short *word)
|
|||||||
return (error);
|
return (error);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Data sheet claims that it implements all function, but also claims
|
|
||||||
* that it implements 7 function and not mention PCALL. So I don't know
|
|
||||||
* whether it will work.
|
|
||||||
*/
|
|
||||||
static int
|
static int
|
||||||
intsmb_pcall(device_t dev, u_char slave, char cmd, short sdata, short *rdata)
|
intsmb_pcall(device_t dev, u_char slave, char cmd, short sdata, short *rdata)
|
||||||
{
|
{
|
||||||
#ifdef PROCCALL_TEST
|
|
||||||
struct intsmb_softc *sc = device_get_softc(dev);
|
|
||||||
int error;
|
|
||||||
|
|
||||||
INTSMB_LOCK(sc);
|
|
||||||
error = intsmb_free(sc);
|
|
||||||
if (error) {
|
|
||||||
INTSMB_UNLOCK(sc);
|
|
||||||
return (error);
|
|
||||||
}
|
|
||||||
bus_write_1(sc->io_res, PIIX4_SMBHSTADD, slave & ~LSB);
|
|
||||||
bus_write_1(sc->io_res, PIIX4_SMBHSTCMD, cmd);
|
|
||||||
bus_write_1(sc->io_res, PIIX4_SMBHSTDAT0, sdata & 0xff);
|
|
||||||
bus_write_1(sc->io_res, PIIX4_SMBHSTDAT1, (sdata & 0xff) >> 8);
|
|
||||||
intsmb_start(sc, PIIX4_SMBHSTCNT_PROT_WDATA, 0);
|
|
||||||
error = intsmb_stop(sc);
|
|
||||||
if (error == 0) {
|
|
||||||
*rdata = bus_read_1(sc->io_res, PIIX4_SMBHSTDAT0);
|
|
||||||
*rdata |= bus_read_1(sc->io_res, PIIX4_SMBHSTDAT1) << 8;
|
|
||||||
}
|
|
||||||
INTSMB_UNLOCK(sc);
|
|
||||||
return (error);
|
|
||||||
#else
|
|
||||||
return (SMB_ENOTSUPP);
|
return (SMB_ENOTSUPP);
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
@ -857,9 +829,6 @@ intsmb_bread(device_t dev, u_char slave, char cmd, u_char *count, char *buf)
|
|||||||
int error, i;
|
int error, i;
|
||||||
u_char data, nread;
|
u_char data, nread;
|
||||||
|
|
||||||
if (*count > SMBBLOCKTRANS_MAX || *count == 0)
|
|
||||||
return (SMB_EINVAL);
|
|
||||||
|
|
||||||
INTSMB_LOCK(sc);
|
INTSMB_LOCK(sc);
|
||||||
error = intsmb_free(sc);
|
error = intsmb_free(sc);
|
||||||
if (error) {
|
if (error) {
|
||||||
@ -872,18 +841,14 @@ intsmb_bread(device_t dev, u_char slave, char cmd, u_char *count, char *buf)
|
|||||||
|
|
||||||
bus_write_1(sc->io_res, PIIX4_SMBHSTADD, slave | LSB);
|
bus_write_1(sc->io_res, PIIX4_SMBHSTADD, slave | LSB);
|
||||||
bus_write_1(sc->io_res, PIIX4_SMBHSTCMD, cmd);
|
bus_write_1(sc->io_res, PIIX4_SMBHSTCMD, cmd);
|
||||||
bus_write_1(sc->io_res, PIIX4_SMBHSTDAT0, *count);
|
|
||||||
intsmb_start(sc, PIIX4_SMBHSTCNT_PROT_BLOCK, 0);
|
intsmb_start(sc, PIIX4_SMBHSTCNT_PROT_BLOCK, 0);
|
||||||
error = intsmb_stop(sc);
|
error = intsmb_stop(sc);
|
||||||
if (error == 0) {
|
if (error == 0) {
|
||||||
nread = bus_read_1(sc->io_res, PIIX4_SMBHSTDAT0);
|
nread = bus_read_1(sc->io_res, PIIX4_SMBHSTDAT0);
|
||||||
if (nread != 0 && nread <= SMBBLOCKTRANS_MAX) {
|
if (nread != 0 && nread <= SMBBLOCKTRANS_MAX) {
|
||||||
for (i = 0; i < nread; i++) {
|
|
||||||
data = bus_read_1(sc->io_res, PIIX4_SMBBLKDAT);
|
|
||||||
if (i < *count)
|
|
||||||
buf[i] = data;
|
|
||||||
}
|
|
||||||
*count = nread;
|
*count = nread;
|
||||||
|
for (i = 0; i < nread; i++)
|
||||||
|
data = bus_read_1(sc->io_res, PIIX4_SMBBLKDAT);
|
||||||
} else
|
} else
|
||||||
error = SMB_EBUSERR;
|
error = SMB_EBUSERR;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user