Author: jhb
Date: Tue Feb  3 16:14:37 2009
New Revision: 188077
URL: http://svn.freebsd.org/changeset/base/188077

Log:
  - Change ichsmb(4) to follow the format of all the other smbus controllers
    for slave addressing by using left-adjusted slave addresses (i.e.
    xxxxxxx0b).
  - Require the low bit of the slave address to always be zero in smb(4) to
    help catch broken applications.
  - Adjust some code in the IPMI driver to not convert the slave address for
    SSIF to a right-adjusted address.  I (or possibly ambrisko@) added this in
    the past to (unknowingly) work around the bug in ichsmb(4).
  
  Submitted by:  Andriy Gapon <avg of icyb.net.ua> (1,2)
  MFC after:    1 month

Modified:
  head/sys/dev/ichsmb/ichsmb.c
  head/sys/dev/ipmi/ipmi_smbios.c
  head/sys/dev/smbus/smb.c

Modified: head/sys/dev/ichsmb/ichsmb.c
==============================================================================
--- head/sys/dev/ichsmb/ichsmb.c        Tue Feb  3 16:00:20 2009        
(r188076)
+++ head/sys/dev/ichsmb/ichsmb.c        Tue Feb  3 16:14:37 2009        
(r188077)
@@ -182,7 +182,7 @@ ichsmb_quick(device_t dev, u_char slave,
                mtx_lock(&sc->mutex);
                sc->ich_cmd = ICH_HST_CNT_SMB_CMD_QUICK;
                bus_write_1(sc->io_res, ICH_XMIT_SLVA,
-                   (slave << 1) | (how == SMB_QREAD ?
+                   slave | (how == SMB_QREAD ?
                        ICH_XMIT_SLVA_READ : ICH_XMIT_SLVA_WRITE));
                bus_write_1(sc->io_res, ICH_HST_CNT,
                    ICH_HST_CNT_START | ICH_HST_CNT_INTREN | sc->ich_cmd);
@@ -208,7 +208,7 @@ ichsmb_sendb(device_t dev, u_char slave,
        mtx_lock(&sc->mutex);
        sc->ich_cmd = ICH_HST_CNT_SMB_CMD_BYTE;
        bus_write_1(sc->io_res, ICH_XMIT_SLVA,
-           (slave << 1) | ICH_XMIT_SLVA_WRITE);
+           slave | ICH_XMIT_SLVA_WRITE);
        bus_write_1(sc->io_res, ICH_HST_CMD, byte);
        bus_write_1(sc->io_res, ICH_HST_CNT,
            ICH_HST_CNT_START | ICH_HST_CNT_INTREN | sc->ich_cmd);
@@ -230,7 +230,7 @@ ichsmb_recvb(device_t dev, u_char slave,
        mtx_lock(&sc->mutex);
        sc->ich_cmd = ICH_HST_CNT_SMB_CMD_BYTE;
        bus_write_1(sc->io_res, ICH_XMIT_SLVA,
-           (slave << 1) | ICH_XMIT_SLVA_READ);
+           slave | ICH_XMIT_SLVA_READ);
        bus_write_1(sc->io_res, ICH_HST_CNT,
            ICH_HST_CNT_START | ICH_HST_CNT_INTREN | sc->ich_cmd);
        if ((smb_error = ichsmb_wait(sc)) == SMB_ENOERR)
@@ -253,7 +253,7 @@ ichsmb_writeb(device_t dev, u_char slave
        mtx_lock(&sc->mutex);
        sc->ich_cmd = ICH_HST_CNT_SMB_CMD_BYTE_DATA;
        bus_write_1(sc->io_res, ICH_XMIT_SLVA,
-           (slave << 1) | ICH_XMIT_SLVA_WRITE);
+           slave | ICH_XMIT_SLVA_WRITE);
        bus_write_1(sc->io_res, ICH_HST_CMD, cmd);
        bus_write_1(sc->io_res, ICH_D0, byte);
        bus_write_1(sc->io_res, ICH_HST_CNT,
@@ -277,7 +277,7 @@ ichsmb_writew(device_t dev, u_char slave
        mtx_lock(&sc->mutex);
        sc->ich_cmd = ICH_HST_CNT_SMB_CMD_WORD_DATA;
        bus_write_1(sc->io_res, ICH_XMIT_SLVA,
-           (slave << 1) | ICH_XMIT_SLVA_WRITE);
+           slave | ICH_XMIT_SLVA_WRITE);
        bus_write_1(sc->io_res, ICH_HST_CMD, cmd);
        bus_write_1(sc->io_res, ICH_D0, word & 0xff);
        bus_write_1(sc->io_res, ICH_D1, word >> 8);
@@ -301,7 +301,7 @@ ichsmb_readb(device_t dev, u_char slave,
        mtx_lock(&sc->mutex);
        sc->ich_cmd = ICH_HST_CNT_SMB_CMD_BYTE_DATA;
        bus_write_1(sc->io_res, ICH_XMIT_SLVA,
-           (slave << 1) | ICH_XMIT_SLVA_READ);
+           slave | ICH_XMIT_SLVA_READ);
        bus_write_1(sc->io_res, ICH_HST_CMD, cmd);
        bus_write_1(sc->io_res, ICH_HST_CNT,
            ICH_HST_CNT_START | ICH_HST_CNT_INTREN | sc->ich_cmd);
@@ -324,7 +324,7 @@ ichsmb_readw(device_t dev, u_char slave,
        mtx_lock(&sc->mutex);
        sc->ich_cmd = ICH_HST_CNT_SMB_CMD_WORD_DATA;
        bus_write_1(sc->io_res, ICH_XMIT_SLVA,
-           (slave << 1) | ICH_XMIT_SLVA_READ);
+           slave | ICH_XMIT_SLVA_READ);
        bus_write_1(sc->io_res, ICH_HST_CMD, cmd);
        bus_write_1(sc->io_res, ICH_HST_CNT,
            ICH_HST_CNT_START | ICH_HST_CNT_INTREN | sc->ich_cmd);
@@ -352,7 +352,7 @@ ichsmb_pcall(device_t dev, u_char slave,
        mtx_lock(&sc->mutex);
        sc->ich_cmd = ICH_HST_CNT_SMB_CMD_PROC_CALL;
        bus_write_1(sc->io_res, ICH_XMIT_SLVA,
-           (slave << 1) | ICH_XMIT_SLVA_WRITE);
+           slave | ICH_XMIT_SLVA_WRITE);
        bus_write_1(sc->io_res, ICH_HST_CMD, cmd);
        bus_write_1(sc->io_res, ICH_D0, sdata & 0xff);
        bus_write_1(sc->io_res, ICH_D1, sdata >> 8);
@@ -403,7 +403,7 @@ ichsmb_bwrite(device_t dev, u_char slave
        mtx_lock(&sc->mutex);
        sc->ich_cmd = ICH_HST_CNT_SMB_CMD_BLOCK;
        bus_write_1(sc->io_res, ICH_XMIT_SLVA,
-           (slave << 1) | ICH_XMIT_SLVA_WRITE);
+           slave | ICH_XMIT_SLVA_WRITE);
        bus_write_1(sc->io_res, ICH_HST_CMD, cmd);
        bus_write_1(sc->io_res, ICH_D0, count);
        bus_write_1(sc->io_res, ICH_BLOCK_DB, buf[0]);
@@ -434,7 +434,7 @@ ichsmb_bread(device_t dev, u_char slave,
        mtx_lock(&sc->mutex);
        sc->ich_cmd = ICH_HST_CNT_SMB_CMD_BLOCK;
        bus_write_1(sc->io_res, ICH_XMIT_SLVA,
-           (slave << 1) | ICH_XMIT_SLVA_READ);
+           slave | ICH_XMIT_SLVA_READ);
        bus_write_1(sc->io_res, ICH_HST_CMD, cmd);
        bus_write_1(sc->io_res, ICH_D0, *count); /* XXX? */
        bus_write_1(sc->io_res, ICH_HST_CNT,

Modified: head/sys/dev/ipmi/ipmi_smbios.c
==============================================================================
--- head/sys/dev/ipmi/ipmi_smbios.c     Tue Feb  3 16:00:20 2009        
(r188076)
+++ head/sys/dev/ipmi/ipmi_smbios.c     Tue Feb  3 16:14:37 2009        
(r188077)
@@ -154,10 +154,10 @@ smbios_t38_proc_info(uint8_t *p, char **
        case SSIF_MODE:
                if ((s->base_address & 0xffffffffffffff00) != 0) {
                        printf("SMBIOS: Invalid SSIF SMBus address, using BMC 
I2C slave address instead\n");
-                       info->address = s->i2c_slave_address >> 1;
+                       info->address = s->i2c_slave_address;
                        break;
                }
-               info->address = IPMI_BAR_ADDR(s->base_address) >> 1;
+               info->address = IPMI_BAR_ADDR(s->base_address);
                break;
        default:
                return;

Modified: head/sys/dev/smbus/smb.c
==============================================================================
--- head/sys/dev/smbus/smb.c    Tue Feb  3 16:00:20 2009        (r188076)
+++ head/sys/dev/smbus/smb.c    Tue Feb  3 16:14:37 2009        (r188077)
@@ -180,6 +180,10 @@ smbioctl(struct cdev *dev, u_long cmd, c
 
        parent = device_get_parent(smbdev);
 
+       /* Make sure that LSB bit is cleared. */
+       if (s->slave & 0x1)
+               return (EINVAL);
+
        /* Allocate the bus. */
        if ((error = smbus_request_bus(parent, smbdev,
                        (flags & O_NONBLOCK) ? SMB_DONTWAIT : (SMB_WAIT | 
SMB_INTR))))
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to