summaryrefslogtreecommitdiffstats
path: root/sys/pci/viapm.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/pci/viapm.c')
-rw-r--r--sys/pci/viapm.c103
1 files changed, 49 insertions, 54 deletions
diff --git a/sys/pci/viapm.c b/sys/pci/viapm.c
index 0bddb22..a26703e 100644
--- a/sys/pci/viapm.c
+++ b/sys/pci/viapm.c
@@ -640,7 +640,7 @@ viasmb_quick(device_t dev, u_char slave, int how)
viapm_clear(viapm);
if (viapm_busy(viapm))
- return (EBUSY);
+ return (SMB_EBUSY);
switch (how) {
case SMB_QWRITE:
@@ -670,7 +670,7 @@ viasmb_sendb(device_t dev, u_char slave, char byte)
viapm_clear(viapm);
if (viapm_busy(viapm))
- return (EBUSY);
+ return (SMB_EBUSY);
VIAPM_OUTB(SMBHADDR, slave & ~ LSB);
VIAPM_OUTB(SMBHCMD, byte);
@@ -692,7 +692,7 @@ viasmb_recvb(device_t dev, u_char slave, char *byte)
viapm_clear(viapm);
if (viapm_busy(viapm))
- return (EBUSY);
+ return (SMB_EBUSY);
VIAPM_OUTB(SMBHADDR, slave | LSB);
@@ -714,7 +714,7 @@ viasmb_writeb(device_t dev, u_char slave, char cmd, char byte)
viapm_clear(viapm);
if (viapm_busy(viapm))
- return (EBUSY);
+ return (SMB_EBUSY);
VIAPM_OUTB(SMBHADDR, slave & ~ LSB);
VIAPM_OUTB(SMBHCMD, cmd);
@@ -737,7 +737,7 @@ viasmb_readb(device_t dev, u_char slave, char cmd, char *byte)
viapm_clear(viapm);
if (viapm_busy(viapm))
- return (EBUSY);
+ return (SMB_EBUSY);
VIAPM_OUTB(SMBHADDR, slave | LSB);
VIAPM_OUTB(SMBHCMD, cmd);
@@ -760,7 +760,7 @@ viasmb_writew(device_t dev, u_char slave, char cmd, short word)
viapm_clear(viapm);
if (viapm_busy(viapm))
- return (EBUSY);
+ return (SMB_EBUSY);
VIAPM_OUTB(SMBHADDR, slave & ~ LSB);
VIAPM_OUTB(SMBHCMD, cmd);
@@ -785,7 +785,7 @@ viasmb_readw(device_t dev, u_char slave, char cmd, short *word)
viapm_clear(viapm);
if (viapm_busy(viapm))
- return (EBUSY);
+ return (SMB_EBUSY);
VIAPM_OUTB(SMBHADDR, slave | LSB);
VIAPM_OUTB(SMBHCMD, cmd);
@@ -808,37 +808,31 @@ static int
viasmb_bwrite(device_t dev, u_char slave, char cmd, u_char count, char *buf)
{
struct viapm_softc *viapm = (struct viapm_softc *)device_get_softc(dev);
- u_char remain, len, i;
- int error = SMB_ENOERR;
+ u_char i;
+ int error;
+
+ if (count < 1 || count > 32)
+ return (SMB_EINVAL);
viapm_clear(viapm);
if (viapm_busy(viapm))
- return (EBUSY);
-
- remain = count;
- while (remain) {
- len = min(remain, 32);
-
- VIAPM_OUTB(SMBHADDR, slave & ~LSB);
- VIAPM_OUTB(SMBHCMD, cmd);
- VIAPM_OUTB(SMBHDATA0, len);
- i = VIAPM_INB(SMBHCTRL);
-
- /* fill the 32-byte internal buffer */
- for (i=0; i<len; i++) {
- VIAPM_OUTB(SMBHBLOCK, buf[count-remain+i]);
- DELAY(2);
- }
- VIAPM_OUTB(SMBHCMD, cmd);
- VIAPM_OUTB(SMBHCTRL, SMBHCTRL_START | SMBHCTRL_BLOCK);
+ return (SMB_EBUSY);
- if ((error = viapm_wait(viapm)) != SMB_ENOERR)
- goto error;
+ VIAPM_OUTB(SMBHADDR, slave & ~LSB);
+ VIAPM_OUTB(SMBHCMD, cmd);
+ VIAPM_OUTB(SMBHDATA0, count);
+ i = VIAPM_INB(SMBHCTRL);
- remain -= len;
+ /* fill the 32-byte internal buffer */
+ for (i = 0; i < count; i++) {
+ VIAPM_OUTB(SMBHBLOCK, buf[i]);
+ DELAY(2);
}
+ VIAPM_OUTB(SMBHCMD, cmd);
+ VIAPM_OUTB(SMBHCTRL, SMBHCTRL_START | SMBHCTRL_BLOCK);
+
+ error = viapm_wait(viapm);
-error:
VIAPM_DEBUG(printf("viapm: WRITEBLK to 0x%x, count=0x%x, cmd=0x%x, error=0x%x", slave, count, cmd, error));
return (error);
@@ -846,40 +840,40 @@ error:
}
static int
-viasmb_bread(device_t dev, u_char slave, char cmd, u_char count, char *buf)
+viasmb_bread(device_t dev, u_char slave, char cmd, u_char *count, char *buf)
{
struct viapm_softc *viapm = (struct viapm_softc *)device_get_softc(dev);
- u_char remain, len, i;
- int error = SMB_ENOERR;
+ u_char data, len, i;
+ int error;
+
+ if (*count < 1 || *count > 32)
+ return (SMB_EINVAL);
viapm_clear(viapm);
if (viapm_busy(viapm))
- return (EBUSY);
-
- remain = count;
- while (remain) {
- VIAPM_OUTB(SMBHADDR, slave | LSB);
- VIAPM_OUTB(SMBHCMD, cmd);
- VIAPM_OUTB(SMBHCTRL, SMBHCTRL_START | SMBHCTRL_BLOCK);
-
- if ((error = viapm_wait(viapm)) != SMB_ENOERR)
- goto error;
+ return (SMB_EBUSY);
- len = VIAPM_INB(SMBHDATA0);
- i = VIAPM_INB(SMBHCTRL); /* reset counter */
+ VIAPM_OUTB(SMBHADDR, slave | LSB);
+ VIAPM_OUTB(SMBHCMD, cmd);
+ VIAPM_OUTB(SMBHCTRL, SMBHCTRL_START | SMBHCTRL_BLOCK);
- len = min(len, remain);
+ if ((error = viapm_wait(viapm)) != SMB_ENOERR)
+ goto error;
- /* read the 32-byte internal buffer */
- for (i=0; i<len; i++) {
- buf[count-remain+i] = VIAPM_INB(SMBHBLOCK);
- DELAY(2);
- }
+ len = VIAPM_INB(SMBHDATA0);
+ i = VIAPM_INB(SMBHCTRL); /* reset counter */
- remain -= len;
+ /* read the 32-byte internal buffer */
+ for (i = 0; i < len; i++) {
+ data = VIAPM_INB(SMBHBLOCK);
+ if (i < *count)
+ buf[i] = data;
+ DELAY(2);
}
+ *count = len;
+
error:
- VIAPM_DEBUG(printf("viapm: READBLK to 0x%x, count=0x%x, cmd=0x%x, error=0x%x", slave, count, cmd, error));
+ VIAPM_DEBUG(printf("viapm: READBLK to 0x%x, count=0x%x, cmd=0x%x, error=0x%x", slave, *count, cmd, error));
return (error);
}
@@ -954,6 +948,7 @@ static driver_t viapropm_driver = {
DRIVER_MODULE(viapm, pci, viapm_driver, viapm_devclass, 0, 0);
DRIVER_MODULE(viapropm, pci, viapropm_driver, viapropm_devclass, 0, 0);
+DRIVER_MODULE(smbus, viapropm, smbus_driver, smbus_devclass, 0, 0);
MODULE_DEPEND(viapm, pci, 1, 1, 1);
MODULE_DEPEND(viapropm, pci, 1, 1, 1);
OpenPOWER on IntegriCloud