The following reply was made to PR system/6422; it has been noted by GNATS.

From: "John L. Scarfone" <[email protected]>
To: [email protected], [email protected]
Cc:  
Subject: Re: system/6422: Patch to add support for 1-Wire counter device>
Date: Sat, 17 Jul 2010 08:11:38 -0400

 - just use a buffer and make onewire_crc16() operate like onewire_crc()
 - some style cleanups
 
 
 Index: onewire_subr.c
 ===================================================================
 RCS file: /cvs/src/sys/dev/onewire/onewire_subr.c,v
 retrieving revision 1.3
 diff -N -u -p onewire_subr.c
 --- onewire_subr.c     6 Jul 2010 19:59:59 -0000       1.3
 +++ onewire_subr.c     17 Jul 2010 11:56:25 -0000
 @@ -150,15 +150,21 @@ onewire_crc(const void *buf, int len)
  }
  
  u_int16_t
 -onewire_crc16(u_int16_t crc16, u_int8_t data)
 +onewire_crc16(const void *buf, int len)
  {
 +      const u_int8_t *p = buf;
 +      u_int16_t crc = 0;
 +      u_int16_t tmpcrc;
        int idx;
 -      u_int16_t newcrc16;
  
 -      idx = (crc16 & 0xff) ^ data;
 -      newcrc16 = crc16_table_high[idx] << 8;
 -      newcrc16 |= crc16_table_low[idx] ^ (crc16 >> 8);
 -      return (newcrc16);
 +      while (len--) {
 +              idx = (crc & 0xff) ^ *p++;
 +              tmpcrc = crc16_table_high[idx] << 8;
 +              tmpcrc |= crc16_table_low[idx] ^ (crc >> 8);
 +              crc = tmpcrc;
 +      }
 +
 +      return (crc);
  }
  
  const char *
 Index: onewirevar.h
 ===================================================================
 RCS file: /cvs/src/sys/dev/onewire/onewirevar.h,v
 retrieving revision 1.6
 diff -N -u -p onewirevar.h
 --- onewirevar.h       6 Jul 2010 19:59:59 -0000       1.6
 +++ onewirevar.h       17 Jul 2010 11:56:25 -0000
 @@ -77,7 +77,7 @@ struct onewire_matchfam {
  
  /* Miscellaneous routines */
  int           onewire_crc(const void *, int);
 -u_int16_t     onewire_crc16(u_int16_t, u_int8_t);
 +u_int16_t     onewire_crc16(const void *, int);
  const char *  onewire_famname(int);
  int           onewire_matchbyfam(struct onewire_attach_args *,
                    const struct onewire_matchfam *, int);
 Index: owctr.c
 ===================================================================
 RCS file: /cvs/src/sys/dev/onewire/owctr.c,v
 retrieving revision 1.3
 diff -N -u -p owctr.c
 --- owctr.c    8 Jul 2010 07:19:54 -0000       1.3
 +++ owctr.c    17 Jul 2010 11:56:25 -0000
 @@ -26,6 +26,7 @@
  #include <sys/systm.h>
  #include <sys/device.h>
  #include <sys/kernel.h>
 +#include <sys/malloc.h>
  #include <sys/proc.h>
  #include <sys/rwlock.h>
  #include <sys/sensors.h>
 @@ -41,6 +42,8 @@
  #define DS2423_COUNTER_BANK_A         0x1c0
  #define DS2423_COUNTER_BANK_B         0x1e0
  
 +#define DS2423_COUNTER_BUFSZ          43
 +
  struct owctr_softc {
        struct device           sc_dev;
  
 @@ -155,76 +158,81 @@ owctr_update_counter(void *arg, int bank)
        u_int16_t crc;
        int data;
        int i;
 +      u_int8_t *buf;
 +      u_int8_t *bp;
  
        rw_enter_write(&sc->sc_lock);
        onewire_lock(sc->sc_onewire, 0);
        if (onewire_reset(sc->sc_onewire) != 0)
                goto done;
  
 +      buf = malloc(DS2423_COUNTER_BUFSZ, M_DEVBUF, M_NOWAIT);
 +      if (buf == NULL) {
 +              printf("%s: malloc() failed\n", sc->sc_dev.dv_xname);
 +              goto done;
 +      }
 +
        onewire_matchrom(sc->sc_onewire, sc->sc_rom);
        onewire_write_byte(sc->sc_onewire, DSCTR_CMD_READ_MEMCOUNTER);
 -      crc = onewire_crc16(0, DSCTR_CMD_READ_MEMCOUNTER);
 +      bp = buf;
 +      *bp++ = DSCTR_CMD_READ_MEMCOUNTER;
        onewire_write_byte(sc->sc_onewire, bank);
 -      crc = onewire_crc16(crc, bank);
 +      *bp++ = bank;
        onewire_write_byte(sc->sc_onewire, bank >> 8);
 -      crc = onewire_crc16(crc, bank >> 8);
 +      *bp++ = bank >> 8;
 +
 +      /* read memory page */
        for (i=0; i<32; ++i)
 -      {
 -              data = onewire_read_byte(sc->sc_onewire);
 -              crc = onewire_crc16(crc, data);
 -      }
 +              *bp++ = onewire_read_byte(sc->sc_onewire);
 +
 +      /* read counter */
        data = onewire_read_byte(sc->sc_onewire);
 -      crc = onewire_crc16(crc, data);
 +      *bp++ = data;
        counter = data;
        data = onewire_read_byte(sc->sc_onewire);
 -      crc = onewire_crc16(crc, data);
 +      *bp++ = data;
        counter |= data << 8;
        data = onewire_read_byte(sc->sc_onewire);
 -      crc = onewire_crc16(crc, data);
 +      *bp++ = data;
        counter |= data << 16;
        data = onewire_read_byte(sc->sc_onewire);
 -      crc = onewire_crc16(crc, data);
 +      *bp++ = data;
        counter |= data << 24;
 +
 +      /* read zeros */
        for (i=0; i<4; ++i)
 -      {
 -              onewire_read_byte(sc->sc_onewire);
 -              crc = onewire_crc16(crc, data);
 -      }
 -      data = onewire_read_byte(sc->sc_onewire);
 -      crc ^= data;
 -      data = onewire_read_byte(sc->sc_onewire);
 -      crc ^= data << 8;
 -      if ( crc != 0xffff)
 -      {
 +              *bp++ = onewire_read_byte(sc->sc_onewire);
 +
 +      crc = onewire_crc16(buf, DS2423_COUNTER_BUFSZ);
 +
 +      /* read CRC */
 +      crc ^= onewire_read_byte(sc->sc_onewire);
 +      crc ^= onewire_read_byte(sc->sc_onewire) << 8;
 +      if ( crc != 0xffff) {
                printf("%s: invalid CRC\n", sc->sc_dev.dv_xname);
                if (bank == DS2423_COUNTER_BANK_A) {
                        sc->sc_counterA.value = 0;
                        sc->sc_counterA.status = SENSOR_S_UNKNOWN;
                        sc->sc_counterA.flags |= SENSOR_FUNKNOWN;
 -              }
 -              else
 -              {
 +              } else {
                        sc->sc_counterB.value = 0;
                        sc->sc_counterB.status = SENSOR_S_UNKNOWN;
                        sc->sc_counterB.flags |= SENSOR_FUNKNOWN;
                }
 -      }
 -      else
 -      {
 -              if (bank == DS2423_COUNTER_BANK_A)
 -              {
 +      } else {
 +              if (bank == DS2423_COUNTER_BANK_A) {
                        sc->sc_counterA.value = counter;
                        sc->sc_counterA.status = SENSOR_S_UNSPEC;
                        sc->sc_counterA.flags &= ~SENSOR_FUNKNOWN;
 -              }
 -              else
 -              {
 +              } else {
                        sc->sc_counterB.value = counter;
                        sc->sc_counterB.status = SENSOR_S_UNSPEC;
                        sc->sc_counterB.flags &= ~SENSOR_FUNKNOWN;
                }
        }
 +
        onewire_reset(sc->sc_onewire);
 +      free(buf, M_DEVBUF);
  
  done:
        onewire_unlock(sc->sc_onewire);
 Index: GENERIC
 ===================================================================
 RCS file: /cvs/src/sys/arch/i386/conf/GENERIC,v
 retrieving revision 1.688
 diff -N -u -p GENERIC
 --- GENERIC    5 Jul 2010 22:20:22 -0000       1.688
 +++ GENERIC    7 Jul 2010 13:35:47 -0000
 @@ -837,6 +837,7 @@ option ONEWIREVERBOSE
  owid* at onewire?             # ID
  owsbm*        at onewire?             # Smart Battery Monitor
  owtemp* at onewire?           # Temperature
 +owctr*        at onewire?             # Counter
  
  pseudo-device pctr            1
  pseudo-device mtrr            1       # Memory range attributes control

Reply via email to