From owner-p4-projects@FreeBSD.ORG Tue Dec 12 03:26:29 2006 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 3C55616A40F; Tue, 12 Dec 2006 03:26:29 +0000 (UTC) X-Original-To: perforce@freebsd.org Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 1314416A403 for ; Tue, 12 Dec 2006 03:26:29 +0000 (UTC) (envelope-from imp@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [69.147.83.41]) by mx1.FreeBSD.org (Postfix) with ESMTP id A2F2243CB2 for ; Tue, 12 Dec 2006 03:25:08 +0000 (GMT) (envelope-from imp@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.6/8.13.6) with ESMTP id kBC3QS2u086299 for ; Tue, 12 Dec 2006 03:26:28 GMT (envelope-from imp@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.6/8.13.4/Submit) id kBC3QSUE086296 for perforce@freebsd.org; Tue, 12 Dec 2006 03:26:28 GMT (envelope-from imp@freebsd.org) Date: Tue, 12 Dec 2006 03:26:28 GMT Message-Id: <200612120326.kBC3QSUE086296@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to imp@freebsd.org using -f From: Warner Losh To: Perforce Change Reviews Cc: Subject: PERFORCE change 111525 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 12 Dec 2006 03:26:29 -0000 http://perforce.freebsd.org/chv.cgi?CH=111525 Change 111525 by imp@imp_lighthouse on 2006/12/12 03:25:53 MF FreeBSD-tsc-6: o More generic description o less verbose dmesg, unless bootverbose (this data should be exported via sysctl) o Initialize the lock o don't do zero length read after the write to verify it succeeded. This lead a lock leak in at91_twi (to be fixed separately). MFP4 after: soon Affected files ... .. //depot/projects/arm/src/sys/dev/iicbus/icee.c#7 edit Differences ... ==== //depot/projects/arm/src/sys/dev/iicbus/icee.c#7 (text+ko) ==== @@ -62,7 +62,7 @@ #define ICEE_LOCK(_sc) mtx_lock_spin(&(_sc)->sc_mtx) #define ICEE_UNLOCK(_sc) mtx_unlock_spin(&(_sc)->sc_mtx) #define ICEE_LOCK_INIT(_sc) \ - mtx_init(&_sc->sc_mtx, device_get_nameunit(_sc->dev), "icee", MTX_SPIN) + mtx_init(&_sc->sc_mtx, device_get_nameunit(_sc->sc_dev), "icee", MTX_SPIN) #define ICEE_LOCK_DESTROY(_sc) mtx_destroy(&_sc->sc_mtx); #define ICEE_ASSERT_LOCKED(_sc) mtx_assert(&_sc->sc_mtx, MA_OWNED); #define ICEE_ASSERT_UNLOCKED(_sc) mtx_assert(&_sc->sc_mtx, MA_NOTOWNED); @@ -86,8 +86,8 @@ static int icee_probe(device_t dev) { - /* XXX really probe? */ - device_set_desc(dev, "AT24C I2C EEPROM"); + /* XXX really probe? -- not until we know the size... */ + device_set_desc(dev, "I2C EEPROM"); return (0); } @@ -109,8 +109,9 @@ if (sc->rd_sz > MAX_RD_SZ) sc->rd_sz = MAX_RD_SZ; resource_int_value(dname, dunit, "wr_sz", &sc->wr_sz); - device_printf(dev, "size: %d bytes bus_width: %d-bits\n", sc->size, - sc->type); + if (bootverbose) + device_printf(dev, "size: %d bytes bus_width: %d-bits\n", + sc->size, sc->type); sc->cdev = make_dev(&icee_cdevsw, device_get_unit(dev), UID_ROOT, GID_WHEEL, 0600, "icee%d", device_get_unit(dev)); if (sc->cdev == NULL) { @@ -118,6 +119,7 @@ goto out; } sc->cdev->si_drv1 = sc; + ICEE_LOCK_INIT(sc); out:; return (err); } @@ -212,11 +214,10 @@ icee_write(struct cdev *dev, struct uio *uio, int ioflag) { struct icee_softc *sc; - int error, len, i, slave; + int error, len, slave; uint8_t data[MAX_WR_SZ + 2]; - struct iic_msg msgs[3] = { + struct iic_msg msgs[1] = { { 0, IIC_M_WR, 0, data }, - { 0, IIC_M_RD, 0, data }, }; sc = CDEV2SOFTC(dev); @@ -244,12 +245,11 @@ data[1] = uio->uio_offset & 0xff; break; } - for (i = 0; i < 2; i++) - msgs[i].slave = slave; + msgs[0].slave = slave; error = uiomove(data + sc->type / 8, len, uio); if (error) break; - error = iicbus_transfer(sc->sc_dev, msgs, 2); + error = iicbus_transfer(sc->sc_dev, msgs, 1); if (error) break; }